Difference Between Revision 3 and Multimedia / obs-studio

obs-studio.changes Changed
x
 
1
@@ -1,4 +1,46 @@
2
 -------------------------------------------------------------------
3
+Fri Mar 28 22:26:17 UTC 2025 - packman@nordisch.org
4
+
5
+- Update to version 31.0.3:
6
+  * libobs: Update version to 31.0.3
7
+  * libobs: Fix duplicating scene with custom size
8
+  * obs-websocket: Update version to 5.5.6
9
+  * UI: Only emit frontend events for existing scene collection
10
+  * rtmp-services: Add "VRCDN - Live" service
11
+  * rtmp-services: Update Castr.io ingests
12
+  * rtmp-services: Remove defunct servers/services
13
+  * mac-avcapture: Clear memory when creating frame struct
14
+  * obs-browser: Update version to 2.24.6
15
+  * nv-filters:  Silence initial load error for Blur
16
+  * nv-filters: Remove reset signal for Video effects
17
+  * nv-filters: Fix  CudaStream used in Video effects
18
+  * nv-filters: Reallocate state when resetting AIGS filters
19
+  * nv-filters: Fix destruction of Background Blur effect
20
+  * nv-filters: Set max effective threshold to 0.95 for Background removal
21
+  * obs-nvenc: Fix incorrect CUDA array size allocation
22
+  * libobs: Reset reconnecting state when can_reconnect is false
23
+  * Revert "libobs: Do not allow reconnect if stop code is OBS_OUTPUT_INVALID_STREAM"
24
+  * CI: Use rebuilt CEF to avoid memory allocation crashes on macOS
25
+  * win-capture: Add FragPunk to compatibility list
26
+  * rtmp-services: Remove unresponsive servers
27
+
28
+-------------------------------------------------------------------
29
+Fri Mar 07 23:49:06 UTC 2025 - packman@nordisch.org
30
+
31
+- Update to version 31.0.2:
32
+  * libobs: Update version to 31.0.2
33
+  * mac-avcapture: Prevent race condition in source init/deinit
34
+  * win-dshow: Fix possible crash if frame width or height is zero
35
+  * obs-browser: Update version to 2.24.5
36
+  * obs-websocket: Update version to 5.5.5
37
+  * obs-nvenc: Fix lookahead depth value logging
38
+  * obs-nvenc: Correct max target quality for AV1
39
+  * cmake: Fix regexp to detect installed FFmpeg version
40
+  * nv-filters: Remove CUDA RT functions
41
+  * nv-filters: Update SDK version targeted
42
+  * obs-scripting: Fix macOS Homebrew Python loading
43
+
44
+-------------------------------------------------------------------
45
 Mon Jan 20 09:57:57 UTC 2025 - darix <packman@nordisch.org>
46
 
47
 - make nvenc handling more readable
48
obs-studio.spec Changed
10
 
1
@@ -35,7 +35,7 @@
2
 %endif
3
 
4
 Name:           obs-studio
5
-Version:        31.0.1
6
+Version:        31.0.3
7
 Release:        0
8
 Summary:        A recording/broadcasting program
9
 Group:          Productivity/Multimedia/Video/Editors and Convertors
10
_service Changed
10
 
1
@@ -1,7 +1,7 @@
2
 <services>
3
   <service name="tar_scm" mode="disabled">
4
     <param name="versionformat">@PARENT_TAG@</param>
5
-    <param name="revision">31.0.1</param>
6
+    <param name="revision">31.0.3</param>
7
     <param name="url">https://github.com/obsproject/obs-studio.git</param>
8
     <param name="versionrewrite-pattern">(\.\d+)-(a-z.*)</param>
9
     <param name="versionrewrite-replacement">\1~\2</param>
10
_servicedata Changed
10
 
1
@@ -1,6 +1,6 @@
2
 <servicedata>
3
   <service name="tar_scm">
4
     <param name="url">https://github.com/obsproject/obs-studio.git</param>
5
-    <param name="changesrevision">b7b7c4cbbcd86eb29d8bbc51765be0338ed6814d</param>
6
+    <param name="changesrevision">fcd1910bf5116b69404a6ecdda6efedd1d00ebdf</param>
7
   </service>
8
 </servicedata>
9
\ No newline at end of file
10
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
20
 
1
@@ -2195,14 +2195,14 @@
2
            disableSaving++;
3
        }
4
 
5
-       disableSaving--;
6
        if (foundCollection || configuredCollection) {
7
+           disableSaving--;
8
            OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED);
9
            OnEvent(OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED);
10
+           OnEvent(OBS_FRONTEND_EVENT_SCENE_CHANGED);
11
+           OnEvent(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED);
12
+           disableSaving++;
13
        }
14
-       OnEvent(OBS_FRONTEND_EVENT_SCENE_CHANGED);
15
-       OnEvent(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED);
16
-       disableSaving++;
17
    }
18
 
19
    loaded = true;
20
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
12
 
1
@@ -17,8 +17,8 @@
2
     "sources": 
3
         {
4
             "type": "archive",
5
-            "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64.tar.xz",
6
-            "sha256": "fab66dfc9cfd2e26fb87798f855aef30c2004edc8e19570d37af555644ae1655"
7
+            "url": "https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v3.tar.xz",
8
+            "sha256": "cb7225c7a937ac4cdc9c41700061f45cccc640d696902357782e57f8250bf43a"
9
         }
