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
@@ -230,6 +230,7 @@ External library support:
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
@@ -1873,6 +1874,7 @@ EXTERNAL_LIBRARY_GPL_LIST="
28
 EXTERNAL_LIBRARY_NONFREE_LIST="
29
     decklink
30
     libfdk_aac
31
+    libfdk_aac_dlopen
32
     libtls
33
 "
34
 
35
@@ -6847,6 +6849,7 @@ enabled libdvdread        && require_pkg
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
@@ -0,0 +1,12 @@
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
@@ -38,6 +38,54 @@
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
@@ -244,6 +292,11 @@ static av_cold int fdk_aac_decode_init(A
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
@@ -37,6 +37,48 @@
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
@@ -182,6 +224,11 @@ static av_cold int aac_encode_init(AVCod
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