Commit graph

457 commits

Author SHA1 Message Date
46531bb479 feat(restream): add ProcessHooks for WebRTC subsystem integration
Adds a pair of lifecycle callbacks the app/webrtc subsystem installs
via SetHooks:

- OnStart fires synchronously just before ffmpeg.Start(). It receives
  the task config and may return []ConfigIO extras to append to the
  output list. When extras are appended, startProcess rebuilds the
  FFmpeg command and the underlying process.Process before starting.
  A non-nil error aborts the start.

- OnStop fires synchronously just after ffmpeg.Stop() so subsystems
  can tear down per-process state.

Hooks run with the restream write lock held; they must not call back
into Restreamer methods or they will deadlock. This is the pattern
app/webrtc uses to inject per-process RTP output legs without having
to reach into restream internals from outside.
2026-04-17 09:57:14 -04:00
16ae17d2a1 feat(app/webrtc): port allocator + FFmpeg arg builder
Adds Alloc(), the ephemeral loopback UDP port grabber the subsystem
uses to pick the RTP port it will hand to FFmpeg and then re-bind with
core/webrtc.NewSourceOn. Covered by a 100x rebind test.

Adds BuildArgs(), which emits the -f rtp output fragments (video on
the passed port, audio on port+1) with copy codecs by default and an
H.264 baseline / libopus re-encode leg when ForceTranscode is set.
Covered by three unit tests.
2026-04-17 09:52:09 -04:00
80db028281 feat(config): add webrtc global config block
Adds webrtc.enable, webrtc.public_ip, webrtc.nat_1_to_1_ips, and
webrtc.udp_mux_port to the Core Data struct and registers each via
the existing vars system. Default is disabled; no behavior change
without explicit opt-in.
2026-04-17 09:51:02 -04:00
eaeefee753 feat(restream): add ConfigWebRTC per-process field
Adds the per-process WebRTC egress toggle + codec/payload-type knobs
described in the M2 spec. Clone() carries it forward. No behavior
change yet \u2014 the subsystem wiring comes later in M2.
2026-04-17 09:50:28 -04:00
c38036de94 docs(m2): implementation plan 2026-04-17 09:49:20 -04:00
86bae816c1 docs(m2): WebRTC into Core proper — design spec
M2 promotes the M1 standalone PoC into the datarhei Core binary so
WebRTC becomes a first-class output alongside RTMP/SRT/HLS, surfaced
in the core-ui dashboard.

Architecture: new app/webrtc sibling subsystem + two small hooks on
restream (ProcessHooks + AppendOutput), reusing the untouched M1
core/webrtc package. WHEP served under /api/v3/process/{id}/whep,
inheriting JWT auth. A new "Live (WebRTC)" tab on the process detail
view provides the embedded browser player.

Covers: purpose, architecture diagram, decision table, components,
data flow (enable/subscribe/stop/disable/restart), error handling,
testing strategy (unit/integration/e2e), acceptance criteria,
rollback, and a seven-milestone sanity breakdown.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-17 09:42:16 -04:00
9e3f031f95 feat(webrtc): add -rtp-host flag + TrueNAS Docker deploy
Some checks failed
tests / build (push) Failing after 3s
CodeQL / Analyze (pull_request) Failing after 3s
tests / build (pull_request) Failing after 3s
- core/webrtc: NewSourceOn(streamID, host, port) allows binding the
  RTP UDP socket on something other than 127.0.0.1, required when the
  PoC runs in a container and must accept RTP from LAN publishers.
  NewSource(streamID, port) stays as a convenience wrapper on
  127.0.0.1 for existing tests and tight local tests.

- cmd/webrtc-poc: new -rtp-host flag (default 127.0.0.1 for safety).

- deploy/docker/Dockerfile: two-stage build, scratch runtime, ~14 MB.

- deploy/truenas/docker-compose.yml: host-networked stack template
  driven by a .env file. Host networking is required for WebRTC ICE
  to work without NAT rewriting per-candidate.