10
     
11
 }
12
obs-studio-31.0.1.tar.xz/buildspec.json -> obs-studio-31.0.3.tar.xz/buildspec.json Changed
25
 
1
@@ -27,11 +27,18 @@
2
             "baseUrl": "https://cdn-fastly.obsproject.com/downloads",
3
             "label": "Chromium Embedded Framework",
4
             "hashes": {
5
-                "macos-x86_64": "139c6664b6c9c446e0b56f303586fa6bd4b3587bae4742e13967c2f0f99c8740",
6
-                "macos-arm64": "8e833fce815b83114ab381c055122a18dc415e29af5c4db0a577caf4b817baa2",
7
-                "ubuntu-x86_64": "fab66dfc9cfd2e26fb87798f855aef30c2004edc8e19570d37af555644ae1655",
8
-                "ubuntu-aarch64": "ab09f04e534306d3f301ea997c03a6a9f7bd245042d50a434f17c1c98ac64b89",
9
-                "windows-x64": "87b1033ff0f8f2fb7262d8a236bc36b981cb50d24b401c20cdf9b31099a9a217"
10
+                "macos-x86_64": "d494f1a18746ae65846853c844c1dcf5efa2348e0f422bcbd97059a536f24496",
11
+                "macos-arm64": "1bb59dbb759150e170796f641a4a84c59c0dea4ffef89477e9d811520af5d15a",
12
+                "ubuntu-x86_64": "cb7225c7a937ac4cdc9c41700061f45cccc640d696902357782e57f8250bf43a",
13
+                "ubuntu-aarch64": "f92df7f076bdc8cac2e3c77e27be418008b7168723201cb73fdbc2f6d91bc778",
14
+                "windows-x64": "922efbda1f2f8be9e5b2754d878a14d90afc81f04e94fc9101a7513e2b5cecc1"
15
+            },
16
+            "revision": {
17
+                "macos-x86_64": 3,
18
+                "macos-arm64": 3,
19
+                "ubuntu-x86_64": 3,
20
+                "ubuntu-aarch64": 3,
21
+                "windows-x64": 2
22
             }
23
         }
24
     },
25
obs-studio-31.0.1.tar.xz/cmake/finders/FindFFmpeg.cmake -> obs-studio-31.0.3.tar.xz/cmake/finders/FindFFmpeg.cmake Changed
10
 
1
@@ -295,7 +295,7 @@
2
     STRINGS
3
     "${FFmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h"
4
     _version_string
5
-    REGEX "^.*FFMPEG_VERSION \t+\"n?0-9a-z\\~.-+\" \t*$"
6
+    REGEX "^.*FFMPEG_VERSION \t+\"n?0-9a-z\\~+.-+\" \t*$"
7
   )
8
   string(REGEX REPLACE ".*FFMPEG_VERSION \t+\"n?(0-9+\\.0-9).*\".*" "\\1" FFmpeg_VERSION "${_version_string}")
9
 endif()
10
obs-studio-31.0.1.tar.xz/libobs/obs-config.h -> obs-studio-31.0.3.tar.xz/libobs/obs-config.h Changed
10
 
1
@@ -41,7 +41,7 @@
2
  *
3
  * Reset to zero each major or minor version
4
  */
5
-#define LIBOBS_API_PATCH_VER 1
6
+#define LIBOBS_API_PATCH_VER 3
7
 
8
 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
9
 
10
obs-studio-31.0.1.tar.xz/libobs/obs-output.c -> obs-studio-31.0.3.tar.xz/libobs/obs-output.c Changed
21
 
1
@@ -2878,8 +2878,8 @@
2
 {
3
    bool reconnect_active = output->reconnect_retry_max != 0;
4
 
5
-   return code != OBS_OUTPUT_INVALID_STREAM && ((reconnecting(output) && code != OBS_OUTPUT_SUCCESS) ||
6
-                            (reconnect_active && code == OBS_OUTPUT_DISCONNECTED));
7
+   return (reconnecting(output) && code != OBS_OUTPUT_SUCCESS) ||
8
+          (reconnect_active && code == OBS_OUTPUT_DISCONNECTED);
9
 }
10
 
11
 void obs_output_signal_stop(obs_output_t *output, int code)
12
@@ -2897,6 +2897,8 @@
13
    } else {
14
        if (delay_active(output))
15
            os_atomic_set_bool(&output->delay_active, false);
16
+       if (reconnecting(output))
17
+           os_atomic_set_bool(&output->reconnecting, false);
18
        obs_output_end_data_capture(output);
19
    }
20
 }
21
obs-studio-31.0.1.tar.xz/libobs/obs-scene.c -> obs-studio-31.0.3.tar.xz/libobs/obs-scene.c Changed
16
 
1
@@ -1990,6 +1990,14 @@
2
    new_scene = make_private ? create_private_id(scene->source->info.id, name)
3
                 : create_id(scene->source->info.id, name);
4
 
5
+   new_scene->is_group = scene->is_group;
6
+   new_scene->custom_size = scene->custom_size;
7
+   new_scene->cx = scene->cx;
8
+   new_scene->cy = scene->cy;
9
+   new_scene->absolute_coordinates = scene->absolute_coordinates;
10
+   new_scene->last_width = scene->last_width;
11
+   new_scene->last_height = scene->last_height;
12
+
13
    obs_source_copy_filters(new_scene->source, scene->source);
