diff --git a/patches/0003-dynamic-loading-of-shared-fdk-aac-library-5.0.patch b/patches/0003-dynamic-loading-of-shared-fdk-aac-library-5.0.patch index f55a8ba..9a244ad 100644 --- a/patches/0003-dynamic-loading-of-shared-fdk-aac-library-5.0.patch +++ b/patches/0003-dynamic-loading-of-shared-fdk-aac-library-5.0.patch @@ -29,96 +29,6 @@ index 6b5ef6332e..19554a7572 100755 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 ffa1fdcce3..b3ee1248ed 100644 --- a/libavcodec/libfdk-aacdec.c @@ -191,19 +101,18 @@ index ffa1fdcce3..b3ee1248ed 100644 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 7ee2f13ac7..7eb1475c6a 100644 +index 7ee2f13ac7..2a91d02c7f 100644 --- a/libavcodec/libfdk-aacenc.c +++ b/libavcodec/libfdk-aacenc.c -@@ -28,6 +28,8 @@ +@@ -26,6 +26,7 @@ + #include "audio_frame_queue.h" + #include "encode.h" #include "internal.h" ++#include "libfdk-aac_internal.h" #include "profiles.h" -+#include "libfdk-aac_internal.h" -+ #ifdef AACENCODER_LIB_VL0 - #define FDKENC_VER_AT_LEAST(vl0, vl1) \ - ((AACENCODER_LIB_VL0 > vl0) || \ -@@ -47,6 +49,8 @@ typedef struct AACContext { +@@ -47,6 +48,8 @@ typedef struct AACContext { int header_period; int vbr; @@ -212,7 +121,20 @@ index 7ee2f13ac7..7eb1475c6a 100644 AudioFrameQueue afq; } AACContext; -@@ -128,6 +132,21 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) +@@ -111,8 +114,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); ++ } + ff_af_queue_close(&s->afq); + + return 0; +@@ -128,6 +133,21 @@ static av_cold int aac_encode_init(AVCodecContext *avctx) int aot = FF_PROFILE_AAC_LOW + 1; int sce = 0, cpe = 0;