Soon to be updated obs-deps built on CI will retain CMake package files
created while building dependencies. When CMake uses packages, the usual
triplet of variables from finders are not set. `CopyMSVCBins` relies
on one such variable.
This PR sets the `CURL_INCLUDE_DIR` if the cURL target is present, but
apparently imported as a CMake package, to ensure prior functionality is
restored.
PIPEWIRE_DEFINITIONS contains ready-to-use compile flags. If used with
INTERFACE_COMPILE_DEFINITIONS, this can lead to a compile error.
Rename the variable to PIPEWIRE_COMPILE_FLAGS to be clear about that and
prevent accidental misuse.
If WAYLAND_DEFINITIONS is set to "-I/usr/include/wayland", setting its
value as INTERFACE_COMPILE_DEFINITION leads to CMake emitting
"-D-I/usr/include/wayland" in the compiler flags. This breaks the
compilation of targets that call find_package(Wayland), such as libobs
and libobs-opengl, in gcc.
To avoid this, rename WAYLAND_DEFINITIONS to WAYLAND_COMPILE_FLAGS to
reflect that it contains ready-to-use compiler flags. Use
WAYLAND_COMPILE_FLAGS as INTERFACE_COMPILE_OPTIONS so it just gets
appended without adding the superfluous "-D".
Makes the check for the number of plugins in the global list an explicit
length check (not relying on CMake implicit functionality), also moves
it in line with how the same was solved in `ObsHelpers.cmake` globally.
The `add_target_resource` function uses unnecessary path components
when copying files to the rundir, resulting in files added that way
not to end up where OBS expects them to.
The generated binaries created by sub-targets also need to be copied
as part of `win-capture`'s data files, which was easy to fix as the
target exists before CMake switches into the subdirectories.
When using `install`, CMake will fix up a binary's rpath entries
automatically. As `install` is also used to copy all build artifacts
into a common runtime directory, this will lead to independent binaries
such as "obs-ffmpeg-mux" to be fixed up to run within a fully portable
app bundle.
Yet during development, the app bundle is not fully portable, so rpath
entries to e.g. libobs need to be retained. Using CMake's
`install PROGRAMS` variant will achieve just that.
Status output related to OBS configuration is prefixed with the string
"OBS" and added padding for enabled and disabled features. This padding
was not aligned between platforms.
By moving the padding and prefix decoration into its own function,
both elements are controlled in a single place. CMake scripts were
changed to use this new function `obs_status` instead of using CMake's
`message` function directly.
obs-plugintemplate uses the `obs_libraries` component to install
obs components required for plugin development. The need of the separate
`pdbs` directory was removed a while ago (as PDB target installation
can be flagged as `OPTIONAL` and enabled for specific configurations
only). This part was overlooked in that change.
Windows and Linux do not require a contained application bundle to run
and debug OBS - as such targets can and should be copied independently
from the main OBS application target.
Also silences the output of the `install` step that sets up those files.
Users on Wayland are displeased that they cannot see their hotkey
bindings. This enables key reporting like X11, and has the infrastructure
in place in case Wayland ever decides to allow for capturing input.
* aja: Initial commit of AJA capture/output plugin
* aja: Fix clang-format on aja-output-ui code
* aja: Remove script used during dev/testing
* aja: Address pull request feedback from @RytoEX
* aja: Remove the SDK sources and update CMakeLists to point to new headers-only/static libs dependency distribution.
* aja: Only build AJA plugin on x64 on macOS for now
* aja: Remove the non-English placeholder locale files. The english strings/files will be produced via crowdin, according to @ddrboxman.
* aja: Add FindLibAJANTV2.cmake script to locate the ajantv2 headers and static libs in the OBS external deps package(s). Tested on Windows x64. macOS and Linux x64 TBD.
* aja: Add ajantv2/includes to FindLibAJANTV2 include search paths
* aja: Remove commented code from aja CMakeLists
* aja: Remove debug code and comments that are no longer needed.
* aja: Fix indentation
* aja: Remove disablement of clang-format in routing table and SDIWireFormat map
* aja: Use spaces for all indentation in widget crosspoint arrays where we disable clang-format
* aja: Address code style comments made by @RytoEX
* aja: Fix uneven indentation
* aja: More fixes to if/else placement and remove superfluous comments.
* aja: Rename 'dwns' to 'deactivateWhileNotShowing' for clarity. The DeckLink plugin still uses the variable name 'dwns' and should be changed, if desired, in a separate PR.
* aja: Remove X11Extras dependency from AJA Output frontend plugin
* aja: Add patch from Jim to find AJA release/debug libs
* aja: Improve AV sync of queued video/audio sent to the AJA card in the AJA Output plugin.
We require libdrm for its header so add the cmake module and header path
to the build. We don't need to link libdrm though so we dont add it to
libraries.
During CMake configuration for 64-bit builds, CopyMSVCBins.cmake would
copy plugins/imageformats/qsvg.dll from the Qt directory to
additional_install_files/exec64r/imageformats/qsvg.dll (exec32r for
32-bit builds). However, it would copy plugins/iconengines/qsvgicond.dll
to the corresponding debug imageformats files location,
additional_install_files/exec64d/imageformats/qsvgicond.dll (or exec32d
for 32-bit). This appears to have been a simple copy-paste mistake.
Let's copy plugins/imageformats/qsvgd.dll instead.
These local copies of CheckForPthreads.c and FindThreads.cmake override
the ones included with CMake. These versions create CMake::Threads, but
Qt6 expects Threads::Threads created by CMake 3.1+. These local versions
seem to be based on old copies from CMake from late 2014 with some
customizations. Let's just use the built-in ones that CMake ships.
This commit also changes CMakeLists.txt files in UI and libobs to
require and link to Threads::Threads.
Co-authored-by: Kurt Kartaltepe <kkartaltepe@gmail.com>
Since CMake 3.17, find_package_handle_standard_args (FPHSA) will emit a
warning if the package name in the caller and in FPHSA do not match.
This normalizes the name "Detours" in CMake calls to prevent this
warning.
FindJack was not using _INCLUDE_DIRS and _LIBRARY_DIRS set by
FindPkgConfig, which prevented it from locating the PipeWire
version of libjack when it is installed to a non-standard path.
In particular, this impacts Fedora Linux, which is the first
distribution to have made the change to have all audio routed
through PipeWire and eliminate the usage of PulseAudio and JACK
by default.
Reference: https://fedoraproject.org/wiki/Changes/DefaultPipeWire
These files have been superseded by files in CI/scripts/macos. They are
no longer used, and keeping them around creates confusion and makes
people think they are still used. Let's remove them to prevent further
confusion.
This commit also removes the CMake function `obs_finish_bundle` that was
only used with the osxbundle resources and removes calls to that
function.
Fixes an issue where on macOS the app’s Info window in Finder would say
"Version: OBS - Free and Open Source Streaming/Recording Software"
instead of the version set in CFBundleShortVersionString.
Since CFBundleGetInfoString is deprecated anyways, it can safely be
removed.
Helps ensure DLLs associated with game capture, virtual camera, and
other such files have their PDBs copied alongside them in any Windows
build, and allows the ability to trace crashes that may occur from
within those files more easily.
If someone tries to build without git they need to set
OBS_VERSION_OVERRIDE, this makes the error message occur before things
like string parsing on the OBS_VERSION which look like missing
parameters.
Add a new Linux capture based on PipeWire [1] and the Desktop portal [2].
This new capture starts by asking the Desktop portal for a screencapture session.
There are quite a few D-Bus calls involved in this, but the key points are:
1. A connection to org.freedesktop.portal.ScreenCast is estabilished, and the
available cursor modes are updated.
2. CreateSession() is called. This is the first step of the negotiation.
3. SelectSources() is called. This is when a system dialog pops up asking the
user to either select a monitor (desktop capture) or a window (window capture).
4. Start() is called. This signals the compositor that it can setup a PipeWire
stream, and start sending buffers.
The reply to this fourth call gives OBS Studio the PipeWire fd, and the id of the
PipeWire node where the buffers are being sent to. This allows creating a consumer
PipeWire stream, and receive the buffers.
Metadata cursor is always preferred, but on the lack of it, we ask the stream for
an embedded cursor (i.e. the cursor is drawn at the buffer, and OBS Studio has no
control over it.)
Window capturing is implemented as a crop operation on the buffer. Compositors
can send big buffers, and a crop rectangle, and this is used to paint a subregion
of the buffer in the scene.
The new capture is only loaded when running on EGL, since it depends on EGL to
call gs_texture_create_from_dmabuf().
[1] https://pipewire.org/
[2] https://github.com/flatpak/xdg-desktop-portal/
GDBus is more and better maintained than libdbus these days. In the
future, a potential Wayland-compatible capture plugin will need to
interact with D-Bus in a way that's way too complicated for libdbus,
and it won't be nice to have both libraries talking to the D-Bus
socket.
Replace the libdbus usage by GDBus. As it turns out, it results in less
code.
A generally accepted path for DepsPath or LibfdkPath is the parent
directory that includes the 'bin' and 'include' directories. This fix
ensures FindLibfdk.cmake acts like other cmake helper scripts.
Closesobsproject/obs-studio#3474
Allows the ability to install extra data from a specific absolute path
rather than a path relative to the cmake current source dir. Useful if
say I want to generate data files in to the cmake binary folder rather
than put them in the data folder of the cmake source dir.
This commit adds support to using Xiph and Mozilla RNNoise library for
noise reduction.
RNNoise is a small library using an AI approach to noise reduction
using a pre-trained model like RTX Voice. But unlike RTX Voice, it is
very tiny, use CPU instead of GPU and only use little resources.
Obviously it is not as efficient but will effectively remove background
noise. It uses more CPU than the existing libspeex-based noise
reduction but it also sounds sounds way better.
RNNoise support is added to the noise reduction effect. It can be
enabled with a checkbox in the effect configuration. RNNoise has no
settings.
As of 3.17 using find_package_handle_standard_args checks that the name
of the FindXXX file and the first argument are the same case.
Some modules used non-standard variables or the old singular variables
instead of plurals. This normalizes variable usage to the new-style.
Some CMakeLists.txt did custom error checking instead of propagating
find_package errors. These were changes to call find_package with
REQUIRED or without QUIET where needed and shortens the custom status
messages. This helps users who want to enable that functionality see
what precisely wasnt found.
This implements OSS audio input capturing support for OSS-capable OSes.
FreeBSD and DragonFly (not yet tested on) supports are added as a
starting point.
As of 3.17 using find_package_handle_standard_args checks that the name
of the FindXXX file and the first argument are the same case.
Some modules used non-standard variables or the old singular variables
instead of plurals. This normalizes variable usage to the new-style.
Some CMakeLists.txt did custom error checking instead of propagating
find_package errors. These were changes to call find_package with
REQUIRED or without QUIET where needed and shortens the custom status
messages. This helps users who want to enable that functionality see
what precisely wasnt found.
The actual plugin files get copied to obs-scripting/ without the
64bit subdir like everything else on MacOs, fix this path accordingly
otherwise the scripting home dir passed to Python is incorrect
This diff adds mbedTLS support to the obs-outputs plugin. PolarSSL and
mbedTLS have grown so different between 2015-or-so when libRTMP was
written, and now it's no longer feasible to just use the USE_POLARSSL
flag.
This commit adds a WITH_RTMPS tri-state CMake variable (auto/on/off),
set to "Auto" by default. "Auto" will use RTMPS if mbedTLS is found,
otherwise will disable RTMPS. "On" will make it require mbedTLS,
otherwise fails configuration, and "Off" disables RTMPS support
altogether.
Closesobsproject/obs-studio#1360
Ubuntu 17.04 updated libxcb1-dev to 1.12 where xinput should be enabled
by default but debian disables it by default atm. Compile libxcb with
--enable-xinput to use this within obs. Arch enables it by default,
debian does not and fedora is untested.
Uses the 'install' command in cmake to install scripting modules/files
(such as _obspython.so, obslua.so, and obspython.py), and changes the
install location of those files on all operating systems. If using a
non-unix structure install, those files will be installed in
data/obs-scripting/[32bit/64bit], otherwise with unix structure installs
those files will be installed to [/usr/local/lib]/obs-scripting.
When setting up a build for the first time on windows, makes it so you
no longer have to run cmake twice: once to build, then once again with
the COPY_DEPENDENCIES box to ensure dependencies are copied.
Closesjp9000/obs-studio#768
Although FFmpeg is installed, OBS currently fails to build on debian
(tested on Debian Jessie 8.6). It looks for libavcodec.a in
/usr/local/lib and not /usr/lib.
Closesjp9000/obs-studio#661
For install_external_plugin_bin_to_data and
install_external_plugin_bin_to_arch_data, they were using the
'plugin_target' variable instead of just 'target' for the plugin
directory output location, and they were using 'target' instead of
'additional_target' for the data/binaries they were supposed to be
installing.
Adds the ability to add video playlists via libvlc instead of via the
media source. This is mostly just being added as a secondary option to
the media source to reduce maintenance costs and save time. Currently
libff cannot pause/unpause/seek, and isn't programmed to handle
playlists yet.
If VLC is installed on the computer (with the same architecture) it will
allow video playback via libVLC. In the future, users should be able to
optionally download VLC libraries via the installer as well if they
don't want to necessarily install VLC to get the plugin working.
This plugin performs runtime linking instead of compile-time linking;
compiling VLC is not required, only its headers are required. To
compile, clone the VLC repository and set the VLCPath cmake variable to
point to the VLC repository directory.
The DBus library is a message bus system used to make applications
communicate with each other. The primary reason for adding it is to
access certain service features to prevent computer sleep/hibernate/etc.
This will also create a HAVE_DBUS variable (set to 1 or 0 if found or
not found)
This allows people to use the base directory of cross-compiled
dependencies (typically our dependencies.zip file), rather than always
having to specify the actual include directory.
This addition allows external cmake modules to include the same modules
that are commonly distributed with the main obs-studio repo: things like
FFmpeg, curl, etc.
This cmake module adds various cmake functions used for generating obs
plugins. This currently may not fully support linux; this may require
more changes on linux due to the nature of the file structure linux
uses.
Fixes issues using DepsPath(32|64), was using ${lib_suffix} instead of
${_lib_suffix} so 32/64-sepcific directories wouldn't work properly.
Also the DepsPath environment/cmake variable wasn't specified for the
library search.
Also added the same dependency search paths for libfdk (if someone wants
to use it on windows for whatever reason)
Since we rely on the dynamic linker to find the library for us via
dlopen(), we need to have DL_OPENGL be .so.N, not the full library
filename, as ldconfig doesn't cache the full filename
Use of TARGET_SONAME_FILE requires the library to be marked as SHARED,
not MODULE
This closes pull request #370
Because libobs-opengl is a public library, it's customary to have SONAME
embedded in the library file. Also remove the prefix override and
remove the prefixing "lib" from the output name. This also requires us
to pass the library file name to dlopen invocations.
Copying this binary is kind of unnecessary because it's something that
everyone has as long as they update DirectX, and isn't something we can
distribute because it's a Microsoft DLL.
I actually did this because it makes it a bit easier to use with a
build from cross-compiled windows FFMpeg/x264 DLLs. When compiling on
linux I just have it compile to a custom prefix directory for the
specific windows arch, then I just copy the arch dir back to my windows
HD when complete. Adding this to the cmake allows me to use the compile
arch directories directly without modification.
This will hopefully help deal with a particular issue where the program
may go to sleep if it hasn't received input from the user for long
periods, or if a game is running in fullscreen mode apparently.
This uses fontconfig for looking up font files for freetype to use on
both linux and mac. It's apparently a bit more optimal and prevents us
from having to worry about the load time on the mac version as well.
Refactored and moved all the old code to the find-font-windows.c file,
as it's no longer used on anything but windows.
On fedora, the freetype cmake module would not find the correct
location. This is because it wasn't using the pkg-cofig include
directory, which is different from the main ft2build.h header directory
(which is /usr/include).
This modification may be a good thing to do on all the cmake packages,
actually. Currently, they all just search for the location of a
specific header, and ignore the pkg-config includes if they find it in
specific hint locations.
This changes the font plugin from using a font file to using a specific
installed system font, which is searched for on each specific system and
associated with the font file. It now uses a font property instead of a
path property, and font size has been removed because the font property
now handles that.
When the module is first loaded, it will build up a list of system fonts
in order to be usable by Freetype. It was quite painful to program this
because font files can contain multiple localized versions of their face
names, and then there was the issue where windows likes to mangle
custom style types to the font name. Regardless, it all seems to have
worked out pretty well.
Minor issues:
- Truetype/Opentype fonts sometimes do not automatically have
italic and/or bold styles available, it seems that the system applies
transformations manually in those cases. We don't do this yet,
however, so right now a user might select a font with italic/bold
only to discover that italic/bold doesn't always work. Not entirely
sure what to do about this yet. There's probably a freetype function
to do something like that somehow,
This also requires that iconv be used for non-windows systems to be able
to look up localized font names within font files. Windows will use
the win32 API and code page IDs to translate font names.
This can make it a bit easier to set up 32bit/64bit environments
separately on windows. This simply allows you to additionally set
FFmpegPath32, FFmpegPath64, x264Path32, x264Path64, etc.
If the cmake user variable COPY_DEPENDENCIES is set, this script will
make it so that a windows build will automatically copy all required
dependencies (FFmpeg, x264, and Qt5) to the respective
additional_install_files\exec(32|64) directory. This makes it much
easier to set up a development environment on windows, and much easier
to make usable test builds.
It will also copy the appropriate Direct3D compiler DLL, along with
dependencies of dependencies (the icu*.dll and EGL/GLES files for Qt)
There's no need to find DirectX because with VS2013 and mingw it's
already available by default. Older visual studio versions that didn't
come with DirectX by default are no longer supported anyway.
(Also mingw doesn't currently work at all due to lack of proper headers,
but once they do it'll be available in the same way. I think.)
Currently the Info.plist file names the app package as OBS.app and cmake
is trying to use 'OBS Studio.app'. I renamed it to OBS for the time
being just because we don't currently have actual studio interface yet.
icon_512x512@2x - 1024 x 1024
icon_512x512 - 512 x 512
icon_256x256@2x - 512 x 512
icon_256x256 - 256 x 256
icon_128x128@2x - 256 x 256
icon_128x128 - 128 x 128
icon_32x32@2x - 64 x 64
icon_32x32 - 32 x 32
icon_16x16@2x - 32 x 32
icon_16x16 - 16 x 16