feat: Add experimental rewrite of go2rtc live provider (MSE/WebRTC/MP4/MJPEG) (#2580)

- Closes #2556
- Closes #2450

**Key intended features:**
 - go2rtc compatible
- 100% test coverage to significantly improve ability to test, maintain
and work around browser weirdnesses (e.g. Safari).
 - Written from the ground up in the style of the rest of the project.

**To use:**
 - Change `live_provider` from `go2rtc` to `go2rtc-experimental`.
This commit is contained in:
Dermot Duffy
2026-07-14 14:22:41 -07:00
committed by GitHub
parent 5662e48c22
commit c02c692f68
125 changed files with 9608 additions and 807 deletions
@@ -1,3 +1,4 @@
import type { MediaUnavailableIssueReason } from '../../../../card-controller/issues/issues/media-unavailable';
import type { LivenessDetector, LivenessVerdict } from '../stream-liveness-controller';
const LIVE_ERROR_EVENT = 'advanced-camera-card:live:error';
@@ -38,12 +39,19 @@ export class ProviderErrorDetector implements LivenessDetector {
return this._verdict;
}
private _handler = (ev: Event): void => {
private _handler = (
ev: CustomEvent<MediaUnavailableIssueReason | undefined>,
): void => {
ev.stopPropagation();
if (this._verdict.state !== 'not_live') {
// Authoritative: an explicit provider error overrides even direct frame
// evidence. No placeholder -- the provider renders its own error.
this._verdict = { state: 'not_live', authority: 'hard', reason: 'playback_error' };
// evidence. No placeholder -- the provider renders its own error. The
// provider may name the cause; otherwise it is a generic playback error.
this._verdict = {
state: 'not_live',
authority: 'hard',
reason: ev.detail ?? 'playback_error',
};
this._onChange();
}
};