摘要
本文主要是对FDK-AAC开源库2.0.3版本进行裁剪,只编译开源库中的AAC-LC解码部分,其余部分则不编译。整个开源库若全部编译,生成.so动态库大小为7.4MB,裁剪后生成的.so动态库大小仅为0.6MB。此外,本文使用ARM交叉编译工具链,编译生成的动态库直接在ARM上使用。
一、开源库结构分析与裁剪
1. AAC-LC解码所需要的函数
1. aacDecoder_Open();
2. aacDecoder_ConfigRaw();
3. aacDecoder_Fill();
4. aacDecoder_DecodeFrame();
5. aacDecoder_GetStreamInfo();
2.解码库函数关联的库文件
1. aacDecoder_Open(); // libAACdec/src/aacdecoder_lib.cpp
--fmin(); // libFDK/include/common.h
--fixmin_UI(); // libFDK/include/commonfix.h
--transportDec_Open(); // libMpegTPDec/src/tpdec_lib.cpp
--GetRam_TransportDecoder(); // libMpegTPDec/src/tpdec_lib.cpp
--adtsRead_CrcInit(); // libMpegTPDec/src/tpdec_adts.cpp
--FDKcrcInit(); // libFDK/src/FDK_crc.cpp
--GetRam_TransportDecoderBuffer(); // libFDK/include/FDK_bitstream.h
--transportDec_SetParam(); // libMpegTPDec/src/tpdec_lib.cpp
--FDK_ResetBitBuffer(); // libFDK/src/FDK_bitbuffer.cpp
--CAacDecoder_Open(); // libAACdec/src/aacdecoder.cpp
--GetAacDecoder(); // libSYS/include/genericStds.h
--FDK_QmfDomain_ClearRequested(); // libFDK/src/FDK_qmf_domain.cpp
--CAacDecoder_AncDataInit(); // libAACdec/src/aacdecoder.cpp
--CStreamInfoInit(); // libAACdec/src/aacdecoder.cpp
--CProgramConfig_Init(); // libMpegTPDec/src/tpdec_asc.cpp
--CConcealment_InitCommonData(); // libSYS/include/genericStds.cpp
--GetDrcInfo(); // libAACdec/src/aac_ram.h
--aacDecoder_drcInit(); // libAACdec/src/aacdec_drc.cpp
--aacDecoder_drcSetParam(); // libAACdec/src/aacdec_drc.cpp
--CConcealment_GetDelay(); // libAACdec/src/conceal.cpp
--GetWorkBufferCore1(); // libAACdec/src/aac_ram.h
--GetWorkBufferCore2(); // libAACdec/src/aac_ram.h
--transportDec_Close(); // libMpegTPDec/src/tpdec_lib.cpp
--FDK_chMapDescr_init(); // libSYS/src/syslib_channelMapDescr.cpp
--transportDec_RegisterAscCallback(); // libMpegTPDec/src/tpdec_lib.cpp
--transportDec_RegisterFreeMemCallback(); // libMpegTPDec/src/tpdec_lib.cpp
--transportDec_RegisterCtrlCFGChangeCallback(); // libMpegTPDec/src/tpdec_lib.cpp
--FDKmemclear(); // libSYS/include/genericStds.cpp
--transportDec_RegisterSscCallback(); // libMpegTPDec/src/tpdec_lib.cpp
--FDK_drcDec_Open(); // libDRCdec/
--transportDec_RegisterUniDrcConfigCallback();
--pcmDmx_Open(); // libPCMutils
--pcmLimiter_Create(); // libPCMutils
--setConcealMethod(); // libAACdec
--aacDecoder_Close(); // libAACdec
2. aacDecoder_ConfigRaw();
--transportDec_OutOfBandConfig(); // libMpegTPDec
3. aacDecoder_Fill();
--transportDec_FillData(); // libMpegTPDec
4. aacDecoder_DecodeFrame(); // 与以上类似
3. 最终需要编译的库
FDK-AAC 2.0.3库文件结构如下:
经过梳理,最终我们需要编译的库如下:
libAACdec, libFDK, libMpegTPDec, libSYS, libDRCdec, libPCMutils
4. 库裁剪
本质上是对CMakeList.txt进行修改,使其只编译我们所需要的部分。
需要修改的部分如下:
set(libfdk_aac_SOURCES
${AACDEC_SRC} ${AACENC_SRC}
${ARITHCODING_SRC}
${DRCDEC_SRC}
${MPEGTPDEC_SRC} ${MPEGTPENC_SRC}
${SACDEC_SRC} ${SACENC_SRC}
${SBRDEC_SRC} ${SBRENC_SRC}
${PCMUTILS_SRC} ${FDK_SRC} ${SYS_SRC})
删除其中不需要的部分,删改后如下:
set(libfdk_aac_SOURCES
${AACDEC_SRC}
${DRCDEC_SRC}
${MPEGTPDEC_SRC}
${PCMUTILS_SRC} ${FDK_SRC} ${SYS_SRC})
修改完后,如果需要在X86上使用,可以直接编译,需要交叉编译的看下面的配置。
二、ARM交叉编译工具链配置
为了不破坏原始的CMakeList结构,可以直接在fdk-aac-2.0.3文件夹下创建一个arm_linux_setup.cmake文件,在cmake编译时加载该配置文件即可。arm_linux_setup.cmake文件内容如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /home/test/toolChain/gcc-arm-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)
其中gcc-arm-linux-gnueabihf为自己的交叉编译工具链位置,可自行替换。
然后在fdk-aac-2.0.3根目录下,执行如下命令完成交叉编译:
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
最后在build文件夹中生成文件如下图:
其中libfdk-aac.so.2.0.3即为我们所需要的动态解码库,将其复制到ARM上即可。
头文件从以下库文件中选取,包含到我们需要编译的目标文件中即可:
以上即为本文所有内容。