14
 
15
    obs_data_apply(new_scene->source->private_settings, scene->source->private_settings);
16
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
69
 
1
@@ -20,8 +20,8 @@
2
     capture_data->isFastPath = false;
3
     capture_data->settings = settings;
4
     capture_data->source = source;
5
-    capture_data->videoFrame = bmalloc(sizeof(OBSAVCaptureVideoFrame));
6
-    capture_data->audioFrame = bmalloc(sizeof(OBSAVCaptureAudioFrame));
7
+    capture_data->videoFrame = bzalloc(sizeof(OBSAVCaptureVideoFrame));
8
+    capture_data->audioFrame = bzalloc(sizeof(OBSAVCaptureAudioFrame));
9
 
10
     OBSAVCapture *capture = OBSAVCapture alloc initWithCaptureInfo:capture_data;
11
 
12
@@ -228,33 +228,36 @@
13
     if (!capture) {
14
         return;
15
     }
16
+    /// It is possible that the source's serial queue is still creating this source, so perform destruction
17
+    /// synchronously on that queue to ensure the source is fully initialized before being destroyed.
18
+    dispatch_sync(capture.sessionQueue, ^{
19
+        OBSAVCaptureInfo *capture_info = capture.captureInfo;
20
 
21
-    OBSAVCaptureInfo *capture_info = capture.captureInfo;
22
-
23
-    capture stopCaptureSession;
24
-    capture.deviceInput.device unlockForConfiguration;
25
+        capture stopCaptureSession;
26
+        capture.deviceInput.device unlockForConfiguration;
27
 
28
-    if (capture_info->isFastPath) {
29
-        pthread_mutex_destroy(&capture_info->mutex);
30
-    }
31
+        if (capture_info->isFastPath) {
32
+            pthread_mutex_destroy(&capture_info->mutex);
33
+        }
34
 
35
-    if (capture_info->videoFrame) {
36
-        bfree(capture_info->videoFrame);
37
-        capture_info->videoFrame = NULL;
38
-    }
39
+        if (capture_info->videoFrame) {
40
+            bfree(capture_info->videoFrame);
41
+            capture_info->videoFrame = NULL;
42
+        }
43
 
44
-    if (capture_info->audioFrame) {
45
-        bfree(capture_info->audioFrame);
46
-        capture_info->audioFrame = NULL;
47
-    }
48
+        if (capture_info->audioFrame) {
49
+            bfree(capture_info->audioFrame);
50
+            capture_info->audioFrame = NULL;
51
+        }
52
 
53
-    if (capture_info->sampleBufferDescription) {
54
-        capture_info->sampleBufferDescription = NULL;
55
-    }
56
+        if (capture_info->sampleBufferDescription) {
57
+            capture_info->sampleBufferDescription = NULL;
58
+        }
59
 
60
-    bfree(capture_info);
61
+        bfree(capture_info);
62
 
63
-    CFBridgingRelease((__bridge CFTypeRef _Nullable)(capture));
64
+        CFBridgingRelease((__bridge CFTypeRef _Nullable)(capture));
65
+    });
66
 }
67
 
68
 #pragma mark - OBS Module API
69
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
6
 
1
@@ -1,2 +1,2 @@
2
-#define MIN_VFX_SDK_VERSION (0 << 24 | 7 << 16 | 2 << 8 | 0 << 0)
3
-#define MIN_AFX_SDK_VERSION (1 << 24 | 3 << 16 | 0 << 0)
4
+#define MIN_VFX_SDK_VERSION (0 << 24 | 7 << 16 | 6 << 8 | 0 << 0)
5
+#define MIN_AFX_SDK_VERSION (1 << 24 | 6 << 16 | 1 << 8 | 2 << 0)
6
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
133
 
1
@@ -55,7 +55,6 @@
2
    bool processed_frame;
3
    bool target_valid;
4
    bool got_new_frame;
5
-   signal_handler_t *handler;
6
 
7
    /* RTX SDK vars */
8
    NvVFX_Handle handle;
9
@@ -145,10 +144,8 @@
10
        if (filter->strength != strength) {
11
            filter->strength = strength;
12
            vfxErr = NvVFX_SetF32(filter->handle_blur, NVVFX_STRENGTH, filter->strength);
13
+           vfxErr = NvVFX_Load(filter->handle_blur);
14
        }
15
-       vfxErr = NvVFX_Load(filter->handle_blur);
16
-       if (NVCV_SUCCESS != vfxErr)
17
-           error("Error loading blur FX %i", vfxErr);
18
    }
19
 }
20
 
21
@@ -183,10 +180,6 @@
22
            NvCVImage_Destroy(filter->blur_dst_img);
23
        }
24
    }
25
-   if (filter->stream)
26
-       NvVFX_CudaStreamDestroy(filter->stream);
27
-   if (filter->stream_blur)
28
-       NvVFX_CudaStreamDestroy(filter->stream_blur);
29
 
