Commit Graph
3056 Commits
Author SHA1 Message Date
Dennis Sädtler e4c39eb648 libobs: Allow interleaver to recover from temporary stalls
The interleaver requires packets with sufficiently high timestamps from
all encoders to be available to send out before it outputs a packet.
This means that if one encoder stalls and does not submit packets for
a while the interleaver can end up with a permanent increase to its
delay due to multiple packets being received from the other encoders
without being able to send any.

This change introduces a recovery mechanism that relies on an upper
bound for the amount of packets that may become "streamable" at a time
being calculated, and flushing additional packets if that bound is
violated.

The upper bound is based on the largest expected interval between
packets and how many packets for each encoder could arrive within
double that interval (to give us a bit of wiggle room since not
all encoders will deliver frames 100% consistently).

This ensures that we still send data at a steady rate but allow the
buffer to drain if it becomes larger than it needs to be.
2025-08-20 18:42:11 -04:00
Sebastian Beckmann b7c399f6d8 libobs: Remove v1 scene item transform API
Deprecated since 4b138f674f (30.1).
2025-08-20 18:05:15 -04:00
Sebastian Beckmann d283181c83 libobs: Remove obs_scene_sceneitem_from_source
Use obs_scene_enum_items to find sources instead.

Deprecated since 4dd3cf6758 (31.0).
2025-08-20 18:05:15 -04:00
Sebastian Beckmann 163493d1e1 libobs: Remove obs_view_get_video_info
Deprecated since fc891295b6 (30.1).
2025-08-20 18:05:15 -04:00
Sebastian Beckmann be66c8a701 libobs: Remove circlebuf
Deprecated since a4b8e1a6a9 (30.1).
2025-08-20 18:05:15 -04:00
PatTheMav 87698b1e01 libobs: Fix clear color mismatch in Metal and OpenGL on Apple Silicon
The OpenGL frontend is implemented in Metal for Apple Silicon Macs.

Metal does not provide a direct "clear" command (neither do D3D12 or
Vulkan) and instead a clear is a load command for a render target of a
render pass.

All writes (and color calculations) in Metal happen in linear space,
with appropriate gamma encoding and decoding happening automatically
depending on the pixel format of the the textures attached to the
pipeline.

Thus setting a clear color with linear gamma is the correct approach to
avoid the SRGB gamma curve being applied twice for both scenarios.
2025-08-20 17:01:09 -04:00
Ryan Foster 7778070cbd libobs: Update version to 31.1.2 2025-07-25 16:55:48 -04:00
Marco 46ce91e582 libobs: Start video output even if there is no mix
This fixes a change in PR 11605 that breaks Decklink video outputs.
get_mix_for_video() returns NULL for those outputs, causing
start_raw_video() to return before connecting the output.
2025-07-25 15:49:19 -04:00
Ryan Foster a32b3f9f6d libobs: Update version to 31.1.1 2025-07-11 21:35:41 -04:00
Sebastian Beckmann 8e66418dc9 libobs: Actually mark obs_[add|remove]_data_path as deprecated
3311a7105e was meant to mark these as
deprecated, but put the deprecated marker in the .c file which doesn't
work.
2025-06-02 14:50:19 -04:00
Ryan Foster e8d1834f68 libobs: Update version to 31.1.0 2025-05-23 20:55:49 -04:00
Norihiro Kamae 90d158cf17 libobs/util: Fix coprocess not having environment variables 2025-05-22 15:06:37 -04:00
derrod 56f75bd3e0 win-capture: Add SDL_app to list of generic classes 2025-05-19 19:25:56 -04:00
Ryan Foster 11ee75d2c2 libobs: Fix canvas_dosignal_source() using wrong signal handler 2025-05-12 16:25:21 -04:00
Exeldro e855bb9d0d libobs: Add obs_canvas_get_signal_handler 2025-05-12 16:25:21 -04:00
Alex Luccisano ef3e7b2563 libobs: Add checks to some graphics API functions
A few recently introduced graphics API functions needed for Enhanced
Broadcasting were marked as `GRAPHICS_IMPORT_OPTIONAL`. Add the
proper checks in the wrapper to ensure they are safe on platforms
that do not implement the underlying function.
2025-05-09 13:08:10 -04:00
Ed Maste 6204c22853 libobs/util: Fix build on FreeBSD
FreeBSD already implemented os_get_free_size.  Move the new Linux
implementation into the existing not-__FreeBSD__ block.

