File ffmpeg-4.2-dlopen-fdk_aac.patch of Package A_tw-ffmpeg

182
 
1
Index: ffmpeg-4.2.1/configure
2
===================================================================
3
--- ffmpeg-4.2.1.orig/configure
4
+++ ffmpeg-4.2.1/configure
5
@@ -232,6 +232,7 @@ External library support:
6
   --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
7
                            and libraw1394 [no]
8
   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
9
+  --enable-libfdk-aac-dlopen enable AAC de/encoding via dlopen()'ed libfdk-aac [no]
10
   --enable-libflite        enable flite (voice synthesis) support via libflite [no]
11
   --enable-libfontconfig   enable libfontconfig, useful for drawtext filter [no]
12
   --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
13
@@ -1724,6 +1725,7 @@ EXTERNAL_LIBRARY_GPL_LIST="
14
 EXTERNAL_LIBRARY_NONFREE_LIST="
15
     decklink
16
     libfdk_aac
17
+    libfdk_aac_dlopen
18
     openssl
19
     libtls
20
 "
21
@@ -6203,6 +6205,7 @@ enabled libdrm            && require_pkg
22
 enabled libfdk_aac        && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
23
                                { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
24
                                  warn "using libfdk without pkg-config"; } }
25
+enabled libfdk_aac_dlopen && enable libfdk_aac && add_cppflags "-I/usr/include/fdk-aac"
26
 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"
27
 enabled libflite          && require libflite "flite/flite.h" flite_init $flite_extralibs
28
 enabled fontconfig        && enable libfontconfig
29
Index: ffmpeg-4.2.1/libavcodec/dlopen.h
30
===================================================================
31
--- /dev/null
32
+++ ffmpeg-4.2.1/libavcodec/dlopen.h
33
@@ -0,0 +1,12 @@
34
+#ifndef LOCALINC_DLOPEN_H
35
+#define LOCALINC_DLOPEN_H
36
+#include <dlfcn.h>
37
+#define num2str(x) str(x)
38
+#define str(x) #x
39
+
40
+#define dl_sym(func, args, lib) \
41
+   dl_##func = args dlsym(lib, #func); \
42
+   if ((err = dlerror())) \
43
+       goto error;
44
+
45
+#endif
46
Index: ffmpeg-4.2.1/libavcodec/libfdk-aacdec.c
47
===================================================================
48
--- ffmpeg-4.2.1.orig/libavcodec/libfdk-aacdec.c
49
+++ ffmpeg-4.2.1/libavcodec/libfdk-aacdec.c
50
@@ -37,6 +37,54 @@
51
 #define AAC_PCM_MAX_OUTPUT_CHANNELS AAC_PCM_OUTPUT_CHANNELS
52
 #endif
53
 