- deploy/truenas/README.md: operator runbook with port picking,
  bring-up, verification curls, and security notes.
2026-04-17 09:05:37 -04:00
413d0f24b6 test(webrtc): add Pion WHEP subscriber client + e2e test
Some checks failed
tests / build (push) Failing after 13s
CodeQL / Analyze (pull_request) Failing after 2s
tests / build (pull_request) Failing after 2s
whep-client/main.go: minimal Pion subscriber that POSTs a recvonly
offer, applies the answer, and waits for one RTP packet on each of
the video and audio tracks. Used as M1's end-to-end verifier.

whep-client/main_test.go: in-process e2e wiring — stands up Source,
Registry, PeerFactory and WHEPHandler behind an httptest server,
injects synthetic PT=102/111 RTP on the Source's UDP port and calls
Subscribe. Validates the full egress pipeline without requiring
FFmpeg or external network. Skipped under -short.
2026-04-17 08:52:40 -04:00
e471bd02b2 test(webrtc): add FFmpeg publisher script for M1 PoC
Generates a synthetic testsrc2 video + sine audio and pushes H.264/Opus
RTP to the webrtc-poc's UDP port, using the hard-coded payload types
(102 video, 111 audio) the M1 forwarder dispatches on. Intended to be
run alongside test/whep-client (M1 Task 11) for end-to-end verification.
2026-04-17 08:51:22 -04:00
c24c96d022 feat(webrtc): add standalone webrtc-poc binary for M1 testing
Minimal egress-only server that wires Source, Registry, PeerFactory and
WHEPHandler together on a single stream id. Listens for RTP on a local
UDP port (default 127.0.0.1:10000) and serves WHEP on :8787.

Not part of the Core binary — will be demoted to an internal test helper
once M2 integrates WebRTC output into the process-graph.
2026-04-17 08:50:31 -04:00
f6ddae23c9 feat(webrtc): add WHEP POST handler (happy path) 2026-04-17 08:48:06 -04:00
b2a691186c feat(webrtc): add PeerFactory, Peer, and RTP forwarder 2026-04-17 08:47:27 -04:00
917c353e03 feat(webrtc): add ICE config helper (Configuration + SettingEngine)
Vendors github.com/pion/webrtc/v4 v4.2.11 and its transitive
dependencies (datachannel, dtls/v3, ice/v4, interceptor, logging,
mdns/v2, sctp, sdp/v3, srtp/v3, stun/v3, transport/v4, turn/v4).
2026-04-17 08:46:27 -04:00
1fdc29ace1 feat(webrtc): add Source with UDP RTP reader and subscriber fan-out
Adds github.com/pion/rtp v1.10.1 as a direct dependency (vendored).
2026-04-17 08:45:48 -04:00
3a17e543c5 feat(webrtc): add thread-safe Registry for stream_id -> SourceHandle 2026-04-17 08:44:59 -04:00
2250cb0a8f feat(webrtc): add Config with defaults and validation 2026-04-17 08:44:30 -04:00
7ea1844869 feat(webrtc): add package skeleton and typed errors 2026-04-17 08:43:57 -04:00
651a9a3eb5 chore(deps): bump Go 1.21→1.24 and resync vendor for Pion WebRTC v4 compat
Pion webrtc/v4 (v4.2.11) requires Go 1.24+. Upstream datarhei was at
go 1.21.0. Bumping to go 1.24.0 pulls minor bumps across testify,
golang.org/x/{crypto,net,sync,sys,text,time,tools,mod}; vendor/ is
regenerated via 'go mod vendor' to reflect the new versions.

