Projects
Multimedia
obs-studio
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 120
View file
obs-studio.changes
Changed
@@ -1,4 +1,52 @@ ------------------------------------------------------------------- +Wed Apr 9 08:48:22 UTC 2025 - darix <packman@nordisch.org> + +- Pull in https://github.com/obsproject/obs-studio/pull/11906.patch + to fix the virtual camera + +------------------------------------------------------------------- +Fri Mar 28 22:26:17 UTC 2025 - packman@nordisch.org + +- Update to version 31.0.3: + * libobs: Update version to 31.0.3 + * libobs: Fix duplicating scene with custom size + * obs-websocket: Update version to 5.5.6 + * UI: Only emit frontend events for existing scene collection + * rtmp-services: Add "VRCDN - Live" service + * rtmp-services: Update Castr.io ingests + * rtmp-services: Remove defunct servers/services + * mac-avcapture: Clear memory when creating frame struct + * obs-browser: Update version to 2.24.6 + * nv-filters: Silence initial load error for Blur + * nv-filters: Remove reset signal for Video effects + * nv-filters: Fix CudaStream used in Video effects + * nv-filters: Reallocate state when resetting AIGS filters + * nv-filters: Fix destruction of Background Blur effect + * nv-filters: Set max effective threshold to 0.95 for Background removal + * obs-nvenc: Fix incorrect CUDA array size allocation + * libobs: Reset reconnecting state when can_reconnect is false + * Revert "libobs: Do not allow reconnect if stop code is OBS_OUTPUT_INVALID_STREAM" + * CI: Use rebuilt CEF to avoid memory allocation crashes on macOS + * win-capture: Add FragPunk to compatibility list + * rtmp-services: Remove unresponsive servers + +------------------------------------------------------------------- +Fri Mar 07 23:49:06 UTC 2025 - packman@nordisch.org + +- Update to version 31.0.2: + * libobs: Update version to 31.0.2 + * mac-avcapture: Prevent race condition in source init/deinit + * win-dshow: Fix possible crash if frame width or height is zero + * obs-browser: Update version to 2.24.5 + * obs-websocket: Update version to 5.5.5 + * obs-nvenc: Fix lookahead depth value logging + * obs-nvenc: Correct max target quality for AV1 + * cmake: Fix regexp to detect installed FFmpeg version + * nv-filters: Remove CUDA RT functions + * nv-filters: Update SDK version targeted + * obs-scripting: Fix macOS Homebrew Python loading + +------------------------------------------------------------------- Mon Jan 20 09:57:57 UTC 2025 - darix <packman@nordisch.org> - make nvenc handling more readable
View file
obs-studio.spec
Changed
@@ -35,7 +35,7 @@ %endif Name: obs-studio -Version: 31.0.1 +Version: 31.0.3 Release: 0 Summary: A recording/broadcasting program Group: Productivity/Multimedia/Video/Editors and Convertors @@ -50,6 +50,7 @@ Patch1: 0001-Prefix-modinfo-with-sbin-since-not-in-normal-path.patch Patch2: libx264-optional.patch Patch3: ffmpeg-x11-linking.patch +Patch4: 11906.patch BuildRequires: update-desktop-files BuildRequires: cmake >= 2.8.12 BuildRequires: pkgconfig(fdk-aac)
View file
11906.patch
Added
@@ -0,0 +1,112 @@ +From 52d57cf70ca70f55378112f6eeb5708fb7680a6b Mon Sep 17 00:00:00 2001 +From: stephematician <steph.fn.contact@proton.me> +Date: Wed, 19 Mar 2025 13:59:21 +1100 +Subject: PATCH linux-v4l2: Fix virtual camera start failure + +Add function that tries to reset v4l2loopback output for module versions +from 0.12.5 to 0.12.7. If successful, then set flag that STREAMON and +STREAMOFF are necessary each time the device is opened/closed. +--- + plugins/linux-v4l2/v4l2-output.c | 57 ++++++++++++++++++++++++++++++-- + 1 file changed, 54 insertions(+), 3 deletions(-) + +diff --git a/plugins/linux-v4l2/v4l2-output.c b/plugins/linux-v4l2/v4l2-output.c +index 366fc474f69d4e..d5e4e0f6ad57fb 100644 +--- a/plugins/linux-v4l2/v4l2-output.c ++++ b/plugins/linux-v4l2/v4l2-output.c +@@ -15,6 +15,7 @@ struct virtualcam_data { + obs_output_t *output; + int device; + uint32_t frame_size; ++ bool use_caps_workaround; + }; + + static const char *virtualcam_name(void *unused) +@@ -110,11 +111,54 @@ static void *virtualcam_create(obs_data_t *settings, obs_output_t *output) + return vcam; + } + ++bool try_reset_output_caps(const char *device) ++{ ++ struct v4l2_capability capability; ++ struct v4l2_format format; ++ int fd; ++ ++ blog(LOG_INFO, "Attempting to reset output capability of '%s'", device); ++ ++ fd = open(device, O_RDWR); ++ if (fd < 0) ++ return false; ++ ++ format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ if (ioctl(fd, VIDIOC_G_FMT, &format) < 0) ++ goto reset_fail_close_fd; ++ ++ if (ioctl(fd, VIDIOC_S_FMT, &format) < 0) ++ goto reset_fail_close_fd; ++ ++ if (ioctl(fd, VIDIOC_STREAMON, &format.type) < 0) ++ goto reset_fail_close_fd; ++ ++ if (ioctl(fd, VIDIOC_STREAMOFF, &format.type) < 0) ++ goto reset_fail_close_fd; ++ ++ close(fd); ++ ++ fd = open(device, O_RDWR); ++ if (fd < 0) ++ return false; ++ ++ if (ioctl(fd, VIDIOC_QUERYCAP, &capability) < 0) ++ goto reset_fail_close_fd; ++ ++ close(fd); ++ return (capability.device_caps & V4L2_CAP_VIDEO_OUTPUT) != 0; ++ ++reset_fail_close_fd: ++ close(fd); ++ return false; ++} ++ + static bool try_connect(void *data, const char *device) + { ++ static bool use_caps_workaround = false; + struct virtualcam_data *vcam = (struct virtualcam_data *)data; +- struct v4l2_format format; + struct v4l2_capability capability; ++ struct v4l2_format format; + struct v4l2_streamparm parm; + + uint32_t width = obs_output_get_width(vcam->output); +@@ -130,6 +174,13 @@ static bool try_connect(void *data, const char *device) + if (ioctl(vcam->device, VIDIOC_QUERYCAP, &capability) < 0) + goto fail_close_device; + ++ if (!use_caps_workaround && !(capability.device_caps & V4L2_CAP_VIDEO_OUTPUT)) { ++ if (!try_reset_output_caps(device)) ++ goto fail_close_device; ++ use_caps_workaround = true; ++ } ++ vcam->use_caps_workaround = use_caps_workaround; ++ + format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + + if (ioctl(vcam->device, VIDIOC_G_FMT, &format) < 0) +@@ -165,7 +216,7 @@ static bool try_connect(void *data, const char *device) + memset(&parm, 0, sizeof(parm)); + parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + +- if (ioctl(vcam->device, VIDIOC_STREAMON, &parm) < 0) { ++ if (vcam->use_caps_workaround && ioctl(vcam->device, VIDIOC_STREAMON, &parm.type) < 0) { + blog(LOG_ERROR, "Failed to start streaming on '%s' (%s)", device, strerror(errno)); + goto fail_close_device; + } +@@ -241,7 +292,7 @@ static void virtualcam_stop(void *data, uint64_t ts) + struct v4l2_streamparm parm = {0}; + parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + +- if (ioctl(vcam->device, VIDIOC_STREAMOFF, &parm) < 0) { ++ if (vcam->use_caps_workaround && ioctl(vcam->device, VIDIOC_STREAMOFF, &parm) < 0) { + blog(LOG_WARNING, "Failed to stop streaming on video device %d (%s)", vcam->device, strerror(errno)); + } +
View file
_service
Changed
@@ -1,7 +1,7 @@ <services> <service name="tar_scm" mode="disabled"> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">31.0.1</param> + <param name="revision">31.0.3</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">b7b7c4cbbcd86eb29d8bbc51765be0338ed6814d</param> + <param name="changesrevision">fcd1910bf5116b69404a6ecdda6efedd1d00ebdf</param> </service> </servicedata> \ No newline at end of file
View file
obs-studio-31.0.1.tar.xz/UI/window-basic-main.cpp -> obs-studio-31.0.3.tar.xz/UI/window-basic-main.cpp
Changed
@@ -2195,14 +2195,14 @@ disableSaving++; } - disableSaving--; if (foundCollection || configuredCollection) { + disableSaving--; OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED); OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED); + OnEvent(OBS_FRONTEND_EVENT_SCENE_CHANGED); + OnEvent(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED); + disableSaving++; } - OnEvent(OBS_FRONTEND_EVENT_SCENE_CHANGED); - OnEvent(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED); - disableSaving++; } loaded = true;
View file
obs-studio-31.0.1.tar.xz/build-aux/modules/99-cef.json -> obs-studio-31.0.3.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.tar.xz", - "sha256": "fab66dfc9cfd2e26fb87798f855aef30c2004edc8e19570d37af555644ae1655" + "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v3.tar.xz", + "sha256": "cb7225c7a937ac4cdc9c41700061f45cccc640d696902357782e57f8250bf43a" } }
View file
obs-studio-31.0.1.tar.xz/buildspec.json -> obs-studio-31.0.3.tar.xz/buildspec.json
Changed
@@ -27,11 +27,18 @@ "baseUrl": "https://cdn-fastly.obsproject.com/downloads", "label": "Chromium Embedded Framework", "hashes": { - "macos-x86_64": "139c6664b6c9c446e0b56f303586fa6bd4b3587bae4742e13967c2f0f99c8740", - "macos-arm64": "8e833fce815b83114ab381c055122a18dc415e29af5c4db0a577caf4b817baa2", - "ubuntu-x86_64": "fab66dfc9cfd2e26fb87798f855aef30c2004edc8e19570d37af555644ae1655", - "ubuntu-aarch64": "ab09f04e534306d3f301ea997c03a6a9f7bd245042d50a434f17c1c98ac64b89", - "windows-x64": "87b1033ff0f8f2fb7262d8a236bc36b981cb50d24b401c20cdf9b31099a9a217" + "macos-x86_64": "d494f1a18746ae65846853c844c1dcf5efa2348e0f422bcbd97059a536f24496", + "macos-arm64": "1bb59dbb759150e170796f641a4a84c59c0dea4ffef89477e9d811520af5d15a", + "ubuntu-x86_64": "cb7225c7a937ac4cdc9c41700061f45cccc640d696902357782e57f8250bf43a", + "ubuntu-aarch64": "f92df7f076bdc8cac2e3c77e27be418008b7168723201cb73fdbc2f6d91bc778", + "windows-x64": "922efbda1f2f8be9e5b2754d878a14d90afc81f04e94fc9101a7513e2b5cecc1" + }, + "revision": { + "macos-x86_64": 3, + "macos-arm64": 3, + "ubuntu-x86_64": 3, + "ubuntu-aarch64": 3, + "windows-x64": 2 } } },
View file
obs-studio-31.0.1.tar.xz/cmake/finders/FindFFmpeg.cmake -> obs-studio-31.0.3.tar.xz/cmake/finders/FindFFmpeg.cmake
Changed
@@ -295,7 +295,7 @@ STRINGS "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h" _version_string - REGEX "^.*FFMPEG_VERSION \t+\"n?0-9a-z\\~.-+\" \t*$" + REGEX "^.*FFMPEG_VERSION \t+\"n?0-9a-z\\~+.-+\" \t*$" ) string(REGEX REPLACE ".*FFMPEG_VERSION \t+\"n?(0-9+\\.0-9).*\".*" "\\1" FFmpeg_VERSION "${_version_string}") endif()
View file
obs-studio-31.0.1.tar.xz/libobs/obs-config.h -> obs-studio-31.0.3.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 3 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-31.0.1.tar.xz/libobs/obs-output.c -> obs-studio-31.0.3.tar.xz/libobs/obs-output.c
Changed
@@ -2878,8 +2878,8 @@ { bool reconnect_active = output->reconnect_retry_max != 0; - return code != OBS_OUTPUT_INVALID_STREAM && ((reconnecting(output) && code != OBS_OUTPUT_SUCCESS) || - (reconnect_active && code == OBS_OUTPUT_DISCONNECTED)); + return (reconnecting(output) && code != OBS_OUTPUT_SUCCESS) || + (reconnect_active && code == OBS_OUTPUT_DISCONNECTED); } void obs_output_signal_stop(obs_output_t *output, int code) @@ -2897,6 +2897,8 @@ } else { if (delay_active(output)) os_atomic_set_bool(&output->delay_active, false); + if (reconnecting(output)) + os_atomic_set_bool(&output->reconnecting, false); obs_output_end_data_capture(output); } }
View file
obs-studio-31.0.1.tar.xz/libobs/obs-scene.c -> obs-studio-31.0.3.tar.xz/libobs/obs-scene.c
Changed
@@ -1990,6 +1990,14 @@ new_scene = make_private ? create_private_id(scene->source->info.id, name) : create_id(scene->source->info.id, name); + new_scene->is_group = scene->is_group; + new_scene->custom_size = scene->custom_size; + new_scene->cx = scene->cx; + new_scene->cy = scene->cy; + new_scene->absolute_coordinates = scene->absolute_coordinates; + new_scene->last_width = scene->last_width; + new_scene->last_height = scene->last_height; + obs_source_copy_filters(new_scene->source, scene->source); obs_data_apply(new_scene->source->private_settings, scene->source->private_settings);
View file
obs-studio-31.0.1.tar.xz/plugins/mac-avcapture/plugin-main.m -> obs-studio-31.0.3.tar.xz/plugins/mac-avcapture/plugin-main.m
Changed
@@ -20,8 +20,8 @@ capture_data->isFastPath = false; capture_data->settings = settings; capture_data->source = source; - capture_data->videoFrame = bmalloc(sizeof(OBSAVCaptureVideoFrame)); - capture_data->audioFrame = bmalloc(sizeof(OBSAVCaptureAudioFrame)); + capture_data->videoFrame = bzalloc(sizeof(OBSAVCaptureVideoFrame)); + capture_data->audioFrame = bzalloc(sizeof(OBSAVCaptureAudioFrame)); OBSAVCapture *capture = OBSAVCapture alloc initWithCaptureInfo:capture_data; @@ -228,33 +228,36 @@ if (!capture) { return; } + /// It is possible that the source's serial queue is still creating this source, so perform destruction + /// synchronously on that queue to ensure the source is fully initialized before being destroyed. + dispatch_sync(capture.sessionQueue, ^{ + OBSAVCaptureInfo *capture_info = capture.captureInfo; - OBSAVCaptureInfo *capture_info = capture.captureInfo; - - capture stopCaptureSession; - capture.deviceInput.device unlockForConfiguration; + capture stopCaptureSession; + capture.deviceInput.device unlockForConfiguration; - if (capture_info->isFastPath) { - pthread_mutex_destroy(&capture_info->mutex); - } + if (capture_info->isFastPath) { + pthread_mutex_destroy(&capture_info->mutex); + } - if (capture_info->videoFrame) { - bfree(capture_info->videoFrame); - capture_info->videoFrame = NULL; - } + if (capture_info->videoFrame) { + bfree(capture_info->videoFrame); + capture_info->videoFrame = NULL; + } - if (capture_info->audioFrame) { - bfree(capture_info->audioFrame); - capture_info->audioFrame = NULL; - } + if (capture_info->audioFrame) { + bfree(capture_info->audioFrame); + capture_info->audioFrame = NULL; + } - if (capture_info->sampleBufferDescription) { - capture_info->sampleBufferDescription = NULL; - } + if (capture_info->sampleBufferDescription) { + capture_info->sampleBufferDescription = NULL; + } - bfree(capture_info); + bfree(capture_info); - CFBridgingRelease((__bridge CFTypeRef _Nullable)(capture)); + CFBridgingRelease((__bridge CFTypeRef _Nullable)(capture)); + }); } #pragma mark - OBS Module API
View file
obs-studio-31.0.1.tar.xz/plugins/nv-filters/nv_sdk_versions.h -> obs-studio-31.0.3.tar.xz/plugins/nv-filters/nv_sdk_versions.h
Changed
@@ -1,2 +1,2 @@ -#define MIN_VFX_SDK_VERSION (0 << 24 | 7 << 16 | 2 << 8 | 0 << 0) -#define MIN_AFX_SDK_VERSION (1 << 24 | 3 << 16 | 0 << 0) +#define MIN_VFX_SDK_VERSION (0 << 24 | 7 << 16 | 6 << 8 | 0 << 0) +#define MIN_AFX_SDK_VERSION (1 << 24 | 6 << 16 | 1 << 8 | 2 << 0)
View file
obs-studio-31.0.1.tar.xz/plugins/nv-filters/nvidia-videofx-filter.c -> obs-studio-31.0.3.tar.xz/plugins/nv-filters/nvidia-videofx-filter.c
Changed
@@ -55,7 +55,6 @@ bool processed_frame; bool target_valid; bool got_new_frame; - signal_handler_t *handler; /* RTX SDK vars */ NvVFX_Handle handle; @@ -145,10 +144,8 @@ if (filter->strength != strength) { filter->strength = strength; vfxErr = NvVFX_SetF32(filter->handle_blur, NVVFX_STRENGTH, filter->strength); + vfxErr = NvVFX_Load(filter->handle_blur); } - vfxErr = NvVFX_Load(filter->handle_blur); - if (NVCV_SUCCESS != vfxErr) - error("Error loading blur FX %i", vfxErr); } } @@ -183,10 +180,6 @@ NvCVImage_Destroy(filter->blur_dst_img); } } - if (filter->stream) - NvVFX_CudaStreamDestroy(filter->stream); - if (filter->stream_blur) - NvVFX_CudaStreamDestroy(filter->stream_blur); if (filter->handle) { if (filter->stateObjectHandle) { @@ -197,6 +190,10 @@ if (filter->handle_blur) { NvVFX_DestroyEffect(filter->handle_blur); } + if (filter->stream) + NvVFX_CudaStreamDestroy(filter->stream); + if (filter->stream_blur) + NvVFX_CudaStreamDestroy(filter->stream_blur); if (filter->effect) { obs_enter_graphics(); @@ -295,7 +292,6 @@ filter->height = 0; filter->initial_render = false; os_atomic_set_bool(&filter->processing_stop, false); - filter->handler = NULL; filter->processing_interval = 1; filter->processing_counter = 0; // set nvvfx_fx_id @@ -378,12 +374,6 @@ os_atomic_set_bool(&filter->processing_stop, true); // A first destroy - if (filter->stream) { - NvVFX_CudaStreamDestroy(filter->stream); - } - if (filter->stream_blur) { - NvVFX_CudaStreamDestroy(filter->stream_blur); - } if (filter->handle) { if (filter->stateObjectHandle) { NvVFX_DeallocateState(filter->handle, filter->stateObjectHandle); @@ -393,6 +383,12 @@ if (filter->handle_blur) { NvVFX_DestroyEffect(filter->handle_blur); } + if (filter->stream) { + NvVFX_CudaStreamDestroy(filter->stream); + } + if (filter->stream_blur) { + NvVFX_CudaStreamDestroy(filter->stream_blur); + } // B recreate /* 1. Create FX */ /* 2. Set models path & initialize CudaStream */ @@ -407,7 +403,9 @@ vfxErr = NvVFX_Load(filter->handle); if (NVCV_SUCCESS != vfxErr) error("Error loading NVIDIA Video FX %i", vfxErr); - vfxErr = NvVFX_ResetState(filter->handle, filter->stateObjectHandle); + // reallocate state object + vfxErr = NvVFX_AllocateState(filter->handle, &filter->stateObjectHandle); + vfxErr = NvVFX_SetStateObjectHandleArray(filter->handle, NVVFX_STATE, &filter->stateObjectHandle); } if (filter->filter_id != S_FX_AIGS) { vfxErr = NvVFX_SetF32(filter->handle_blur, NVVFX_STRENGTH, filter->strength); @@ -632,7 +630,7 @@ } /* 2. Convert to BGR. */ - vfxErr = NvCVImage_Transfer(filter->src_img, filter->BGR_src_img, 1.0f, filter->stream_blur, filter->stage); + vfxErr = NvCVImage_Transfer(filter->src_img, filter->BGR_src_img, 1.0f, process_stream, filter->stage); if (vfxErr != NVCV_SUCCESS) { const char *errString = NvCV_GetErrorStringFromCode(vfxErr); error("Error converting src to BGR img; error %i: %s", vfxErr, errString); @@ -834,7 +832,7 @@ gs_effect_set_texture_srgb(filter->blur_param, filter->blur_texture); } else { gs_effect_set_texture(filter->mask_param, filter->alpha_texture); - gs_effect_set_float(filter->threshold_param, filter->threshold); + gs_effect_set_float(filter->threshold_param, min(filter->threshold, 0.95f)); } gs_effect_set_texture_srgb(filter->image_param, gs_texrender_get_texture(filter->render)); @@ -874,11 +872,6 @@ return; } - if (parent && !filter->handler) { - filter->handler = obs_source_get_signal_handler(parent); - signal_handler_connect(filter->handler, "update", nvvfx_filter_reset, filter); - } - /* 1. Render to retrieve texture. */ if (!filter->render) { obs_source_skip_video_filter(filter->context); @@ -1189,14 +1182,6 @@ LOAD_SYM(NvCVImage_FromD3DColorSpace); #undef LOAD_SYM -#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB(sym, nv_cudart, "cudart64_110.dll") - LOAD_SYM(cudaMalloc); - LOAD_SYM(cudaStreamSynchronize); - LOAD_SYM(cudaFree); - LOAD_SYM(cudaMemcpy); - LOAD_SYM(cudaMemsetAsync); -#undef LOAD_SYM - #define LOAD_SYM(sym) LOAD_SYM_FROM_LIB2(sym, nv_videofx, "NVVideoEffects.dll") LOAD_SYM(NvVFX_SetStateObjectHandleArray); LOAD_SYM(NvVFX_AllocateState);
View file
obs-studio-31.0.1.tar.xz/plugins/nv-filters/nvvfx-load.h -> obs-studio-31.0.3.tar.xz/plugins/nv-filters/nvvfx-load.h
Changed
@@ -670,15 +670,6 @@ FreeLibrary(nv_cvimage); nv_cvimage = NULL; } - cudaMalloc = NULL; - cudaStreamSynchronize = NULL; - cudaFree = NULL; - cudaMemcpy = NULL; - cudaMemsetAsync = NULL; - if (nv_cudart) { - FreeLibrary(nv_cudart); - nv_cudart = NULL; - } } static inline void nvvfx_get_sdk_path(char *buffer, const size_t len) @@ -702,9 +693,8 @@ nv_videofx = LoadLibrary(L"NVVideoEffects.dll"); nv_cvimage = LoadLibrary(L"NVCVImage.dll"); - nv_cudart = LoadLibrary(L"cudart64_110.dll"); SetDllDirectoryA(NULL); - return !!nv_videofx && !!nv_cvimage && !!nv_cudart; + return !!nv_videofx && !!nv_cvimage; } static unsigned int get_lib_version(void)
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/browser-app.cpp -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/browser-app.cpp
Changed
@@ -78,10 +78,16 @@ // Don't override existing, as this can break OSR std::string disableFeatures = command_line->GetSwitchValue("disable-features"); disableFeatures += ",HardwareMediaKeyHandling"; +#ifdef _WIN32 + disableFeatures += ",EnableWindowsGamingInputDataFetcher"; +#endif disableFeatures += ",WebBluetooth"; command_line->AppendSwitchWithValue("disable-features", disableFeatures); } else { command_line->AppendSwitchWithValue("disable-features", "WebBluetooth," +#ifdef _WIN32 + "EnableWindowsGamingInputDataFetcher," +#endif "HardwareMediaKeyHandling"); }
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/browser-client.cpp -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/browser-client.cpp
Changed
@@ -83,6 +83,23 @@ return nullptr; } +void BrowserClient::OnRenderProcessTerminated(CefRefPtr<CefBrowser>, TerminationStatus, int, + const CefString &error_string) +{ + if (!valid()) + return; + + std::string str_text = error_string; + + const char *sourceName = "<unknown>"; + + if (bs && bs->source) + sourceName = obs_source_get_name(bs->source); + + blog(LOG_ERROR, "obs-browser: '%s' Webpage has crashed unexpectedly! Reason: '%s'", sourceName, + str_text.c_str()); +} + CefResourceRequestHandler::ReturnValue BrowserClient::OnBeforeResourceLoad(CefRefPtr<CefBrowser>, CefRefPtr<CefFrame>, CefRefPtr<CefRequest>, CefRefPtr<CefCallback>)
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/browser-client.hpp -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/browser-client.hpp
Changed
@@ -98,6 +98,8 @@ GetResourceRequestHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, bool is_navigation, bool is_download, const CefString &request_initiator, bool &disable_default_handling) override; + virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, TerminationStatus status, int error_code, + const CefString &error_string) override; /* CefResourceRequestHandler */ virtual CefResourceRequestHandler::ReturnValue OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/browser-version.h -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/browser-version.h
Changed
@@ -2,7 +2,7 @@ #define OBS_BROWSER_VERSION_MAJOR 2 #define OBS_BROWSER_VERSION_MINOR 24 -#define OBS_BROWSER_VERSION_PATCH 4 +#define OBS_BROWSER_VERSION_PATCH 6 #ifndef MAKE_SEMANTIC_VERSION #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/cmake/os-linux.cmake -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/cmake/os-linux.cmake
Changed
@@ -1,7 +1,5 @@ find_package(X11 REQUIRED) -target_compile_definitions(obs-browser PRIVATE ENABLE_BROWSER_QT_LOOP) - target_link_libraries(obs-browser PRIVATE CEF::Wrapper CEF::Library X11::X11) set_target_properties(obs-browser PROPERTIES BUILD_RPATH "$ORIGIN/" INSTALL_RPATH "$ORIGIN/")
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/obs-browser-plugin.cpp -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/obs-browser-plugin.cpp
Changed
@@ -281,7 +281,7 @@ os_mkdir(conf_path); CefSettings settings; - settings.log_severity = LOGSEVERITY_DISABLE; + settings.log_severity = LOGSEVERITY_FATAL; BPtr<char> log_path = obs_module_config_path("debug.log"); BPtr<char> log_path_abs = os_get_abs_path_ptr(log_path); CefString(&settings.log_file) = log_path_abs; @@ -367,10 +367,10 @@ #if !defined(_WIN32) BackupSignalHandlers(); - CefInitialize(args, settings, app, nullptr); + bool success = CefInitialize(args, settings, app, nullptr); RestoreSignalHandlers(); #elif (CHROME_VERSION_BUILD > 3770) - CefInitialize(args, settings, app, nullptr); + bool success = CefInitialize(args, settings, app, nullptr); #else /* Massive (but amazing) hack to prevent chromium from modifying our * process tokens and permissions, which caused us problems with winrt, @@ -379,9 +379,14 @@ * we'll just switch back to the static library but I doubt we'll need * to. */ uintptr_t zeroed_memory_lol32 = {}; - CefInitialize(args, settings, app, zeroed_memory_lol); + bool success = CefInitialize(args, settings, app, zeroed_memory_lol); #endif + if (!success) { + blog(LOG_ERROR, "obs-browser: CEF failed to initialize. Exit code: %d", CefGetExitCode()); + return; + } + #if !ENABLE_LOCAL_FILE_URL_SCHEME /* Register http://absolute/ scheme handler for older * CEF builds which do not support file:// URLs */ @@ -774,8 +779,8 @@ BrowserShutdown(); #else if (manager_thread.joinable()) { - while (!QueueCEFTask(() { CefQuitMessageLoop(); })) - os_sleep_ms(5); + if (!QueueCEFTask(() { CefQuitMessageLoop(); })) + blog(LOG_DEBUG, "obs-browser: Failed to post CefQuit task to loop"); manager_thread.join(); }
View file
obs-studio-31.0.1.tar.xz/plugins/obs-browser/panel/browser-panel-client.cpp -> obs-studio-31.0.3.tar.xz/plugins/obs-browser/panel/browser-panel-client.cpp
Changed
@@ -216,7 +216,7 @@ void QCefBrowserClient::OnBeforeClose(CefRefPtr<CefBrowser>) { if (widget) { - emit widget->CloseSafely(); + widget->CloseSafely(); } }
View file
obs-studio-31.0.1.tar.xz/plugins/obs-nvenc/nvenc-cuda.c -> obs-studio-31.0.3.tar.xz/plugins/obs-nvenc/nvenc-cuda.c
Changed
@@ -118,9 +118,8 @@ desc.Height += enc->cy / 2; break; case NV_ENC_BUFFER_FORMAT_YUV420_10BIT: - desc.Format = CU_AD_FORMAT_UNSIGNED_INT16; + desc.Format = CU_AD_FORMAT_UNSIGNED_INT16; // 2 bytes per element desc.Height += enc->cy / 2; - desc.NumChannels = 2; // number of bytes per element break; case NV_ENC_BUFFER_FORMAT_YUV444: desc.Format = CU_AD_FORMAT_UNSIGNED_INT8;
View file
obs-studio-31.0.1.tar.xz/plugins/obs-nvenc/nvenc-properties.c -> obs-studio-31.0.3.tar.xz/plugins/obs-nvenc/nvenc-properties.c
Changed
@@ -126,7 +126,8 @@ p = obs_properties_add_int(props, "bitrate", obs_module_text("Bitrate"), 50, UINT32_MAX / 1000, 50); obs_property_int_set_suffix(p, " Kbps"); - obs_properties_add_int(props, "target_quality", obs_module_text("TargetQuality"), 1, 51, 1); + obs_properties_add_int(props, "target_quality", obs_module_text("TargetQuality"), 1, + codec == CODEC_AV1 ? 63 : 51, 1); p = obs_properties_add_int(props, "max_bitrate", obs_module_text("MaxBitrate"), 0, UINT32_MAX / 1000, 50); obs_property_int_set_suffix(p, " Kbps");
View file
obs-studio-31.0.1.tar.xz/plugins/obs-nvenc/nvenc.c -> obs-studio-31.0.3.tar.xz/plugins/obs-nvenc/nvenc.c
Changed
@@ -392,7 +392,8 @@ dstr_catf(&log, "\theight: %d\n", enc->cy); dstr_catf(&log, "\tb-frames: %ld\n", enc->props.bf); dstr_catf(&log, "\tb-ref-mode: %ld\n", enc->props.bframe_ref_mode); - dstr_catf(&log, "\tlookahead: %s (%d frames)\n", lookahead ? "true" : "false", rc_lookahead); + dstr_catf(&log, "\tlookahead: %s (%d frames)\n", lookahead ? "true" : "false", + config->rcParams.lookaheadDepth); dstr_catf(&log, "\taq: %s\n", enc->props.adaptive_quantization ? "true" : "false"); if (enc->props.split_encode) {
View file
obs-studio-31.0.1.tar.xz/plugins/obs-websocket/CMakeLists.txt -> obs-studio-31.0.3.tar.xz/plugins/obs-websocket/CMakeLists.txt
Changed
@@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16...3.25) -set(obs-websocket_VERSION 5.5.4) +set(obs-websocket_VERSION 5.5.6) set(OBS_WEBSOCKET_RPC_VERSION 1) include(cmake/obs-websocket-api.cmake)
View file
obs-studio-31.0.1.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Scenes.cpp -> obs-studio-31.0.3.tar.xz/plugins/obs-websocket/src/eventhandler/EventHandler_Scenes.cpp
Changed
@@ -109,6 +109,9 @@ { OBSSourceAutoRelease currentScene = obs_frontend_get_current_scene(); + if (!currentScene) + return; + json eventData; eventData"sceneName" = obs_source_get_name(currentScene); eventData"sceneUuid" = obs_source_get_uuid(currentScene);
View file
obs-studio-31.0.1.tar.xz/plugins/obs-websocket/src/utils/Json.cpp -> obs-studio-31.0.3.tar.xz/plugins/obs-websocket/src/utils/Json.cpp
Changed
@@ -178,7 +178,7 @@ bool Utils::Json::GetJsonFileContent(std::string fileName, json &content) { - std::ifstream f(fileName); + std::ifstream f(std::filesystem::u8path(fileName)); if (!f.is_open()) return false; @@ -195,9 +195,11 @@ bool Utils::Json::SetJsonFileContent(std::string fileName, const json &content, bool makeDirs) { + auto jsonFilePath = std::filesystem::u8path(fileName); + if (makeDirs) { + auto p = jsonFilePath.parent_path(); std::error_code ec; - auto p = std::filesystem::path(fileName).parent_path(); if (!ec && !std::filesystem::exists(p, ec)) std::filesystem::create_directories(p, ec); if (ec) { @@ -207,7 +209,7 @@ } } - std::ofstream f(fileName); + std::ofstream f(jsonFilePath); if (!f.is_open()) { blog(LOG_ERROR, "Utils::Json::SetJsonFileContent Failed to open file `%s` for writing", fileName.c_str()); return false;
View file
obs-studio-31.0.1.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-31.0.3.tar.xz/plugins/rtmp-services/data/package.json
Changed
@@ -1,11 +1,11 @@ { "$schema": "schema/package-schema.json", "url": "https://obsproject.com/obs2_update/rtmp-services/v5", - "version": 264, + "version": 268, "files": { "name": "services.json", - "version": 264 + "version": 268 } }
View file
obs-studio-31.0.1.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-31.0.3.tar.xz/plugins/rtmp-services/data/services.json
Changed
@@ -708,18 +708,58 @@ "url": "rtmp://qc.castr.io/static" }, { - "name": "SA (Sao Paulo, BR)", + "name": "Mexico", + "url": "rtmp://mexico.castr.io/static" + }, + { + "name": "Sao Paulo, BR", "url": "rtmp://br.castr.io/static" }, { + "name": "Colombia", + "url": "rtmp://bogota.castr.io/static" + }, + { + "name": "Santiago, Chile", + "url": "rtmp://santiago.castr.io/static" + }, + { + "name": "Istanbul, TR", + "url": "rtmp://istanbul.castr.io/static" + }, + { + "name": "Tel Aviv, IL", + "url": "rtmp://telaviv.castr.io/static" + }, + { "name": "EU-West (London, UK)", "url": "rtmp://uk.castr.io/static" }, { + "name": "EU-West (Paris, FR)", + "url": "rtmp://paris.castr.io/static" + }, + { + "name": "EU-West (Madrid, ES)", + "url": "rtmp://madrid.castr.io/static" + }, + { "name": "EU-Central (Frankfurt, DE)", "url": "rtmp://fr.castr.io/static" }, { + "name": "EU-Central (Milan, IT)", + "url": "rtmp://milan.castr.io/static" + }, + { + "name": "EU-North (Stockholm, SE)", + "url": "rtmp://stockholm.castr.io/static" + }, + { + "name": "EU-North (Copenhagen, DK)", + "url": "rtmp://copenhagen.castr.io/static" + }, + { "name": "Russia (Moscow)", "url": "rtmp://ru.castr.io/static" }, @@ -728,6 +768,10 @@ "url": "rtmp://sg.castr.io/static" }, { + "name": "Asia (Hong Kong, HK)", + "url": "rtmp://hongkong.castr.io/static" + }, + { "name": "Asia (India)", "url": "rtmp://in.castr.io/static" }, @@ -736,6 +780,18 @@ "url": "rtmp://au.castr.io/static" }, { + "name": "UAE (Dubai)", + "url": "rtmp://dubai.castr.io/static" + }, + { + "name": "Africa (Johannesburg, ZA)", + "url": "rtmp://southafrica.castr.io/static" + }, + { + "name": "Africa (Lagos, NG)", + "url": "rtmp://lagos.castr.io/static" + }, + { "name": "US Central", "url": "rtmp://us-central.castr.io/static" }, @@ -1563,14 +1619,6 @@ { "name": "CloudBeta", "url": "rtmp://cloudbetastreaming.onlyfans.com/live" - }, - { - "name": "Backup (USA)", - "url": "rtmp://route0.onlyfans.com/live" - }, - { - "name": "Backup (Europe)", - "url": "rtmp://route0-dc2.onlyfans.com/live" } , "recommended": { @@ -2675,22 +2723,10 @@ "url": "rtmp://live-us-lax-stream.shareplay.tv" }, { - "name": "Seattle, Washington, USA", - "url": "rtmp://live-us-sea-stream.shareplay.tv" - }, - { - "name": "Paris, France", - "url": "rtmp://live-fr-par-stream.shareplay.tv" - }, - { "name": "Milan, Italy", "url": "rtmp://live-it-mil-stream.shareplay.tv" }, { - "name": "Sydney, Australia", - "url": "rtmp://live-au-syd-stream.shareplay.tv" - }, - { "name": "Toronto, Canada", "url": "rtmp://live-ca-yyz-stream.shareplay.tv" }, @@ -3530,6 +3566,21 @@ "supported video codecs": "h264" + }, + { + "name": "VRCDN - Live", + "more_info_link": "https://vrcdn.live", + "servers": + { + "name": "Automatic", + "url": "rtmp://ingest.vrcdn.live/live" + } + , + "supported video codecs": "h264", + "recommended": { + "keyint": 1, + "max video bitrate": 6000 + } } }
View file
obs-studio-31.0.1.tar.xz/plugins/win-capture/data/compatibility.json -> obs-studio-31.0.3.tar.xz/plugins/win-capture/data/compatibility.json
Changed
@@ -603,6 +603,20 @@ "window_capture_wgc": false, "message": "The Bazaar may require OBS to be run as admin to use Game Capture.", "url": "https://obsproject.com/kb/game-capture-troubleshooting" + }, + { + "name": "FragPunk", + "translation_key": "Compatibility.GameCapture.Admin", + "severity": 1, + "executable": "FragPunk.exe", + "window_class": "", + "window_title": "", + "match_flags": 1, + "game_capture": true, + "window_capture": false, + "window_capture_wgc": false, + "message": "FragPunk may require OBS to be run as admin to use Game Capture.", + "url": "https://obsproject.com/kb/game-capture-troubleshooting" } }
View file
obs-studio-31.0.1.tar.xz/plugins/win-capture/data/package.json -> obs-studio-31.0.3.tar.xz/plugins/win-capture/data/package.json
Changed
@@ -1,11 +1,11 @@ { "$schema": "schema/package-schema.json", "url": "https://obsproject.com/obs2_update/win-capture/v1", - "version": 6, + "version": 7, "files": { "name": "compatibility.json", - "version": 6 + "version": 7 } }
View file
obs-studio-31.0.1.tar.xz/plugins/win-dshow/win-dshow.cpp -> obs-studio-31.0.3.tar.xz/plugins/win-dshow/win-dshow.cpp
Changed
@@ -936,6 +936,12 @@ return false; } + if (!videoConfig.cx || !videoConfig.cy_abs) { + blog(LOG_ERROR, "%s: Frame width or height are zero (%" PRIu32 "x%" PRIu32 ")", + obs_source_get_name(source), videoConfig.cx, videoConfig.cy_abs); + return false; + } + DStr formatName = GetVideoFormatName(videoConfig.internalFormat); double fps = 0.0;
View file
obs-studio-31.0.1.tar.xz/shared/obs-scripting/obs-scripting-python-import.c -> obs-studio-31.0.3.tar.xz/shared/obs-scripting/obs-scripting-python-import.c
Changed
@@ -35,7 +35,7 @@ #define PATH_MAX MAX_PATH #elif __APPLE__ #define VERSION_PATTERN "%d.%d" -#define FILE_PATTERN "Python.framework/Versions/Current/lib/libpython%s.dylib" +#define FILE_PATTERN "Python.framework/Versions/%s/lib/libpython%s.dylib" #endif #define PY_MAJOR_VERSION_MAX 3 @@ -71,7 +71,7 @@ struct dstr temp; dstr_init(&temp); - dstr_printf(&temp, FILE_PATTERN, cur_version); + dstr_printf(&temp, FILE_PATTERN, cur_version, cur_version); int minor_version = PY_MINOR_VERSION_MAX; do {
View file
obs-studio-31.0.1.tar.xz/shared/obs-scripting/obs-scripting-python.c -> obs-studio-31.0.3.tar.xz/shared/obs-scripting/obs-scripting-python.c
Changed
@@ -1607,7 +1607,8 @@ if (python_path && *python_path) { #ifdef __APPLE__ char tempPATH_MAX; - snprintf(temp, sizeof(temp), "%s/Python.framework/Versions/Current", python_path); + snprintf(temp, sizeof(temp), "%s/Python.framework/Versions/%i.%i", python_path, python_version.major, + python_version.minor); os_utf8_to_wcs(temp, 0, home_path, PATH_MAX); Py_SetPythonHome(home_path); #else
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
.