30
    if (filter->handle) {
31
        if (filter->stateObjectHandle) {
32
@@ -197,6 +190,10 @@
33
    if (filter->handle_blur) {
34
        NvVFX_DestroyEffect(filter->handle_blur);
35
    }
36
+   if (filter->stream)
37
+       NvVFX_CudaStreamDestroy(filter->stream);
38
+   if (filter->stream_blur)
39
+       NvVFX_CudaStreamDestroy(filter->stream_blur);
40
 
41
    if (filter->effect) {
42
        obs_enter_graphics();
43
@@ -295,7 +292,6 @@
44
    filter->height = 0;
45
    filter->initial_render = false;
46
    os_atomic_set_bool(&filter->processing_stop, false);
47
-   filter->handler = NULL;
48
    filter->processing_interval = 1;
49
    filter->processing_counter = 0;
50
    // set nvvfx_fx_id
51
@@ -378,12 +374,6 @@
52
 
53
    os_atomic_set_bool(&filter->processing_stop, true);
54
    // A first destroy
55
-   if (filter->stream) {
56
-       NvVFX_CudaStreamDestroy(filter->stream);
57
-   }
58
-   if (filter->stream_blur) {
59
-       NvVFX_CudaStreamDestroy(filter->stream_blur);
60
-   }
61
    if (filter->handle) {
62
        if (filter->stateObjectHandle) {
63
            NvVFX_DeallocateState(filter->handle, filter->stateObjectHandle);
64
@@ -393,6 +383,12 @@
65
    if (filter->handle_blur) {
66
        NvVFX_DestroyEffect(filter->handle_blur);
67
    }
68
+   if (filter->stream) {
69
+       NvVFX_CudaStreamDestroy(filter->stream);
70
+   }
71
+   if (filter->stream_blur) {
72
+       NvVFX_CudaStreamDestroy(filter->stream_blur);
73
+   }
74
    // B recreate
75
    /* 1. Create FX */
76
    /* 2. Set models path & initialize CudaStream */
77
@@ -407,7 +403,9 @@
78
        vfxErr = NvVFX_Load(filter->handle);
79
        if (NVCV_SUCCESS != vfxErr)
80
            error("Error loading NVIDIA Video FX %i", vfxErr);
81
-       vfxErr = NvVFX_ResetState(filter->handle, filter->stateObjectHandle);
82
+       // reallocate state object
83
+       vfxErr = NvVFX_AllocateState(filter->handle, &filter->stateObjectHandle);
84
+       vfxErr = NvVFX_SetStateObjectHandleArray(filter->handle, NVVFX_STATE, &filter->stateObjectHandle);
85
    }
86
    if (filter->filter_id != S_FX_AIGS) {
87
        vfxErr = NvVFX_SetF32(filter->handle_blur, NVVFX_STRENGTH, filter->strength);
88
@@ -632,7 +630,7 @@
89
    }
90
 
91
    /* 2. Convert to BGR. */
92
-   vfxErr = NvCVImage_Transfer(filter->src_img, filter->BGR_src_img, 1.0f, filter->stream_blur, filter->stage);
93
+   vfxErr = NvCVImage_Transfer(filter->src_img, filter->BGR_src_img, 1.0f, process_stream, filter->stage);
94
    if (vfxErr != NVCV_SUCCESS) {
95
        const char *errString = NvCV_GetErrorStringFromCode(vfxErr);
96
        error("Error converting src to BGR img; error %i: %s", vfxErr, errString);
97
@@ -834,7 +832,7 @@
98
            gs_effect_set_texture_srgb(filter->blur_param, filter->blur_texture);
99
        } else {
100
            gs_effect_set_texture(filter->mask_param, filter->alpha_texture);
101
-           gs_effect_set_float(filter->threshold_param, filter->threshold);
102
+           gs_effect_set_float(filter->threshold_param, min(filter->threshold, 0.95f));
103
        }
104
        gs_effect_set_texture_srgb(filter->image_param, gs_texrender_get_texture(filter->render));
105
 
106
@@ -874,11 +872,6 @@
107
        return;
108
    }
109
 
110
-   if (parent && !filter->handler) {
111
-       filter->handler = obs_source_get_signal_handler(parent);
112
-       signal_handler_connect(filter->handler, "update", nvvfx_filter_reset, filter);
113
-   }
114
-
115
    /* 1. Render to retrieve texture. */
116
    if (!filter->render) {
117
        obs_source_skip_video_filter(filter->context);
118
@@ -1189,14 +1182,6 @@
119
    LOAD_SYM(NvCVImage_FromD3DColorSpace);
120
 #undef LOAD_SYM
121
 
122
-#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB(sym, nv_cudart, "cudart64_110.dll")
123
-   LOAD_SYM(cudaMalloc);
124
-   LOAD_SYM(cudaStreamSynchronize);
125
-   LOAD_SYM(cudaFree);
126
-   LOAD_SYM(cudaMemcpy);
127
-   LOAD_SYM(cudaMemsetAsync);
128
-#undef LOAD_SYM
129
-
130
 #define LOAD_SYM(sym) LOAD_SYM_FROM_LIB2(sym, nv_videofx, "NVVideoEffects.dll")
131
    LOAD_SYM(NvVFX_SetStateObjectHandleArray);
132
    LOAD_SYM(NvVFX_AllocateState);
133
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
28
 
1
@@ -670,15 +670,6 @@
2
        FreeLibrary(nv_cvimage);
3
        nv_cvimage = NULL;
4
    }
5
-   cudaMalloc = NULL;
6
-   cudaStreamSynchronize = NULL;
7
-   cudaFree = NULL;
8
-   cudaMemcpy = NULL;
9
-   cudaMemsetAsync = NULL;
10
-   if (nv_cudart) {
11
-       FreeLibrary(nv_cudart);
12
-       nv_cudart = NULL;
13
-   }
14
 }
15
 
16
 static inline void nvvfx_get_sdk_path(char *buffer, const size_t len)
17
@@ -702,9 +693,8 @@
18
 
19
    nv_videofx = LoadLibrary(L"NVVideoEffects.dll");
20
    nv_cvimage = LoadLibrary(L"NVCVImage.dll");
21
-   nv_cudart = LoadLibrary(L"cudart64_110.dll");
22
    SetDllDirectoryA(NULL);
23
-   return !!nv_videofx && !!nv_cvimage && !!nv_cudart;
24
+   return !!nv_videofx && !!nv_cvimage;
25
 }
26
 
27
 static unsigned int get_lib_version(void)
28
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
18
 
1
@@ -78,10 +78,16 @@
2
        // Don't override existing, as this can break OSR
3
        std::string disableFeatures = command_line->GetSwitchValue("disable-features");
4
        disableFeatures += ",HardwareMediaKeyHandling";
5
+#ifdef _WIN32
6
+       disableFeatures += ",EnableWindowsGamingInputDataFetcher";
7
+#endif
8
        disableFeatures += ",WebBluetooth";
9
        command_line->AppendSwitchWithValue("disable-features", disableFeatures);
10
    } else {
11
        command_line->AppendSwitchWithValue("disable-features", "WebBluetooth,"
12
+#ifdef _WIN32
13
+                                   "EnableWindowsGamingInputDataFetcher,"
14
+#endif
15
                                    "HardwareMediaKeyHandling");
16
    }
