I was kinda playing around with this to see if I could get something closer to what I need (2.9) to build on FreeBSD, currently the best one I can get is like 1.5 from 2022 from ports, but it actually wasn't too much work. FreeBSD uses
onevpl before it was renamed I guess,
Anyway I will test this and mess with it some more when I get chance (it does at least build now)
[sq@msi ~/libvpl]$ cmake --build build
[ 10%] Built target VPL
[ 13%] Built target vpl-inspect
[ 16%] Built target system_analyzer
[ 62%] Built target sample_common
[ 66%] Built target sample_decode
[ 78%] Built target sample_vpp
[ 85%] Built target sample_encode
[ 92%] Built target sample_multi_transcode
[100%] Built target vpl_wayland
[sq@msi ~/libvpl]$
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b50a74a..1a51ad5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -231,7 +231,7 @@ message(
message(STATUS " BUILD_DEV : ${BUILD_DEV}")
message(STATUS " BUILD_DISPATCHER : ${BUILD_DISPATCHER}")
message(STATUS " BUILD_TOOLS : ${BUILD_TOOLS}")
-if(CMAKE_SYSTEM_NAME MATCHES Linux)
+if(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD")
message(STATUS " ENABLE_VA : ${ENABLE_VA}")
message(STATUS " ENABLE_DRM : ${ENABLE_DRM}")
message(STATUS " ENABLE_WAYLAND : ${ENABLE_WAYLAND}")
diff --git a/api/vpl/mfxdefs.h b/api/vpl/mfxdefs.h
index 2e8ad55..cce2d04 100644
--- a/api/vpl/mfxdefs.h
+++ b/api/vpl/mfxdefs.h
@@ -64,7 +64,7 @@ extern "C"
#define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(8)
#define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8)
/* 32-bit ILP32 data model Windows* (Intel(r) architecture) */
-#elif defined(_WIN32) || defined(_M_IX86) && !defined(__linux__)
+#elif defined(_WIN32) || defined(_M_IX86) && !defined(__linux__) && !defined(__FreeBSD__)
#define MFX_PACK_BEGIN_STRUCT_W_PTR() MFX_PACK_BEGIN_X(4)
#define MFX_PACK_BEGIN_STRUCT_W_L_TYPE() MFX_PACK_BEGIN_X(8)
/* 32-bit ILP32 data model Linux* */
@@ -99,7 +99,7 @@ extern "C"
#define MFX_DEPRECATED __declspec(deprecated)
#define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg
#define MFX_DEPRECATED_ENUM_FIELD_OUTSIDE(arg) __pragma(deprecated(arg))
- #elif defined(__linux__)
+ #elif defined(__linux__) || defined(__FreeBSD__)
#define MFX_DEPRECATED __attribute__((deprecated))
#if defined(__cplusplus)
#define MFX_DEPRECATED_ENUM_FIELD_INSIDE(arg) arg __attribute__((deprecated))
diff --git a/dispatcher/vpl/mfx_dispatcher_vpl.h b/dispatcher/vpl/mfx_dispatcher_vpl.h
index 443bbe8..2ad1880 100644
--- a/dispatcher/vpl/mfx_dispatcher_vpl.h
+++ b/dispatcher/vpl/mfx_dispatcher_vpl.h
@@ -48,7 +48,7 @@ typedef char CHAR_TYPE;
#define MSDK_LIB_NAME L"libmfxhw64."
#endif
#define ONEVPL_PRIORITY_PATH_VAR L"ONEVPL_PRIORITY_PATH"
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__FreeBSD__)
// Linux x64
#define MSDK_LIB_NAME "libmfxhw64."
#define ONEVPL_PRIORITY_PATH_VAR "ONEVPL_PRIORITY_PATH"
diff --git a/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp b/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp
index c9aff94..bba898b 100644
--- a/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp
+++ b/dispatcher/vpl/mfx_dispatcher_vpl_loader.cpp
@@ -413,7 +413,7 @@ mfxU32 LoaderCtxVPL::GetSearchPathsLegacy(std::list<STRING_TYPE> &searchDirs) {
mfxU32 LoaderCtxVPL::GetSearchPathsSystemDefault(std::list<STRING_TYPE> &searchDirs) {
searchDirs.clear();
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
// Add the standard path for libmfx1 install in Ubuntu
searchDirs.push_back("/usr/lib/x86_64-linux-gnu");
@@ -422,6 +422,7 @@ mfxU32 LoaderCtxVPL::GetSearchPathsSystemDefault(std::list<STRING_TYPE> &searchD
searchDirs.push_back("/usr/lib");
searchDirs.push_back("/lib64");
searchDirs.push_back("/usr/lib64");
+ searchDirs.push_back("/usr/local/lib");
#endif
return (mfxU32)searchDirs.size();
diff --git a/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp b/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp
index 4908b2e..6916b0e 100644
--- a/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp
+++ b/dispatcher/vpl/mfx_dispatcher_vpl_lowlatency.cpp
@@ -18,7 +18,7 @@
#define LIB_ONEVPL L"libmfx64-gen.dll"
#define LIB_MSDK L"libmfxhw64.dll"
#endif
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__FreeBSD__)
// Linux x64
#define LIB_ONEVPL "libmfx-gen.so.1.2"
#define LIB_MSDK "libmfxhw64.so.1"
@@ -197,7 +197,7 @@ mfxStatus LoaderCtxVPL::LoadLibsFromSystemDir(LibType libType) {
}
mfxStatus LoaderCtxVPL::LoadLibsFromMultipleDirs(LibType libType) {
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
// clang-format off
// standard paths for RT installation on Linux
diff --git a/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp b/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp
index a48bb39..92a6bf7 100644
--- a/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp
+++ b/dispatcher/vpl/mfx_dispatcher_vpl_msdk.cpp
@@ -10,7 +10,7 @@
#include "vpl/mfx_dispatcher_vpl_win.h"
#endif
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <pthread.h>
#define strncpy_s(dst, size, src, cnt) strncpy((dst), (src), (cnt)) // NOLINT
#endif
@@ -142,7 +142,7 @@ mfxStatus LoaderCtxMSDK::OpenSession(mfxSession *session,
mfxInitializationParam vplParam = {};
vplParam.AccelerationMode = accelMode;
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
vplParam.ExtParam = (mfxExtBuffer **)&extParams;
vplParam.NumExtParam = 1;
#else
@@ -183,7 +183,7 @@ mfxAccelerationMode LoaderCtxMSDK::CvtAccelType(mfxIMPL implType, mfxIMPL implMe
}
mfxStatus LoaderCtxMSDK::GetDefaultAccelType(mfxU32 adapterID, mfxIMPL *implDefault, mfxU64 *luid) {
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
// VAAPI only
*implDefault = MFX_IMPL_VIA_VAAPI;
*luid = 0;
@@ -235,7 +235,7 @@ mfxStatus LoaderCtxMSDK::QueryAPIVersion(STRING_TYPE libNameFull, mfxVersion *ms
vplParam.AccelerationMode =
(mfxAccelerationMode)CvtAccelType(MFX_IMPL_HARDWARE, implDefault & 0xFF00);
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
vplParam.ExtParam = (mfxExtBuffer **)&extParams;
vplParam.NumExtParam = 1;
#else
@@ -279,7 +279,7 @@ mfxStatus LoaderCtxMSDK::QueryMSDKCaps(STRING_TYPE libNameFull,
m_libNameFull = libNameFull;
m_deviceID = 0;
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
// require pthreads to be linked in for MSDK RT to load
pthread_key_t pkey;
if (pthread_key_create(&pkey, NULL) == 0) {
@@ -489,7 +489,7 @@ mfxStatus LoaderCtxMSDK::GetRenderNodeDescription(mfxU32 adapterID,
vendorID = 0;
deviceID = 0;
-#if defined(__linux__)
+#if defined(__linux__) || defined(__FreeBSD__)
mfxU32 DRMRenderNodeNum = 128 + adapterID;
std::string nodeStr = std::to_string(DRMRenderNodeNum);
@@ -580,7 +580,7 @@ mfxStatus LoaderCtxMSDK::QueryExtDeviceID(mfxExtendedDeviceId *extDeviceID,
luidArr >>= 8;
}
}
-#elif defined(__linux__)
+#elif defined(__linux__) || defined(__FreeBSD__)
extDeviceID->DRMPrimaryNodeNum = adapterID;
extDeviceID->DRMRenderNodeNum = 128 + adapterID;
#endif
diff --git a/examples/api1x_core/legacy-decode/src/util.hpp b/examples/api1x_core/legacy-decode/src/util.hpp
index 1d64b31..d35e0ef 100644
--- a/examples/api1x_core/legacy-decode/src/util.hpp
+++ b/examples/api1x_core/legacy-decode/src/util.hpp
@@ -30,7 +30,7 @@ enum {
#include "vpl/mfxdispatcher.h"
#endif
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <fcntl.h>
#include <unistd.h>
#endif
diff --git a/examples/api1x_core/legacy-encode/src/util.hpp b/examples/api1x_core/legacy-encode/src/util.hpp
index 1d64b31..d35e0ef 100644
--- a/examples/api1x_core/legacy-encode/src/util.hpp
+++ b/examples/api1x_core/legacy-encode/src/util.hpp
@@ -30,7 +30,7 @@ enum {
#include "vpl/mfxdispatcher.h"
#endif
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <fcntl.h>
#include <unistd.h>
#endif
diff --git a/examples/api1x_core/legacy-vpp/src/util.hpp b/examples/api1x_core/legacy-vpp/src/util.hpp
index 1d64b31..d35e0ef 100644
--- a/examples/api1x_core/legacy-vpp/src/util.hpp
+++ b/examples/api1x_core/legacy-vpp/src/util.hpp
@@ -30,7 +30,7 @@ enum {
#include "vpl/mfxdispatcher.h"
#endif
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <fcntl.h>
#include <unistd.h>
#endif
diff --git a/examples/api2x/hello-decode/src/util.hpp b/examples/api2x/hello-decode/src/util.hpp
index 1d64b31..d35e0ef 100644
--- a/examples/api2x/hello-decode/src/util.hpp
+++ b/examples/api2x/hello-decode/src/util.hpp
@@ -30,7 +30,7 @@ enum {
#include "vpl/mfxdispatcher.h"
#endif
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <fcntl.h>
#include <unistd.h>
#endif
diff --git a/examples/api2x/hello-decvpp/src/util.hpp b/examples/api2x/hello-decvpp/src/util.hpp
index 1d64b31..d35e0ef 100644
--- a/examples/api2x/hello-decvpp/src/util.hpp
+++ b/examples/api2x/hello-decvpp/src/util.hpp
@@ -30,7 +30,7 @@ enum {
#include "vpl/mfxdispatcher.h"
#endif
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <fcntl.h>
#include <unistd.h>
#endif
diff --git a/tools/cli/system_analyzer/system_analyzer.cpp b/tools/cli/system_analyzer/system_analyzer.cpp
index 6b6f712..534baa5 100644
--- a/tools/cli/system_analyzer/system_analyzer.cpp
+++ b/tools/cli/system_analyzer/system_analyzer.cpp
@@ -14,11 +14,11 @@
#include <vector>
#include "vpl/mfx.h"
-#ifdef __linux__
+#if defined(__linux__) || defined(__FreeBSD__)
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
- #include "dlfcn.h"
+ #include <dlfcn.h>
#include "va/va.h"
#include "va/va_drm.h"
#endif
diff --git a/tools/legacy/sample_common/CMakeLists.txt b/tools/legacy/sample_common/CMakeLists.txt
index df15a4f..86f214f 100644
--- a/tools/legacy/sample_common/CMakeLists.txt
+++ b/tools/legacy/sample_common/CMakeLists.txt
@@ -4,7 +4,7 @@
# SPDX-License-Identifier: MIT
# ##############################################################################
set(TOOLS_DEFAULT ON)
-if(CMAKE_SYSTEM_NAME MATCHES Linux)
+if(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD")
# Check dependencies up-front so we can set option defaults
find_package(PkgConfig REQUIRED)
# note: pkg-config version for libva is *API* version
@@ -161,7 +161,7 @@ if(BUILD_TOOLS_ONEVPL_EXPERIMENTAL)
target_compile_definitions(${TARGET} PUBLIC -DONEVPL_EXPERIMENTAL)
endif()
-if(CMAKE_SYSTEM_NAME MATCHES Linux)
+if(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD")
target_compile_definitions(${TARGET} PUBLIC LINUX64)
if(NOT ENABLE_VA)
diff --git a/tools/legacy/sample_common/include/base_allocator.h b/tools/legacy/sample_common/include/base_allocator.h
index 693807b..c833e53 100644
--- a/tools/legacy/sample_common/include/base_allocator.h
+++ b/tools/legacy/sample_common/include/base_allocator.h
@@ -156,8 +156,7 @@ protected:
std::list<mfxFrameAllocResponse> m_responses;
std::list<UniqueResponse> m_ExtResponses;
- struct IsSame
- : public std::binary_function<mfxFrameAllocResponse, mfxFrameAllocResponse, bool> {
+ struct IsSame {
bool operator()(const mfxFrameAllocResponse& l, const mfxFrameAllocResponse& r) const {
return r.mids != 0 && l.mids != 0 && r.mids[0] == l.mids[0] &&
r.NumFrameActual == l.NumFrameActual;
diff --git a/tools/legacy/sample_common/src/base_allocator.cpp b/tools/legacy/sample_common/src/base_allocator.cpp
index fccb808..39fb255 100644
--- a/tools/legacy/sample_common/src/base_allocator.cpp
+++ b/tools/legacy/sample_common/src/base_allocator.cpp
@@ -162,9 +162,10 @@ mfxStatus BaseFrameAllocator::FreeFrames(mfxFrameAllocResponse* response) {
mfxStatus sts = MFX_ERR_NONE;
// check whether response is an external decoder response
- std::list<UniqueResponse>::iterator i = std::find_if(m_ExtResponses.begin(),
- m_ExtResponses.end(),
- std::bind1st(IsSame(), *response));
+ std::list<UniqueResponse>::iterator i = std::find_if(
+ m_ExtResponses.begin(),
+ m_ExtResponses.end(),
+ [&](const UniqueResponse& res) { return IsSame()(*response, res); });
if (i != m_ExtResponses.end()) {
if ((--i->m_refCount) == 0) {
@@ -176,7 +177,9 @@ mfxStatus BaseFrameAllocator::FreeFrames(mfxFrameAllocResponse* response) {
// if not found so far, then search in internal responses
std::list<mfxFrameAllocResponse>::iterator i2 =
- std::find_if(m_responses.begin(), m_responses.end(), std::bind1st(IsSame(), *response));
+ std::find_if(m_responses.begin(),
+ m_responses.end(),
+ [&](const mfxFrameAllocResponse& res) { return IsSame()(*response, res); });
if (i2 != m_responses.end()) {
sts = ReleaseResponse(response);
diff --git a/tools/legacy/sample_common/src/vm/thread_linux.cpp b/tools/legacy/sample_common/src/vm/thread_linux.cpp
index cf3fa9a..b220bd4 100644
--- a/tools/legacy/sample_common/src/vm/thread_linux.cpp
+++ b/tools/legacy/sample_common/src/vm/thread_linux.cpp
@@ -283,12 +283,16 @@ mfxStatus msdk_thread_get_schedtype(const msdk_char* str, mfxI32& type) {
else if (!msdk_strcmp(str, MSDK_STRING("other"))) {
type = SCHED_OTHER;
}
+#ifdef SCHED_BATCH
else if (!msdk_strcmp(str, MSDK_STRING("batch"))) {
type = SCHED_BATCH;
}
+#endif
+#ifdef SCHED_IDLE
else if (!msdk_strcmp(str, MSDK_STRING("idle"))) {
type = SCHED_IDLE;
}
+#endif
// else if (!msdk_strcmp(str, MSDK_STRING("deadline"))) {
// type = SCHED_DEADLINE;
// }
diff --git a/tools/legacy/sample_common/src/vpl_implementation_loader.cpp b/tools/legacy/sample_common/src/vpl_implementation_loader.cpp
index e54b3fe..18d42f1 100644
--- a/tools/legacy/sample_common/src/vpl_implementation_loader.cpp
+++ b/tools/legacy/sample_common/src/vpl_implementation_loader.cpp
@@ -9,7 +9,7 @@
#include "sample_utils.h"
#include "vpl/mfxdispatcher.h"
-#if defined(LINUX32) || defined(LINUX64)
+#if defined(LINUX32) || defined(LINUX64) || defined(__linux__) || defined(__FreeBSD__)
#include <link.h>
#include <string.h>
#else
@@ -587,7 +587,7 @@ mfxStatus MainVideoSession::PrintLibInfo(VPLImplementationLoader* Loader) {
}
// Module Name
-#if (defined(LINUX32) || defined(LINUX64))
+#if defined(LINUX32) || defined(LINUX64) || defined(__linux__) || defined(__FreeBSD__)
#ifdef ONEVPL_EXPERIMENTAL
msdk_printf(MSDK_STRING(" DRMRenderNodeNum: %d \n"), Loader->GetDRMRenderNodeNumUsed());
#endif
diff --git a/tools/legacy/sample_misc/wayland/CMakeLists.txt b/tools/legacy/sample_misc/wayland/CMakeLists.txt
index 471bcd9..9d6da16 100644
--- a/tools/legacy/sample_misc/wayland/CMakeLists.txt
+++ b/tools/legacy/sample_misc/wayland/CMakeLists.txt
@@ -109,8 +109,12 @@ if(PKGConfig_LIBDRM_FOUND)
)
endif()
- target_link_libraries(${TARGET} PRIVATE sample_common wayland-client va drm
- drm_intel)
+ target_link_libraries(
+ ${TARGET}
+ PRIVATE sample_common
+ PkgConfig::PKG_WAYLAND_CLIENT
+ PkgConfig::PKG_LIBVA
+ PkgConfig::PKGConfig_LIBDRM)
install(TARGETS ${TARGET}
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}"
I was kinda playing around with this to see if I could get something closer to what I need (2.9) to build on FreeBSD, currently the best one I can get is like 1.5 from 2022 from ports, but it actually wasn't too much work. FreeBSD uses
onevpl before it was renamed I guess,
/usr/ports/multimedia/onevploneVPL-2022.1.5/I need something a little bit newer for OBS (to build the qsv driver): I could potentially build an older version of obs but not really because old QT vs new QT problems before 30 and the latest is 32 so I figured what the hell, this could be interesting. I guess I'll see if it works but I thought I'd give you a heads up incase I never get that far. Lately they've been wanting to improve the FreeBSD landscape a bit and make it more suitable for laptops which if you ask me like if you don't have things which use the graphics pipeline it's a wonder how you're getting any life out of your battery. I don't think even Linux handles using the graphics piplines for encode/decode very well (most of the time I have to find and install something that isn't part of any normal user experience as you might expect.)
Anyway I will test this and mess with it some more when I get chance (it does at least build now)
* (HEAD detached at v2023.2.0)