【fdk-aac-2.0.3开源库裁剪与交叉编译】

摘要

本文主要是对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上即可。
头文件从以下库文件中选取,包含到我们需要编译的目标文件中即可:
在这里插入图片描述

以上即为本文所有内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值