17
 
18
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
25
 
1
@@ -83,6 +83,23 @@
2
    return nullptr;
3
 }
4
 
5
+void BrowserClient::OnRenderProcessTerminated(CefRefPtr<CefBrowser>, TerminationStatus, int,
6
+                         const CefString &error_string)
7
+{
8
+   if (!valid())
9
+       return;
10
+
11
+   std::string str_text = error_string;
12
+
13
+   const char *sourceName = "<unknown>";
14
+
15
+   if (bs && bs->source)
16
+       sourceName = obs_source_get_name(bs->source);
17
+
18
+   blog(LOG_ERROR, "obs-browser: '%s' Webpage has crashed unexpectedly! Reason: '%s'", sourceName,
19
+        str_text.c_str());
20
+}
21
+
22
 CefResourceRequestHandler::ReturnValue BrowserClient::OnBeforeResourceLoad(CefRefPtr<CefBrowser>, CefRefPtr<CefFrame>,
23
                                       CefRefPtr<CefRequest>,
24
                                       CefRefPtr<CefCallback>)
25
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
10
 
1
@@ -98,6 +98,8 @@
2
    GetResourceRequestHandler(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame,
3
                  CefRefPtr<CefRequest> request, bool is_navigation, bool is_download,
4
                  const CefString &request_initiator, bool &disable_default_handling) override;
5
+   virtual void OnRenderProcessTerminated(CefRefPtr<CefBrowser> browser, TerminationStatus status, int error_code,
6
+                          const CefString &error_string) override;
7
 
8
    /* CefResourceRequestHandler */
9
    virtual CefResourceRequestHandler::ReturnValue OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
10
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
10
 
1
@@ -2,7 +2,7 @@
2
 
3
 #define OBS_BROWSER_VERSION_MAJOR 2
4
 #define OBS_BROWSER_VERSION_MINOR 24
5
-#define OBS_BROWSER_VERSION_PATCH 4
6
+#define OBS_BROWSER_VERSION_PATCH 6
7
 
8
 #ifndef MAKE_SEMANTIC_VERSION
9
 #define MAKE_SEMANTIC_VERSION(major, minor, patch) ((major << 24) | (minor << 16) | patch)
10
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
9
 
1
@@ -1,7 +1,5 @@
2
 find_package(X11 REQUIRED)
3
 
4
-target_compile_definitions(obs-browser PRIVATE ENABLE_BROWSER_QT_LOOP)
5
-
6
 target_link_libraries(obs-browser PRIVATE CEF::Wrapper CEF::Library X11::X11)
7
 set_target_properties(obs-browser PROPERTIES BUILD_RPATH "$ORIGIN/" INSTALL_RPATH "$ORIGIN/")
8
 
9
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
50
 
1
@@ -281,7 +281,7 @@
2
    os_mkdir(conf_path);
3
 
4
    CefSettings settings;
5
-   settings.log_severity = LOGSEVERITY_DISABLE;
6
+   settings.log_severity = LOGSEVERITY_FATAL;
7
    BPtr<char> log_path = obs_module_config_path("debug.log");
8
    BPtr<char> log_path_abs = os_get_abs_path_ptr(log_path);
9
    CefString(&settings.log_file) = log_path_abs;
10
@@ -367,10 +367,10 @@
11
 
12
 #if !defined(_WIN32)
13
    BackupSignalHandlers();
