feat(camera): add Logitech webcam support#361
Conversation
48bc7d8 to
f0ce600
Compare
Greptile SummaryThis PR adds first-class Logitech webcam support to OpenLogi. The main changes are:
Confidence Score: 5/5This looks safe to merge.
Important Files Changed
Reviews (13): Last reviewed commit: "fix(camera): encode CMFormatDescription ..." | Re-trigger Greptile |
0bb4827 to
fdc8528
Compare
AprilNEA
left a comment
There was a problem hiding this comment.
Fantastic feature — thanks for the thorough write-up and the end-to-end macOS testing on the StreamCam. A few things need to happen before it can land, and they're much easier from your side since you have the hardware:
1. Rebase onto master. It's ~60 commits behind and now conflicts (settings-page overhaul, Windows follow-ups, wheel/hotplug work, and the 20 locale files). Fresh conflict resolution from someone who knows the camera code will be far more reliable.
2. Move the macOS FFI to objc2. The whole workspace migrated off raw objc 0.2 to objc2 since you opened this — openlogi-hook, openlogi-inject, openlogi-agent, and openlogi-gui are all on it now — so openlogi-camera should match (the "same objc 0.2 as the GUI" note is now stale). That means Retained<T> for ownership, MainThreadMarker where the AVFoundation calls need the main thread, etc. The pattern in crates/openlogi-gui/src/platform/ and crates/openlogi-agent/src/tray.rs is the reference — it keeps the unsafe_code = "deny" + typed-ownership convention consistent across the workspace.
3. Windows is still untested on hardware — worth a pass on a real Logitech cam before shipping it first-class (or we land macOS-first and flag Windows experimental).
Happy to review again once it's rebased and on objc2. Really nice work.
bcad272 to
9aa7d54
Compare
fe20e7a to
8cd9185
Compare
Rebased onto current master (config.rs split into config/{settings,device}.rs,
the app.rs → app/{detail,home,widgets}.rs split, the asset-sync overhaul that
replaced collect_models with AppState::asset_models, and the 20 new locale
strings). Camera models are folded into the sync set from main.rs since
asset_models is built from the HID++ device list; the permission page stays
macOS/Linux-gated.
CLI: `openlogi snapshot` / `openlogi camera`. GUI: a Camera detail tab with a
live preview and UVC image controls, camera records in the device gallery, and
persisted per-device controls + profiles in config.
The workspace moved off raw `objc` 0.2 to `objc2` (GUI menu bar / permissions, the hook's NSWorkspace read); openlogi-camera was the last holdout. Port both AVFoundation modules to match: - `Retained<T>` replaces `StrongPtr` for the session / output / delegate, so ownership is leak-proof by construction (no hand-balanced retain/release). - The frame delegate is registered with `ClassBuilder` (the objc2 analog of `ClassDecl`); it stays a stateless background-queue `NSObject` subclass, so no `MainThreadMarker` is needed — AVFoundation's session start/stop and the sample-buffer callback are all off-main. - `block2::RcBlock` replaces `block::ConcreteBlock` for the requestAccess completion handler. - Enumeration uses `objc2::rc::autoreleasepool` instead of a manual `NSAutoreleasePool` new/drain pair. Deps: objc 0.2 + block 0.1 → objc2 (workspace) + block2; drops the `unexpected_cfgs` allow the old objc macros needed. `unsafe_code = "deny"` with local `#[expect(unsafe_code)]` is unchanged.
8cd9185 to
c43f25a
Compare
2d4a48e to
26ea8d2
Compare
Context
OpenLogi only managed HID++ devices — Logitech UVC webcams were invisible. This adds first-class webcam support: enumeration, live preview, and device-level image controls written over USB to the camera's own registers, so adjustments carry into Google Meet, Zoom, and OBS rather than living only in our preview.
Note
Platform support: macOS has the full feature (AVFoundation preview + IOKit controls) and is verified end-to-end on a StreamCam. Windows matches it — DirectShow enumeration and controls (
IAMVideoProcAmp/IAMCameraControl) plus a Media Foundation live preview/snapshot backend (IMFSourceReader, RGB32) — and compiles clean againstx86_64-pc-windows-msvc, but has not yet been exercised on real Windows hardware. Linux builds against stubs and shows no cameras.Demo
config.tomland re-apply after unplug/reboot.openlogi camera get,openlogi camera set brightness 140,openlogi snapshotChanges
openlogi-cameracrate — AVFoundation capture plus IOKit UVC controls on macOS (Processing Unit and Camera Terminal, 4-byte exposure payloads, AE-mode bitmap, batched into a single device-seize); Media Foundation capture plus DirectShow enumeration/controls on Windows:capture.rs,capture_windows.rs,uvc.rs,uvc_windows.rs,controls.rs,capture_types.rscamera_preview.rs,camera_controls.rs,app.rsdevice_camera_imagemanifest key and base-model variants fetch and resolve; marker-less camera metadata parses:asset/sync.rs,asset/images.rs,openlogi-assetsCameraControlsbecomes a name-keyed map (existing TOML loads unchanged) with per-camera profiles and active selection:config.rs,state.rsopenlogi camera get/setfor every control and auto toggle;openlogi snapshotwrites a PNG:cmd/camera.rs,cmd/snapshot.rscarousel.rsNotes