Fixes: 935613816f ("libobs/util: Update `os_get_free_size()`")
2025-05-07 15:22:24 -04:00
Dennis Sädtler 33734ef99c libobs: Fall back to main canvas dimensions if group canvas unset 2025-05-07 14:01:15 -04:00
Dennis Sädtler 66f47924ea libobs: Add obs_canvas_rename_source() 2025-05-06 16:07:47 -04:00
Dennis Sädtler de7df57ee2 libobs: Raise max number of output encoders to 10 2025-05-05 17:17:20 -04:00
Miha Frangež 1fc94ecde5 libobs/util: Fix os_process_pipe_create on Linux
This fixes a regression on Linux, introduced in commit 9bc3082.

According to the POSIX specification for the exec family of commands, 
"The first argument is the filename or pathname of the executable to 
be executed". This was done correctly before, but the above commit 
removed "sh" from the arguments, breaking the pipe function on Linux.
2025-05-05 16:54:12 -04:00
Dennis Sädtler f1e44c122c libobs: Improve readability of scene duplication type 2025-05-05 15:19:31 -04:00
tytan652 5ed5863556 libobs: Fix module load in relocatable scenario 2025-05-03 16:34:25 -07:00
PatTheMav 3311a7105e libobs: Mark data path modification functions as deprecated 2025-04-30 15:14:57 -04:00
gxalpha 281f8137f5 UI,libobs,obs-outputs: Remove HAVE_OBSCONFIG_H ifdefs
With the removal of all legacy code paths, obsconfig.h always exists and
the compile definition always gets set. As such, it's no longer
necessary to check for it.

As removing the definition itself could be seen as a breaking change,
this simply moves the definition to pc.in and cmake.in files for now to
preserve the value for plugins that might expect this to be set. We may
remove the definition entirely in a later release.
2025-04-30 13:05:35 -04:00
Penwywern 63260148df libobs: Use absolute path for install prefix module load 2025-04-28 15:04:27 -04:00
Norihiro Kamae 220b0ec649 libobs/callback: Catch fail cases with missing error data
In `parse_decl_string`, it jumps to `fail` label if an error occurs.
However, if the lexer encountered an error for example, `cfp.error_list`
may be empty.
2025-04-28 14:26:07 -04:00
Ilya Melamed a19945b53a libobs: Fix setting non-0 order on only scene item 2025-04-28 13:50:01 -04:00
tytan652 1bf84a6901 cmake: Replace Xcb CMake finders with ECM 2025-04-28 13:30:26 -04:00
Norihiro Kamae 5c448452cf libobs/util: Prevent locking mutex in child process when checking Qt5
The frontend has set a log handler which locks the mutex in `LogString`.
If `os_dlopen` fails in the child process, it calls `blog` and attempted
to lock the mutex that may have already been locked by another thread
before `fork()`. This change prevents the child process from locking the
mutex, resolving the potential deadlock.
2025-04-25 19:10:34 -04:00
Lain 775ac56bc8 libobs/graphics: Add gs_draw_quadf()
Adds a function to draw a sprite or quad using floating point sizes
rather than integer sizes. Also named it more appropriately.
2025-04-23 15:23:29 -04:00
Lain 7b8b51b29f libobs/graphics: Improve sprite drawing perf
Sprites were unnecessarily updating a dynamic vertex buffer every single
draw call. This creates static vertex buffers for common vertex buffer
dimensions/uvs and only uses a dynamic vertex buffer when the texture
coordinates actually change.

