안녕하세요.
또 오랜만에 질문을 올리네요. (본론으로 들어가서)
stagfright이 적용된 ffmpeg 컴파일은 잘 되었습니다. (so, a)
문제는 아트릭스에서는 동작을 잘 하지만 삼성폰에서는 아래와 같은 오류가 나타납니다.
08-21 11:30:00.710: E/Player(1996): LoadLibrary err : Cannot load library: reloc_library[1315]: 226 cannot locate '_ZN7android8OMXCodec6CreateERKNS_2spINS_4IOMXEEERKNS1_INS_8MetaDataEEEbRKNS1_INS_11MediaSourceEEEPKcj'...
위에 보면 android OMXCodec Create 와 관련된 오류인 것 같습니다.
혹시 해결 하신분 계신가요? 삼성에 문의를 해야 하는 것인지 잘 모르겠습니다.
우선은 아트릭스에서는 동작을 하기에 기본적인 컴파일 방법에는 특별한 문제가 없는 것으로 생각 되고
다만 삼성폰에서 먼가 설정등의 어떤 방법이 들어 가야 하는 것 같습니다.
혹시나 싶어 아트릭스에서라도 동작되는 stagfright 적용된 ffmpeg 셀 스크립트를 올려 드립니다.
필요하신분은 사용해서 쓰세요. (홋날 삼성폰에서도 동작을 한다면 그 방법좀 알려 주세요 ㅠ.ㅠ)
먼저 이 셀스크립트는 ffmpeg의 tools/build_libstagefright 파일을 수정 한 것 입니다.
#!/bin/bash
######################################################################
## NDK
NDK=/opt/eclipse/android-ndk/android-ndk-r7b
if [ "$NDK" = "" ]; then
echo NDK variable not set, assuming ${HOME}/android-ndk
export NDK=${HOME}/android-ndk
fi
######################################################################
## Download library and source.
echo "Fetching Android system headers"
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git ../android-source/system/core
echo "Fetching Android libraries for linking"
# Libraries from any froyo/gingerbread device/emulator should work
# fine, since the symbols used should be available on most of them.
if [ ! -d "../android-libs" ]; then
if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then
wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../
fi
unzip ../update-cm-7.0.3-N1-signed.zip system/lib/* -d../
mv ../system/lib ../android-libs
rmdir ../system
fi
SYSROOT=$NDK/platforms/android-9/arch-arm
# Expand the prebuilt/* path into the correct one
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86`
export PATH=$TOOLCHAIN/bin:$PATH
ANDROID_SOURCE=../android-source
ANDROID_LIBS=../android-libs
######################################################################
## build_configure
function build_configure
{
rm -rf $DEST
mkdir -p $DEST
#FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=$CPU"
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --disable-avdevice --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264"
EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/system/include"
#EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_CFLAGS="$EXTRA_CFLAGS $BUILD_CFLAGS"
EXTRA_LDFLAGS="$BUILD_LDFLAGS -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$SYSROOT/usr/lib -Wl,-rpath-link,$SYSROOT/usr/lib -nostdlib -lc -lm -ldl -llog"
EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"
mkdir -p $DEST
#--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 $EXTRA_CFLAGS" \
echo $FLAGS --extra-cflags="-O3 -fpic -DANDROID $EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/${BUILD}_info.txt
./configure --prefix=$DEST \
$FLAGS \
--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 $EXTRA_CFLAGS" \
--extra-ldflags="$EXTRA_LDFLAGS" \
--extra-cxxflags="$EXTRA_CXXFLAGS" \
--extra-libs="-lgcc" \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-devices \
--disable-filters \
--disable-encoders \
--disable-muxers \
--disable-bsfs \
--disable-shared \
--enable-static \
--enable-asm \
--enable-gpl \
--enable-parsers \
--enable-decoders \
--enable-demuxers \
--enable-swscale \
--enable-network \
--enable-indevs \
--enable-protocols \
| tee $DEST/${BUILD}_configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
make clean
make -j4 || exit 1
make install
$TOOLCHAIN/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
}
######################################################################
## build_start
function build_share
{
#STAGEFRIGHT_LDFLAGS="-lstdc++ -lstlport -lutils -lmedia -lbinder -lstagefright"
STAGEFRIGHT_LDFLAGS="-lstlport -lutils -lmedia -lbinder -lstagefright"
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=${ANDROID_LIBS} -L${ANDROID_LIBS} \
-rpath-link=${SYSROOT}/usr/lib -L${SYSROOT}/usr/lib \
-soname lib${BUILD}.so -shared \
-nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined \
-o ${DEST}/lib${BUILD}.so \
libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a \
-lc -lm -lz -ldl -llog \
${STAGEFRIGHT_LDFLAGS} \
--dynamic-linker=/system/bin/linker \
${STAGEFRIGHT_STATIC_LIBS} \
${TOOLCHAIN}/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}
function build_static
{
ar -q ${DEST}/lib${BUILD}.a libavcodec/*.o
ar -q ${DEST}/lib${BUILD}.a libavformat/*.o
ar -q ${DEST}/lib${BUILD}.a libavutil/*.o
ar -q ${DEST}/lib${BUILD}.a libswscale/*.o
}
function build_start
{
build_configure
FFMPEG_CXX_SUPCPP="$NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libsupc++.a"
STAGEFRIGHT_STATIC_LIBS="$FFMPEG_CXX_SUPCPP"
#build_share
build_static
}
######################################################################
## excute armv7-a
CPU=armv7-a
BUILD=${CPU}_vfpv3
DEST="../build/stagefright/$BUILD"
BUILD_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU"
build_start
위에서 excute armv7-a 부분은 neon을 사용하지 않는 armv7의 ffmpeg 라이브러리를 생성하는 것 입니다.
아래는 stagefright를 사용하지 않는 다른 소스의 일부분으로 neon을 위한 부분 입니다. (참고용 입니다.)
#arm v7n
CPU=armv7-a
BUILD=${CPU}_neon
DEST="../build/stagefright/$BUILD"
BUILD_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
BUILD_LDFLAGS="-Wl,--fix-cortex-a8"
BUILD_FLAG=--enable-neon
#build_start위의 라이브러리를 사용하는 jni 소스 디렉토리에 있는 android.mk 도 올려 드립니다.
주의사항으로
아래에서 보통은 sdl 1.x 버전을 사용하는데요. 저의 경우 SDL2를 사용하였습니다.
또한 opengles2를 사용 하였습니다.
따라서 SDL2, opengles2를 수정하시고
나머지 경로를 님들의 상황에 맞게 수정 하시면 됩니다.
중요사항으로 아래 내용은 돌핀플레이어의 소스를 수정하여 사용 한 것입니다.
(돌핀은 sdl 1.x opengles입니다.)
Android.mk
LOCAL_PATH := $(call my-dir)
FFMPEG_ANDROID_LIBS := "/opt/AAndroid/ffmpeg/src/ffmpeg-0.10/android-libs"
FFMPEG_PATH := "/opt/AAndroid/ffmpeg/src/ffmpeg-0.10"
FFMPEG_LIB_PATH := "/opt/AAndroid/ffmpeg/src/build/stagefright/armv7-a_vfpv3"
include $(CLEAR_VARS)
LOCAL_MODULE := application
APP_SUBDIRS := $(patsubst $(LOCAL_PATH)/%, %, $(shell find $(LOCAL_PATH)/src -type d))
APP_SUBDIRS += $(patsubst $(LOCAL_PATH)/%, %, $(shell find $(LOCAL_PATH)/resources -type d))
# Add more subdirs here, like src/subdir1 src/subdir2
LOCAL_CFLAGS := $(foreach D, $(APP_SUBDIRS), -I$(LOCAL_PATH)/$(D)) \
-I$(AVPLAYER_PATH)"/jni/sdl-2.0/include" \
-I$(FFMPEG_PATH) \
-D__STDC_CONSTANT_MACROS \
-I$(AVPLAYER_PATH)"/jni/app/include" \
-I$(AVPLAYER_PATH)"/jni/soundtouch-1.6.0/include"
LOCAL_CFLAGS += $(CC_OPTIMIZE_FLAG)
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -DHAVE_NEON=1
endif
#Change C++ file extension as appropriate
LOCAL_CPP_EXTENSION := .cpp
LOCAL_SRC_FILES := $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wildcard $(LOCAL_PATH)/$(F)/*.cpp))))
# Uncomment to also add C sources
LOCAL_SRC_FILES += $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wildcard $(LOCAL_PATH)/$(F)/*.c))))
LOCAL_SRC_FILES += $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wildcard $(LOCAL_PATH)/$(F)/*.S))))
LOCAL_SHARED_LIBRARIES := SDL2
LOCAL_STATIC_LIBRARIES := cpufeatures
LIBS_WITH_LONG_SYMBOLS := $(strip $(shell \
for f in $(LOCAL_PATH)/../../libs/armeabi/*.so ; do \
if echo $$f | grep "libapplication[.]so" > /dev/null ; then \
continue ; \
fi ; \
if [ -e "$$f" ] ; then \
if nm -g $$f | cut -c 12- | egrep '.{128}' > /dev/null ; then \
echo $$f | grep -o 'lib[^/]*[.]so' ; \
fi ; \
fi ; \
done \
) )
ifneq "$(LIBS_WITH_LONG_SYMBOLS)" ""
$(foreach F, $(LIBS_WITH_LONG_SYMBOLS), \
$(info Library $(F): abusing symbol names are: \
$(shell nm -g $(LOCAL_PATH)/../../libs/armeabi/$(F) | cut -c 12- | egrep '.{128}' ) ) \
$(info Library $(F) contains symbol names longer than 128 bytes, \
YOUR CODE WILL DEADLOCK WITHOUT ANY WARNING when youll access such function - \
please make this library static to avoid problems. ) )
$(error Detected libraries with too long symbol names. Remove all files under project/libs/armeabi, make these libs static, and recompile)
endif
LOCAL_LDLIBS := -lGLESv2 -ldl -llog -lc -lm -lz \
-L$(FFMPEG_LIB_PATH)/lib \
-L$(FFMPEG_ANDROID_LIBS) \
-lutils -lmedia -lbinder -lstagefright \
-lavformat -lavcodec -lswscale -lavutil
include $(BUILD_SHARED_LIBRARY)
위의 내용들은 아마도 큰 도움이 되실 것 같습니다.
다만 삼성폰에서 왜 위와 같은 오류가 나타나는지 해결방법이 무엇인지..
저의 아집 때문인지 해결방법이 떠오르지 않네요...
많은 능력자님들께서 부디 해결 방법을 찾아 적어 주셨으면 합니다.
혹은 어떻게 해결했는지 모르겠다 싶으시면 저와 같이 위의 자료들을 적어 주시면 감사하겠습니다.




ICS 부터(Honeycomb도 해당되는 듯 합니다만 소스가 없어서 확실히 말씀드리기가 어렵습니다.)
OMXCreate.h 의 Create 함수에 파라메터가 한개 더 들어갔습니다.
사용하신 OMXCodec.h 헤더에 const sp<ANativeWindow> &nativeWindow = NULL 부분을 추가하시고, 삼성단말의 libstagefright.so를 사용해 빌드 하시면 로드는 될 겁니다.
static sp<MediaSource> Create(