14
-   CefInitialize(args, settings, app, nullptr);
15
+   bool success = CefInitialize(args, settings, app, nullptr);
16
    RestoreSignalHandlers();
17
 #elif (CHROME_VERSION_BUILD > 3770)
18
-   CefInitialize(args, settings, app, nullptr);
19
+   bool success = CefInitialize(args, settings, app, nullptr);
20
 #else
21
    /* Massive (but amazing) hack to prevent chromium from modifying our
22
     * process tokens and permissions, which caused us problems with winrt,
23
@@ -379,9 +379,14 @@
24
     * we'll just switch back to the static library but I doubt we'll need
25
     * to. */
26
    uintptr_t zeroed_memory_lol32 = {};
27
-   CefInitialize(args, settings, app, zeroed_memory_lol);
28
+   bool success = CefInitialize(args, settings, app, zeroed_memory_lol);
29
 #endif
30
 
31
+   if (!success) {
32
+       blog(LOG_ERROR, "obs-browser: CEF failed to initialize. Exit code: %d", CefGetExitCode());
33
+       return;
34
+   }
35
+
36
 #if !ENABLE_LOCAL_FILE_URL_SCHEME
37
    /* Register http://absolute/ scheme handler for older
38
     * CEF builds which do not support file:// URLs */
39
@@ -774,8 +779,8 @@
40
    BrowserShutdown();
41
 #else
42
    if (manager_thread.joinable()) {
43
-       while (!QueueCEFTask(() { CefQuitMessageLoop(); }))
44
-           os_sleep_ms(5);
45
+       if (!QueueCEFTask(() { CefQuitMessageLoop(); }))
46
+           blog(LOG_DEBUG, "obs-browser: Failed to post CefQuit task to loop");
47
 
48
        manager_thread.join();
49
    }
50
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
10
 
1
@@ -216,7 +216,7 @@
2
 void QCefBrowserClient::OnBeforeClose(CefRefPtr<CefBrowser>)
3
 {
4
    if (widget) {
5
-       emit widget->CloseSafely();
6
+       widget->CloseSafely();
7
    }
8
 }
9
 
10
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
12
 
1
@@ -118,9 +118,8 @@
2
            desc.Height += enc->cy / 2;
3
            break;
4
        case NV_ENC_BUFFER_FORMAT_YUV420_10BIT:
5
-           desc.Format = CU_AD_FORMAT_UNSIGNED_INT16;
6
+           desc.Format = CU_AD_FORMAT_UNSIGNED_INT16; // 2 bytes per element
7
            desc.Height += enc->cy / 2;
8
-           desc.NumChannels = 2; // number of bytes per element
9
            break;
10
        case NV_ENC_BUFFER_FORMAT_YUV444:
11
            desc.Format = CU_AD_FORMAT_UNSIGNED_INT8;
12
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
11
 
1
@@ -126,7 +126,8 @@
2
    p = obs_properties_add_int(props, "bitrate", obs_module_text("Bitrate"), 50, UINT32_MAX / 1000, 50);
3
    obs_property_int_set_suffix(p, " Kbps");
4
 
5
-   obs_properties_add_int(props, "target_quality", obs_module_text("TargetQuality"), 1, 51, 1);
6
+   obs_properties_add_int(props, "target_quality", obs_module_text("TargetQuality"), 1,
7
+                  codec == CODEC_AV1 ? 63 : 51, 1);
8
 
9
    p = obs_properties_add_int(props, "max_bitrate", obs_module_text("MaxBitrate"), 0, UINT32_MAX / 1000, 50);
10
    obs_property_int_set_suffix(p, " Kbps");
11
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
11
 
1
@@ -392,7 +392,8 @@
2
    dstr_catf(&log, "\theight:       %d\n", enc->cy);
3
    dstr_catf(&log, "\tb-frames:     %ld\n", enc->props.bf);
4
    dstr_catf(&log, "\tb-ref-mode:   %ld\n", enc->props.bframe_ref_mode);
5
-   dstr_catf(&log, "\tlookahead:    %s (%d frames)\n", lookahead ? "true" : "false", rc_lookahead);
6
+   dstr_catf(&log, "\tlookahead:    %s (%d frames)\n", lookahead ? "true" : "false",
7
+         config->rcParams.lookaheadDepth);
8
    dstr_catf(&log, "\taq:           %s\n", enc->props.adaptive_quantization ? "true" : "false");
9
 
