Projects
home:darix:branches:Multimedia
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 2
View file
obs-studio.changes
Changed
@@ -1,4 +1,26 @@ ------------------------------------------------------------------- +Mon Jul 28 20:01:46 UTC 2025 - darix <packman@nordisch.org> + +- Update to version 31.1.2: + * libobs: Update version to 31.1.2 + * CI: Update obs-crowdin-sync action + * libobs: Start video output even if there is no mix + * Revert "linux-pipewire: Fix 10- and 16-bit captures" + * CI: Fix failures of analyze workflow runs due to GitHub policy change + * linux-pipewire: Ensure the release point is always signaled + * linux-pipewire: Dup syncobj fds + * linux-pipewire: Require Gio 2.76 + * libobs-opengl: Make some includes unconditional + * frontend: Fix settings scrollbar size + * frontend: Fix progress bar appearance + * linux-v4l2: Avoid stopping capture on AVERROR(EAGAIN) + * frontend: Do not set maximum_video_tracks if user has set it to "Auto" + * CI: Update sphinx-publish-action commit + * frontend: Fix build failure with Clang 20+ in OBSCanvas + * build-aux: Use rebuilt CEF on Linux with backported API on Flatpak + * CI: Add checkout to fix gh CLI usage + +------------------------------------------------------------------- Sat Jul 12 14:13:46 UTC 2025 - darix <packman@nordisch.org> - Update to version 31.1.1:
View file
obs-studio.spec
Changed
@@ -39,7 +39,7 @@ %endif Name: obs-studio -Version: 31.1.1 +Version: 31.1.2 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors
View file
_service
Changed
@@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="manual"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">31.1.1</param> + <param name="revision">31.1.2</param> <param name="url">https://github.com/obsproject/obs-studio.git</param> <param name="versionrewrite-pattern">(\.\d+)-(a-z.*)</param> <param name="versionrewrite-replacement">\1~\2</param>
View file
_servicedata
Changed
@@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/obsproject/obs-studio.git</param> - <param name="changesrevision">a32b3f9f6d5e1cf6fa0f8105a2ed46ec0b4d991c</param> + <param name="changesrevision">7778070cbd8e4689d91d90068091ced467c5fdef</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-31.1.1.tar.xz/.github/actions/generate-docs/action.yaml -> obs-studio-31.1.2.tar.xz/.github/actions/generate-docs/action.yaml
Changed
@@ -59,7 +59,7 @@ echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT - name: Install Sphinx π - uses: totaldebug/sphinx-publish-action@cdbb304b4b8aa1fd36015e3c459c1f122804bd6b + uses: totaldebug/sphinx-publish-action@a44364271972de3b13c5b63801c2596dfde82413 with: sphinx_src: ${{ inputs.sourceDirectory }}/docs/sphinx build_only: true
View file
obs-studio-31.1.1.tar.xz/.github/workflows/analyze-project.yaml -> obs-studio-31.1.2.tar.xz/.github/workflows/analyze-project.yaml
Changed
@@ -124,7 +124,7 @@ pushd ${analytics_root} - npx @microsoft/sarif-multitool merge *.sarif + npx @microsoft/sarif-multitool merge --merge-runs *.sarif popd
View file
obs-studio-31.1.1.tar.xz/.github/workflows/dispatch.yaml -> obs-studio-31.1.2.tar.xz/.github/workflows/dispatch.yaml
Changed
@@ -68,7 +68,7 @@ submodules: recursive token: ${{ secrets.CROWDIN_SYNC_GITHUB_PAT }} fetch-depth: 0 - - uses: obsproject/obs-crowdin-sync/download@6066f54d3615e39a228b6ccd1a9884953ba3ab05 + - uses: obsproject/obs-crowdin-sync/download@430665179ed13233af2d83ec192c2ae8c40a29ae steam-upload: name: Upload Steam Builds π
View file
obs-studio-31.1.1.tar.xz/.github/workflows/publish.yaml -> obs-studio-31.1.2.tar.xz/.github/workflows/publish.yaml
Changed
@@ -22,6 +22,12 @@ flatpakMatrix: ${{ steps.check.outputs.flatpakMatrix }} updateChannel: ${{ steps.check.outputs.updateChannel }} steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + set-safe-directory: ${{ env.GITHUB_WORKSPACE }} + - name: Check Release Tag βοΈ id: check env:
View file
obs-studio-31.1.1.tar.xz/.github/workflows/scheduled.yaml -> obs-studio-31.1.2.tar.xz/.github/workflows/scheduled.yaml
Changed
@@ -154,7 +154,7 @@ - name: Upload US English Language Files πΊπΈ if: steps.checks.outcome == 'success' && fromJSON(steps.checks.outputs.hasChangedFiles) - uses: obsproject/obs-crowdin-sync/upload@6066f54d3615e39a228b6ccd1a9884953ba3ab05 + uses: obsproject/obs-crowdin-sync/upload@430665179ed13233af2d83ec192c2ae8c40a29ae env: CROWDIN_PAT: ${{ secrets.CROWDIN_SYNC_CROWDIN_PAT }} GITHUB_EVENT_BEFORE: ${{ steps.nightly-checks.outputs.lastNightly }}
View file
obs-studio-31.1.1.tar.xz/build-aux/modules/99-cef.json -> obs-studio-31.1.2.tar.xz/build-aux/modules/99-cef.json
Changed
@@ -17,8 +17,8 @@ "sources": { "type": "archive", - "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v3.tar.xz", - "sha256": "cb7225c7a937ac4cdc9c41700061f45cccc640d696902357782e57f8250bf43a" + "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v5.tar.xz", + "sha256": "df38ef6d8078895953d224a58dd811b83110b4f8644c5cd2b6246d04b0023ee6" } }
View file
obs-studio-31.1.1.tar.xz/frontend/data/themes/Yami.obt -> obs-studio-31.1.2.tar.xz/frontend/data/themes/Yami.obt
Changed
@@ -139,6 +139,7 @@ --volume_slider_label: calc(var(--volume_slider_box) * 2); --scrollbar_size: 12px; + --settings_scrollbar_size: calc(var(--scrollbar_size) + 9px); --scrollbar_handle: var(--grey4); --scrollbar_bg: var(--grey6); @@ -457,7 +458,10 @@ border: 1px solid var(--bg_base); } -* { +QCheckBox, +QGroupBox, +QMenuBar, +QRadioButton { spacing: var(--spacing_small); } @@ -473,6 +477,19 @@ border: none; } +QProgressBar { + text-align: center; + border-radius: 4px; + border-top: 2px solid transparent; +} + +QProgressBar::chunk { + background: var(--blue3); + border-top: 1px solid var(--blue2); + border-bottom: 2px solid var(--blue4); + border-radius: var(--border_radius_small); +} + /* Context Menu */ QMenu::indicator { @@ -618,10 +635,12 @@ OBSBasicSettings QScrollBar:vertical { width: var(--scrollbar_size); + width: var(--settings_scrollbar_size); + margin-left: 9px; } OBSBasicSettings QScrollBar:horizontal { - height: var(--scrollbar_size); + height: var(--settings_scrollbar_size); } /* Settings properties view */ @@ -720,6 +739,11 @@ border-radius: var(--border_radius); } +/* ScrollAreaContents */ +QScrollArea > QWidget > QWidget { + background: transparent; +} + /* Qt enforces a padding inside its status bar, so we * oversize it and use margin to crunch it back down */
View file
obs-studio-31.1.1.tar.xz/frontend/utility/GoLiveAPI_PostData.cpp -> obs-studio-31.1.2.tar.xz/frontend/utility/GoLiveAPI_PostData.cpp
Changed
@@ -73,13 +73,11 @@ if (maximum_aggregate_bitrate.has_value()) preferences.maximum_aggregate_bitrate = maximum_aggregate_bitrate.value(); - if (maximum_video_tracks.has_value()) - preferences.maximum_video_tracks = maximum_video_tracks.value(); - /* Always cap to maximum number of output encoders. */ - if (!preferences.maximum_video_tracks.has_value() || - preferences.maximum_video_tracks.value() > MAX_OUTPUT_VIDEO_ENCODERS) { - preferences.maximum_video_tracks = MAX_OUTPUT_VIDEO_ENCODERS; + if (maximum_video_tracks.has_value()) { + /* Cap to maximum supported number of output encoders. */ + preferences.maximum_video_tracks = + std::min(maximum_video_tracks.value(), static_cast<uint32_t>(MAX_OUTPUT_VIDEO_ENCODERS)); } return post_data;
View file
obs-studio-31.1.1.tar.xz/frontend/utility/OBSCanvas.cpp -> obs-studio-31.1.2.tar.xz/frontend/utility/OBSCanvas.cpp
Changed
@@ -55,15 +55,15 @@ return std::nullopt; } -std::optional<Canvas> Canvas::Load(obs_data_t *data) +std::unique_ptr<Canvas> Canvas::Load(obs_data_t *data) { if (OBSDataAutoRelease canvas_data = obs_data_get_obj(data, "info")) { if (obs_canvas_t *canvas = obs_load_canvas(canvas_data)) { - return canvas; + return std::make_unique<Canvas>(canvas); } } - return std::nullopt; + return nullptr; } std::vector<Canvas> Canvas::LoadCanvases(obs_data_array_t *canvases)
View file
obs-studio-31.1.1.tar.xz/frontend/utility/OBSCanvas.hpp -> obs-studio-31.1.2.tar.xz/frontend/utility/OBSCanvas.hpp
Changed
@@ -17,6 +17,7 @@ #pragma once +#include <memory> #include <optional> #include <vector> @@ -41,7 +42,7 @@ operator obs_canvas_t *() const { return canvas; } nodiscard std::optional<OBSDataAutoRelease> Save() const; - static std::optional<Canvas> Load(obs_data_t *data); + static std::unique_ptr<Canvas> Load(obs_data_t *data); static std::vector<Canvas> LoadCanvases(obs_data_array_t *canvases); static OBSDataArrayAutoRelease SaveCanvases(const std::vector<Canvas> &canvases);
View file
obs-studio-31.1.1.tar.xz/libobs-opengl/gl-egl-common.c -> obs-studio-31.1.2.tar.xz/libobs-opengl/gl-egl-common.c
Changed
@@ -17,8 +17,11 @@ #include "gl-egl-common.h" +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> +#include <unistd.h> +#include <xf86drm.h> #include <glad/glad_egl.h> @@ -26,9 +29,6 @@ #include <linux/types.h> #include <asm/ioctl.h> -#include <xf86drm.h> -#include <unistd.h> -#include <fcntl.h> typedef unsigned int drm_handle_t; #else
View file
obs-studio-31.1.1.tar.xz/libobs/obs-config.h -> obs-studio-31.1.2.tar.xz/libobs/obs-config.h
Changed
@@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 1 +#define LIBOBS_API_PATCH_VER 2 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-31.1.1.tar.xz/libobs/obs.c -> obs-studio-31.1.2.tar.xz/libobs/obs.c
Changed
@@ -3047,18 +3047,22 @@ void (*callback)(void *param, struct video_data *frame), void *param) { struct obs_core_video_mix *video = get_mix_for_video(v); - if (!video) - return; - if (video_output_connect2(v, conversion, frame_rate_divisor, callback, param)) + + // TODO: Make affected outputs use views/canvasses, and revert this later. + // https://github.com/obsproject/obs-studio/pull/12379 + // https://github.com/obsproject/obs-studio/issues/12366 + if (video_output_connect2(v, conversion, frame_rate_divisor, callback, param) && video) os_atomic_inc_long(&video->raw_active); } void stop_raw_video(video_t *v, void (*callback)(void *param, struct video_data *frame), void *param) { struct obs_core_video_mix *video = get_mix_for_video(v); - if (!video) - return; - if (video_output_disconnect2(v, callback, param)) + + // TODO: Make affected outputs use views/canvasses, and revert this later. + // https://github.com/obsproject/obs-studio/pull/12379 + // https://github.com/obsproject/obs-studio/issues/12366 + if (video_output_disconnect2(v, callback, param) && video) os_atomic_dec_long(&video->raw_active); }
View file
obs-studio-31.1.1.tar.xz/plugins/linux-pipewire/CMakeLists.txt -> obs-studio-31.1.2.tar.xz/plugins/linux-pipewire/CMakeLists.txt
Changed
@@ -7,7 +7,7 @@ endif() find_package(PipeWire 0.3.33 REQUIRED) -find_package(Gio REQUIRED) +find_package(Gio 2.76 REQUIRED) find_package(Libdrm REQUIRED) get_target_property(libdrm_include_directories Libdrm::Libdrm INTERFACE_INCLUDE_DIRECTORIES)
View file
obs-studio-31.1.1.tar.xz/plugins/linux-pipewire/pipewire.c -> obs-studio-31.1.2.tar.xz/plugins/linux-pipewire/pipewire.c
Changed
@@ -26,6 +26,7 @@ #include <gio/gio.h> #include <gio/gunixfdlist.h> +#include <glib/gstdio.h> #include <fcntl.h> #include <glad/glad.h> @@ -143,6 +144,7 @@ int release_syncobj_fd; uint64_t acquire_point; uint64_t release_point; + bool release_point_will_signal; bool set; } sync; }; @@ -765,15 +767,28 @@ } #if PW_CHECK_VERSION(1, 2, 0) + if (obs_pw_stream->sync.release_syncobj_fd != -1) { + if (!obs_pw_stream->sync.release_point_will_signal) { + gs_sync_signal_syncobj_timeline_point(obs_pw_stream->sync.release_syncobj_fd, + obs_pw_stream->sync.release_point); + obs_pw_stream->sync.release_point_will_signal = true; + } + } + + g_clear_fd(&obs_pw_stream->sync.acquire_syncobj_fd, NULL); + g_clear_fd(&obs_pw_stream->sync.release_syncobj_fd, NULL); + if (synctimeline && (buffer->n_datas == (planes + 2))) { assert(buffer->datasplanes.type == SPA_DATA_SyncObj); assert(buffer->datasplanes + 1.type == SPA_DATA_SyncObj); - obs_pw_stream->sync.acquire_syncobj_fd = buffer->datasplanes.fd; + obs_pw_stream->sync.acquire_syncobj_fd = fcntl(buffer->datasplanes.fd, F_DUPFD_CLOEXEC, 5); obs_pw_stream->sync.acquire_point = synctimeline->acquire_point; - obs_pw_stream->sync.release_syncobj_fd = buffer->datasplanes + 1.fd; + obs_pw_stream->sync.release_syncobj_fd = + fcntl(buffer->datasplanes + 1.fd, F_DUPFD_CLOEXEC, 5); obs_pw_stream->sync.release_point = synctimeline->release_point; + obs_pw_stream->sync.release_point_will_signal = false; obs_pw_stream->sync.set = true; } else { @@ -791,10 +806,11 @@ g_clear_pointer(&obs_pw_stream->texture, gs_texture_destroy); use_modifiers = obs_pw_stream->format.info.raw.modifier != DRM_FORMAT_MOD_INVALID; - obs_pw_stream->texture = gs_texture_create_from_dmabuf( - obs_pw_stream->format.info.raw.size.width, obs_pw_stream->format.info.raw.size.height, - obs_pw_video_format.drm_format, obs_pw_video_format.gs_format, planes, fds, strides, offsets, - use_modifiers ? modifiers : NULL); + obs_pw_stream->texture = gs_texture_create_from_dmabuf(obs_pw_stream->format.info.raw.size.width, + obs_pw_stream->format.info.raw.size.height, + obs_pw_video_format.drm_format, GS_BGRX, planes, + fds, strides, offsets, + use_modifiers ? modifiers : NULL); if (obs_pw_stream->texture == NULL) { remove_modifier_from_format(obs_pw_stream, obs_pw_stream->format.info.raw.format, @@ -1179,6 +1195,8 @@ obs_pw_stream->cursor.visible = connect_info->screencast.cursor_visible; obs_pw_stream->framerate.set = connect_info->video.framerate != NULL; obs_pw_stream->resolution.set = connect_info->video.resolution != NULL; + obs_pw_stream->sync.acquire_syncobj_fd = -1; + obs_pw_stream->sync.release_syncobj_fd = -1; if (obs_pw_stream->framerate.set) obs_pw_stream->framerate.fraction = *connect_info->video.framerate; @@ -1309,20 +1327,10 @@ gs_sync_destroy(acquire_sync); } - effect = obs_get_base_effect(OBS_EFFECT_DEFAULT); - gs_technique_t *tech = gs_effect_get_technique(effect, "DrawSrgbDecompress"); - gs_technique_begin(tech); - gs_technique_begin_pass(tech, 0); - - const bool linear_srgb = gs_get_linear_srgb(); - const bool previous = gs_framebuffer_srgb_enabled(); - gs_enable_framebuffer_srgb(linear_srgb); - + /* FIXME: Use obs_pw_stream->format.info.raw colorimetry info to handle + * textures in their corresponding color space */ image = gs_effect_get_param_by_name(effect, "image"); - if (linear_srgb) - gs_effect_set_texture_srgb(image, obs_pw_stream->texture); - else - gs_effect_set_texture(image, obs_pw_stream->texture); + gs_effect_set_texture(image, obs_pw_stream->texture); rotated = push_rotation(obs_pw_stream); @@ -1356,10 +1364,7 @@ gs_matrix_push(); gs_matrix_translate3f(cursor_x, cursor_y, 0.0f); - if (linear_srgb) - gs_effect_set_texture_srgb(image, obs_pw_stream->cursor.texture); - else - gs_effect_set_texture(image, obs_pw_stream->cursor.texture); + gs_effect_set_texture(image, obs_pw_stream->cursor.texture); gs_draw_sprite(obs_pw_stream->texture, 0, obs_pw_stream->cursor.width, obs_pw_stream->cursor.height); gs_matrix_pop(); @@ -1367,16 +1372,12 @@ gs_blend_state_pop(); - gs_enable_framebuffer_srgb(previous); - - gs_technique_end_pass(tech); - gs_technique_end(tech); - if (obs_pw_stream->sync.set) { gs_sync_t *release_sync = gs_sync_create(); gs_sync_export_syncobj_timeline_point(release_sync, obs_pw_stream->sync.release_syncobj_fd, obs_pw_stream->sync.release_point); gs_sync_destroy(release_sync); + obs_pw_stream->sync.release_point_will_signal = true; } } @@ -1409,6 +1410,9 @@ g_clear_pointer(&obs_pw_stream->stream, pw_stream_destroy); pw_thread_loop_unlock(obs_pw_stream->obs_pw->thread_loop); + g_clear_fd(&obs_pw_stream->sync.acquire_syncobj_fd, NULL); + g_clear_fd(&obs_pw_stream->sync.release_syncobj_fd, NULL); + clear_format_info(obs_pw_stream); bfree(obs_pw_stream); }
View file
obs-studio-31.1.1.tar.xz/plugins/linux-pipewire/screencast-portal.c -> obs-studio-31.1.2.tar.xz/plugins/linux-pipewire/screencast-portal.c
Changed
@@ -736,7 +736,7 @@ const struct obs_source_info screencast_portal_capture_info = { .id = "pipewire-screen-capture-source", .type = OBS_SOURCE_TYPE_INPUT, - .output_flags = OBS_SOURCE_VIDEO | OBS_SOURCE_SRGB, + .output_flags = OBS_SOURCE_VIDEO, .get_name = screencast_portal_desktop_capture_get_name, .create = screencast_portal_capture_create, .destroy = screencast_portal_capture_destroy,
View file
obs-studio-31.1.1.tar.xz/plugins/linux-v4l2/v4l2-decoder.c -> obs-studio-31.1.2.tar.xz/plugins/linux-v4l2/v4l2-decoder.c
Changed
@@ -17,6 +17,7 @@ #include <obs-module.h> #include <linux/videodev2.h> +#include <libavutil/error.h> #include "v4l2-decoder.h" @@ -86,14 +87,18 @@ int v4l2_decode_frame(struct obs_source_frame *out, uint8_t *data, size_t length, struct v4l2_decoder *decoder) { + int r; decoder->packet->data = data; decoder->packet->size = length; if (avcodec_send_packet(decoder->context, decoder->packet) < 0) { blog(LOG_ERROR, "failed to send frame to codec"); return -1; } - - if (avcodec_receive_frame(decoder->context, decoder->frame) < 0) { + r = avcodec_receive_frame(decoder->context, decoder->frame); + if (r == AVERROR(EAGAIN)) { + blog(LOG_DEBUG, "failed to receive frame in this state, try to send new frame to codec"); + return 0; + } else if (r < 0) { blog(LOG_ERROR, "failed to receive frame from codec"); return -1; }
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.