FFmpegKit Linux API  4.5.1
Packages.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 Taner Sener
3  *
4  * This file is part of FFmpegKit.
5  *
6  * FFmpegKit is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * FFmpegKit is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General License
17  * along with FFmpegKit. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "Packages.h"
21 #include "config.h"
22 #include <memory>
23 #include <algorithm>
24 
26  std::shared_ptr<std::set<std::string>> enabledLibrarySet = getExternalLibraries();
27  #define contains_ext_lib(element) enabledLibrarySet->find(element) != enabledLibrarySet->end()
28  bool speex = contains_ext_lib("speex");
29  bool fribidi = contains_ext_lib("fribidi");
30  bool gnutls = contains_ext_lib("gnutls");
31  bool xvid = contains_ext_lib("xvid");
32 
33  bool min = false;
34  bool minGpl = false;
35  bool https = false;
36  bool httpsGpl = false;
37  bool audio = false;
38  bool video = false;
39  bool full = false;
40  bool fullGpl = false;
41 
42  if (speex && fribidi) {
43  if (xvid) {
44  fullGpl = true;
45  } else {
46  full = true;
47  }
48  } else if (speex) {
49  audio = true;
50  } else if (fribidi) {
51  video = true;
52  } else if (xvid) {
53  if (gnutls) {
54  httpsGpl = true;
55  } else {
56  minGpl = true;
57  }
58  } else {
59  if (gnutls) {
60  https = true;
61  } else {
62  min = true;
63  }
64  }
65 
66  if (fullGpl) {
67  if (contains_ext_lib("dav1d") &&
68  contains_ext_lib("fontconfig") &&
69  contains_ext_lib("freetype") &&
70  contains_ext_lib("fribidi") &&
71  contains_ext_lib("gmp") &&
72  contains_ext_lib("gnutls") &&
73  contains_ext_lib("kvazaar") &&
74  contains_ext_lib("mp3lame") &&
75  contains_ext_lib("libass") &&
76  contains_ext_lib("iconv") &&
77  contains_ext_lib("libilbc") &&
78  contains_ext_lib("libtheora") &&
79  contains_ext_lib("libvidstab") &&
80  contains_ext_lib("libvorbis") &&
81  contains_ext_lib("libvpx") &&
82  contains_ext_lib("libwebp") &&
83  contains_ext_lib("libxml2") &&
84  contains_ext_lib("opencore-amr") &&
85  contains_ext_lib("opus") &&
86  contains_ext_lib("shine") &&
87  contains_ext_lib("snappy") &&
88  contains_ext_lib("soxr") &&
89  contains_ext_lib("speex") &&
90  contains_ext_lib("twolame") &&
91  contains_ext_lib("x264") &&
92  contains_ext_lib("x265") &&
93  contains_ext_lib("xvid")) {
94  return "full-gpl";
95  } else {
96  return "custom";
97  }
98  }
99 
100  if (full) {
101  if (contains_ext_lib("dav1d") &&
102  contains_ext_lib("fontconfig") &&
103  contains_ext_lib("freetype") &&
104  contains_ext_lib("fribidi") &&
105  contains_ext_lib("gmp") &&
106  contains_ext_lib("gnutls") &&
107  contains_ext_lib("kvazaar") &&
108  contains_ext_lib("mp3lame") &&
109  contains_ext_lib("libass") &&
110  contains_ext_lib("iconv") &&
111  contains_ext_lib("libilbc") &&
112  contains_ext_lib("libtheora") &&
113  contains_ext_lib("libvorbis") &&
114  contains_ext_lib("libvpx") &&
115  contains_ext_lib("libwebp") &&
116  contains_ext_lib("libxml2") &&
117  contains_ext_lib("opencore-amr") &&
118  contains_ext_lib("opus") &&
119  contains_ext_lib("shine") &&
120  contains_ext_lib("snappy") &&
121  contains_ext_lib("soxr") &&
122  contains_ext_lib("speex") &&
123  contains_ext_lib("twolame")) {
124  return "full";
125  } else {
126  return "custom";
127  }
128  }
129 
130  if (video) {
131  if (contains_ext_lib("dav1d") &&
132  contains_ext_lib("fontconfig") &&
133  contains_ext_lib("freetype") &&
134  contains_ext_lib("fribidi") &&
135  contains_ext_lib("kvazaar") &&
136  contains_ext_lib("libass") &&
137  contains_ext_lib("iconv") &&
138  contains_ext_lib("libtheora") &&
139  contains_ext_lib("libvpx") &&
140  contains_ext_lib("libwebp") &&
141  contains_ext_lib("snappy")) {
142  return "video";
143  } else {
144  return "custom";
145  }
146  }
147 
148  if (audio) {
149  if (contains_ext_lib("mp3lame") &&
150  contains_ext_lib("libilbc") &&
151  contains_ext_lib("libvorbis") &&
152  contains_ext_lib("opencore-amr") &&
153  contains_ext_lib("opus") &&
154  contains_ext_lib("shine") &&
155  contains_ext_lib("soxr") &&
156  contains_ext_lib("speex") &&
157  contains_ext_lib("twolame")) {
158  return "audio";
159  } else {
160  return "custom";
161  }
162  }
163 
164  if (httpsGpl) {
165  if (contains_ext_lib("gmp") &&
166  contains_ext_lib("gnutls") &&
167  contains_ext_lib("libvidstab") &&
168  contains_ext_lib("x264") &&
169  contains_ext_lib("x265") &&
170  contains_ext_lib("xvid")) {
171  return "https-gpl";
172  } else {
173  return "custom";
174  }
175  }
176 
177  if (https) {
178  if (contains_ext_lib("gmp") &&
179  contains_ext_lib("gnutls")) {
180  return "https";
181  } else {
182  return "custom";
183  }
184  }
185 
186  if (minGpl) {
187  if (contains_ext_lib("libvidstab") &&
188  contains_ext_lib("x264") &&
189  contains_ext_lib("x265") &&
190  contains_ext_lib("xvid")) {
191  return "min-gpl";
192  } else {
193  return "custom";
194  }
195  }
196 
197  return "min";
198 }
199 
200 std::shared_ptr<std::set<std::string>> ffmpegkit::Packages::getExternalLibraries() {
201  const std::set<const char*> supportedExternalLibraries{
202  "dav1d",
203  "fontconfig",
204  "freetype",
205  "fribidi",
206  "gmp",
207  "gnutls",
208  "kvazaar",
209  "mp3lame",
210  "libaom",
211  "libass",
212  "iconv",
213  "libilbc",
214  "libtheora",
215  "libvidstab",
216  "libvorbis",
217  "libvpx",
218  "libwebp",
219  "libxml2",
220  "opencore-amr",
221  "openh264",
222  "opus",
223  "rubberband",
224  "sdl2",
225  "shine",
226  "snappy",
227  "soxr",
228  "speex",
229  "tesseract",
230  "twolame",
231  "x264",
232  "x265",
233  "xvid"};
234  std::string buildConfiguration(FFMPEG_CONFIGURATION);
235  char libraryName1[50];
236  char libraryName2[50];
237  std::shared_ptr<std::set<std::string>> enabledLibrarySet = std::make_shared<std::set<std::string>>();
238 
239  std::for_each(supportedExternalLibraries.cbegin(), supportedExternalLibraries.cend(), [&](const char* supportedExternalLibrary) {
240  sprintf(libraryName1, "enable-%s", supportedExternalLibrary);
241  sprintf(libraryName2, "enable-lib%s", supportedExternalLibrary);
242 
243  if (buildConfiguration.find(libraryName1) != std::string::npos || buildConfiguration.find(libraryName2) != std::string::npos) {
244  enabledLibrarySet->insert(supportedExternalLibrary);
245  }
246  });
247 
248  return enabledLibrarySet;
249 }
ffmpegkit::Packages::getPackageName
static std::string getPackageName()
Definition: Packages.cpp:25
contains_ext_lib
#define contains_ext_lib(element)
ffmpegkit::Packages::getExternalLibraries
static std::shared_ptr< std::set< std::string > > getExternalLibraries()
Definition: Packages.cpp:200
Packages.h