diff --git a/cmake/Modules/FindLibsysinfo.cmake b/cmake/Modules/FindLibsysinfo.cmake new file mode 100644 index 000000000..b1b176e8c --- /dev/null +++ b/cmake/Modules/FindLibsysinfo.cmake @@ -0,0 +1,24 @@ +# Once done these will be defined: +# +# SYSINFO_FOUND +# SYSINFO_INCLUDE_DIRS +# SYSINFO_LIBRARIES + +find_path(SYSINFO_INCLUDE_DIR + NAMES sys/sysinfo.h + PATHS + /usr/include /usr/local/include /opt/local/include) + +find_library(SYSINFO_LIB + NAMES sysinfo libsysinfo + PATHS + /usr/lib /usr/local/lib /opt/local/lib) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(sysinfo DEFAULT_MSG SYSINFO_LIB SYSINFO_INCLUDE_DIR) +mark_as_advanced(SYSINFO_INCLUDE_DIR SYSINFO_LIB) + +if(SYSINFO_FOUND) + set(SYSINFO_INCLUDE_DIRS ${SYSINFO_INCLUDE_DIR}) + set(SYSINFO_LIBRARIES ${SYSINFO_LIB}) +endif() diff --git a/deps/glad/CMakeLists.txt b/deps/glad/CMakeLists.txt index 95d80762d..0fe6a937b 100644 --- a/deps/glad/CMakeLists.txt +++ b/deps/glad/CMakeLists.txt @@ -43,8 +43,13 @@ endif() if(NOT WIN32 AND NOT APPLE) set(glad_PLATFORM_DEPS - -ldl ${X11_X11_LIB}) + # only link to libdl on linux + if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(glad_PLATFORM_DEPS + ${glad_PLATFORM_DEPS} + -ldl) + endif() endif() target_link_libraries(glad diff --git a/deps/jansson/CMakeLists.txt b/deps/jansson/CMakeLists.txt index 194404b0a..fc26dc8bd 100644 --- a/deps/jansson/CMakeLists.txt +++ b/deps/jansson/CMakeLists.txt @@ -95,7 +95,7 @@ if (MSVC) endif() -if (NOT WIN32 AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)) +if (NOT WIN32 AND NOT APPLE) set(CMAKE_C_FLAGS "-fPIC") endif() diff --git a/libobs/CMakeLists.txt b/libobs/CMakeLists.txt index cd8131b8c..99817f758 100644 --- a/libobs/CMakeLists.txt +++ b/libobs/CMakeLists.txt @@ -77,6 +77,15 @@ elseif(UNIX) util/threading-posix.c util/pipe-posix.c util/platform-nix.c) + + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + # use the sysinfo compatibility library on bsd + find_package(Libsysinfo REQUIRED) + include_directories(${SYSINFO_INCLUDE_DIRS}) + set(libobs_PLATFORM_DEPS + ${libobs_PLATFORM_DEPS} + ${SYSINFO_LIBRARIES}) + endif() endif() if(MSVC) diff --git a/libobs/graphics/graphics.h b/libobs/graphics/graphics.h index 4c5188cd5..c50fa5b40 100644 --- a/libobs/graphics/graphics.h +++ b/libobs/graphics/graphics.h @@ -426,7 +426,7 @@ struct gs_window { void *hwnd; #elif defined(__APPLE__) __unsafe_unretained id view; -#elif defined(__linux__) +#elif defined(__linux__) || defined(__FreeBSD__) /* I'm not sure how portable defining id to uint32_t is. */ uint32_t id; void* display; diff --git a/libobs/obs-nix.c b/libobs/obs-nix.c index 34dcc7e0f..4a48b0aaf 100644 --- a/libobs/obs-nix.c +++ b/libobs/obs-nix.c @@ -16,6 +16,10 @@ along with this program. If not, see . ******************************************************************************/ +#ifdef __FreeBSD__ +#define _WITH_GETLINE +#endif + #include #include #include diff --git a/libobs/util/platform-nix.c b/libobs/util/platform-nix.c index efdc615f2..a9762c102 100644 --- a/libobs/util/platform-nix.c +++ b/libobs/util/platform-nix.c @@ -26,7 +26,6 @@ #if !defined(__APPLE__) #include -#include #endif #include "darray.h" diff --git a/libobs/util/threading-posix.c b/libobs/util/threading-posix.c index 720cfbc07..a36010093 100644 --- a/libobs/util/threading-posix.c +++ b/libobs/util/threading-posix.c @@ -26,6 +26,10 @@ #include #endif +#if defined(__FreeBSD__) +#include +#endif + #include "bmem.h" #include "threading.h" @@ -256,6 +260,8 @@ void os_set_thread_name(const char *name) { #if defined(__APPLE__) pthread_setname_np(name); +#elif defined(__FreeBSD__) + pthread_set_name_np(pthread_self(), name); #elif !defined(__MINGW32__) pthread_setname_np(pthread_self(), name); #endif diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp index 6e2fd9561..98e62a5e0 100644 --- a/obs/obs-app.cpp +++ b/obs/obs-app.cpp @@ -357,6 +357,8 @@ string OBSApp::GetVersionString() const ver << "windows)"; #elif __APPLE__ ver << "mac)"; +#elif __FreeBSD__ + ver << "freebsd)"; #else /* assume linux for the time being */ ver << "linux)"; #endif diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 349575436..383776f7a 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -15,6 +15,11 @@ elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") add_subdirectory(linux-v4l2) add_subdirectory(linux-jack) add_subdirectory(decklink/linux) +elseif("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD") + add_subdirectory(linux-capture) + add_subdirectory(linux-pulseaudio) + add_subdirectory(linux-v4l2) + add_subdirectory(linux-jack) endif() add_subdirectory(image-source) diff --git a/plugins/linux-jack/CMakeLists.txt b/plugins/linux-jack/CMakeLists.txt index 4ac17cbf9..aac7a8db6 100644 --- a/plugins/linux-jack/CMakeLists.txt +++ b/plugins/linux-jack/CMakeLists.txt @@ -13,7 +13,10 @@ elseif(NOT JACK_FOUND) return() endif() -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +include_directories( + SYSTEM "${CMAKE_SOURCE_DIR}/libobs" + ${JACK_INCLUDE_DIR} +) set(linux-jack_SOURCES linux-jack.c diff --git a/plugins/linux-pulseaudio/CMakeLists.txt b/plugins/linux-pulseaudio/CMakeLists.txt index 7f6eca61b..ae9ad805c 100644 --- a/plugins/linux-pulseaudio/CMakeLists.txt +++ b/plugins/linux-pulseaudio/CMakeLists.txt @@ -13,7 +13,10 @@ elseif(NOT PULSEAUDIO_FOUND) return() endif() -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +include_directories( + SYSTEM "${CMAKE_SOURCE_DIR}/libobs" + ${PULSEAUDIO_INCLUDE_DIR} +) set(linux-pulseaudio_SOURCES linux-pulseaudio.c diff --git a/plugins/linux-v4l2/CMakeLists.txt b/plugins/linux-v4l2/CMakeLists.txt index a466c818c..a310d5def 100644 --- a/plugins/linux-v4l2/CMakeLists.txt +++ b/plugins/linux-v4l2/CMakeLists.txt @@ -24,6 +24,11 @@ else() add_definitions(-DHAVE_UDEV) endif() +include_directories( + SYSTEM "${CMAKE_SOURCE_DIR}/libobs" + ${LIBV4L2_INCLUDE_DIRS} +) + set(linux-v4l2_SOURCES linux-v4l2.c v4l2-input.c diff --git a/plugins/linux-v4l2/v4l2-helpers.c b/plugins/linux-v4l2/v4l2-helpers.c index d468b9011..97ec3aa73 100644 --- a/plugins/linux-v4l2/v4l2-helpers.c +++ b/plugins/linux-v4l2/v4l2-helpers.c @@ -240,7 +240,7 @@ int_fast32_t v4l2_set_standard(int_fast32_t dev, int *standard) int_fast32_t v4l2_enum_dv_timing(int_fast32_t dev, struct v4l2_dv_timings *dvt, int index) { -#ifndef VIDIOC_ENUM_DV_TIMINGS +#if !defined(VIDIOC_ENUM_DV_TIMINGS) || !defined(V4L2_IN_CAP_DV_TIMINGS) UNUSED_PARAMETER(dev); UNUSED_PARAMETER(dvt); UNUSED_PARAMETER(index); diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c index 422306262..0ef8d572c 100644 --- a/plugins/linux-v4l2/v4l2-input.c +++ b/plugins/linux-v4l2/v4l2-input.c @@ -43,7 +43,7 @@ along with this program. If not, see . /* The new dv timing api was introduced in Linux 3.4 * Currently we simply disable dv timings when this is not defined */ -#ifndef VIDIOC_ENUM_DV_TIMINGS +#if !defined(VIDIOC_ENUM_DV_TIMINGS) || !defined(V4L2_IN_CAP_DV_TIMINGS) #define V4L2_IN_CAP_DV_TIMINGS 0 #endif @@ -269,7 +269,11 @@ static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings) size_t cur_device_index; const char *cur_device_name; +#ifdef __FreeBSD__ + dirp = opendir("/dev"); +#else dirp = opendir("/sys/class/video4linux"); +#endif if (!dirp) return; @@ -285,6 +289,11 @@ static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings) uint32_t caps; struct v4l2_capability video_cap; +#ifdef __FreeBSD__ + if (strstr(dp->d_name, "video") == NULL) + continue; +#endif + if (dp->d_type == DT_DIR) continue; @@ -949,7 +958,7 @@ static void *v4l2_create(obs_data_t *settings, obs_source_t *source) #ifndef V4L2_CAP_DEVICE_CAPS blog(LOG_WARNING, "Plugin built without device caps support!"); #endif -#ifndef VIDIOC_ENUM_DV_TIMINGS +#if !defined(VIDIOC_ENUM_DV_TIMINGS) || !defined(V4L2_IN_CAP_DV_TIMINGS) blog(LOG_WARNING, "Plugin built without dv-timing support!"); #endif