diff --git a/multimedia/obs-studio/Makefile b/multimedia/obs-studio/Makefile index 9336e33d7833..31c69cff2ad7 100644 --- a/multimedia/obs-studio/Makefile +++ b/multimedia/obs-studio/Makefile @@ -1,110 +1,110 @@ PORTNAME= obs-studio DISTVERSION= 27.0.1 -PORTREVISION= 3 +PORTREVISION= 4 CATEGORIES= multimedia MAINTAINER= yuri@FreeBSD.org COMMENT= Open source streaming/recording software LICENSE= GPLv2+ LICENSE_FILE= ${WRKSRC}/COPYING BROKEN_i386= https://github.com/obsproject/obs-browser/issues/241 BUILD_DEPENDS= v4l_compat>=0:multimedia/v4l_compat \ swig:devel/swig LIB_DEPENDS= libavcodec.so:multimedia/ffmpeg \ libcurl.so:ftp/curl \ libdbus-1.so:devel/dbus \ libfdk-aac.so:audio/fdk-aac \ libfontconfig.so:x11-fonts/fontconfig \ libfreetype.so:print/freetype2 \ libjansson.so:devel/jansson \ libmbedtls.so:security/mbedtls \ libspeexdsp.so:audio/speexdsp \ libsysinfo.so:devel/libsysinfo \ libudev.so:devel/libudev-devd \ libv4l2.so:multimedia/libv4l \ libvlc.so:multimedia/vlc \ libwayland-client.so:graphics/wayland \ libx264.so:multimedia/libx264 \ libxcb-ewmh.so:x11/xcb-util-wm \ libxcb-image.so:x11/xcb-util-image \ libxcb-keysyms.so:x11/xcb-util-keysyms \ libxcb-render-util.so:x11/xcb-util-renderutil \ libxcb-util.so:x11/xcb-util \ ${LIB_DEPENDS_${ARCH}} LIB_DEPENDS_amd64= libluajit-5.1.so:lang/luajit LIB_DEPENDS_armv7= libluajit-5.1.so:lang/luajit LIB_DEPENDS_i386= libluajit-5.1.so:lang/luajit LIB_DEPENDS_powerpc= libluajit-5.1.so:lang/luajit LIB_DEPENDS_powerpc64= libluajit-5.1.so:lang/luajit-openresty LIB_DEPENDS_powerpc64le= libluajit-5.1.so:lang/luajit-openresty USES= cmake compiler:c++17-lang gl gnome lua pkgconfig python:3.4+ \ qt:5 xorg USE_QT= core gui svg widgets x11extras xml buildtools_build imageformats_run qmake_build USE_GNOME= glib20 USE_GL= gl USE_XORG= ice sm x11 xcb xcomposite xext xfixes xinerama xrandr USE_LDCONFIG= yes USE_GITHUB= yes GH_ACCOUNT= obsproject GH_TUPLE= obsproject:obs-browser:f1a61c5:obs_browser/plugins/obs-browser \ obsproject:obs-vst:aaa7b7f:obs_vst/plugins/obs-vst CMAKE_ON= UNIX_STRUCTURE CMAKE_OFF= ENABLE_PIPEWIRE # beginning with 27.0.1 (PR#4287) the linux-capture plugin optionally requires the piperware library and in this case expects the linux/dma-buf.h header CMAKE_ARGS= -DOBS_VERSION_OVERRIDE:STRING="${PORTVERSION}" LDFLAGS+= -fPIC # pending https://github.com/obsproject/obs-studio/issues/3436 OPTIONS_DEFINE= BROWSER VST OPTIONS_DEFAULT= VST OPTIONS_MULTI= AUDIO OPTIONS_MULTI_AUDIO= JACK PULSEAUDIO SNDIO OPTIONS_DEFAULT+= JACK PULSEAUDIO SNDIO OPTIONS_SUB= yes AUDIO_DESC= Audio backends BROWSER_DESC= Build OSB browser BROWSER_CMAKE_BOOL= BUILD_BROWSER BROWSER_BROKEN= Needs CEF (Chromium Embedded Framework) which isn't yet ported JACK_LIB_DEPENDS= libjack.so:audio/jack JACK_CMAKE_ON= -DENABLE_JACK=TRUE JACK_CMAKE_OFF= -DDISABLE_JACK=TRUE PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio PULSEAUDIO_CMAKE_ON= -DENABLE_PULSEAUDIO=TRUE PULSEAUDIO_CMAKE_OFF= -DDISABLE_PULSEAUDIO=TRUE PULSEAUDIO_BROKEN_OFF= https://github.com/obsproject/obs-studio/issues/4025 SNDIO_LIB_DEPENDS= libsndio.so:audio/sndio SNDIO_CMAKE_ON= -DENABLE_SNDIO=TRUE SNDIO_CMAKE_OFF= -DDISABLE_SNDIO=TRUE VST_DESC= Build VST submodule VST_CMAKE_BOOL= BUILD_VST .include .if ${ARCH} != amd64 && ${ARCH} != armv7 && ${ARCH} != i386 && ${ARCH} != powerpc && ${ARCH} != powerpc64 PLIST_SUB+= LUAJIT="@comment " .else PLIST_SUB+= LUAJIT="" .endif post-patch: @${REINPLACE_CMD} -e 's| 3.4)| ${PYTHON_VER})|' \ ${WRKSRC}/cmake/Modules/FindPythonDeps.cmake post-install: # https://github.com/obsproject/obs-studio/issues/2625 ${INSTALL_DATA} ${WRKSRC}/UI/obs-frontend-api/obs-frontend-api.h ${STAGEDIR}${PREFIX}/include/obs # https://github.com/obsproject/obs-studio/issues/2647 (only for multimedia/obs-audio-spectralizer, should be removed later) ${INSTALL_DATA} ${WRKSRC}/cmake/Modules/ObsHelpers.cmake ${STAGEDIR}${PREFIX}/lib/cmake ${INSTALL_DATA} ${WRKSRC}/cmake/external/ObsPluginHelpers.cmake ${STAGEDIR}${PREFIX}/lib/cmake .include diff --git a/multimedia/obs-studio/files/patch-plugins_linux-v4l2_v4l2-output.c b/multimedia/obs-studio/files/patch-plugins_linux-v4l2_v4l2-output.c new file mode 100644 index 000000000000..0c1120159c0c --- /dev/null +++ b/multimedia/obs-studio/files/patch-plugins_linux-v4l2_v4l2-output.c @@ -0,0 +1,109 @@ +- backport patch for OBS Studio Virtual Camera on FreeBSD +- see https://www.davidschlachter.com/misc/freebsd-obs-virtualcam + +diff --git plugins/linux-v4l2/v4l2-output.c b/plugins/linux-v4l2/v4l2-output.c +index 05ac70b42f0..0ddd3152384 100644 +--- plugins/linux-v4l2/v4l2-output.c ++++ plugins/linux-v4l2/v4l2-output.c +@@ -27,6 +27,7 @@ static void virtualcam_destroy(void *data) + bfree(data); + } + ++#ifdef __linux__ + static bool is_flatpak_sandbox(void) + { + static bool flatpak_info_exists = false; +@@ -98,6 +99,32 @@ static int loopback_module_load() + return run_command( + "pkexec modprobe v4l2loopback exclusive_caps=1 card_label='OBS Virtual Camera' && sleep 0.5"); + } ++#else ++bool loopback_module_available() ++{ ++ struct v4l2_capability capability; ++ char new_device[16]; ++ int fd; ++ int i; ++ ++ for (i = 0; i != MAX_DEVICES; i++) { ++ snprintf(new_device, 16, "/dev/video%d", i); ++ fd = open(new_device, O_RDWR); ++ if (fd < 0) ++ continue; ++ if (ioctl(fd, VIDIOC_QUERYCAP, &capability) < 0) { ++ close(fd); ++ continue; ++ } ++ if (capability.capabilities & V4L2_CAP_VIDEO_OUTPUT) { ++ close(fd); ++ return true; ++ } ++ close(fd); ++ } ++ return false; ++} ++#endif + + static void *virtualcam_create(obs_data_t *settings, obs_output_t *output) + { +@@ -131,13 +158,19 @@ static bool try_connect(void *data, int device) + if (vcam->device < 0) + return false; + +- if (ioctl(vcam->device, VIDIOC_QUERYCAP, &capability) < 0) ++ if (ioctl(vcam->device, VIDIOC_QUERYCAP, &capability) < 0) { ++ close(vcam->device); ++ vcam->device = -1; + return false; ++ } + + format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + +- if (ioctl(vcam->device, VIDIOC_G_FMT, &format) < 0) ++ if (ioctl(vcam->device, VIDIOC_G_FMT, &format) < 0) { ++ close(vcam->device); ++ vcam->device = -1; + return false; ++ } + + struct obs_video_info ovi; + obs_get_video_info(&ovi); +@@ -149,16 +182,22 @@ static bool try_connect(void *data, int device) + parm.parm.output.timeperframe.numerator = ovi.fps_den; + parm.parm.output.timeperframe.denominator = ovi.fps_num; + +- if (ioctl(vcam->device, VIDIOC_S_PARM, &parm) < 0) ++ if (ioctl(vcam->device, VIDIOC_S_PARM, &parm) < 0) { ++ close(vcam->device); ++ vcam->device = -1; + return false; ++ } + + format.fmt.pix.width = width; + format.fmt.pix.height = height; + format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; + format.fmt.pix.sizeimage = vcam->frame_size; + +- if (ioctl(vcam->device, VIDIOC_S_FMT, &format) < 0) ++ if (ioctl(vcam->device, VIDIOC_S_FMT, &format) < 0) { ++ close(vcam->device); ++ vcam->device = -1; + return false; ++ } + + struct video_scale_info vsi = {0}; + vsi.format = VIDEO_FORMAT_YUY2; +@@ -176,11 +215,12 @@ static bool virtualcam_start(void *data) + { + struct virtualcam_data *vcam = (struct virtualcam_data *)data; + ++#ifdef __linux__ + if (!loopback_module_loaded()) { + if (loopback_module_load() != 0) + return false; + } +- ++#endif + for (int i = 0; i < MAX_DEVICES; i++) { + if (!try_connect(vcam, i)) + continue;