54
+#ifdef CONFIG_LIBFDK_AAC_DLOPEN
55
+#include "dlopen.h"
56
+AAC_DECODER_ERROR (*dl_aacDecoder_AncDataInit)(HANDLE_AACDECODER, UCHAR*, int);
57
+HANDLE_AACDECODER (*dl_aacDecoder_Open)(TRANSPORT_TYPE, UINT);
58
+AAC_DECODER_ERROR (*dl_aacDecoder_Fill)(HANDLE_AACDECODER, UCHAR**, const UINT*, UINT*);
59
+AAC_DECODER_ERROR (*dl_aacDecoder_ConfigRaw)(HANDLE_AACDECODER, UCHAR **, const UINT*);
60
+AAC_DECODER_ERROR (*dl_aacDecoder_SetParam)(const HANDLE_AACDECODER, const AACDEC_PARAM, const INT);
61
+AAC_DECODER_ERROR (*dl_aacDecoder_DecodeFrame)(HANDLE_AACDECODER, INT_PCM*, const INT, const UINT);
62
+CStreamInfo* (*dl_aacDecoder_GetStreamInfo)(HANDLE_AACDECODER);
63
+void (*dl_aacDecoder_Close)(HANDLE_AACDECODER);
64
+#define aacDecoder_AncDataInit dl_aacDecoder_AncDataInit
65
+#define aacDecoder_Open dl_aacDecoder_Open
66
+#define aacDecoder_Fill dl_aacDecoder_Fill
67
+#define aacDecoder_ConfigRaw dl_aacDecoder_ConfigRaw
68
+#define aacDecoder_SetParam dl_aacDecoder_SetParam
69
+#define aacDecoder_DecodeFrame dl_aacDecoder_DecodeFrame
70
+#define aacDecoder_GetStreamInfo dl_aacDecoder_GetStreamInfo
71
+#define aacDecoder_Close dl_aacDecoder_Close
72
+#define FDKAAC_LIB "libfdk-aac.so.1"
73
+static int loadLibFdkAac(AVCodecContext *avctx);
74
+static int loadLibFdkAac(AVCodecContext *avctx) {
75
+   void *libfdkaac = NULL;
76
+   const char *err = NULL;
77
+   
78
+   libfdkaac = dlopen(FDKAAC_LIB, RTLD_LAZY);
79
+   if(err = dlerror()) {
80
+       av_log(avctx, AV_LOG_FATAL, "%s\n%s is missing, libfdk-aac support will be disabled\n", err, FDKAAC_LIB);
81
+       if(libfdkaac)
82
+           dlclose(libfdkaac);
83
+       return 1;
84
+   }
85
+   dl_sym(aacDecoder_AncDataInit, (AAC_DECODER_ERROR (*)(HANDLE_AACDECODER, UCHAR*, int)), libfdkaac);
86
+   dl_sym(aacDecoder_Open, (HANDLE_AACDECODER (*)(TRANSPORT_TYPE, UINT)), libfdkaac);
87
+   dl_sym(aacDecoder_Fill, (AAC_DECODER_ERROR (*)(HANDLE_AACDECODER, UCHAR**, const UINT*, UINT*)), libfdkaac);
88
+   dl_sym(aacDecoder_ConfigRaw, (AAC_DECODER_ERROR (*)(HANDLE_AACDECODER, UCHAR**, const UINT*)), libfdkaac);
89
+   dl_sym(aacDecoder_SetParam, (AAC_DECODER_ERROR (*)(const HANDLE_AACDECODER, const AACDEC_PARAM, const INT)), libfdkaac);
90
+   dl_sym(aacDecoder_DecodeFrame, (AAC_DECODER_ERROR (*)(HANDLE_AACDECODER, INT_PCM*, const INT, const UINT)), libfdkaac);
91
+   dl_sym(aacDecoder_GetStreamInfo, (CStreamInfo* (*)(HANDLE_AACDECODER)), libfdkaac);
92
+   dl_sym(aacDecoder_Close, (void (*)(HANDLE_AACDECODER)), libfdkaac);
93
+   return 0;
94
+error:
95
+   av_log(avctx, AV_LOG_FATAL, "libfdk-aac: Missing symbols in %s: %s\n"
96
+       "libfdk-aac support disabled\n", FDKAAC_LIB, err);
97
+   dlclose(libfdkaac);
98
+   return 1;
99
+}
100
+#endif
101
+
102
 enum ConcealMethod {
103
     CONCEAL_METHOD_SPECTRAL_MUTING      =  0,
104
     CONCEAL_METHOD_NOISE_SUBSTITUTION   =  1,
105
@@ -224,6 +272,11 @@ static av_cold int fdk_aac_decode_init(A
106
     FDKAACDecContext *s = avctx->priv_data;
107
     AAC_DECODER_ERROR err;
108
 
109
+#ifdef CONFIG_LIBFDK_AAC_DLOPEN
110
+    if (loadLibFdkAac(avctx))
111
+        return -1;
112
+#endif
113
+
114
     s->handle = aacDecoder_Open(avctx->extradata_size ? TT_MP4_RAW : TT_MP4_ADTS, 1);
115
     if (!s->handle) {
116
         av_log(avctx, AV_LOG_ERROR, "Error opening decoder\n");
117
Index: ffmpeg-4.2.1/libavcodec/libfdk-aacenc.c
118
===================================================================
119
--- ffmpeg-4.2.1.orig/libavcodec/libfdk-aacenc.c
120
+++ ffmpeg-4.2.1/libavcodec/libfdk-aacenc.c
121
@@ -34,6 +34,48 @@
122
 #define FDKENC_VER_AT_LEAST(vl0, vl1) 0
123
 #endif
124
 
125
+#ifdef CONFIG_LIBFDK_AAC_DLOPEN
126
+#include "dlopen.h"
127
+#include <fdk-aac/aacdecoder_lib.h>
128
+AACENC_ERROR (*dl_aacEncOpen)(HANDLE_AACENCODER*, const UINT, const UINT);
129
+AACENC_ERROR (*dl_aacEncoder_SetParam)(const HANDLE_AACENCODER, const AACENC_PARAM, const UINT);
130
+AACENC_ERROR (*dl_aacEncEncode)(const HANDLE_AACENCODER, const AACENC_BufDesc*, const AACENC_BufDesc*, const AACENC_InArgs*, AACENC_OutArgs*);
131
+AACENC_ERROR (*dl_aacEncInfo)(const HANDLE_AACENCODER, AACENC_InfoStruct*);
132
+AACENC_ERROR (*dl_aacEncClose)(HANDLE_AACENCODER*);
133
+
134
+#define aacEncOpen dl_aacEncOpen
135
+#define aacEncoder_SetParam dl_aacEncoder_SetParam
136
+#define aacEncEncode dl_aacEncEncode
137
+#define aacEncInfo dl_aacEncInfo
138
+#define aacEncClose dl_aacEncClose
139
+#define FDKAAC_LIB "libfdk-aac.so.1"
140
+
141
+static int loadLibFdkAac(AVCodecContext *avctx);
142
+static int loadLibFdkAac(AVCodecContext *avctx) {
143
+   void *libfdkaac = NULL;
144
+   const char *err = NULL;
145
+   
146
+   libfdkaac = dlopen(FDKAAC_LIB, RTLD_LAZY);
147
+   if(err = dlerror()) {
148
+       av_log(avctx, AV_LOG_FATAL, "%s\n%s is missing, libfdk-aac support will be disabled\n", err, FDKAAC_LIB);
149
+       if(libfdkaac)
150
+           dlclose(libfdkaac);
151
+       return 1;
152
+   }
153
+   dl_sym(aacEncOpen, (AACENC_ERROR (*)(HANDLE_AACENCODER*, const UINT, const UINT)), libfdkaac);
154
+   dl_sym(aacEncoder_SetParam, (AACENC_ERROR (*)(const HANDLE_AACENCODER, const AACENC_PARAM, const UINT)), libfdkaac);
155
+   dl_sym(aacEncEncode, (AACENC_ERROR (*)(const HANDLE_AACENCODER, const AACENC_BufDesc*, const AACENC_BufDesc*, const AACENC_InArgs*, AACENC_OutArgs*)), libfdkaac);
156
+   dl_sym(aacEncInfo, (AACENC_ERROR (*)(const HANDLE_AACENCODER, AACENC_InfoStruct*)), libfdkaac);
157
+   dl_sym(aacEncClose, (AACENC_ERROR (*)(HANDLE_AACENCODER*)), libfdkaac);
158
+   return 0;
159
+error:
160
+   av_log(avctx, AV_LOG_FATAL, "libfdk-aac: Missing symbols in %s: %s\n"
161
+       "libfdk-aac support disabled\n", FDKAAC_LIB, err);
162
+   dlclose(libfdkaac);
163
+   return 1;
164
+}
165
+#endif
166
+
167
 typedef struct AACContext {
168
     const AVClass *class;
169
     HANDLE_AACENCODER handle;
170
@@ -126,6 +168,11 @@ static av_cold int aac_encode_init(AVCod
171
     int aot = FF_PROFILE_AAC_LOW + 1;
172
     int sce = 0, cpe = 0;
173
 
174
+#ifdef CONFIG_LIBFDK_AAC_DLOPEN
175
+    if (loadLibFdkAac(avctx))
176
+        return -1;
177
+#endif
178
+
179
     if ((err = aacEncOpen(&s->handle, 0, avctx->channels)) != AACENC_OK) {
180
         av_log(avctx, AV_LOG_ERROR, "Unable to open the encoder: %s\n",
181
                aac_get_error(err));
182