본문 바로가기

프로그래밍/Android

ffmpeg 빌드 #3

 

 

에구 ffmpeg 관련된 포스팅만 세개째.. 

 

cpu별 빌드와 일부 플래그에 관해 정리. 

(참조는 rockplayer ffmpeg 소스 코드 중 build_android.sh)

 

rockplayer는 Android.mk 를 사용한 ndk-build 가 아닌 해당 툴체인만을 참조해 빌드한다.

이는 bambuser 와 비슷한데, cpu와 플래그 설정이 좀더 세밀하게 구분되어 있다.

 

우선, configure 항목중 스크립트에 언급된 내용에 대해 기술한다. 해당 설정이 플레이어마다 

각자 다르므로 이 설정이 정확한 값인지는 확인할 수는 없다 -_-;;;

더욱이 ffmpeg도 계속 수정되고 있으니...쩝 

 

일반적인 내용으로 빌드해보고, 아래 관련한 오류가 나면 적용해봐야 할 듯...

 

기본적으로 설정해야 하는 내용은 비슷하다.

PLATFORM=$NDK/platforms/android-8/arch-arm/

PREBUILT=$NDK/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86

 

--target-os=linux \

--arch=arm \

--source-path=ffmpeg소스폴더 \

--sysroot=NDK의 ndk\platforms\android-n\arch-arm 폴더로 기본 헤더와 라이브러리 \

--enable-cross-compile \

--cross-prefix= ndk\toolchains\arm-eabi-4.4.0\prebuilt\linux-x86\bin\arm-eabi- \

--prefix=출력폴더 \

--cc=툴체인의 arm-eabi-gcc \

--nm= 툴체인의 arm-eabi-nm \ 

 

 

 

rockplayer의 경우 필요하다는 플래그

--extra-libs="-lgcc" : 몇몇 런타임 함수 심볼 문제

--enable-protocols : 파일 오픈시 오류

--whole-archive : 작은 so 파일이 생성되는 문제

--no-stdlib : 안드로이드는 standard c 를 사용하지 않음

--disable-doc : 버그같단다..

 

--extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums  -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \

-fasm : 안드로이드 헤더파일에 asm 관련 키워드가 달라 발생하는 오류

-fno-short-enums : 최적화. ffmpeg 빌드시 가변크기의 enum과 관련된 넘인데.. 먼소린지..

요건 --no-enum-size-warning 으로도 해결가능.

-Dipv6mr_interface=ipv6mr_ifindex : ipv6 관련 내용인듯..

 

--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -nostdlib -lc -lm -ldl -llog" \

-llog : 디버그시

-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x 는 많은 소스에서 사용하는데 쓸필요 없다 함.

 

 

CPU별 --extra-cflags 추가 플래그

arm v6

-marm -march=armv6

 

arm v7vfpv3

-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a

 

arm v7vfp

-mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a

 

arm v7n

-mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8

 

arm v6+vfp

-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=armv6

 

 

 

 

빌드 

make  -j4 install

 

$PREBUILT/bin/arm-eabi-ar d libavcodec/libavcodec.a inverse.o

ffmpeg이 inverse.c가 libabutil, libavcodec 양쪽에 포함되어 있는데, 이 처리를 잊을 경우 libffmpeg.so 생성시 오류가 발생

 

$PREBUILT/bin/arm-eabi-ld 

-rpath-link=$PLATFORM/usr/lib 

-L$PLATFORM/usr/lib  

-soname libffmpeg.so 

-shared 

-nostdlib  

-z,noexecstack 

-Bsymbolic 

--whole-archive 

--no-undefined 

-o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a  

-lc -lm -lz -ldl -llog  

--warn-once 

--dynamic-linker=/system/bin/linker 

$PREBUILT/lib/gcc/arm-eabi/4.4.0/libgcc.a

'프로그래밍 > Android' 카테고리의 다른 글

List adapter  (0) 2011.09.15
낙서  (0) 2011.09.07
터치 이벤트 처리순서  (0) 2011.09.01
천천히 로딩되는 리스트 아이템  (0) 2011.08.22
이미지 클리핑 기초  (0) 2011.08.18
ffmpeg 빌드 #2 ffmpeg 옵션별 빌드  (0) 2011.07.06
ffmpeg 라이브러리 빌드 #1  (0) 2011.06.30
Drag&drop listview  (0) 2010.10.06
뷰 전환시 3차원 에니메이션 적용하기  (0) 2010.09.17
안드로이드 위젯 배경 이미지, 나인패치  (0) 2010.08.17