diff --git a/media-video/qtav/patches/5263d9d9.patch b/media-video/qtav/patches/5263d9d9.patch new file mode 100644 index 000000000..a992f59fa --- /dev/null +++ b/media-video/qtav/patches/5263d9d9.patch @@ -0,0 +1,22 @@ +From 5263d9d9ee29303a919d33d52b15acda554226c5 Mon Sep 17 00:00:00 2001 +From: rezso +Date: Mon, 1 Jun 2020 13:30:21 +0200 +Subject: [PATCH] Fix build with Qt 5.15 + +Solves https://github.com/wang-bin/QtAV/issues/1309 +--- + src/QtAV/FilterContext.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/QtAV/FilterContext.h b/src/QtAV/FilterContext.h +index 6d2f9a041..7cc2fc1c5 100644 +--- a/src/QtAV/FilterContext.h ++++ b/src/QtAV/FilterContext.h +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + /* + * QPainterFilterContext, D2DFilterContext, ... + */ diff --git a/media-video/qtav/patches/5abba7f0.patch b/media-video/qtav/patches/5abba7f0.patch new file mode 100644 index 000000000..c81ccddaa --- /dev/null +++ b/media-video/qtav/patches/5abba7f0.patch @@ -0,0 +1,21 @@ +From 5abba7f0505e75fceabd4dd8992a7e02bb149d64 Mon Sep 17 00:00:00 2001 +From: Alexander Ivash +Date: Tue, 24 Dec 2019 16:04:25 +0300 +Subject: [PATCH] add include + +--- + qml/SGVideoNode.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/qml/SGVideoNode.cpp b/qml/SGVideoNode.cpp +index b12089d8e..3f2a07d72 100644 +--- a/qml/SGVideoNode.cpp ++++ b/qml/SGVideoNode.cpp +@@ -25,6 +25,7 @@ + #include "QtAV/VideoFrame.h" + #include + #include ++#include + #include + + // all in QSGRenderThread diff --git a/media-video/qtav/patches/qtav-1.12.0.patchset b/media-video/qtav/patches/qtav-1.12.0.patchset deleted file mode 100644 index 5963b8cd9..000000000 --- a/media-video/qtav/patches/qtav-1.12.0.patchset +++ /dev/null @@ -1,729 +0,0 @@ -From dd02092df2454cee17ff5293cb383082fdcce293 Mon Sep 17 00:00:00 2001 -From: 0xFelix -Date: Tue, 12 Dec 2017 13:24:34 +0100 -Subject: Remove usage of deprecated avfiltergraph.h header - - -diff --git a/src/QtAV/private/AVCompat.h b/src/QtAV/private/AVCompat.h -index e387868..e6225e9 100644 ---- a/src/QtAV/private/AVCompat.h -+++ b/src/QtAV/private/AVCompat.h -@@ -59,6 +59,7 @@ extern "C" - #include - #include - #include -+#include - - #if !FFMPEG_MODULE_CHECK(LIBAVUTIL, 51, 73, 101) - #include -@@ -79,8 +80,11 @@ extern "C" - #endif //QTAV_HAVE(AVRESAMPLE) - - #if QTAV_HAVE(AVFILTER) -+#if LIBAVFILTER_VERSION_INT < AV_VERSION_INT(3,8,0) - #include /*code is here for old version*/ -+#else - #include -+#endif - #include - #include - #endif //QTAV_HAVE(AVFILTER) --- -2.21.0 - - -From 68334c99231118758475e5218adc2e818b7a0f7b Mon Sep 17 00:00:00 2001 -From: Felix Matouschek -Date: Sat, 11 Nov 2017 10:13:06 +0100 -Subject: Make QtAV build with newer versions of FFmpeg - - -diff --git a/src/AVMuxer.cpp b/src/AVMuxer.cpp -index 729d94a..10d85bb 100644 ---- a/src/AVMuxer.cpp -+++ b/src/AVMuxer.cpp -@@ -122,7 +122,7 @@ AVStream *AVMuxer::Private::addStream(AVFormatContext* ctx, const QString &codec - c->time_base = s->time_base; - /* Some formats want stream headers to be separate. */ - if (ctx->oformat->flags & AVFMT_GLOBALHEADER) -- c->flags |= CODEC_FLAG_GLOBAL_HEADER; -+ c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; - // expose avctx to encoder and set properties in encoder? - // list codecs for a given format in ui - return s; -diff --git a/src/QtAV/private/AVCompat.h b/src/QtAV/private/AVCompat.h -index e6225e9..944cfd7 100644 ---- a/src/QtAV/private/AVCompat.h -+++ b/src/QtAV/private/AVCompat.h -@@ -460,3 +460,15 @@ const char *get_codec_long_name(AVCodecID id); - } } while(0) - - #endif //QTAV_COMPAT_H -+ -+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56,33,0) -+#define AV_CODEC_FLAG_GLOBAL_HEADER CODEC_FLAG_GLOBAL_HEADER -+#endif -+ -+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56,56,100) -+#define AV_INPUT_BUFFER_MIN_SIZE FF_MIN_BUFFER_SIZE -+#endif -+ -+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56,56,100) -+#define AV_INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE -+#endif -diff --git a/src/codec/audio/AudioEncoderFFmpeg.cpp b/src/codec/audio/AudioEncoderFFmpeg.cpp -index 93a0506..f67fb27 100644 ---- a/src/codec/audio/AudioEncoderFFmpeg.cpp -+++ b/src/codec/audio/AudioEncoderFFmpeg.cpp -@@ -153,8 +153,8 @@ bool AudioEncoderFFmpegPrivate::open() - } else { - buffer_size = frame_size*format_used.bytesPerSample()*format_used.channels()*2+200; - } -- if (buffer_size < FF_MIN_BUFFER_SIZE) -- buffer_size = FF_MIN_BUFFER_SIZE; -+ if (buffer_size < AV_INPUT_BUFFER_MIN_SIZE) -+ buffer_size = AV_INPUT_BUFFER_MIN_SIZE; - buffer.resize(buffer_size); - return true; - } -diff --git a/src/codec/video/VideoEncoderFFmpeg.cpp b/src/codec/video/VideoEncoderFFmpeg.cpp -index 7c5ed42..671efa7 100644 ---- a/src/codec/video/VideoEncoderFFmpeg.cpp -+++ b/src/codec/video/VideoEncoderFFmpeg.cpp -@@ -245,7 +245,7 @@ bool VideoEncoderFFmpegPrivate::open() - applyOptionsForContext(); - AV_ENSURE_OK(avcodec_open2(avctx, codec, &dict), false); - // from mpv ao_lavc -- const int buffer_size = qMax(qMax(width*height*6+200, FF_MIN_BUFFER_SIZE), sizeof(AVPicture));//?? -+ const int buffer_size = qMax(qMax(width*height*6+200, AV_INPUT_BUFFER_MIN_SIZE), sizeof(AVPicture));//?? - buffer.resize(buffer_size); - return true; - } -diff --git a/src/filter/LibAVFilter.cpp b/src/filter/LibAVFilter.cpp -index 1915120..8993a91 100644 ---- a/src/filter/LibAVFilter.cpp -+++ b/src/filter/LibAVFilter.cpp -@@ -120,7 +120,10 @@ public: - // pixel_aspect==sar, pixel_aspect is more compatible - QString buffersrc_args = args; - qDebug("buffersrc_args=%s", buffersrc_args.toUtf8().constData()); -- AVFilter *buffersrc = avfilter_get_by_name(video ? "buffer" : "abuffer"); -+#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(7,0,0) -+ const -+#endif -+ AVFilter *buffersrc = avfilter_get_by_name(video ? "buffer" : "abuffer"); - Q_ASSERT(buffersrc); - AV_ENSURE_OK(avfilter_graph_create_filter(&in_filter_ctx, - buffersrc, -@@ -128,6 +131,9 @@ public: - filter_graph) - , false); - /* buffer video sink: to terminate the filter chain. */ -+#if LIBAVFILTER_VERSION_INT >= AV_VERSION_INT(7,0,0) -+ const -+#endif - AVFilter *buffersink = avfilter_get_by_name(video ? "buffersink" : "abuffersink"); - Q_ASSERT(buffersink); - AV_ENSURE_OK(avfilter_graph_create_filter(&out_filter_ctx, buffersink, "out", -diff --git a/src/subtitle/SubtitleProcessorFFmpeg.cpp b/src/subtitle/SubtitleProcessorFFmpeg.cpp -index 30ee936..1755c38 100644 ---- a/src/subtitle/SubtitleProcessorFFmpeg.cpp -+++ b/src/subtitle/SubtitleProcessorFFmpeg.cpp -@@ -249,7 +249,7 @@ bool SubtitleProcessorFFmpeg::processHeader(const QByteArray &codec, const QByte - codec_ctx->time_base.den = 1000; - if (!data.isEmpty()) { - av_free(codec_ctx->extradata); -- codec_ctx->extradata = (uint8_t*)av_mallocz(data.size() + FF_INPUT_BUFFER_PADDING_SIZE); -+ codec_ctx->extradata = (uint8_t*)av_mallocz(data.size() + AV_INPUT_BUFFER_PADDING_SIZE); - if (!codec_ctx->extradata) - return false; - codec_ctx->extradata_size = data.size(); --- -2.21.0 - - -From 9336c7619b41418c97b6262aaaf433f4dc1ddd39 Mon Sep 17 00:00:00 2001 -From: Johannes Huber -Date: Wed, 6 Sep 2017 23:30:42 +0200 -Subject: Fix multilib install - - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index ef7ade0..11f8603 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -66,7 +66,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) # for .moc - set(CMAKE_AUTOMOC ON) - if(NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(QTAV_INSTALL_HEADERS ${CMAKE_INSTALL_PREFIX}/include) -- set(QTAV_INSTALL_LIBS ${CMAKE_INSTALL_PREFIX}/lib) -+ set(QTAV_INSTALL_LIBS ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) - set(QTAV_INSTALL_BINS ${CMAKE_INSTALL_PREFIX}/bin) - set(QTAV_INSTALL_QML ${CMAKE_INSTALL_PREFIX}/qml) - else() --- -2.21.0 - - -From ec7adb96023306de5387f3a3130022fcdad7552f Mon Sep 17 00:00:00 2001 -From: Gerasim Troeglazov <3dEyes@gmail.com> -Date: Wed, 1 May 2019 21:12:05 +1000 -Subject: Add missing header - - -diff --git a/contrib/capi/capi.h b/contrib/capi/capi.h -new file mode 100644 -index 0000000..df7c8ee ---- /dev/null -+++ b/contrib/capi/capi.h -@@ -0,0 +1,518 @@ -+/****************************************************************************** -+ Use C API in C++ dynamically and no link. Header only. -+ Use it with a code generation tool: https://github.com/wang-bin/mkapi -+ Copyright (C) 2014-2017 Wang Bin -+ -+ This library 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. -+ -+ This library 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 this library; if not, write to the Free Software -+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+******************************************************************************/ -+// no class based implementation: https://github.com/wang-bin/dllapi . limitation: can not reload library -+#ifndef CAPI_H -+#define CAPI_H -+ -+/*! -+ How To Use: (see test/zlib) -+ use the header and source from code gerenrated from: https://github.com/wang-bin/mkapi -+ */ -+ -+#include //ptrdiff_t -+#include -+#include -+#include -+ -+#define CAPI_IS(X) (defined CAPI_IS_##X && CAPI_IS_##X) -+/*! -+ * you can define CAPI_IS_LAZY_RESOLVE 0 before including capi.h. then all symbols will be resolved in constructor. -+ * default resolving a symbol at it's first call -+ */ -+#ifndef CAPI_IS_LAZY_RESOLVE -+#define CAPI_IS_LAZY_RESOLVE 1 -+#endif -+namespace capi { -+namespace version { -+ enum { -+ Major = 0, Minor = 7, Patch = 1, -+ Value = ((Major&0xff)<<16) | ((Minor&0xff)<<8) | (Patch&0xff) -+ }; -+ static const char name[] = { Major + '0', '.', Minor + '0', '.', Patch + '0', 0 }; -+} //namespace version -+// set lib name with version -+enum { -+ NoVersion = -1, /// library name without major version, for example libz.so -+ EndVersion = -2 -+}; -+/********************************** The following code is only used in .cpp **************************************************/ -+/*! -+ * -Library names: -+ static const char* zlib[] = { -+ #ifdef CAPI_TARGET_OS_WIN -+ "zlib", -+ #else -+ "z", -+ #endif -+ /usr/local/lib/libmyz.so, // absolute path is ok -+ NULL}; -+ CAPI_BEGIN_DLL(zlib, ::capi::dso) // the 2nd parameter is a dynamic shared object loader class. \sa dll_helper class -+ ... -+ * -Multiple library versions -+ An example to open libz.so, libz.so.1, libz.so.0 on unix -+ static const int ver[] = { ::capi::NoVersion, 1, 0, ::capi::EndVersion }; -+ CAPI_BEGIN_DLL_VER(zlib, ver, ::capi::dso) -+ ... -+ */ -+class dso { -+ void *handle; -+ char full_name[512]; -+ dso(const dso&); -+ dso& operator=(const dso&); -+public: -+ static inline char* path_from_handle(void* handle, char* path, int path_len); -+ dso(): handle(0) {} -+ virtual ~dso() { unload();} -+ inline void setFileName(const char* name); -+ inline void setFileNameAndVersion(const char* name, int ver); -+ inline bool load(); -+ inline bool unload(); -+ bool isLoaded() const { return !!handle;} -+ virtual void* resolve(const char* symbol) { return resolve(symbol, true);} -+ const char* path() const { return full_name;} // loaded path -+protected: -+ inline void* load(const char* name); -+ inline bool unload(void* lib); -+ inline void* resolve(const char* sym, bool try_); -+}; -+} //namespace capi -+/// DLL_CLASS is a library loader and symbols resolver class. Must implement api like capi::dso (the same function name and return type, but string parameter type can be different): -+/// unload() must support ref count. i.e. do unload if no one is using the real library -+/// Currently you can use ::capi::dso and QLibrary for DLL_CLASS. You can also use your own library resolver -+#define CAPI_BEGIN_DLL(names, DLL_CLASS) \ -+ class api_dll : public ::capi::internal::dll_helper { \ -+ public: api_dll() : ::capi::internal::dll_helper(names) CAPI_DLL_BODY_DEFINE -+#define CAPI_BEGIN_DLL_VER(names, versions, DLL_CLASS) \ -+ class api_dll : public ::capi::internal::dll_helper { \ -+ public: api_dll() : ::capi::internal::dll_helper(names, versions) CAPI_DLL_BODY_DEFINE -+#if CAPI_IS(LAZY_RESOLVE) -+#define CAPI_END_DLL() } api_t; api_t api; }; -+#else -+#define CAPI_END_DLL() }; -+#endif -+#define CAPI_DEFINE_DLL api::api():dll(new api_dll()){} \ -+ api::~api(){delete dll;} \ -+ bool api::loaded() const { return dll->isLoaded();} \ -+ namespace capi { \ -+ static api_dll* dll = NULL; \ -+ bool loaded() { \ -+ if (!dll) dll = new api_dll(); \ -+ return dll->isLoaded(); \ -+ } \ -+ } -+ -+/*! -+ * N: number of arguments -+ * R: return type -+ * name: api name -+ * ...: api arguments with only types, wrapped by CAPI_ARGn, n=0,1,2,...13 -+ * The symbol of the api is "name". Otherwise, use CAPI_DEFINE instead. -+ * example: -+ * 1. const char* zlibVersion() -+ * CAPI_DEFINE(const char* zlibVersion, CAPI_ARG0()) -+ * 2. const char* zError(int) // get error string from zlib error code -+ * CAPI_DEFINE(const char*, zError, CAPI_ARG1(int)) -+ */ -+#if CAPI_IS(LAZY_RESOLVE) -+#define CAPI_DEFINE(R, name, ...) EXPAND(CAPI_DEFINE2_X(R, name, name, __VA_ARGS__)) /* not ##__VA_ARGS__ !*/ -+#define CAPI_DEFINE_ENTRY(R, name, ...) EXPAND(CAPI_DEFINE_ENTRY_X(R, name, name, __VA_ARGS__)) -+#define CAPI_DEFINE_M_ENTRY(R, M, name, ...) EXPAND(CAPI_DEFINE_M_ENTRY_X(R, M, name, name, __VA_ARGS__)) -+#else -+#define CAPI_DEFINE(R, name, ...) EXPAND(CAPI_DEFINE_X(R, name, __VA_ARGS__)) /* not ##__VA_ARGS__ !*/ -+#define CAPI_DEFINE_ENTRY(R, name, ...) EXPAND(CAPI_DEFINE_RESOLVER_X(R, name, name, __VA_ARGS__)) -+#define CAPI_DEFINE_M_ENTRY(R, M, name, ...) EXPAND(CAPI_DEFINE_M_RESOLVER_X(R, M, name, name, __VA_ARGS__)) -+#endif -+//EXPAND(CAPI_DEFINE##N(R, name, #name, __VA_ARGS__)) -+ -+///////////////////////////////////////////////////////////////////////////////////////////////////////////////// -+/************The followings are used internally**********/ -+#if CAPI_IS(LAZY_RESOLVE) -+#define CAPI_DLL_BODY_DEFINE { memset(&api, 0, sizeof(api));} typedef struct { -+#else -+#define CAPI_DLL_BODY_DEFINE { CAPI_DBG_RESOLVE("capi resolved dll symbols...");} -+#endif -+#define CAPI_DEFINE_T_V(R, name, ARG_T, ARG_T_V, ARG_V) \ -+ R api::name ARG_T_V { \ -+ CAPI_DBG_CALL(" "); \ -+ assert(dll && dll->isLoaded() && "dll is not loaded"); \ -+ return dll->name ARG_V; \ -+ } -+#define CAPI_DEFINE2_T_V(R, name, sym, ARG_T, ARG_T_V, ARG_V) \ -+ R api::name ARG_T_V { \ -+ CAPI_DBG_CALL(" "); \ -+ assert(dll && dll->isLoaded() && "dll is not loaded"); \ -+ if (!dll->api.name) { \ -+ dll->api.name = (api_dll::api_t::name##_t)dll->resolve(#sym); \ -+ CAPI_DBG_RESOLVE("dll::api_t::" #name ": @%p", dll->api.name); \ -+ } \ -+ assert(dll->api.name && "failed to resolve " #R #sym #ARG_T_V); \ -+ return dll->api.name ARG_V; \ -+ } -+/* -+ * TODO: choose 1 of below -+ * - use CAPI_LINKAGE and remove CAPI_DEFINE_M_ENTRY_X & CAPI_DEFINE_M_RESOLVER_X -+ * - also pass a linkage parameter to CAPI_NS_DEFINE_T_V & CAPI_NS_DEFINE2_T_V -+ */ -+#ifndef CAPI_LINKAGE -+#define CAPI_LINKAGE -+#endif //CAPI_LINKAGE -+#define CAPI_NS_DEFINE_T_V(R, name, ARG_T, ARG_T_V, ARG_V) \ -+ namespace capi { \ -+ using capi::dll; \ -+ R CAPI_LINKAGE name ARG_T_V { \ -+ CAPI_DBG_CALL(" "); \ -+ if (!dll) dll = new api_dll(); \ -+ assert(dll && dll->isLoaded() && "dll is not loaded"); \ -+ return dll->name ARG_V; \ -+ } } -+#define CAPI_NS_DEFINE2_T_V(R, name, sym, ARG_T, ARG_T_V, ARG_V) \ -+ namespace capi { \ -+ using capi::dll; \ -+ R CAPI_LINKAGE name ARG_T_V { \ -+ CAPI_DBG_CALL(" "); \ -+ if (!dll) dll = new api_dll(); \ -+ assert(dll && dll->isLoaded() && "dll is not loaded"); \ -+ if (!dll->api.name) { \ -+ dll->api.name = (api_dll::api_t::name##_t)dll->resolve(#sym); \ -+ CAPI_DBG_RESOLVE("dll::api_t::" #name ": @%p", dll->api.name); \ -+ } \ -+ assert(dll->api.name && "failed to resolve " #R #sym #ARG_T_V); \ -+ return dll->api.name ARG_V; \ -+ } } -+ -+// nested class can not call non-static members outside the class, so hack the address here -+// need -Wno-invalid-offsetof -+#define CAPI_DEFINE_M_RESOLVER_T_V(R, M, name, sym, ARG_T, ARG_T_V, ARG_V) \ -+ public: \ -+ typedef R (M *name##_t) ARG_T; \ -+ name##_t name; \ -+ private: \ -+ struct name##_resolver_t { \ -+ name##_resolver_t() { \ -+ const ptrdiff_t diff = ptrdiff_t(&((api_dll*)0)->name##_resolver) - ptrdiff_t(&((api_dll*)0)->name); \ -+ name##_t *p = (name##_t*)((char*)this - diff); \ -+ api_dll* dll = (api_dll*)((char*)this - ((ptrdiff_t)(&((api_dll*)0)->name##_resolver))); \ -+ if (!dll->isLoaded()) { \ -+ CAPI_WARN_LOAD("dll not loaded"); \ -+ *p = NULL; \ -+ return; \ -+ } \ -+ *p = (name##_t)dll->resolve(#sym); \ -+ if (*p) { CAPI_DBG_RESOLVE("dll::" #name ": @%p", *p); } \ -+ else { CAPI_WARN_RESOLVE("capi resolve error '" #name "'"); } \ -+ } \ -+ } name##_resolver; -+ -+#if defined(__GNUC__) -+# define CAPI_FUNC_INFO __PRETTY_FUNCTION__ -+#elif defined(_MSC_VER) -+# define CAPI_FUNC_INFO __FUNCSIG__ -+#else -+# define CAPI_FUNC_INFO __FUNCTION__ -+#endif -+#ifdef DEBUG -+#define DEBUG_LOAD -+#define DEBUG_RESOLVE -+#define DEBUG_CALL -+#endif //DEBUG -+#if defined(DEBUG) || defined(DEBUG_LOAD) || defined(DEBUG_RESOLVE) || defined(DEBUG_CALL) -+#define CAPI_LOG(STDWHERE, fmt, ...) do {fprintf(STDWHERE, "[%s] %s@%d: " fmt "\n", __FILE__, CAPI_FUNC_INFO, __LINE__, ##__VA_ARGS__); fflush(STDWHERE);} while(0); -+#else -+#define CAPI_LOG(...) -+#endif //DEBUG -+#ifdef DEBUG_LOAD -+#define CAPI_DBG_LOAD(...) EXPAND(CAPI_LOG(stdout, ##__VA_ARGS__)) -+#define CAPI_WARN_LOAD(...) EXPAND(CAPI_LOG(stderr, ##__VA_ARGS__)) -+#else -+#define CAPI_DBG_LOAD(...) -+#define CAPI_WARN_LOAD(...) -+#endif //DEBUG_LOAD -+#ifdef DEBUG_RESOLVE -+#define CAPI_DBG_RESOLVE(...) EXPAND(CAPI_LOG(stdout, ##__VA_ARGS__)) -+#define CAPI_WARN_RESOLVE(...) EXPAND(CAPI_LOG(stderr, ##__VA_ARGS__)) -+#else -+#define CAPI_DBG_RESOLVE(...) -+#define CAPI_WARN_RESOLVE(...) -+#endif //DEBUG_RESOLVE -+#ifdef DEBUG_CALL -+#define CAPI_DBG_CALL(...) EXPAND(CAPI_LOG(stdout, ##__VA_ARGS__)) -+#define CAPI_WARN_CALL(...) EXPAND(CAPI_LOG(stderr, ##__VA_ARGS__)) -+#else -+#define CAPI_DBG_CALL(...) -+#define CAPI_WARN_CALL(...) -+#endif //DEBUG_CALL -+//fully expand. used by VC. VC will not expand __VA_ARGS__ but treats it as 1 parameter -+#define EXPAND(expr) expr //TODO: rename CAPI_EXPAND -+#if defined(_WIN32) // http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system -+#define CAPI_TARGET_OS_WIN 1 -+#include -+#ifdef WINAPI_FAMILY -+#include -+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -+#define CAPI_TARGET_OS_WINRT 1 -+#endif -+#endif //WINAPI_FAMILY -+#endif -+#if defined(__APPLE__) -+#define CAPI_TARGET_OS_MAC 1 -+#include -+#endif -+#ifndef CAPI_TARGET_OS_WIN -+#if !defined(__APPLE__) && !defined(__HAIKU__) -+#include // for link_map. qnx: sys/link.h -+#endif -+#include -+#endif -+namespace capi { -+namespace internal { -+// the following code is for the case DLL=QLibrary + QT_NO_CAST_FROM_ASCII -+// you can add a new qstr_wrap like class and a specialization of dso_trait to support a new string type before/after include "capi.h" -+struct qstr_wrap { -+ static const char* fromLatin1(const char* s) {return s;} -+}; -+template struct dso_trait { -+ typedef const char* str_t; -+ typedef qstr_wrap qstr_t; -+}; -+//can not explicit specialization of 'trait' in class scope -+#if defined(QLIBRARY_H) && defined(QT_CORE_LIB) -+template<> struct dso_trait { -+ typedef QString str_t; -+ typedef QString qstr_t; -+}; -+#endif -+// base ctor dll_helper("name")=>derived members in decl order(resolvers)=>derived ctor -+static const int kDefaultVersions[] = {::capi::NoVersion, ::capi::EndVersion}; -+template class dll_helper { //no CAPI_EXPORT required -+ DLL m_lib; -+ typename dso_trait::str_t strType(const char* s) { -+ return dso_trait::qstr_t::fromLatin1(s); -+ } -+public: -+ dll_helper(const char* names[], const int versions[] = kDefaultVersions) { -+ static bool is_1st = true; -+ if (is_1st) { -+ is_1st = false; -+ fprintf(stderr, "capi::version: %s\n", ::capi::version::name); -+ } -+ for (int i = 0; names[i]; ++i) { -+ for (int j = 0; versions[j] != ::capi::EndVersion; ++j) { -+ if (versions[j] == ::capi::NoVersion) -+ m_lib.setFileName(strType(names[i])); -+ else -+ m_lib.setFileNameAndVersion(strType(names[i]), versions[j]); -+ if (m_lib.load()) { -+ CAPI_DBG_LOAD("capi loaded {library name: %s, version: %d}: %s", names[i], versions[j], m_lib.path()); -+ return; -+ } -+ CAPI_WARN_LOAD("capi can not load {library name: %s, version %d}", names[i], versions[j]); -+ } -+ } -+ } -+ virtual ~dll_helper() { m_lib.unload();} -+ bool isLoaded() const { return m_lib.isLoaded(); } -+ void* resolve(const char *symbol) { return (void*)m_lib.resolve(symbol);} -+}; -+#ifdef CAPI_TARGET_OS_WIN -+ static const char kPre[] = ""; -+ static const char kExt[] = ".dll"; -+#else -+ static const char kPre[] = "lib"; -+#ifdef CAPI_TARGET_OS_MAC -+ static const char kExt[] = ".dylib"; -+#else -+ static const char kExt[] = ".so"; -+#endif -+#endif -+} //namespace internal -+#ifdef CAPI_TARGET_OS_WIN -+#define CAPI_SNPRINTF _snprintf -+#define CAPI_SNWPRINTF _snwprintf -+#else -+#define CAPI_SNPRINTF snprintf -+#define CAPI_SNWPRINTF snwprintf -+#endif -+void dso::setFileName(const char* name) { -+ CAPI_DBG_LOAD("dso.setFileName(\"%s\")", name); -+ if (name[0] == '/') -+ CAPI_SNPRINTF(full_name, sizeof(full_name), "%s", name); -+ else -+ CAPI_SNPRINTF(full_name, sizeof(full_name), "%s%s%s", internal::kPre, name, internal::kExt); -+} -+void dso::setFileNameAndVersion(const char* name, int ver) { -+ CAPI_DBG_LOAD("dso.setFileNameAndVersion(\"%s\", %d)", name, ver); -+ if (ver >= 0) { -+#if defined(CAPI_TARGET_OS_WIN) // ignore version on win. xxx-V.dll? -+ CAPI_SNPRINTF(full_name, sizeof(full_name), "%s%s%s", internal::kPre, name, internal::kExt); -+#elif defined(CAPI_TARGET_OS_MAC) -+ CAPI_SNPRINTF(full_name, sizeof(full_name), "%s%s.%d%s", internal::kPre, name, ver, internal::kExt); -+#else -+ CAPI_SNPRINTF(full_name, sizeof(full_name), "%s%s%s.%d", internal::kPre, name, internal::kExt, ver); -+#endif -+ } else { -+ setFileName(name); -+ } -+} -+bool dso::load() { -+ handle = load(full_name); -+ path_from_handle(handle, full_name, sizeof(full_name)); -+ return !!handle; -+} -+bool dso::unload() { -+ if (!isLoaded()) -+ return true; -+ if (!unload(handle)) -+ return false; -+ handle = NULL; //TODO: check ref? -+ return true; -+} -+void* dso::load(const char* name) { -+ CAPI_DBG_LOAD("dso.load: %s", name); -+#ifdef CAPI_TARGET_OS_WIN -+#ifdef CAPI_TARGET_OS_WINRT -+ wchar_t wname[strlen(name)+1]; -+ CAPI_SNWPRINTF(wname, sizeof(wname), L"%s", name); -+ return (void*)::LoadPackagedLibrary(wname, 0); -+#else -+ return (void*)::LoadLibraryExA(name, NULL, 0); //DONT_RESOLVE_DLL_REFERENCES -+#endif -+#else -+ return ::dlopen(name, RTLD_LAZY|RTLD_LOCAL); // try no prefix name if error? TODO: ios |RTLD_GLOBAL? -+#endif -+} -+bool dso::unload(void* h) { -+#ifdef CAPI_TARGET_OS_WIN -+ if (!::FreeLibrary(static_cast(h))) //return 0 if error. ref counted -+ return false; -+#else -+ if (::dlclose(handle) != 0) //ref counted -+ return false; -+#endif -+ return true; -+} -+void* dso::resolve(const char* sym, bool try_) { -+ const char* s = sym; -+ char _s[512]; // old a.out systems add an underscore in front of symbols -+ if (!try_) {//previous has no '_', now has '_' -+ CAPI_SNPRINTF(_s, sizeof(_s), "_%s", sym); -+ s = _s; -+ } -+ CAPI_DBG_RESOLVE("dso.resolve(\"%s\", %d)", s, try_); -+#ifdef CAPI_TARGET_OS_WIN -+ void *ptr = (void*)::GetProcAddress((HMODULE)handle, s); -+#else -+ void *ptr = ::dlsym(handle, s); -+#endif -+ if (!ptr && try_) -+ return resolve(sym, false); -+ return ptr; -+} -+ -+char* dso::path_from_handle(void* handle, char* path, int path_len) -+{ -+ if (!handle) -+ return nullptr;; -+#if (CAPI_TARGET_OS_WIN+0) -+ GetModuleFileNameA(HMODULE(handle), path, path_len); -+#elif defined(__APPLE__) -+ for (size_t i = _dyld_image_count(); i > 0; --i) { -+ const char* name = _dyld_get_image_name(i); -+ void* h = dlopen(name, RTLD_LAZY); -+ dlclose(h); -+ if ((ptrdiff_t(handle) - ptrdiff_t(h))>>2 == 0) { -+ CAPI_SNPRINTF(path, path_len, "%s", name); -+ break; -+ } -+ } -+#elif (__ANDROID__+0) -+ // from boost.dll -+ typedef struct soinfo { -+ // if defined(__work_around_b_24465209__), then an array of char[128] goes here. -+ // Unfortunately, __work_around_b_24465209__ is visible only during compilation of Android's linker -+ const void* phdr; -+ size_t phnum; -+ void* entry; -+ void* base; -+ // ... // Ignoring remaning parts of the structure -+ } soinfo; -+ static const size_t work_around_b_24465209__offset = 128; -+ Dl_info info; -+ const soinfo* si = reinterpret_cast(intptr_t(handle)+work_around_b_24465209__offset); -+ if (dladdr(si->base, &info)) -+ CAPI_SNPRINTF(path, path_len, "%s", info.dli_fname); -+#elif defined(RTLD_DEFAULT) && !defined(__HAIKU__) // check (0+__USE_GNU+__ELF__)? weak dlinfo? // mac, mingw, cygwin has no dlinfo -+ const link_map* m = static_cast(handle); -+# if defined(__FreeBSD__) -+ if (dlinfo(handle, RTLD_DI_LINKMAP, &m) < 0) -+ m = NULL; -+# endif -+ if (m->l_name && m->l_name[0]) -+ CAPI_SNPRINTF(path, path_len, "%s", m->l_name); -+#endif -+ return path; -+} -+} //namespace capi -+ -+#if defined(_MSC_VER) -+#pragma warning(disable:4098) //vc return void -+#endif //_MSC_VER -+#ifdef __GNUC__ -+//gcc: ((T*)0)->member -+//no #pragma GCC diagnostic push/pop around because code is defined as a macro -+#pragma GCC diagnostic ignored "-Winvalid-offsetof" -+#endif -+/*! -+ * used by .cpp to define the api -+ * e.g. CAPI_DEFINE(cl_int, clGetPlatformIDs, "clGetPlatformIDs", CAPI_ARG3(cl_uint, cl_platform_id*, cl_uint*)) -+ * sym: symbol of the api in library. -+ * Defines both namespace style and class style. User can choose which one to use at runtime by adding a macro before including the header or not: #define SOMELIB_CAPI_NS -+ * See test/zlib/zlib_api.h -+ */ -+#define CAPI_DEFINE_X(R, name, ARG_T, ARG_T_V, ARG_V) \ -+ CAPI_DEFINE_T_V(R, name, ARG_T, ARG_T_V, ARG_V) \ -+ CAPI_NS_DEFINE_T_V(R, name, ARG_T, ARG_T_V, ARG_V) -+/* declare and define the symbol resolvers*/ -+#define EMPTY_LINKAGE -+#define CAPI_DEFINE_RESOLVER_X(R, name, sym, ARG_T, ARG_T_V, ARG_V) CAPI_DEFINE_M_RESOLVER_T_V(R, EMPTY_LINKAGE, name, sym, ARG_T, ARG_T_V, ARG_V) -+// api with linkage modifier -+#define CAPI_DEFINE_M_RESOLVER_X(R, M, name, sym, ARG_T, ARG_T_V, ARG_V) CAPI_DEFINE_M_RESOLVER_T_V(R, M, name, sym, ARG_T, ARG_T_V, ARG_V) -+ -+#define CAPI_DEFINE2_X(R, name, sym, ARG_T, ARG_T_V, ARG_V) \ -+ CAPI_DEFINE2_T_V(R, name, sym, ARG_T, ARG_T_V, ARG_V) \ -+ CAPI_NS_DEFINE2_T_V(R, name, sym, ARG_T, ARG_T_V, ARG_V) -+#define CAPI_DEFINE_ENTRY_X(R, name, sym, ARG_T, ARG_T_V, ARG_V) CAPI_DEFINE_M_ENTRY_X(R, EMPTY_LINKAGE, name, sym, ARG_T, ARG_T_V, ARG_V) -+#define CAPI_DEFINE_M_ENTRY_X(R, M, sym, name, ARG_T, ARG_T_V, ARG_V) typedef R (M *name##_t) ARG_T; name##_t name; -+ -+#define CAPI_ARG0() (), (), () -+#define CAPI_ARG1(P1) (P1), (P1 p1), (p1) -+#define CAPI_ARG2(P1, P2) (P1, P2), (P1 p1, P2 p2), (p1, p2) -+#define CAPI_ARG3(P1, P2, P3) (P1, P2, P3), (P1 p1, P2 p2, P3 p3), (p1, p2, p3) -+#define CAPI_ARG4(P1, P2, P3, P4) (P1, P2, P3, P4), (P1 p1, P2 p2, P3 p3, P4 p4), (p1, p2, p3, p4) -+#define CAPI_ARG5(P1, P2, P3, P4, P5) (P1, P2, P3, P4, P5), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5), (p1, p2, p3, p4, p5) -+#define CAPI_ARG6(P1, P2, P3, P4, P5, P6) (P1, P2, P3, P4, P5, P6), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6), (p1, p2, p3, p4, p5, p6) -+#define CAPI_ARG7(P1, P2, P3, P4, P5, P6, P7) (P1, P2, P3, P4, P5, P6, P7), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7), (p1, p2, p3, p4, p5, p6, p7) -+#define CAPI_ARG8(P1, P2, P3, P4, P5, P6, P7, P8) (P1, P2, P3, P4, P5, P6, P7, P8), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8), (p1, p2, p3, p4, p5, p6, p7, p8) -+#define CAPI_ARG9(P1, P2, P3, P4, P5, P6, P7, P8, P9) (P1, P2, P3, P4, P5, P6, P7, P8, P9), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9), (p1, p2, p3, p4, p5, p6, p7, p8, p9) -+#define CAPI_ARG10(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) -+#define CAPI_ARG11(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11) (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10, P11 p11), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) -+#define CAPI_ARG12(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12) (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10, P11 p11, P12 p12), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) -+#define CAPI_ARG13(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13) (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13), (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10, P11 p11, P12 p12, P13 p13), (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) -+ -+#endif // CAPI_H --- -2.21.0 - - -From 288576ecf68eae240ce3348e17072ef297837db2 Mon Sep 17 00:00:00 2001 -From: Gerasim Troeglazov <3dEyes@gmail.com> -Date: Wed, 1 May 2019 21:45:39 +1000 -Subject: Install path for Haiku - - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 11f8603..77826ca 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -77,6 +77,14 @@ else() - set(QTAV_INSTALL_QML ${QT_INSTALL_QML}) - endif() - -+if(HAIKU) -+ set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "default install path" FORCE) -+ set(QTAV_INSTALL_HEADERS ${CMAKE_INSTALL_HEADERS}) -+ set(QTAV_INSTALL_LIBS ${CMAKE_INSTALL_LIBS}) -+ set(QTAV_INSTALL_BINS ${CMAKE_INSTALL_BINS}) -+ set(QTAV_INSTALL_QML ${CMAKE_INSTALL_QML}) -+endif() -+ - message(STATUS "Qt version: ${Qt5Core_VERSION_STRING}") - message(STATUS "Qt prefix: ${QT_INSTALL_PREFIX}") - message(STATUS "QtAV headers prefix: ${QTAV_INSTALL_HEADERS}") --- -2.21.0 - diff --git a/media-video/qtav/patches/qtav-1.13.0.patchset b/media-video/qtav/patches/qtav-1.13.0.patchset new file mode 100644 index 000000000..cca06a6e6 --- /dev/null +++ b/media-video/qtav/patches/qtav-1.13.0.patchset @@ -0,0 +1,28 @@ +From 288576ecf68eae240ce3348e17072ef297837db2 Mon Sep 17 00:00:00 2001 +From: Gerasim Troeglazov <3dEyes@gmail.com> +Date: Wed, 1 May 2019 21:45:39 +1000 +Subject: Install path for Haiku + + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 88746af..99bf814 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -83,6 +83,14 @@ else() + set(QTAV_INSTALL_QML ${QT_INSTALL_QML}) + endif() + ++if(HAIKU) ++ set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "default install path" FORCE) ++ set(QTAV_INSTALL_HEADERS ${CMAKE_INSTALL_HEADERS}) ++ set(QTAV_INSTALL_LIBS ${CMAKE_INSTALL_LIBS}) ++ set(QTAV_INSTALL_BINS ${CMAKE_INSTALL_BINS}) ++ set(QTAV_INSTALL_QML ${CMAKE_INSTALL_QML}) ++endif() ++ + message(STATUS "Qt version: ${Qt5Core_VERSION_STRING}") + message(STATUS "Qt prefix: ${QT_INSTALL_PREFIX}") + message(STATUS "QtAV headers prefix: ${QTAV_INSTALL_HEADERS}") +-- +2.37.3 + diff --git a/media-video/qtav/qtav-1.12.0.recipe b/media-video/qtav/qtav-1.13.0.recipe similarity index 70% rename from media-video/qtav/qtav-1.12.0.recipe rename to media-video/qtav/qtav-1.13.0.recipe index 954d12371..8fe866fd6 100644 --- a/media-video/qtav/qtav-1.12.0.recipe +++ b/media-video/qtav/qtav-1.13.0.recipe @@ -1,7 +1,6 @@ SUMMARY="A cross-platform multimedia framework" DESCRIPTION="QtAV is a multimedia playback library based on Qt and FFmpeg. \ -It can help you to write a player with less effort than ever \ -before. +It can help you to write a player with less effort than ever before. QtAV can meet your most demands: @@ -31,19 +30,29 @@ you can write your decoder, audio output for particular platform." HOMEPAGE="http://www.qtav.org/" COPYRIGHT="2013-2019 Wang Bin" LICENSE="GNU LGPL v2.1" -REVISION="7" +REVISION="1" SOURCE_URI="https://github.com/wang-bin/QtAV/archive/v$portVersion.tar.gz" -CHECKSUM_SHA256="65ab859985d73521c2d17e72117baae0f3f6242b69f59994acada76fa5364193" +CHECKSUM_SHA256="a493d54d105b32c526f05188e4d7a8cf3508ecac697aae088721ffad20982288" SOURCE_DIR="QtAV-$portVersion" -PATCHES="qtav-$portVersion.patchset" +srcGitRev_2="6a5f3006533b79aa57a3a54cf9df4442a356dd48" +SOURCE_URI_2="https://raw.githubusercontent.com/wang-bin/capi/$srcGitRev_2/capi.h#noarchive" +CHECKSUM_SHA256_2="3b684223aafb5d4f3faf862b578547f7acd9b6e8d83b452271672f714b67b13d" +PATCHES="qtav-$portVersion.patchset + 5abba7f0.patch + 5263d9d9.patch" ARCHITECTURES="all !x86_gcc2" SECONDARY_ARCHITECTURES="x86" +libVersion="$portVersion" +libVersionCompat="$libVersion compat >= ${libVersion%%.*}" + PROVIDES=" qtav$secondaryArchSuffix = $portVersion - lib:libqtav$secondaryArchSuffix = 1.11.0 compat >= 1 - lib:libqtavwidgets$secondaryArchSuffix = 1.11.0 compat >= 1 +# cmd:player$secondaryArchSuffix = $portVersion #crashes +# cmd:qmlplayer$secondaryArchSuffix = $portVersion #crashes + lib:libqtav$secondaryArchSuffix = $libVersionCompat + lib:libqtavwidgets$secondaryArchSuffix = $libVersionCompat " REQUIRES=" haiku$secondaryArchSuffix @@ -55,6 +64,7 @@ REQUIRES=" lib:libavutil$secondaryArchSuffix lib:libgl$secondaryArchSuffix lib:libopenal$secondaryArchSuffix +# lib:libportaudio$secondaryArchSuffix lib:libQt5Core$secondaryArchSuffix lib:libQt5Gui$secondaryArchSuffix lib:libQt5Widgets$secondaryArchSuffix @@ -65,8 +75,8 @@ REQUIRES=" PROVIDES_devel=" qtav${secondaryArchSuffix}_devel = $portVersion - devel:libqtav$secondaryArchSuffix = 1.11.0 compat >= 1 - devel:libqtavwidgets$secondaryArchSuffix = 1.11.0 compat >= 1 + devel:libqtav$secondaryArchSuffix = $libVersionCompat + devel:libqtavwidgets$secondaryArchSuffix = $libVersionCompat " REQUIRES_devel=" haiku${secondaryArchSuffix}_devel @@ -76,15 +86,16 @@ REQUIRES_devel=" BUILD_REQUIRES=" haiku${secondaryArchSuffix}_devel devel:libass$secondaryArchSuffix - devel:libavcodec$secondaryArchSuffix - devel:libavdevice$secondaryArchSuffix - devel:libavfilter$secondaryArchSuffix - devel:libavformat$secondaryArchSuffix - devel:libavutil$secondaryArchSuffix + devel:libavcodec$secondaryArchSuffix >= 58 + devel:libavdevice$secondaryArchSuffix >= 58 + devel:libavfilter$secondaryArchSuffix >= 7 + devel:libavformat$secondaryArchSuffix >= 58 + devel:libavutil$secondaryArchSuffix >= 56 devel:libgl$secondaryArchSuffix devel:libopenal$secondaryArchSuffix +# devel:libportaudio$secondaryArchSuffix devel:libQt5Core$secondaryArchSuffix - devel:libswresample$secondaryArchSuffix + devel:libswresample$secondaryArchSuffix >= 3 devel:libswscale$secondaryArchSuffix devel:libuchardet$secondaryArchSuffix " @@ -101,9 +112,9 @@ BUILD_PREREQUIRES=" BUILD() { - mkdir -p build - cd build - cmake .. \ + cp $sourceDir2/capi.h $sourceDir/contrib/capi + + cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=$prefix \ -DCMAKE_INSTALL_HEADERS=$includeDir \ -DCMAKE_INSTALL_LIBS=$libDir \ @@ -116,14 +127,12 @@ BUILD() -DHAVE_PORTAUDIO=OFF \ -DHAVE_PULSE=OFF \ -DHAVE_VAAPI=OFF - - make $jobArgs + make -C build $jobArgs } INSTALL() { - cd build - make install + make -C build install prepareInstalledDevelLibs \ libQtAV \