docs: add v0.3.0-dragonfork CHANGELOG entry
Covers WHIP ingest backend, keyframe cache, Wild Dragon UI WHIP toggle, seed-data.sh always-overwrite fix, and the full core/webrtc test suite.
This commit is contained in:
parent
228ed4b09b
commit
c4857f5581
1 changed files with 89 additions and 0 deletions
89
CHANGELOG.md
89
CHANGELOG.md
|
|
@ -1,5 +1,94 @@
|
|||
# Datarhei — Dragon Fork
|
||||
|
||||
## v0.3.0-dragonfork (2026-05-10)
|
||||
|
||||
WebRTC ingest (WHIP) milestone. Browsers and OBS can now push a
|
||||
WebRTC stream into a channel, and the first-frame experience for WHEP
|
||||
viewers is dramatically improved by the in-memory keyframe cache.
|
||||
|
||||
Resolves issues #15, #16, #17.
|
||||
|
||||
### Added
|
||||
|
||||
- **WHIP ingest path** — browsers and OBS Studio can push a WebRTC
|
||||
stream (H.264 + Opus) into any Dragon Fork channel via
|
||||
`POST /api/v3/whip/{id}`. The publisher sends an SDP offer; Core
|
||||
answers, allocates a loopback UDP pair, and injects RTP input legs
|
||||
into the FFmpeg command line — the exact mirror of the WHEP egress
|
||||
path. `DELETE /api/v3/whip/{id}/{resource}` tears down the publisher
|
||||
cleanly. Closes #16.
|
||||
|
||||
- **`ProcessConfigWHIPIngest` API struct** in `http/api/process.go`
|
||||
mapping `whip_ingest.{enabled,video_pt,audio_pt}` between the JSON
|
||||
API and `app.ConfigWHIPIngest`. Without this struct, `WHIPIngest.Enabled`
|
||||
was always false and WHIP could never activate via the API.
|
||||
|
||||
- **WHIP ingest lifecycle hooks** — `onWHIPProcessStart` /
|
||||
`onWHIPProcessStop` in `app/webrtc/whip_lifecycle.go` allocate and
|
||||
teardown the ingest UDP port pair, controlled by the per-process
|
||||
`whip_ingest.enabled` flag. Merged via `MergedHooks()` alongside the
|
||||
existing WHEP egress hooks.
|
||||
|
||||
- **Wild Dragon UI — WHIP toggle control** (`overlay/src/misc/controls/WHIP.js`
|
||||
in the `wilddragon-restreamer-ui` overlay). Mirrors WHEP.js exactly.
|
||||
Renders an Enable checkbox with caption in the channel edit view.
|
||||
|
||||
- **Wild Dragon UI — Edit/index.js wiring** — renders the WHIP control
|
||||
in the Edit view and patches `props.restreamer._upsertProcess` in the
|
||||
`save()` handler to inject `whip_ingest.enabled` into the process
|
||||
config before the SDK PUT reaches Core. The patch is required because
|
||||
the Restreamer SDK's `UpsertIngest` does not forward `webrtc` or
|
||||
`whip_ingest` fields (SDK gap).
|
||||
|
||||
- **In-memory H.264 keyframe cache** in `core/webrtc/keyframecache.go`.
|
||||
Retains the most recent IDR burst (all RTP packets from the first IDR
|
||||
NAL fragment until the next one) per video Source. Bounded at 512
|
||||
packets / 2 MiB. Detects single-NAL IDR (type 5) and FU-A start
|
||||
fragments (type 28, start bit set, inner type 5). Closes #17.
|
||||
|
||||
- **Subscribe pre-fill** — `Source.Subscribe()` snapshots the keyframe
|
||||
cache before registering the new subscriber, then drains the burst
|
||||
into the channel immediately. New WHEP peers receive a complete
|
||||
reference frame on join instead of waiting up to one GOP (≈ 2 s at
|
||||
30 fps / GOP=60).
|
||||
|
||||
- **`Source.EnableKeyFrameCache()`** — opt-in method; called only on
|
||||
video sources in `allocAdjacentPair()`. Audio sources are
|
||||
intentionally uncached (Opus payloads would accumulate without ever
|
||||
triggering a reset).
|
||||
|
||||
- **Test suite for `core/webrtc`** — `keyframecache_test.go` (18
|
||||
functions) and `source_test.go` (5 functions). Covers IDR detection
|
||||
in all packetisation modes, cache reset, burst accumulation, capacity
|
||||
caps, snapshot independence, concurrent read/write under `-race`, and
|
||||
Subscribe pre-fill behaviour. All 34 tests in `core/webrtc` green
|
||||
under `go test -race`.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **`deploy/truenas/core/seed-data.sh`** — the old no-clobber-only
|
||||
approach kept stale JS bundles alive on the data volume after image
|
||||
rebuilds (`static/` was never refreshed because it already existed).
|
||||
Fixed by splitting into two phases: always-overwrite for `index.html`,
|
||||
`asset-manifest.json`, and `static/`; no-clobber for everything else
|
||||
(channel data, player bundles, operator content). Prevents a class of
|
||||
"new code never runs" deployment bugs.
|
||||
|
||||
### Upgrade (from v0.2)
|
||||
|
||||
```sh
|
||||
cd deploy/truenas/core
|
||||
git pull
|
||||
docker compose build --no-cache core
|
||||
docker compose up -d core
|
||||
```
|
||||
|
||||
The `seed-data.sh` fix means there is no longer a need to manually
|
||||
`docker exec` a static-bundle copy after rebuilds — it happens
|
||||
automatically on container start.
|
||||
|
||||
---
|
||||
|
||||
## v0.2 backlog (2026-05-06)
|
||||
|
||||
Completes the open v0.2 issues from the post-GUI-ship backlog.
|
||||
|
|
|
|||
Loading…
Reference in a new issue