10
    if (enc->props.split_encode) {
11
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
9
 
1
@@ -1,6 +1,6 @@
2
 cmake_minimum_required(VERSION 3.16...3.25)
3
 
4
-set(obs-websocket_VERSION 5.5.4)
5
+set(obs-websocket_VERSION 5.5.6)
6
 set(OBS_WEBSOCKET_RPC_VERSION 1)
7
 
8
 include(cmake/obs-websocket-api.cmake)
9
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
11
 
1
@@ -109,6 +109,9 @@
2
 {
3
    OBSSourceAutoRelease currentScene = obs_frontend_get_current_scene();
4
 
5
+   if (!currentScene)
6
+       return;
7
+
8
    json eventData;
9
    eventData"sceneName" = obs_source_get_name(currentScene);
10
    eventData"sceneUuid" = obs_source_get_uuid(currentScene);
11
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
32
 
1
@@ -178,7 +178,7 @@
2
 
3
 bool Utils::Json::GetJsonFileContent(std::string fileName, json &content)
4
 {
5
-   std::ifstream f(fileName);
6
+   std::ifstream f(std::filesystem::u8path(fileName));
7
    if (!f.is_open())
8
        return false;
9
 
10
@@ -195,9 +195,11 @@
11
 
12
 bool Utils::Json::SetJsonFileContent(std::string fileName, const json &content, bool makeDirs)
13
 {
14
+   auto jsonFilePath = std::filesystem::u8path(fileName);
15
+
16
    if (makeDirs) {
17
+       auto p = jsonFilePath.parent_path();
18
        std::error_code ec;
19
-       auto p = std::filesystem::path(fileName).parent_path();
20
        if (!ec && !std::filesystem::exists(p, ec))
21
            std::filesystem::create_directories(p, ec);
22
        if (ec) {
23
@@ -207,7 +209,7 @@
24
        }
25
    }
26
 
27
-   std::ofstream f(fileName);
28
+   std::ofstream f(jsonFilePath);
29
    if (!f.is_open()) {
30
        blog(LOG_ERROR, "Utils::Json::SetJsonFileContent Failed to open file `%s` for writing", fileName.c_str());
31
        return false;
32
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
15
 
1
@@ -1,11 +1,11 @@
2
 {
3
     "$schema": "schema/package-schema.json",
4
     "url": "https://obsproject.com/obs2_update/rtmp-services/v5",
5
-    "version": 264,
6
+    "version": 268,
7
     "files": 
8
         {
9
             "name": "services.json",
10
-            "version": 264
11
+            "version": 268
12
         }
13
     
14
 }
15
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
151
 
1
@@ -708,18 +708,58 @@
2
                     "url": "rtmp://qc.castr.io/static"
3
                 },
4
                 {
5
-                    "name": "SA (Sao Paulo, BR)",
6
+                    "name": "Mexico",
7
+                    "url": "rtmp://mexico.castr.io/static"
8
+                },
9
+                {
10
+                    "name": "Sao Paulo, BR",
11
                     "url": "rtmp://br.castr.io/static"
12
                 },
13
                 {
14
+                    "name": "Colombia",
15
+                    "url": "rtmp://bogota.castr.io/static"
16
+                },
17
+                {
18
+                    "name": "Santiago, Chile",
19
+                    "url": "rtmp://santiago.castr.io/static"
20
+                },
21
+                {
22
+                    "name": "Istanbul, TR",
23
+                    "url": "rtmp://istanbul.castr.io/static"
24
+                },
25
+                {
26
+                    "name": "Tel Aviv, IL",
27
+                    "url": "rtmp://telaviv.castr.io/static"
28
+                },
29
+                {
30
                     "name": "EU-West (London, UK)",
31
                     "url": "rtmp://uk.castr.io/static"
32
                 },
33
                 {
34
+                    "name": "EU-West (Paris, FR)",
35
+                    "url": "rtmp://paris.castr.io/static"
36
+                },
37
+                {
38
+                    "name": "EU-West (Madrid, ES)",
39
+                    "url": "rtmp://madrid.castr.io/static"
40
+                },
41
+                {
42
                     "name": "EU-Central (Frankfurt, DE)",
43
                     "url": "rtmp://fr.castr.io/static"
44
                 },
45
                 {
46
+                    "name": "EU-Central (Milan, IT)",
47
+                    "url": "rtmp://milan.castr.io/static"
48
+                },
49
+                {
50
+                    "name": "EU-North (Stockholm, SE)",
51
+                    "url": "rtmp://stockholm.castr.io/static"
52
+                },
53
+                {
54
+                    "name": "EU-North (Copenhagen, DK)",
55
+                    "url": "rtmp://copenhagen.castr.io/static"
56
+                },
57
+                {
58
                     "name": "Russia (Moscow)",
59
                     "url": "rtmp://ru.castr.io/static"
60
                 },
61
@@ -728,6 +768,10 @@
62
                     "url": "rtmp://sg.castr.io/static"
63
                 },
64
                 {
65
+                    "name": "Asia (Hong Kong, HK)",
66
+                    "url": "rtmp://hongkong.castr.io/static"
67
+                },
68
+                {
69
                     "name": "Asia (India)",
70
                     "url": "rtmp://in.castr.io/static"
71
                 },
72
@@ -736,6 +780,18 @@
73
                     "url": "rtmp://au.castr.io/static"
74
                 },
75
                 {
76
+                    "name": "UAE (Dubai)",
77
+                    "url": "rtmp://dubai.castr.io/static"
78
+                },
79
+                {
80
+                    "name": "Africa (Johannesburg, ZA)",
81
+                    "url": "rtmp://southafrica.castr.io/static"
82
+                },
83
+                {
84
+                    "name": "Africa (Lagos, NG)",
85
+                    "url": "rtmp://lagos.castr.io/static"
86
+                },
87
+                {
88
                     "name": "US Central",
89
                     "url": "rtmp://us-central.castr.io/static"
90
                 },
91
@@ -1563,14 +1619,6 @@
92
                 {
93
                     "name": "CloudBeta",
94
                     "url": "rtmp://cloudbetastreaming.onlyfans.com/live"
95
-                },
96
-                {
97
-                    "name": "Backup (USA)",
98
-                    "url": "rtmp://route0.onlyfans.com/live"
99
-                },
100
-                {
101
-                    "name": "Backup (Europe)",
102
-                    "url": "rtmp://route0-dc2.onlyfans.com/live"
103
                 }
104
             ,
105
             "recommended": {
106
@@ -2675,22 +2723,10 @@
107
                     "url": "rtmp://live-us-lax-stream.shareplay.tv"
108
                 },
109
                 {
110
-                    "name": "Seattle, Washington, USA",
111
-                    "url": "rtmp://live-us-sea-stream.shareplay.tv"
112
-                },
113
-                {
114
-                    "name": "Paris, France",
115
-                    "url": "rtmp://live-fr-par-stream.shareplay.tv"
116
-                },
117
-                {
118
                     "name": "Milan, Italy",
119
                     "url": "rtmp://live-it-mil-stream.shareplay.tv"
120
                 },
121
                 {
122
-                    "name": "Sydney, Australia",
123
-                    "url": "rtmp://live-au-syd-stream.shareplay.tv"
124
-                },
125
-                {
126
                     "name": "Toronto, Canada",
127
                     "url": "rtmp://live-ca-yyz-stream.shareplay.tv"
128
                 },
129
@@ -3530,6 +3566,21 @@
130
             "supported video codecs": 
131
                 "h264"
132
             
133
+        },
134
+        {
135
+            "name": "VRCDN - Live",
136
+            "more_info_link": "https://vrcdn.live",
137
+            "servers": 
138
+                {
139
+                    "name": "Automatic",
140
+                    "url": "rtmp://ingest.vrcdn.live/live"
141
+                }
142
+            ,
143
+            "supported video codecs": "h264",
144
+            "recommended": {
145
+                "keyint": 1,
146
+                "max video bitrate": 6000
147
+            }
148
         }
149
     
150
 }
