From fc05ed52b10101130b248b40d2d41389a2c533f0 Mon Sep 17 00:00:00 2001 From: Daniel Stankewitz Date: Mon, 21 Jun 2021 08:09:47 +0200 Subject: [PATCH] Create 0003-dynamic-loading-of-shared-fdk-aac-library-4.4.patch --- ...oading-of-shared-fdk-aac-library-4.4.patch | 264 ++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 patches/0003-dynamic-loading-of-shared-fdk-aac-library-4.4.patch diff --git a/patches/0003-dynamic-loading-of-shared-fdk-aac-library-4.4.patch b/patches/0003-dynamic-loading-of-shared-fdk-aac-library-4.4.patch new file mode 100644 index 0000000..53ba322 --- /dev/null +++ b/patches/0003-dynamic-loading-of-shared-fdk-aac-library-4.4.patch @@ -0,0 +1,264 @@ +From de345e50f1b2d8b79c72db747c66a6bdcc646914 Mon Sep 17 00:00:00 2001 +From: Gianluigi Tiesi +Date: Sun, 4 Dec 2016 01:28:51 +0100 +Subject: [PATCH 3/8] dynamic loading of shared fdk-aac library + +--- + configure | 6 +-- + libavcodec/libfdk-aac_internal.h | 84 ++++++++++++++++++++++++++++++++ + libavcodec/libfdk-aacdec.c | 32 ++++++++++-- + libavcodec/libfdk-aacenc.c | 25 +++++++++- + 4 files changed, 138 insertions(+), 9 deletions(-) + create mode 100644 libavcodec/libfdk-aac_internal.h + +diff --git a/configure b/configure +index 69fc11fcba..d381419123 100755 +--- a/configure ++++ b/configure +@@ -1726,7 +1726,6 @@ EXTERNAL_LIBRARY_GPL_LIST=" + + EXTERNAL_LIBRARY_NONFREE_LIST=" + decklink +- libfdk_aac + openssl + libtls + " +@@ -1816,6 +1815,7 @@ EXTERNAL_LIBRARY_LIST=" + opengl + pocketsphinx + vapoursynth ++ libfdk_aac + " + + HWACCEL_AUTODETECT_LIBRARY_LIST=" +@@ -6246,9 +6246,7 @@ enabled libdav1d && require_pkg_config libdav1d "dav1d >= 0.4.0" "dav1d + enabled libdavs2 && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open + enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new + enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion +-enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen || +- { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac && +- warn "using libfdk without pkg-config"; } } ++enabled libfdk_aac && require_headers fdk-aac/aacenc_lib.h + flite_extralibs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite" + enabled libflite && require libflite "flite/flite.h" flite_init $flite_extralibs + enabled fontconfig && enable libfontconfig +diff --git a/libavcodec/libfdk-aac_internal.h b/libavcodec/libfdk-aac_internal.h +new file mode 100644 +index 0000000000..cd1e6e3340 +--- /dev/null ++++ b/libavcodec/libfdk-aac_internal.h +@@ -0,0 +1,84 @@ ++/* ++ * Copyright (c) 2018 Gianluigi Tiesi ++ * ++ * This file is part of FFmpeg. ++ * ++ * FFmpeg is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * FFmpeg is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with FFmpeg; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#ifndef AVCODEC_LIBFDK_AAC_INTERNAL_H ++#define AVCODEC_LIBFDK_AAC_INTERNAL_H ++ ++#ifdef _WIN32 ++#include ++#define LIBNAME "libfdk-aac-2.dll" ++#define dlopen(fname, f) ((void *) LoadLibraryA(fname)) ++#define dlclose(handle) FreeLibrary((HMODULE) handle) ++#define dlsym(handle, name) GetProcAddress((HMODULE) handle, name) ++#else ++#include ++#define LIBNAME "libfdk-aac.so.2" ++#endif ++ ++#define DLSYM(x) \ ++ do \ ++ { \ ++ s->pfn.x = ( imp_##x ) dlsym(s->hLib, AV_STRINGIFY(x)); \ ++ if (!s->pfn.x ) \ ++ { \ ++ av_log(avctx, AV_LOG_ERROR, "Unable to find symbol " AV_STRINGIFY(x) " in dynamic " LIBNAME "\n"); \ ++ return -1; \ ++ } \ ++ } while (0) ++ ++ ++#include ++#include ++ ++typedef AACENC_ERROR (*imp_aacEncOpen)(HANDLE_AACENCODER *phAacEncoder, const UINT encModules, const UINT maxChannels); ++typedef AACENC_ERROR (*imp_aacEncClose)(HANDLE_AACENCODER *phAacEncoder); ++typedef AACENC_ERROR (*imp_aacEncEncode)(const HANDLE_AACENCODER hAacEncoder, const AACENC_BufDesc *inBufDesc, const AACENC_BufDesc *outBufDesc, const AACENC_InArgs *inargs, AACENC_OutArgs *outargs); ++typedef AACENC_ERROR (*imp_aacEncInfo)(const HANDLE_AACENCODER hAacEncoder, AACENC_InfoStruct *pInfo); ++typedef AACENC_ERROR (*imp_aacEncoder_SetParam)(const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param, const UINT value); ++ ++typedef struct _aacEncLib { ++ imp_aacEncOpen aacEncOpen; ++ imp_aacEncClose aacEncClose; ++ imp_aacEncEncode aacEncEncode; ++ imp_aacEncInfo aacEncInfo; ++ imp_aacEncoder_SetParam aacEncoder_SetParam; ++} aacEncLib; ++ ++typedef LINKSPEC_H HANDLE_AACDECODER (*imp_aacDecoder_Open)(TRANSPORT_TYPE transportFmt, UINT nrOfLayers); ++typedef LINKSPEC_H void (*imp_aacDecoder_Close)(HANDLE_AACDECODER self); ++typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_Fill)(HANDLE_AACDECODER self, UCHAR *pBuffer[], const UINT bufferSize[], UINT *bytesValid); ++typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_DecodeFrame)(HANDLE_AACDECODER self, INT_PCM *pTimeData, const INT timeDataSize, const UINT flags); ++typedef LINKSPEC_H CStreamInfo* (*imp_aacDecoder_GetStreamInfo)(HANDLE_AACDECODER self); ++typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_ConfigRaw)(HANDLE_AACDECODER self, UCHAR *conf[], const UINT length[]); ++typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_SetParam)(const HANDLE_AACDECODER self, const AACDEC_PARAM param, const INT value); ++typedef LINKSPEC_H AAC_DECODER_ERROR (*imp_aacDecoder_AncDataInit)(HANDLE_AACDECODER self, UCHAR *buffer, int size); ++ ++typedef struct _aacDecLib { ++ imp_aacDecoder_Open aacDecoder_Open; ++ imp_aacDecoder_Close aacDecoder_Close; ++ imp_aacDecoder_Fill aacDecoder_Fill; ++ imp_aacDecoder_DecodeFrame aacDecoder_DecodeFrame; ++ imp_aacDecoder_ConfigRaw aacDecoder_ConfigRaw; ++ imp_aacDecoder_GetStreamInfo aacDecoder_GetStreamInfo; ++ imp_aacDecoder_SetParam aacDecoder_SetParam; ++ imp_aacDecoder_AncDataInit aacDecoder_AncDataInit; ++} aacDecLib; ++ ++#endif /* AVCODEC_LIBFDK_AAC_INTERNAL_H */ +diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c +index 1abe1d8438..ef7728c368 100644 +--- a/libavcodec/libfdk-aacdec.c ++++ b/libavcodec/libfdk-aacdec.c +@@ -24,6 +24,7 @@ + #include "libavutil/opt.h" + #include "avcodec.h" + #include "internal.h" ++#include "libfdk-aac_internal.h" + + #ifdef AACDECODER_LIB_VL0 + #define FDKDEC_VER_AT_LEAST(vl0, vl1) \ +@@ -47,6 +48,8 @@ enum ConcealMethod { + typedef struct FDKAACDecContext { + const AVClass *class; + HANDLE_AACDECODER handle; ++ void *hLib; ++ aacDecLib pfn; + uint8_t *decoder_buffer; + int decoder_buffer_size; + uint8_t *anc_buffer; +@@ -99,7 +102,7 @@ static const AVClass fdk_aac_dec_class = { + static int get_stream_info(AVCodecContext *avctx) + { + FDKAACDecContext *s = avctx->priv_data; +- CStreamInfo *info = aacDecoder_GetStreamInfo(s->handle); ++ CStreamInfo *info = s->pfn.aacDecoder_GetStreamInfo(s->handle); + int channel_counts[0x24] = { 0 }; + int i, ch_error = 0; + uint64_t ch_layout = 0; +@@ -211,8 +214,10 @@ static av_cold int fdk_aac_decode_close(AVCodecContext *avctx) + { + FDKAACDecContext *s = avctx->priv_data; + +- if (s->handle) +- aacDecoder_Close(s->handle); ++ if (s->hLib && s->handle) { ++ s->pfn.aacDecoder_Close(s->handle); ++ dlclose(s->hLib); ++ } + av_freep(&s->decoder_buffer); + av_freep(&s->anc_buffer); + +@@ -224,6 +229,27 @@ static av_cold int fdk_aac_decode_init(AVCodecContext *avctx) + FDKAACDecContext *s = avctx->priv_data; + AAC_DECODER_ERROR err; + ++ if (!(s->hLib = dlopen(LIBNAME, RTLD_NOW))) { ++ av_log(avctx, AV_LOG_ERROR, "Unable to load " LIBNAME "\n"); ++ return -1; ++ } ++ ++ DLSYM(aacDecoder_Open); ++#define aacDecoder_Open s->pfn.aacDecoder_Open ++ DLSYM(aacDecoder_Close); ++ DLSYM(aacDecoder_Fill); ++#define aacDecoder_Fill s->pfn.aacDecoder_Fill ++ DLSYM(aacDecoder_DecodeFrame); ++#define aacDecoder_DecodeFrame s->pfn.aacDecoder_DecodeFrame ++ DLSYM(aacDecoder_GetStreamInfo); ++#define aacDecoder_GetStreamInfo s->pfn.aacDecoder_GetStreamInfo ++ DLSYM(aacDecoder_ConfigRaw); ++#define aacDecoder_ConfigRaw s->pfn.aacDecoder_ConfigRaw ++ DLSYM(aacDecoder_SetParam); ++#define aacDecoder_SetParam s->pfn.aacDecoder_SetParam ++ DLSYM(aacDecoder_AncDataInit); ++#define aacDecoder_AncDataInit s->pfn.aacDecoder_AncDataInit ++ + s->handle = aacDecoder_Open(avctx->extradata_size ? TT_MP4_RAW : TT_MP4_ADTS, 1); + if (!s->handle) { + av_log(avctx, AV_LOG_ERROR, "Error opening decoder\n"); +diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c +index 5620bb5951..c4519b6b74 100644 +--- a/libavcodec/libfdk-aacenc.c ++++ b/libavcodec/libfdk-aacenc.c +@@ -26,6 +26,8 @@ + #include "audio_frame_queue.h" + #include "internal.h" + ++#include "libfdk-aac_internal.h" ++ + #ifdef AACENCODER_LIB_VL0 + #define FDKENC_VER_AT_LEAST(vl0, vl1) \ + ((AACENCODER_LIB_VL0 > vl0) || \ +@@ -45,6 +47,8 @@ typedef struct AACContext { + int header_period; + int vbr; + ++ void *hLib; ++ aacEncLib pfn; + AudioFrameQueue afq; + } AACContext; + +@@ -108,8 +112,10 @@ static int aac_encode_close(AVCodecContext *avctx) + { + AACContext *s = avctx->priv_data; + +- if (s->handle) +- aacEncClose(&s->handle); ++ if (s->hLib && s->handle) { ++ s->pfn.aacEncClose(&s->handle); ++ dlclose(s->hLib); ++ } + av_freep(&avctx->extradata); + ff_af_queue_close(&s->afq); + +@@ -126,6 +132,21 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) + int aot = FF_PROFILE_AAC_LOW + 1; + int sce = 0, cpe = 0; + ++ if (!(s->hLib = dlopen(LIBNAME, RTLD_NOW))) { ++ av_log(avctx, AV_LOG_ERROR, "Unable to load " LIBNAME "\n"); ++ return -1; ++ } ++ ++ DLSYM(aacEncOpen); ++#define aacEncOpen s->pfn.aacEncOpen ++ DLSYM(aacEncClose); ++ DLSYM(aacEncEncode); ++#define aacEncEncode s->pfn.aacEncEncode ++ DLSYM(aacEncInfo); ++#define aacEncInfo s->pfn.aacEncInfo ++ DLSYM(aacEncoder_SetParam); ++#define aacEncoder_SetParam s->pfn.aacEncoder_SetParam ++ + if ((err = aacEncOpen(&s->handle, 0, avctx->channels)) != AACENC_OK) { + av_log(avctx, AV_LOG_ERROR, "Unable to open the encoder: %s\n", + aac_get_error(err)); +-- +2.24.0