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