No application code changes; pure dep bump to unblock M1.
2026-04-17 08:43:31 -04:00
262a393b8d docs: add Dragon Fork WebRTC egress design spec and M1 plan 2026-04-17 08:40:05 -04:00
Ingo Oppermann
0de97f4a6b
Add linux/arm/v8 build
Some checks failed
CodeQL / Analyze (push) Failing after 9s
tests / build (push) Failing after 19s
2026-03-16 09:28:04 +01:00
Ingo Oppermann
8b66753a27
Upgrade to CUDA 12.9.1 2026-02-25 14:03:16 +01:00
Ingo Oppermann
d93ab0e92b
Upgrade alpine to 3.23, golang to 1.26 2026-02-25 13:52:36 +01:00
Ingo Oppermann
74cd623377
Upgrade to ffmpeg 7.1.1 2025-12-29 08:59:28 +02:00
Ingo Oppermann
41c505ad43
Bump golang to 1.25 2025-12-09 15:10:55 +01:00
Ingo Oppermann
17a73c9f95
Build latest vod 2025-07-17 22:11:45 +02:00
Ingo Oppermann
5a533022f2
Build specific commit 2025-07-17 17:14:56 +02:00
Ingo Oppermann
a5c2e79253
Build specific commit 2025-07-17 16:46:30 +02:00
Ingo Oppermann
9a7f357e30
Update go version 2025-06-19 16:19:37 +02:00
Ingo Oppermann
07221a2f0b
Upgrade to alpine3.21 2025-01-29 12:20:56 +01:00
Ingo Oppermann
37b99e7752
Remove ubuntu22 build, remove cuda11 builds, bundle with ffmpeg7.1 2024-11-29 11:45:20 +01:00
Ingo Oppermann
6f3e2caf0f
Build with go1.23 2024-10-01 15:19:58 +02:00
Ingo Oppermann
2a8b01feac
Make cuda12 image latest 2024-09-26 15:03:59 +02:00
Ingo Oppermann
65beedd281
Upgrade to ubuntu noble, add cuda 12 bundle 2024-09-26 14:13:59 +02:00
Ingo Oppermann
ca6dba7259
Add ubuntu build for vod branch 2024-09-24 11:47:25 +02:00
Ingo Oppermann
ddba7bbf74
Upgrade base image to alpine3.20 2024-07-11 12:22:50 +02:00
Ingo Oppermann
6872ba0498
Merge branch 'main' into dev 2024-06-07 11:47:03 +02:00
Ingo Oppermann
69d3155176
Remove alpine3.16 builds for vod branch 2024-06-07 11:45:06 +02:00
Ingo Oppermann
18fc8abe62
Update changelog, bump version to 16.16.0 2024-06-07 11:37:25 +02:00
Ingo Oppermann
32b5a83fa9
Fix datarhei/restreamer#759 2024-06-04 17:51:49 +02:00
Ingo Oppermann
8bc84adc2b
Upgrade RTMP dependency 2024-05-30 22:53:20 +02:00
Ingo Oppermann
609bce569b
Don't report EOF as error in RTMP server, update dependency 2024-05-29 16:33:32 +02:00
Ingo Oppermann
d6a80c28e5
Add ConnectionIdleTimeout to RTMP server 2024-05-29 16:16:10 +02:00
Ingo Oppermann
ad8d214805
Add WithLevel() to Logger interface 2024-05-29 15:51:51 +02:00
Ingo Oppermann
8ae7ba8dfe
Upgrade dependencies 2024-05-28 14:26:54 +02:00
Ingo Oppermann
e271a0257b
Update dependencies 2024-05-15 14:59:04 +02:00
Ingo Oppermann
4739958e12
Fix wrong log output when receiving a RTMP stream 2024-04-19 11:36:02 +02:00
Ingo Oppermann
e35c3dead3
Update dependencies 2024-04-15 16:22:39 +02:00
Ingo Oppermann
28d9ae78c7
Cosmetics 2024-04-05 16:01:30 +02:00
Ingo Oppermann
8370b5da8d
Create empty session registry if none is provided 2024-04-05 16:01:19 +02:00
Ingo Oppermann
793414b4e3
Skip handling if session collectors are nil 2024-04-05 15:59:47 +02:00