Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
9400386
feat(transitions): support host-configured WebM scene overlays
ClodoCapeo Oct 8, 2026
7fc403f
test(transitions): record Prism-hosted WebM validation
ClodoCapeo Oct 8, 2026
031ad29
fix(audio): initialize RTWQ for headless WASAPI capture
ClodoCapeo Oct 8, 2026
f56fcc2
fix(bundle): classify requested child termination as informational
ClodoCapeo Oct 8, 2026
fb29cd7
feat(transitions): support MP4 and integrate runtime lifecycle fixes
ClodoCapeo Oct 8, 2026
4e29cc1
fix(transitions): cover persistent Preview scene changes
ClodoCapeo Oct 8, 2026
3e77323
fix(preview): play media transitions continuously after scene prepara…
ClodoCapeo Oct 8, 2026
e8d0ce4
fix(websocket): guard invalid source screenshot allocations
ClodoCapeo Oct 9, 2026
c05dca2
test: record native filter audit evidence
ClodoCapeo Oct 10, 2026
54c2640
feat: add native alpha-preserving camera vignette
ClodoCapeo Oct 10, 2026
c298c13
test(nvidia): qualify installed effects with synthetic native media
ClodoCapeo Oct 10, 2026
0cac057
fix: qualify NVIDIA effects and guarantee zero intensity bypass
ClodoCapeo Oct 10, 2026
c501105
test: preserve NVIDIA intensity regression and native qualification e…
ClodoCapeo Oct 10, 2026
ed9d4fd
fix(nvidia): apply live audio settings without blocking the audio thread
ClodoCapeo Oct 10, 2026
32d3830
test(nvidia): qualify native video and decoded effect audio
ClodoCapeo Oct 10, 2026
e514679
docs(nvidia): checkpoint native video and shared integration
ClodoCapeo Oct 10, 2026
a7da349
feat(nvidia): AR camera effects, video denoise and native diagnostics
ClodoCapeo Oct 10, 2026
cbf6f77
test(nvidia): qualify image and looping video backgrounds
ClodoCapeo Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ option(PULSAR_BUILD_WEBSOCKET "Build the pulsar-websocket plugin"
option(PULSAR_BUILD_MULTISTREAM "Build the pulsar-multi-stream plugin" ON)
option(PULSAR_BUILD_SCENE_SOURCE "Build the pulsar-scene-source plugin" ON)
option(PULSAR_BUILD_BROWSER "Build the pulsar-browser plugin (forked CEF)" ON)
option(PULSAR_BUILD_CAMERA_EFFECTS "Build native GPU camera effects" ON)

# Header-only, no build of its own, and needed by pulsar-multi-stream and
# by tests/nv-probe -- so it is added before both. (upstream's nv-filters
Expand Down Expand Up @@ -82,6 +83,10 @@ if(PULSAR_BUILD_SCENE_SOURCE)
add_subdirectory(plugins/pulsar-scene-source)
endif()

if(PULSAR_BUILD_CAMERA_EFFECTS)
add_subdirectory(plugins/pulsar-camera-effects)
endif()

if(PULSAR_BUILD_BROWSER)
add_subdirectory(plugins/pulsar-browser)
endif()
Expand Down Expand Up @@ -152,6 +157,7 @@ if(WIN32)
# cross-root/physical-directory authorities, alias hardening, and
# acquire/refusal/release/abandoned-recovery of both lock classes.
add_subdirectory(tests/runtime-isolation-probe)
add_subdirectory(tests/rtwq-lifecycle)

# #248 -- the producer (C) and DirectShow consumer (C++) must take the
# same fail-closed namespace decision before either can touch a named
Expand Down Expand Up @@ -181,6 +187,7 @@ if(WIN32)
# GPU, or running Pulsar process.
add_subdirectory(tests/dual-lane-config)
add_subdirectory(tests/pulsar-transition-controller)
add_subdirectory(tests/pulsar-media-transition)
add_subdirectory(tests/equal-view-swap)
add_subdirectory(tests/return-queue-safety)
add_subdirectory(tests/probe-nvenc-ready-drain)
Expand Down
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,12 @@ file path. See [destinations](plugins/pulsar-multi-stream/README.md) and the

## Capture, composition and browser rendering

The native [camera-effects module](plugins/pulsar-camera-effects/README.md) adds
`pulsar_vignette_filter`. It darkens source edges on the GPU while preserving
alpha, with independent enable/bypass and bounded intensity, radius and softness.
Hosts expose it only when the runtime filter inventory registers it. It does
not require NVIDIA AI SDKs or create another capture producer.

Pulsar retains OBS's source and scene model. The engine loads the source types
provided by the selected bundle and the host's available hardware; query
`GetInputKindList` and the capability manifest instead of assuming that a DLL
Expand Down Expand Up @@ -467,7 +473,7 @@ does not recover scene identity from arbitrary pixels.
Pulsar is a maintained native fork, not only a JavaScript wrapper around stock
OBS. Its OBS submodule is pinned to
`bd73b922891e56839b0bc86bdc519802802f9d68`, an OBS 32.1.2-derived revision.
Five foundational modifications are incorporated in that pin; **52 additional
Five foundational modifications are incorporated in that pin; **61 additional
patch files** build the current media core.

| Area | What Pulsar changes |
Expand Down Expand Up @@ -592,7 +598,7 @@ as a troubleshooting shortcut.
| [Client](packages/pulsar-client/README.md) | TypeScript API, typed events, errors and examples. |
| [Embedding](docs/PRISM-EMBEDDING.md) | Host lifecycle, readiness and verified bundle integration. |
| [Architecture](docs/ARCHITECTURE.md) | Runtime structure and ownership boundaries. |
| [All libobs changes](docs/LIBOBS-CHANGES.md) | Integrated OBS changes and all 52 source patches. |
| [All libobs changes](docs/LIBOBS-CHANGES.md) | Integrated OBS changes and all 61 source patches. |
| [All documentation](docs/README.md) | Current guides, operational runbooks, contracts and historical studies. |
| [Development](docs/DEVELOPMENT.md) | Build toolchain and local development. |
| [Dual-lane canary](docs/runbooks/pulsar-dual-lane-canary.md) | Qualification and operational checks. |
Expand Down
1 change: 1 addition & 0 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ consumer. The runtime remains GPL-2.0-or-later; the WebSocket client is MIT.
| `pulsar-multi-stream` | `pulsar-multi-stream.dll` | Destination registry, shared-encoder fan-out, adaptive bitrate, capabilities, audio/monitoring/diagnostic vendor requests. Owns vendor `pulsar`. |
| `pulsar-scene-source` | `pulsar-scene-source.dll` | Legacy single browser-capture replacement. Owns vendor `pulsar-scene`. |
| `pulsar-browser` | `pulsar-browser.dll` + `pulsar-browser-page.exe` | CEF browser source, accelerated/software rendering callbacks, source-task lifecycle and browser shutdown fence. Full distribution only. |
| `pulsar-camera-effects` | `pulsar-camera-effects.dll` | Embedded GPU source vignette, bounded settings, alpha preservation and bypass. No AI models or new capture producer. |
| `pulsar-output-classify` | Header-only interface target | Shared stable output-failure classification used by frontend and registry. |
| `pulsar-nv-secure-load` | Header-only interface target | Shared validated SDK-directory/loading policy used by upstream effect module, capability probe and native tests. |
| Patched OBS | `obs.dll`, graphics and upstream module binaries | Rendering/audio/video I/O, atomic view swap, encoders, output interleaving, capture and return transport. |
Expand Down
108 changes: 107 additions & 1 deletion docs/LIBOBS-CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ missing files to recreate in `patches/`:
| [7e7a5a383](https://github.com/ZabLaboratory/obs-studio/commit/7e7a5a383) | Adds a separate Program-return camera. |
| [b33f831b8](https://github.com/ZabLaboratory/obs-studio/commit/b33f831b8) | Resolves embedded modules and registers Program return. |

On top of this pin, 3.0.0 carries **52 patch files**: 51 root-OBS patches
On top of this pin, 3.0.0 carries **61 patch files**: 60 root-OBS patches
and one nested obs-browser patch. [build-win.ps1](../scripts/build-win.ps1)
sorts complete filenames lexically, routes names containing `obs-browser`
to `upstream/plugins/obs-browser/`, and applies the others to `upstream/`.
Expand Down Expand Up @@ -553,8 +553,114 @@ Further restricts automatic current readback to a physical graphics adapter. A s

Affected files: `libobs/obs-video.c`.

### 0057-feat-source-core-memory-readback

[Source patch](../patches/0057-feat-source-core-memory-readback.patch)

Adds core-owned source memory statistics consumed by the native GetSourceStats
request. Windows reads allocations and cached frames under the source async
mutex; other platforms return an unavailable sentinel. This lower bound excludes
plugin, driver and GPU allocations. Affected files: `libobs/obs-source.c`,
`libobs/obs.h`.

### 0058-fix-build-provision-cef-for-full-pulsar

[Source patch](../patches/0058-fix-build-provision-cef-for-full-pulsar.patch)

Allows PULSAR_REQUIRE_CEF to request the pinned, hash-verified CEF dependency
independently of the upstream browser target. Full builds opt in; light builds
do not. Affected file: `cmake/common/buildspec_common.cmake`.

### 0059-fix-source-telemetry-profiling-lease

[Source patch](../patches/0059-fix-source-telemetry-profiling-lease.patch)

Bounds read-owned source profiling to a five-second lease independently of
explicit resource tracing. Native telemetry covers polling and idle expiry.
Affected files: `libobs/util/source-profiler.c`, `libobs/util/source-profiler.h`.

### 0060-fix-nvidia-effect-initialization-and-logging

[Source patch](../patches/0060-fix-nvidia-effect-initialization-and-logging.patch)

Defers initial/recreated blur loading until source and destination images are
bound. Live intensity updates retain reload and report failed SDK statuses.
Null/empty logger messages are ignored; real SDK diagnostics are preserved.
The installed-SDK probe exercises live intensity, exact video bypass, stacked
filters, 20 native scene changes and native audio meters. A passing load or
readback does not qualify audio intensity: the probe rejects the reproduced
AFX 1.6.1.2 zero-intensity failure.

Affected files: `plugins/nv-filters/nvidia-audiofx-filter.c`,
`plugins/nv-filters/nvidia-videofx-filter.c`.

### 0061-fix-nvidia-audio-zero-intensity-bypass

[Source patch](../patches/0061-fix-nvidia-audio-zero-intensity-bypass.patch)

Guarantees that intensity zero passes original PCM through the existing 10 ms
FIFO, including bypass of VAD. An atomic flag preserves native enabled state
and avoids the reproduced AFX 1.6.1.2 denoiser near-silence at zero. Nonzero SDK
processing remains unchanged. No reset/reload, allocation or additional audio
thread lock is introduced. The regression checks all three methods against a
contemporaneous disabled-filter control and reapplies intensity one.

Affected file: `plugins/nv-filters/nvidia-audiofx-filter.c`.

### 0062-fix-nvidia-audio-settings-worker

[Source patch](../patches/0062-fix-nvidia-audio-settings-worker.patch)

Recreates private AFX handles off the audio/settings thread when method,
intensity or VAD changes. The installed AFX denoiser captures intensity at
load and VAD is a load-time SDK parameter. Settings coalesce on a persistent
worker; original PCM passes through the existing FIFO during loading.
The audio callback never waits for model loading. Destruction joins the worker
outside its mutex before releasing buffers or handles. The global SDK logger
lives until module unload rather than an individual filter's destruction.
The probe adds 72 rapid settings changes, six removals during loading, two
audio filters and optional native recording of synthetic fixtures.

Affected file: `plugins/nv-filters/nvidia-audiofx-filter.c`.

## Validation boundaries and retained studies

### 0063-add-nvidia-video-denoise-and-comparison

[Source patch](../patches/0063-add-nvidia-video-denoise-and-comparison.patch)

Registers `nv_denoise_filter` only with the installed conservative/aggressive
VFX models. Inputs use normalized planar BGR float and outputs convert back
to the existing GPU texture. Closed model modes 0/1, live blend intensity,
temporal state and exact zero bypass are native. Comparison preserves the
original left half and processes the right half of the same source frame;
it also appears in Program. An exported module flag gates the Prism setting.

Affected files: `plugins/nv-filters/nvidia-videofx-filter.c`, `nv-filters.c`,
`data/rtx_blur.effect` and `data/rtx_greenscreen.effect` in the same directory.

### 0064-add-nvidia-ar-effects-and-demand-processing

[Source patch](../patches/0064-add-nvidia-ar-effects-and-demand-processing.patch)

Adds `nv_autoframe_filter` and `nv_eye_contact_filter` using the separately
installed AR 0.8.7 SDK and existing VFX texture/CUDA interop. The owned minimal
ABI adapter lives outside upstream. Auto Frame follows the largest valid face,
clamps the crop and returns smoothly to the original frame after one second
without a face. Eye Contact binds the required gaze and landmark outputs;
strength blends the processed image and zero bypasses it exactly.

Image/model allocation begins on actual render demand. Unused sources perform
no inference; warmed allocations remain retained for resumption. The native
`get_nvidia_processing` procedure reads processed counts and pipeline wall time
on the graphics thread. This measures the native pipeline, not GPU-only time.
Creation failures return to one cleanup owner; destroyed handles are nulled;
partial image allocations and both background-blur textures are released.

Affected files: `plugins/nv-filters/nvidia-videofx-filter.c`, `nv-filters.c`
and `data/rtx_blur.effect`. The native probes use synthetic patterns and an
explicit official portrait fixture; real webcam quality is a separate check.

The native CPU readback study records 100 warm-up and 100 measured Cuts per
trial, a changed decoded-image oracle, media timestamps and common Program
audio. Measured x264 p95 moves from 45.897–45.947 ms in the reference trials
Expand Down
Loading
Loading