LiveKit integration: real camera feed pipeline #1
@@ -9,6 +9,15 @@ name: Build
|
|||||||
# bootstrap (buildspec.json + cmake/common/buildspec_common.cmake), which
|
# bootstrap (buildspec.json + cmake/common/buildspec_common.cmake), which
|
||||||
# downloads the pinned obs-deps bundle and obs-studio source and builds just
|
# downloads the pinned obs-deps bundle and obs-studio source and builds just
|
||||||
# `libobs`. That step is the slow one: several minutes on a cold runner.
|
# `libobs`. That step is the slow one: several minutes on a cold runner.
|
||||||
|
#
|
||||||
|
# RELEASE GATE: this workflow only builds, tests, and uploads CI-internal
|
||||||
|
# workflow artifacts (actions/upload-artifact, below) -- it does not create a
|
||||||
|
# Gitea Release, push a tag-triggered publish, or otherwise distribute
|
||||||
|
# binaries publicly, and it must not start doing so without explicit owner
|
||||||
|
# sign-off on the WebRTC/OpenH264 attribution and GPLv2/Apache-2.0
|
||||||
|
# license-compatibility questions tracked in third_party/livekit/README.md
|
||||||
|
# and the README's top-level Status section. If a real release/publish step
|
||||||
|
# is ever added here, it must carry that same gate.
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|||||||
@@ -8,6 +8,20 @@ Media-Source path for directors. Full design:
|
|||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
|
**Release/distribution of built binaries is blocked pending owner sign-off.**
|
||||||
|
This plugin statically/dynamically pulls in Google WebRTC and OpenH264 code
|
||||||
|
through the LiveKit SDK, and this repository's own top-level `LICENSE` is
|
||||||
|
GPLv2 while the vendored LiveKit binaries are Apache-2.0 — both a real patent/
|
||||||
|
royalty question (OpenH264/WebRTC) and a real license-compatibility question
|
||||||
|
(GPLv2 vs. Apache-2.0-linked code) that only the project owner can decide.
|
||||||
|
Nothing in this repo should be built into a package and handed out, posted,
|
||||||
|
or attached to a public release until that sign-off happens. See
|
||||||
|
`third_party/livekit/README.md` for the specifics of what is and is not
|
||||||
|
currently known/shipped on the licensing side. (CI in `.gitea/workflows/build.yml`
|
||||||
|
currently only builds, tests, and uploads CI-internal build artifacts — it
|
||||||
|
does not create a Gitea Release or otherwise publish anything publicly; if
|
||||||
|
that ever changes, the new step must carry this same gate.)
|
||||||
|
|
||||||
The plugin is **functionally complete on Linux and verified end to end there**
|
The plugin is **functionally complete on Linux and verified end to end there**
|
||||||
(module loads into real libobs, connects to a real LiveKit server through the
|
(module loads into real libobs, connects to a real LiveKit server through the
|
||||||
real streamer-tools API shape, and pushes decoded frames into
|
real streamer-tools API shape, and pushes decoded frames into
|
||||||
@@ -15,7 +29,13 @@ real streamer-tools API shape, and pushes decoded frames into
|
|||||||
|
|
||||||
It has **not been run in the OBS GUI on any platform.** macOS builds the real
|
It has **not been run in the OBS GUI on any platform.** macOS builds the real
|
||||||
module in CI but its artifact is not yet loadable (see the macOS packaging gap
|
module in CI but its artifact is not yet loadable (see the macOS packaging gap
|
||||||
under CI). Windows has not yet completed a build with the current fixes.
|
under CI). Windows CI has **failed on every completed run so far** (7
|
||||||
|
consecutive failures on this branch as of this writing); a run against the
|
||||||
|
commit with the `-A x64` argument fix is in progress but not yet complete,
|
||||||
|
and the commit with the PowerShell rewrite of the Windows steps is still
|
||||||
|
queued behind it. Neither fix has a completed, passing run yet. See "Where
|
||||||
|
the Windows bootstrap got to" under CI below for the exact record, and check
|
||||||
|
current CI status rather than trusting this paragraph's age.
|
||||||
|
|
||||||
See "What is verified, and how" below for exactly what has and has not been
|
See "What is verified, and how" below for exactly what has and has not been
|
||||||
checked, and "Testing this by hand" for what a human still needs to do.
|
checked, and "Testing this by hand" for what a human still needs to do.
|
||||||
@@ -173,7 +193,7 @@ livekit-server 1.13.6 in dev mode):
|
|||||||
|---|---|
|
|---|---|
|
||||||
| The pinned LiveKit SDK links and is callable | `test_livekit_smoke`: `initialize()`/`shutdown()` round-trip, header version asserted equal to the CMake pin |
|
| The pinned LiveKit SDK links and is callable | `test_livekit_smoke`: `initialize()`/`shutdown()` round-trip, header version asserted equal to the CMake pin |
|
||||||
| The JSON reader handles real and hostile input | `test_json`, 158 checks, including truncated bodies, HTML error pages, binary garbage, lone surrogates, and a depth-limit case |
|
| The JSON reader handles real and hostile input | `test_json`, 158 checks, including truncated bodies, HTML error pages, binary garbage, lone surrogates, and a depth-limit case |
|
||||||
| The API client parses the real response shapes and every error branch | `test_api_client`, 121 checks, against a fake HTTP client **and** a real loopback HTTP server driving the actual platform backend |
|
| The API client parses the real response shapes and every error branch | `test_api_client`, 127 checks, against a fake HTTP client **and** a real loopback HTTP server driving the actual platform backend |
|
||||||
| A dead/stalled/garbage server cannot hang or crash the plugin | loopback cases: truncated JSON, connection closed with no reply, non-HTTP bytes, dead port, stalled server cut off by the client timeout |
|
| A dead/stalled/garbage server cannot hang or crash the plugin | loopback cases: truncated JSON, connection closed with no reply, non-HTTP bytes, dead port, stalled server cut off by the client timeout |
|
||||||
| Session state transitions, track selection, frame geometry | `test_session`, 81 checks, plus real `connect()` failures against the real SDK |
|
| Session state transitions, track selection, frame geometry | `test_session`, 81 checks, plus real `connect()` failures against the real SDK |
|
||||||
| **Media actually flows** | `test_integration_livekit` against a real LiveKit server: 36 video frames + 323 audio frames, correct I420 geometry and plane pointers, publisher unpublish → `hasVideo()` false with **no further frames from the dead publisher**, republish → video resumes |
|
| **Media actually flows** | `test_integration_livekit` against a real LiveKit server: 36 video frames + 323 audio frames, correct I420 geometry and plane pointers, publisher unpublish → `hasVideo()` false with **no further frames from the dead publisher**, republish → video resumes |
|
||||||
@@ -208,7 +228,7 @@ runners available to this repo under the `CyberCoveLLC` org.
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `linux` | `ubuntu-24.04` | `localhost.localdomain` | **Green.** Builds the real adapter against Ubuntu's libobs-dev 30.0.2, runs all six test suites, uploads `build/package` as an artifact |
|
| `linux` | `ubuntu-24.04` | `localhost.localdomain` | **Green.** Builds the real adapter against Ubuntu's libobs-dev 30.0.2, runs all six test suites, uploads `build/package` as an artifact |
|
||||||
| `macos` | `macos-latest` | `home-mac` (Global) | **Green.** Builds libobs 30.0.2 from source, then the real adapter; 6/6 tests; artifact uploaded. But see the macOS packaging gap below |
|
| `macos` | `macos-latest` | `home-mac` (Global) | **Green.** Builds libobs 30.0.2 from source, then the real adapter; 6/6 tests; artifact uploaded. But see the macOS packaging gap below |
|
||||||
| `windows` | `windows-latest` | `winvm-builder` (org-scoped) | **Unconfirmed** — see below |
|
| `windows` | `windows-latest` | `winvm-builder` (org-scoped) | **Failing** — 7/7 completed runs on this branch have failed; see below |
|
||||||
|
|
||||||
The Linux job is pinned to `ubuntu-24.04` rather than `ubuntu-latest`: this
|
The Linux job is pinned to `ubuntu-24.04` rather than `ubuntu-latest`: this
|
||||||
instance's two Linux runners answer `ubuntu-latest` with different releases,
|
instance's two Linux runners answer `ubuntu-latest` with different releases,
|
||||||
@@ -282,11 +302,25 @@ attempted here rather than guessed at.
|
|||||||
|
|
||||||
Windows is by far the slowest job — the `lukka/get-cmake` step alone takes
|
Windows is by far the slowest job — the `lukka/get-cmake` step alone takes
|
||||||
7-15 minutes on `winvm-builder`, and the runner serialises jobs, so a burst of
|
7-15 minutes on `winvm-builder`, and the runner serialises jobs, so a burst of
|
||||||
pushes leaves a queue that takes an hour to drain. One confirmed bug of its
|
pushes leaves a queue that takes an hour to drain.
|
||||||
own was found and fixed: upstream passes `-A x64,version=<Windows SDK>` to the
|
|
||||||
OBS sub-configure, and with a current CMake that `,version=` suffix reappears
|
**The honest record: every completed Windows CI run on this branch has
|
||||||
verbatim in the sub-build's `CMAKE_VS_PLATFORM_NAME` — which obs-studio's own
|
failed. 7 consecutive failures**, at the 7 branch commits (in order) that had
|
||||||
dependency downloader uses as the architecture, sending it after
|
a completed Windows run as of this writing -- all of them at commits before
|
||||||
|
the `-A x64` fix below was applied. As of this writing, a Windows run against
|
||||||
|
the commit with that fix is in progress but has not yet completed, and the
|
||||||
|
commit with the PowerShell rewrite is still queued behind it (the runner's
|
||||||
|
serial queue means fixed commits can sit behind older, unfixed ones for a
|
||||||
|
while). Do not read either fix below as "confirmed" until a Windows run
|
||||||
|
actually goes green on a commit that includes it; check current CI status
|
||||||
|
rather than trusting this paragraph's age.
|
||||||
|
|
||||||
|
Two bugs of its own were found and (believed, not yet proven) fixed:
|
||||||
|
|
||||||
|
1. Upstream passes `-A x64,version=<Windows SDK>` to the OBS sub-configure,
|
||||||
|
and with a current CMake that `,version=` suffix reappears verbatim in the
|
||||||
|
sub-build's `CMAKE_VS_PLATFORM_NAME` — which obs-studio's own dependency
|
||||||
|
downloader uses as the architecture, sending it after
|
||||||
`windows-deps-2023-11-03-x64,version=10.0.26100.0.zip`:
|
`windows-deps-2023-11-03-x64,version=10.0.26100.0.zip`:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -294,8 +328,13 @@ string sub-command JSON member 'hashes windows-x64,version=10.0.26100.0' not fou
|
|||||||
Unable to download .../windows-deps-2023-11-03-x64,version=10.0.26100.0.zip
|
Unable to download .../windows-deps-2023-11-03-x64,version=10.0.26100.0.zip
|
||||||
```
|
```
|
||||||
|
|
||||||
Plain `-A x64` now. **No Windows run has yet completed with that fix in
|
Plain `-A x64` now.
|
||||||
place**, so Windows should be treated as unverified beyond "the core library
|
2. The Windows CI steps were originally written in bash (via
|
||||||
and the WinHTTP backend compile and their tests pass", which earlier runs did
|
`shell: bash`), which is a poor fit for a `windows-latest` runner's
|
||||||
show. Expect further iterations there of the same kind the macOS bootstrap
|
default toolchain expectations; they were rewritten in PowerShell.
|
||||||
needed.
|
|
||||||
|
Until a Windows run completes green with both fixes in place, Windows should
|
||||||
|
be treated as unverified beyond "the core library and the WinHTTP backend
|
||||||
|
compile and their tests pass", which earlier (failing-job) runs did show
|
||||||
|
before failing later in the job. Expect further iterations there of the same
|
||||||
|
kind the macOS bootstrap needed.
|
||||||
|
|||||||
Reference in New Issue
Block a user