2014-07-13 2 views
0

모두 ... 안드로이드 장치 용 libstagefright_h264로 ffmpeg hw 가속화를 시도하고 싶습니다. 소스 코드가 ffmpeg 2.2.1 및 android 4.2.2에서 약간 오래된 것으로 보입니다. 그래서 나는 소스 코드를 업데이트하려고하지만 때 나는 단지 다음과 같이 조금 코드를 작성 : 내가 코드를 실행할 때 다음과 같이 알려줍니다ffmpeg에 대한 무대 장치 : 정의되지 않은 심볼 '_ZTIN7android11MediaSourceE'

struct FFSource : public MediaSource {                     
    virtual status_t start(MetaData *params) { return -1; }      
    virtual status_t stop() { return -1; }           
    virtual sp<MetaData> getFormat() { return sp<MetaData>(); }     
    virtual status_t read(                        
      MediaBuffer **buffer, const ReadOptions *options) { return -1; }  
}; 

static av_cold int Stagefright_init(AVCodecContext *avctx)                
{                               
    av_log(avctx, AV_LOG_ERROR, "In function: %s\n", __FUNCTION__);              
    FFSource *decoder;                         
    sp<MediaSource> mediaSource; 

    decoder = new FFSource();               
    return -1; 
} 

을 : 는 "위해 libavcodec에 의해 참조 기호"_ZTIN7android11MediaSourceE "를 찾을 수 없습니다 "-55.so ...

그리고 그 결과는 libavcodec-55.so 위해 nm 명령을 보여
[[email protected] ffmpeg-2.2.1.lsc]$nm ./libavcodec/libavcodec.so | grep Source 

003a31a8 t _ZN7android11MediaSource10setBuffersERKNS_6VectorIPNS_11MediaBufferEEE 
003a319c t _ZN7android11MediaSource5pauseEv 
     U _ZN7android11MediaSourceC2Ev 
     U _ZN7android11MediaSourceD0Ev 
     U _ZN7android11MediaSourceD1Ev 
     U _ZN7android11MediaSourceD2Ev 
003a31d0 t _ZN8FFSource4readEPPN7android11MediaBufferEPKNS0_11MediaSource11ReadOptionsE 
003a31bc t _ZN8FFSource4stopEv 
003a31b4 t _ZN8FFSource5startEPN7android8MetaDataE 
003a31c4 t _ZN8FFSource9getFormatEv 
003a3340 t _ZN8FFSourceD0Ev 
003a32e0 t _ZN8FFSourceD1Ev 
007b29f0 d _ZTC8FFSource0_N7android11MediaSourceE 
007b29e0 d _ZTI8FFSource 
     U _ZTIN7android11MediaSourceE 
006ac028 r _ZTS8FFSource 
007b2970 d _ZTT8FFSource 
     U _ZTv0_n12_N7android11MediaSourceD0Ev 
     U _ZTv0_n12_N7android11MediaSourceD1Ev 
003a3330 t _ZTv0_n12_N8FFSourceD0Ev 
003a32d0 t _ZTv0_n12_N8FFSourceD1Ev 
007b2980 d _ZTV8FFSource 

이 또한 내가 libstagefright.so에 _ZTIN7android11MediaSourceE를 찾을 수 없습니다. stagefright 라이브러리를 잘못 링크하는 대신 소스 코드를 작성하는 데 실수가 있다고 생각합니다. ffmpeg 소스를 컴파일하기 위해 안드로이드 독립 실행 형 툴체인을 사용합니다. 다음과 같은 구성 :

