MbedTLS changed a lot of internals with their LTS version 3.6.0, which
are incompatible with the find module currently shipped with
OBS Studio.
The solution requires several changes to be applied at once:
* Rename the generated target name to MbedTLS::mbedtls to match the
name used by MbedTLS' own CMake package
* Update find module to use the updated target name(s)
* Set CMAKE_FIND_PACKAGE_PREFER_CONFIG to TRUE before trying to find
MbedTLS to ensure that CMake package files are used with priority
(Those are shipped only with MbedTLS 3.6.0 in obs-deps).
* A deprecation warning is emitted if the find module is used with
MbedTLS 3.6.0 available
We're currently using peter-evans/create-pull-request v6.0.0 which has a
known issue that affects our services-validator action when attempting
to update an existing PR. This issue was fixed in v6.0.1, but we can
update to v7.0.2.
We check that mids is a nullptr which may not be the case if this
remains uninitialized. Earlier attempt to fix this assumed we faulted on
the response itself.
fixes#11221
Cleans up the source code by sorting functions by topic and also
removes macros for hotkey implementation, removing the need to disable
compiler warnings.
Key codes and descriptions are now contained in arrays which either
use the OBS key code or the macOS key code as lookup keys with all
necessary context information directly associated with the key.
The implementation also uses the zero-initialization rule for arrays
of structs in such a way that the struct's "is_valid" boolean is
"false" by default so that only values explicitly initialized with a
key are ever "valid".
This change enables loading scene collections from locations different
than OBS' own configuration directory.
It also rewrites profile management in the app to work off an in-memory
collection of profiles found on disk and does not require iterating
over directory contents for most profile interactions by the app.
This change enables loading profiles from locations different than
OBS' own configuration directory.
It also rewrites profile management in the app to work off an in-memory
collection of profiles found on disk and does not require iterating
over directory contents for most profile interactions by the app.
This introduces a split of the current single ConfigFile instance for
all configuration into two separate instances.
The app config instance contains system-wide settings that mainly
concern the working of the app itself, whereas the user config instance
contains settings actually exposed to the user for the configuration.
cmake-format was replaced with gersemi in
19d3e30a3a and this action is now unused
(and wouldn't work anymore anyways due to the removal of the
./build-aux/run-cmake-format script).
This commit includes build-aux README fix-ups where the now nonexistent
run-cmake-format script was mentioned and the run-gersemi script was
misspelled.
At some point NVIDIA started using NV_ENC_ERR_INCOMPATIBLE_CLIENT_KEY
instead of NV_ENC_ERR_OUT_OF_MEMORY to signal that the session limit
has been exceeded.
When using the Auto-Configuration Wizard with the
Twitch service, testing for Enhanced Broadcasting would
always run, even if deselected. Add a conditional check
to only run the test if selected.
If speex and rnnoise are disabled but nvafx is enabled, the noise
reduction filter still needs to be built. This fixes the issue.
Co-authored-by: Ryan Foster <ryan@obsproject.com>
Signed-off-by: pkv <pkv@obsproject.com>
Work around a bug with too many open files in versions before v4.3.5 and
also in v4.3.6 due to a revert. The relevant error message is:
Error: EMFILE: too many open files
We applied the same workaround to release/30.2.
Separate the commonly used functions into service-ingest.c/h.
Split the Amazon IVS support out of the Twitch specific files
and into the new amazon-ivs.c/h files. This allows for clean
usage of `struct ingest` between the two services.
This doesn't generally make the speedtest work for Amazon IVS, since
most Amazon IVS channels will be disconnected if the bitrate being
sent exceeds the upper limit for that channel.
Notable changes:
* deps.windows: Disable x86 build slice for dependencies
* deps.qt: Disable x86 build slice for Qt6
* CI: Remove Windows x86 slices for Qt6 and FFmpeg builds
* deps.ffmpeg: Disable Windows x86 build slice for FFmpeg dependencies
* deps.ffmpeg: Update libvpx to v1.14.1
* deps.ffmpeg: Update SVT-AV1 to 2.2.1
* deps.ffmpeg: Update aom to 3.9.1
* deps.ffmpeg: Update AMF to 1.4.34
* deps.ffmpeg: Update FFmpeg to 7.0.2
* deps.macos: Update LuaJIT to 2.1 f725e44cda
* deps.macos: Update FreeType to 2.13.3
* deps.macos: Update Asio to 1.31.0
* deps.macos: Update qrcodegen-cmake to v1.8.0-cmake3
* deps.macos: Update Sparkle to 2.6.4
* deps.qt: Update Qt to 6.7.2 for macOS
* deps.qt: Update Qt to 6.7.2 for Windows
* deps.windows: Update FreeType to 2.13.3
* deps.windows: Update curl to 8.9.1
* deps.windows: Update LuaJIT to 2.1 f725e44cda
* deps.windows: Update Asio to 1.31.0
* deps.windows: Update qrcodegen-cmake to v1.8.0-cmake3
* deps.windows: Update WIL to v1.0.240803.1
* deps.ffmpeg: Remove MbedTLS CMake files from macOS FFmpeg package
Also update Sparkle to match the obs-deps version.
Introduce support for delivering BPM (Broadcast
Performance Metrics) over SEI (for AVC/H.264 and
HEVC/H.265) and OBU (for AV1) unregistered messages.
Metrics being sent are the session frame counters,
per-rendition frame counters, and RFC3339-based
timestamping information to support end-to-end
latency measurement.
SEI/OBU messages are generated and sent with each IDR
frame, and the frame counters are diff-based, meaning
the counts reflect the diff between IDRs, not the running
totals.
BPM documentation is available at [1].
BPM relies on the recently introduced encoder packet timing
support and the packet callback mechanism.
BPM injection is enabled for an output by registering
the `bpm_inject()` callback via `obs_output_add_packet_callback()`
function. The callback must be unregistered using
`obs_output_remove_packet_callback()` and `bpm_destroy()`
must be used by the caller to release the BPM structures.
It is important to measure the number of frames successfully
encoded by the obs_encoder_t instances, particularly for
renditions where the encoded frame rate differs from the
canvas frame rate. The encoded_frames counter and
`obs_encoder_get_encoded_frames()` API is introduced
to measure and report this in the encoded rendition
metrics message.
[1] https://d50yg09cghihd.cloudfront.net/other/20240718-MultitrackVideoIntegrationGuide.pdf
Packet callbacks are invoked in `send_interleaved()` and
are useful for any plugin to extend functionality at the
packet processing level without needing to modify code in
libobs. Closed caption support is one candidate that is
suitable for migration to a packet callback.
The packet callback also supports the new encoder packet
timing feature. This means a registered callback will have
access to both the compressed encoder packet and the associated
encoder packet timing information.
Introduce support for the `encoder_packet_time` struct
to capture timing information for each frame, starting
from the composition of each frame, through the encoder,
to the queueing of the frame data to each output_t.
Timestamps for each of the following events are based on
`os_gettime_ns()`:
CTS: Composition time stamp (in the encoder render threads)
FER: Frame encode request
FERC: Frame encoder request completely
PIR: Packet interleave request (`send_interleaved()`)
Frame times are forwarded through encoder callbacks in the
context that runs on the relevant encoder thread, ensuring
no race conditions with accessing per encoder array happen.
All per-output processing happens on data that is owned by
the output.
Co-authored-by: Ruwen Hahn <haruwenz@twitch.tv>