151
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
22
 
1
@@ -603,6 +603,20 @@
2
             "window_capture_wgc": false,
3
             "message": "The Bazaar may require OBS to be run as admin to use Game Capture.",
4
             "url": "https://obsproject.com/kb/game-capture-troubleshooting"
5
+        },
6
+        {
7
+            "name": "FragPunk",
8
+            "translation_key": "Compatibility.GameCapture.Admin",
9
+            "severity": 1,
10
+            "executable": "FragPunk.exe",
11
+            "window_class": "",
12
+            "window_title": "",
13
+            "match_flags": 1,
14
+            "game_capture": true,
15
+            "window_capture": false,
16
+            "window_capture_wgc": false,
17
+            "message": "FragPunk may require OBS to be run as admin to use Game Capture.",
18
+            "url": "https://obsproject.com/kb/game-capture-troubleshooting"
19
         }
20
     
21
 }
22
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
15
 
1
@@ -1,11 +1,11 @@
2
 {
3
     "$schema": "schema/package-schema.json",
4
     "url": "https://obsproject.com/obs2_update/win-capture/v1",
5
-    "version": 6,
6
+    "version": 7,
7
     "files": 
8
         {
9
             "name": "compatibility.json",
10
-            "version": 6
11
+            "version": 7
12
         }
13
     
14
 }
15
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
14
 
1
@@ -936,6 +936,12 @@
2
        return false;
3
    }
4
 
5
+   if (!videoConfig.cx || !videoConfig.cy_abs) {
6
+       blog(LOG_ERROR, "%s: Frame width or height are zero (%" PRIu32 "x%" PRIu32 ")",
7
+            obs_source_get_name(source), videoConfig.cx, videoConfig.cy_abs);
8
+       return false;
9
+   }
10
+
11
    DStr formatName = GetVideoFormatName(videoConfig.internalFormat);
12
 
13
    double fps = 0.0;
14
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
19
 
1
@@ -35,7 +35,7 @@
2
 #define PATH_MAX MAX_PATH
3
 #elif __APPLE__
4
 #define VERSION_PATTERN "%d.%d"
5
-#define FILE_PATTERN "Python.framework/Versions/Current/lib/libpython%s.dylib"
6
+#define FILE_PATTERN "Python.framework/Versions/%s/lib/libpython%s.dylib"
7
 #endif
8
 
9
 #define PY_MAJOR_VERSION_MAX 3
10
@@ -71,7 +71,7 @@
11
 
12
    struct dstr temp;
13
    dstr_init(&temp);
14
-   dstr_printf(&temp, FILE_PATTERN, cur_version);
15
+   dstr_printf(&temp, FILE_PATTERN, cur_version, cur_version);
16
 
17
    int minor_version = PY_MINOR_VERSION_MAX;
18
    do {
19
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
11
 
1
@@ -1607,7 +1607,8 @@
2
    if (python_path && *python_path) {
3
 #ifdef __APPLE__
4
        char tempPATH_MAX;
5
-       snprintf(temp, sizeof(temp), "%s/Python.framework/Versions/Current", python_path);
6
+       snprintf(temp, sizeof(temp), "%s/Python.framework/Versions/%i.%i", python_path, python_version.major,
7
+            python_version.minor);
8
        os_utf8_to_wcs(temp, 0, home_path, PATH_MAX);
9
        Py_SetPythonHome(home_path);
10
 #else
11