Skip to content

v0.3.8-rc2

Pre-release
Pre-release

Choose a tag to compare

@keyldev keyldev released this 22 Jul 11:06
b8f3601

Builds on the React SPA web console and closes most of the gap with the desktop head. Everything here is server-side + SPA only — no change to the video pipeline, the desktop UI, or the mobile heads.

Live grid

  • Stills mode — periodic snapshots instead of live streams, refresh interval
    2–60 s. A 25-cell wall costs one HTTP GET per camera per interval instead of an
    ffmpeg session each; the camera encodes the JPEG itself when it runs Majestic.
  • Digital zoom in a tile: mouse wheel, drag to pan, buttons for touch. The
    transform lives on the tile's slot, never on the pooled <video>, so zoom
    can't follow a camera into another cell.
  • Kiosk mode — chrome-free full-viewport wall with optional page cycling.
    Uses the Fullscreen API when granted and falls back to a fixed overlay when it
    isn't (embedded/iframed pages refuse it outright).
  • Wall preferences live in the browser, not the install: the same layout is
    watched from a control-room screen and from someone's laptop.

Archive

  • Recording start/stop from the browser, written into the same folder and table
    the desktop head uses (-c copy, segmented, q on stdin so the MP4 trailer is
    written).
  • Calendar + date filtering, paging, and clip export (fast -c copy or precise
    re-encode), streamed as a download without leaving a copy on the server.
  • Playback is a ranged file response, so seeking is the browser's own.

Snapshot library

  • Stills taken from the browser can be kept: same folder layout, same
    .thumbs/<id>.jpg naming and the same table as the desktop's
    SnapshotService, so a still taken from a phone shows up in the desktop
    gallery and vice versa.
  • Thumbnails are produced with ffmpeg — already a dependency of this head —
    rather than pulling the Video layer's Skia thumbnailer into the server.
  • Pixel dimensions are read from the JPEG frame header; no imaging library
    needed to record what the desktop records.
  • Gallery page with lightbox, download and delete, under the Archive tab.

Camera settings (Majestic)

  • Read the live config.json, edit fields, post raw JSON, set day/night, read
    /metrics. Schema-driven like the desktop editor (IMajesticConfigSchema), so
    it renders whatever knobs the firmware actually exposes instead of a fixed form
    that drifts between builds.
  • ISP fields get their own panel: Majestic re-reads those live, so tuning the
    picture does not restart the encoder. Fields that do restart it are flagged.
  • Edits travel as (path, value) and are applied against a freshly read copy of
    the camera's config, so a stale tab can't revert someone else's change.

Two-way audio

  • Listen: audio rides in the existing live stream (transcoded to AAC, ~1% of
    the video bitrate) rather than a second session, so nobody's picture restarts
    when they unmute.
  • Push-to-talk: the browser sends 16-bit PCM over a WebSocket; G.711
    encoding and RTP packetizing happen server-side in the same Core code the
    desktop talks with. One talker per camera — a speaker is exclusive.
  • Held, not toggled, and the camera is released when the route changes.

Permissions

  • New Talk flag, separate from Ptz/Manage: it is the one action that
    reaches people standing in front of the camera.
  • ViewArchive now gates the archive and the snapshot library; Export gates
    clip export. Both flags previously existed without gating anything.
  • Camera settings are Manage-only including readsconfig.json carries
    the camera's own logins and, on many builds, the Wi-Fi PSK.

Fixes

  • The live WebSocket was write-only, so a viewer's close frame went unnoticed and
    the shared ffmpeg process outlived its last viewer. Verified: 8 streams → 0
    after the last tile releases.
  • A camera that never answered a Majestic call was reported as success (204): our
    own call deadline surfaced as the same cancellation as an abandoned request.
    Now 504.
  • Player: a viewer joining an already-running stream got a buffer starting at
    t=90s with currentTime=0 and sat paused forever. A watchdog now jumps to the
    live edge.
  • ViewArchive was missing from the users page, which quietly made the archive
    ungrantable to anyone created from the web console.
  • Recording a camera that delivered nothing left a 0-byte file and an archive row.

What's Changed

  • Web console: archive, snapshots, camera settings and two-way audio by @keyldev in #60
  • web: OpenIPC logo in the console by @keyldev in #61

Full Changelog: v0.3.8-rc1...v0.3.8-rc2