Porbably not a significant perf change considering the very few number
of traingles we draw per frame but still nice to do.
2025-04-23 15:23:29 -04:00
Lain d25e2c18e4 libobs/graphics: Optimize certain matrix4 functions
Optimizes certain 4x4 matrix functions by minimizing unnecessary math
operations. This ends up optimizing gs_matrix_transform() and
gs_matrix_rotate() functions and makes positional/rotational operations
a bit more optimal and requiring much less math than they would
otherwise.
2025-04-23 15:23:29 -04:00
Lain 9fa3b045a3 libobs/graphics: Remove some unnecessary checks
These checks are redundant because the base function they all lead to
does the same check.
2025-04-23 15:23:29 -04:00
Lain 40f0543488 libobs/graphics: Separate some sections via comments 2025-04-23 15:23:29 -04:00
PatTheMav 96e4d67242 clang-format: Update source code files with clang-format 19.1.1 2025-04-17 18:16:33 +02:00
Dennis Sädtler dac0be2cbe libobs: Use UUIDs in scene undo/redo data
Since scenes now can have non-unique names by being part of different
canvases, use UUIDs instead.
2025-04-02 12:39:46 -04:00
Dennis Sädtler ec9f4b0d20 libobs: Add Canvas object RAII wrappers 2025-04-02 12:39:46 -04:00
Dennis Sädtler 3d57b1fd63 libobs: Introduce Canvases
This adds a new obs_canvas object that acts as a shareable
(reference-counted) owner of views, mixes, and (optionally) scenes.

This is a step towards faciliatating multi-canvas and multi-output
features in OBS Studio.

It solves a number of complications that exist with the manual approach
of using views, such as audio mixing, source active-state tracking, and
scenes not havinga  reliable way of identifying the actual available
canvas size.
2025-04-02 12:39:46 -04:00
Dennis Sädtler 66da1e42c7 libobs: Add video_reset signal
Signals when a video reset has completed. This is mainly useful when
canvases or views are used, whose mixes will have been freed or
recreated during the reset.
2025-04-02 12:39:46 -04:00
Dennis Sädtler 4459041e7e libobs: Add view type to view object
Allos creating additional views that act like a MAIN_VIEW instead of AUX_VIEW.
2025-04-02 12:39:46 -04:00
Alex Luccisano 935613816f libobs/util: Update os_get_free_size()
`os_get_free_size()` was simply returning 0. For Linux,
implement the free size calculation based on the `sysinfo()`
system call.
2025-04-01 23:18:15 -04:00
Alex Luccisano abb8cdf0da libobs, libobs-opengl: Add memory and identification APIs
Add graphics APIs to obtain the GPU driver version and renderer
strings, as well as GDDR memory sizes. The GDDR memory sizes
include the dmem (dedicated memory on the GPU) and smem
(shared CPU memory used by the GPU but resides in the CPU DDR).

The version and renderer strings are needed for identification
purposes, for example enhanced broadcasting used by Twitch, to
associate the GPU used by OBS with the PCIe-based identification
values such as device_id and vendor_id.
2025-04-01 23:18:15 -04:00
gxalpha 62ef7e0fee libobs: Deprecate obs_get_transition_by_[name|uuid]
obs_get_transition_by_name is very problematic because transitions are
always private and their names aren't unique. This means that the method
iterates over all private sources and then takes the first that both is
a transition and matches the name we're looking for. However, this could
be from anywhere - it could be a frontend transition, but also a source
transition, quick transition, or even one from third-party plugins. This
is always never what is intended.

As such, this method (which should never have been added in the first
place) needs to go. In its place, obs_frontend_get_transitions returns a
list of all frontend transitions (which is usually what people are
looking for), and alternatively obs_get_source_by_uuid also provides
access to private sources.

While we're at it, obs_get_transition_by_uuid is basically a wrapper for
obs_get_source_by_uuid and not really necessary. UUID's are unique and
a source doesn't suddenly change its type, so if you have a transition's
UUID you can be pretty sure that when you do obs_get_source_by_uuid, it
will still be a transition.
2025-04-01 17:07:24 -04:00
Ryan Foster 3e84469cc1 libobs: Update version to 31.0.3 2025-03-26 16:05:26 -04:00
Exeldro 5ca6e1effa libobs: Fix duplicating scene with custom size 2025-03-26 15:17:13 -04:00
Dennis Sädtler 12baa1c817 libobs: Reset reconnecting state when can_reconnect is false 2025-03-17 14:22:56 -04:00
Dennis Sädtler 187eef7b38 libobs: Add optional reconnect callback to outputs 2025-03-17 13:30:58 -04:00
Dennis Sädtler 2950daa29d Revert "libobs: Do not allow reconnect if stop code is OBS_OUTPUT_INVALID_STREAM"
This reverts commit a0edc5e8bc.
2025-03-17 13:30:58 -04:00
Ryan Foster ef2fe6fdd3 libobs: Update version to 31.0.2 2025-03-07 16:44:15 -05:00