function config_lsf                                            
    { 
     # build flags                                            
     PREFIX=/home/cxm/work/Android/proj/dy-proj-careye/dy-proj-careye/jni/src/lib/android/   FLAGS="--prefix=$PREFIX"                                          
     FLAGS="$FLAGS --disable-static"                                        
     FLAGS="$FLAGS --disable-doc"                                         
     FLAGS="$FLAGS --disable-programs"                                       
     FLAGS="$FLAGS --disable-avdevice"                                       
     FLAGS="$FLAGS --disable-symver"                                        
     FLAGS="$FLAGS --enable-shared"                                        
     FLAGS="$FLAGS --cross-prefix=arm-linux-androideabi-"                                   
     FLAGS="$FLAGS --target-os=linux"                                        
     FLAGS="$FLAGS --arch=arm"                                         
     FLAGS="$FLAGS --enable-cross-compile"                                      

     FLAGS="$FLAGS --disable-decoder=h264"                                      
     FLAGS="$FLAGS --disable-decoder=h264_vdpau"                                     
     FLAGS="$FLAGS --enable-libstagefright-h264"                                     

     # cflags                                              
     CFLAGS="-Os -fpic -marm"                         
     ANDROID_SOURCE=../mokesoures/                                        
     ANDROID_LIBS=../android-libs                                         
     CFLAGS="$CFLAGS -I$ANDROID_SOURCE/frameworks/av/include"                                  
     CFLAGS="$CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/"                                
     CFLAGS="$CFLAGS -I$ANDROID_SOURCE/system/core/include"                                  
     CFLAGS="$CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include"                                
     CFLAGS="$CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax/"                             

     # ld flags                                             
     LDFLAGS="-Wl,--fix-cortex-a8"                                        
     LDFLAGS="$LDFLAGS -lstdc++ -lgnustl_shared -lstagefright -lutils -lbinder"                             
     LDFLAGS="$LDFLAGS -L$ANDROID_LIBS"                                       
     LDFLAGS="$LDFLAGS -Wl,-rpath-link,$ANDROID_LIBS"                             

     ./configure.android $FLAGS --extra-cflags="$CFLAGS" \                                  
      --extra-ldflags="$LDFLAGS" \                                        

     sed -i 's/#define\ HAVE_POSIX_MEMALIGN\ 1/#define\ HAVE_POSIX_MEMALIGN\ 0/' ./config.h                          
     make -j4 V=1 2>&1 | tee log                                         
     make install                                             
    }                                                

이 주제에 대한 도움을주십시오. 매우 감사합니다.

+0

'Android.mk' 파일을 공유 할 수 있습니까? – Ganesh

+0

안드로이드 독립 실행 형 툴체인을 사용하여 ffmpeg를 컴파일하므로 Android.mk가 없습니다. 내 구성을 추가하기 위해이 주제를 다시 편집하기 만하면됩니다. 매우 감사합니다. – user3051473

+1

'confg_lsf'에서 rtti를 어디에서 사용할 수 있는지 알 수 없습니다. 그리고'build_libstagefright' 스크립트는 명시 적으로'EXTRA_CXXFLAGS = "- Wno-multichar -fno-exceptions -fno-rtti"를 설정합니다. –

답변

4

_ZTIN7android11MediaSourceEandroid::MediaSource에 대한 typeinfo입니다. 빌드 구성에 -frtti이 활성화되어있을 수도 있지만 Android 라이브러리에는 런타임 유형 정보가 포함되어 있지 않습니다. 따라서 적어도 FFSource 클래스에서이 플래그를 제거해야합니다.

+0

친애하는 Alex, 당신은 심볼 이름으로 rtti를 가리 키기 때문에 C/C++에 대해 매우 숙련 된 전문가 여야합니다! 나는 컴파일러가 어떻게 C++ 함수를 c 함수로 변환하는지 궁금해한다. 이 주제에 대한 조언을 해줄 수 있습니까? 대단히 고마워 ... – user3051473

+0

"C++ 함수를 C로 변환"한다는 것은 무엇을 의미합니까? C++에서 _callable_ 함수를 사용하려면 함수 _declaration_ 앞에'extern "C"'를 추가하십시오. (C는 이것을 이해하지 못하기 때문에 보통 ** .c **와 **. cpp **에서 모두 포함 된 헤더 파일의'#ifdef __cplusplus'에 포장합니다. –

+0

제 연구에서 대학 도서의 경우, C++ 코드는 컴파일하는 동안 c 코드로 먼저 변환되어야합니다. 예를 들어, 클래스 C의 멤버 함수 F()는 F (C * this)와 같은 C 스타일 함수로 변환되어야합니다. 클래스 C가 N의 네임 스페이스 아래에 있다면 함수 F()가 다음과 같이 C 스타일 함수로 변환되어야한다고 생각합니다. N :: F (C * this), 알겠습니까? – user3051473