@3dsource/angular-unreal-module 0.0.93 → 0.0.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3536,6 +3536,334 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
3536
3536
  type: Injectable
3537
3537
  }], ctorParameters: () => [] });
3538
3538
 
3539
+ /**
3540
+ * Adaptive FPS controller that monitors the incoming WebRTC video stream
3541
+ * quality and dynamically adjusts Unreal Engine's `t.MaxFPS` console variable.
3542
+ *
3543
+ * ## How it works
3544
+ *
3545
+ * The service subscribes to `VideoService.videoStats$` (emitted every 250 ms)
3546
+ * and collects samples of FPS, bitrate, and QP (Quantisation Parameter).
3547
+ * Every {@link SAMPLE_WINDOW} ticks (~2 s) it averages the collected samples
3548
+ * and feeds them into a set of **fuzzy-logic membership functions** that
3549
+ * classify each metric into overlapping quality bands.
3550
+ *
3551
+ * ### Input signals
3552
+ *
3553
+ * **1. FPS ratio** = `actualFPS / currentTargetFPS` (0..1+)
3554
+ *
3555
+ * | Band | Range | Meaning |
3556
+ * |--------|---------------------|-----------------------------------------------|
3557
+ * | low | ratio < 0.7 → 1.0, linear ramp 0.7..0.9 → 0 | Stream cannot keep up with the target |
3558
+ * | ok | triangle 0.8..1.0, peak at 0.95 | Stream roughly matches the target |
3559
+ * | high | ratio 0.9..1.0 → ramp, >1.0 → 1.0 | Stream meets or exceeds the target |
3560
+ *
3561
+ * **2. Bitrate load** = `currentBitrate / MAX_BITRATE` (0..1+)
3562
+ *
3563
+ * `MAX_BITRATE` = 20 Mbit/s — the reference ceiling for the encoder.
3564
+ *
3565
+ * | Band | Range | Meaning |
3566
+ * |--------|-------------------------------------------------|-----------------------------------------------|
3567
+ * | high | load 0.5..0.8 → ramp, >0.8 → 1.0 | Encoder is using most of the available bandwidth |
3568
+ * | not high | load < 0.5 → 0.0 | Bandwidth headroom is available |
3569
+ *
3570
+ * **3. Quality** — mapped from QP via `mapQpToQuality()` (see {@link Quality}):
3571
+ *
3572
+ * | Quality | QP range | Meaning |
3573
+ * |----------|-----------|-------------------------------------------------|
3574
+ * | `lime` | QP <= 26 | Good — encoder has enough headroom |
3575
+ * | `orange` | QP 27..35 | Fair — encoder is under moderate pressure |
3576
+ * | `red` | QP > 35 | Poor — heavy compression, visible artefacts |
3577
+ *
3578
+ * ### Decision rules (evaluated in priority order, first match wins)
3579
+ *
3580
+ * | # | Condition | Decision |
3581
+ * |---|------------------------------------------------------------|--------------|
3582
+ * | 1 | FPS ratio is **low** (membership > 0.5) | **decrease** |
3583
+ * | 2 | FPS ratio is **ok** AND quality is `red` | **decrease** |
3584
+ * | 3 | FPS ratio is **ok** AND bitrate **high** AND quality is `orange` | **hold** |
3585
+ * | 4 | FPS ratio is **high** AND quality is `lime` AND bitrate **not high** | **increase** |
3586
+ * | — | Everything else | **hold** |
3587
+ *
3588
+ * ## Cooldown-based throttling
3589
+ *
3590
+ * The service continuously evaluates fuzzy rules every sample window.
3591
+ * After each FPS step change it enforces a cooldown before the next
3592
+ * change can be applied. The cooldown duration depends on the
3593
+ * (previous decision → next decision) pair:
3594
+ *
3595
+ * | Previous | Next | Cooldown |
3596
+ * |-----------|-----------|-----------------------------------------------------|
3597
+ * | decrease | decrease | {@link COOLDOWN_DECREASE_AFTER_DECREASE_MS} (2 s) |
3598
+ * | decrease | increase | {@link COOLDOWN_INCREASE_AFTER_DECREASE_MS} (10 s) |
3599
+ * | increase | decrease | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |
3600
+ * | increase | increase | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |
3601
+ *
3602
+ * This means the system reacts quickly after an increase (2 s in any
3603
+ * direction) but is cautious about stepping back up after a decrease
3604
+ * (10 s), while still allowing consecutive decreases at 2 s intervals.
3605
+ *
3606
+ * ## FPS dispatch
3607
+ *
3608
+ * FPS changes are dispatched via the NgRx `setMaxFps` action, which triggers
3609
+ * the existing `UnrealEffects.setMaxFps$` effect that sends the
3610
+ * `t.MaxFPS <value>` console command to Unreal Engine.
3611
+ */
3612
+ class FpsMonitorService {
3613
+ constructor() {
3614
+ this.videoService = inject(VideoService);
3615
+ this.store = inject(Store);
3616
+ /** Discrete FPS targets the controller can switch between (ascending order). */
3617
+ this.FPS_STEPS = [30, 40, 50, 60];
3618
+ /** Reference ceiling for bitrate (bits/sec) used to normalise bitrate load to 0..1. */
3619
+ this.MAX_BITRATE = 20_000_000;
3620
+ /**
3621
+ * Cooldown (ms) for any decision (increase or decrease) following an increase.
3622
+ * After an increase the system should react faster.
3623
+ */
3624
+ this.COOLDOWN_AFTER_INCREASE_MS = 2_000;
3625
+ /**
3626
+ * Cooldown (ms) for a decrease following a previous decrease.
3627
+ */
3628
+ this.COOLDOWN_DECREASE_AFTER_DECREASE_MS = 2_000;
3629
+ /**
3630
+ * Cooldown (ms) for an increase following a previous decrease.
3631
+ * The stream needs more time to stabilise before stepping back up.
3632
+ */
3633
+ this.COOLDOWN_INCREASE_AFTER_DECREASE_MS = 10_000;
3634
+ /**
3635
+ * Number of videoStats$ ticks to accumulate before evaluating.
3636
+ * At 250 ms per tick this gives a ~2 s sliding evaluation window,
3637
+ * long enough to smooth out single-frame jitter.
3638
+ */
3639
+ this.SAMPLE_WINDOW = 8;
3640
+ /** Current FPS target; starts at max (60 FPS) and adapts downward/upward. */
3641
+ this.currentFpsTarget = this.FPS_STEPS[this.FPS_STEPS.length - 1];
3642
+ this.samples = [];
3643
+ this.lastDecisionTime = Date.now();
3644
+ this.lastUpgrade = 'hold';
3645
+ this.init();
3646
+ }
3647
+ init() {
3648
+ this.videoService.videoStats$
3649
+ .pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady))
3650
+ .subscribe(([stats]) => this.processTick(stats));
3651
+ }
3652
+ /**
3653
+ * Called on every videoStats$ emission (~250 ms).
3654
+ * Accumulates samples and evaluates once per SAMPLE_WINDOW.
3655
+ */
3656
+ processTick(stats) {
3657
+ const { framesPerSecond, bitrate, VideoEncoderQP } = stats.aggregatedStats;
3658
+ this.samples.push({
3659
+ fps: framesPerSecond ?? 0,
3660
+ bitrate: bitrate ?? 0,
3661
+ qp: VideoEncoderQP ?? 0,
3662
+ });
3663
+ // Wait until we have enough samples for a reliable average.
3664
+ if (this.samples.length < this.SAMPLE_WINDOW) {
3665
+ return;
3666
+ }
3667
+ const avg = this.averageSamples();
3668
+ this.samples = [];
3669
+ this.handleMonitoring(avg, this.currentFpsTarget);
3670
+ }
3671
+ handleMonitoring(avg, currentTarget) {
3672
+ const decision = this.evaluateDecision(avg, currentTarget);
3673
+ this.upgradeFps(decision, avg.qp);
3674
+ }
3675
+ /**
3676
+ * Combines fuzzy membership values into a single discrete decision.
3677
+ * Rules are evaluated in priority order — first match wins.
3678
+ *
3679
+ * Inputs:
3680
+ * - `fpsRatio` = avgFPS / currentTargetFPS (e.g. 45/60 = 0.75)
3681
+ * - `bitrateLoad` = avgBitrate / 20 Mbit/s (e.g. 12M/20M = 0.6)
3682
+ * - `quality` = mapQpToQuality(avgQP) → 'lime' | 'orange' | 'red'
3683
+ */
3684
+ evaluateDecision(avg, currentTarget) {
3685
+ const fpsRatio = currentTarget > 0 ? avg.fps / currentTarget : 1;
3686
+ const bitrateLoad = avg.bitrate / this.MAX_BITRATE;
3687
+ const fpsLow = this.membershipFpsLow(fpsRatio);
3688
+ const fpsOk = this.membershipFpsOk(fpsRatio);
3689
+ const fpsHigh = this.membershipFpsHigh(fpsRatio);
3690
+ const bitrateHigh = this.membershipBitrateHigh(bitrateLoad);
3691
+ // Quality is derived from QP: lime (QP <= 26), orange (QP 27..35), red (QP > 35).
3692
+ const quality = mapQpToQuality(avg.qp);
3693
+ // Rule 1: FPS clearly below target (ratio roughly < 0.8) → step down immediately.
3694
+ if (fpsLow > 0.5) {
3695
+ return 'decrease';
3696
+ }
3697
+ // Rule 2: FPS looks acceptable numerically, but encoder quality is 'red'
3698
+ // (QP > 35 — heavy compression artefacts). Reducing target FPS frees
3699
+ // encoder headroom and improves visual quality.
3700
+ if (fpsOk > 0.4 && quality === 'red') {
3701
+ return 'decrease';
3702
+ }
3703
+ // Rule 3: FPS is ok, but bitrate is above ~50-80% of 20 Mbit/s ceiling
3704
+ // and quality is 'orange' (QP 27..35). Near capacity — don't push higher.
3705
+ if (fpsOk > 0.4 && bitrateHigh > 0.5 && quality === 'orange') {
3706
+ return 'hold';
3707
+ }
3708
+ // Rule 4: FPS meets/exceeds target (ratio >= ~0.95), quality is 'lime'
3709
+ // (QP <= 26), and bitrate is below 50% of ceiling — safe to step up.
3710
+ if (fpsHigh > 0.5 &&
3711
+ quality === 'lime' &&
3712
+ bitrateHigh < 0.5 &&
3713
+ this.currentFpsTarget < this.FPS_STEPS[this.FPS_STEPS.length - 1]) {
3714
+ return 'increase';
3715
+ }
3716
+ return 'hold';
3717
+ }
3718
+ // ---------------------------------------------------------------------------
3719
+ // Fuzzy membership functions
3720
+ //
3721
+ // Each function maps a normalised input (0..1+) to a membership degree (0..1).
3722
+ // Overlapping trapezoid/triangle shapes let multiple categories be partially
3723
+ // active at the same time, which makes the rules less brittle than hard thresholds.
3724
+ // ---------------------------------------------------------------------------
3725
+ /**
3726
+ * FPS ratio membership "low".
3727
+ * Input: ratio = actualFPS / targetFPS (e.g. 42/60 = 0.70).
3728
+ *
3729
+ * ratio < 0.7 → 1.0 (clearly failing, e.g. 40/60)
3730
+ * ratio 0.7..0.9 → linear ramp down (e.g. 0.8 → 0.5)
3731
+ * ratio > 0.9 → 0.0 (keeping up)
3732
+ */
3733
+ membershipFpsLow(ratio) {
3734
+ if (ratio < 0.7)
3735
+ return 1.0;
3736
+ if (ratio > 0.9)
3737
+ return 0.0;
3738
+ return (0.9 - ratio) / 0.2;
3739
+ }
3740
+ /**
3741
+ * FPS ratio membership "ok" — triangle shape.
3742
+ * Input: ratio = actualFPS / targetFPS.
3743
+ *
3744
+ * ratio < 0.8 → 0.0
3745
+ * ratio 0.8..0.95 → ramp up, peak at 0.95 (e.g. 57/60)
3746
+ * ratio 0.95..1.0 → ramp down
3747
+ * ratio > 1.0 → 0.0
3748
+ */
3749
+ membershipFpsOk(ratio) {
3750
+ if (ratio < 0.8)
3751
+ return 0.0;
3752
+ if (ratio < 0.95)
3753
+ return (ratio - 0.8) / 0.15;
3754
+ if (ratio <= 1.0)
3755
+ return (1.0 - ratio) / 0.05;
3756
+ return 0.0;
3757
+ }
3758
+ /**
3759
+ * FPS ratio membership "high".
3760
+ * Input: ratio = actualFPS / targetFPS.
3761
+ *
3762
+ * ratio < 0.9 → 0.0
3763
+ * ratio 0.9..1.0 → linear ramp up (e.g. 0.95 → 0.5)
3764
+ * ratio >= 1.0 → 1.0 (meeting or exceeding target, e.g. 60/60)
3765
+ */
3766
+ membershipFpsHigh(ratio) {
3767
+ if (ratio < 0.9)
3768
+ return 0.0;
3769
+ if (ratio > 1.0)
3770
+ return 1.0;
3771
+ return (ratio - 0.9) / 0.1;
3772
+ }
3773
+ /**
3774
+ * Bitrate load membership "high".
3775
+ * Input: load = currentBitrate / MAX_BITRATE (20 Mbit/s).
3776
+ *
3777
+ * load < 0.5 → 0.0 (below 10 Mbit/s — plenty of headroom)
3778
+ * load 0.5..0.8 → linear ramp (e.g. 13M/20M = 0.65 → 0.5)
3779
+ * load > 0.8 → 1.0 (above 16 Mbit/s — near capacity)
3780
+ */
3781
+ membershipBitrateHigh(load) {
3782
+ if (load < 0.5)
3783
+ return 0.0;
3784
+ if (load > 0.8)
3785
+ return 1.0;
3786
+ return (load - 0.5) / 0.3;
3787
+ }
3788
+ // ---------------------------------------------------------------------------
3789
+ // Step actions
3790
+ // ---------------------------------------------------------------------------
3791
+ upgradeFps(decision, qp) {
3792
+ if (decision === 'hold')
3793
+ return;
3794
+ const now = Date.now();
3795
+ // Throttle: cooldown depends on (previous decision → current decision) pair.
3796
+ const isStepUp = decision === 'increase';
3797
+ const cooldown = this.lastUpgrade === 'decrease'
3798
+ ? isStepUp
3799
+ ? this.COOLDOWN_INCREASE_AFTER_DECREASE_MS
3800
+ : this.COOLDOWN_DECREASE_AFTER_DECREASE_MS
3801
+ : this.COOLDOWN_AFTER_INCREASE_MS;
3802
+ if (now - this.lastDecisionTime < cooldown) {
3803
+ return;
3804
+ }
3805
+ this.lastUpgrade = decision;
3806
+ const quality = mapQpToQuality(qp);
3807
+ const newTarget = this.getNextFpsTarget(this.currentFpsTarget, decision);
3808
+ Logger.info(`[FpsMonitor] Decision: ${decision} → FPS: ${newTarget}, Quality: ${quality}`);
3809
+ if (newTarget !== this.currentFpsTarget) {
3810
+ this.currentFpsTarget = newTarget;
3811
+ this.store.dispatch(setMaxFps({ maxFps: newTarget }));
3812
+ }
3813
+ this.lastDecisionTime = now;
3814
+ this.samples = [];
3815
+ }
3816
+ /**
3817
+ * Get the next FPS target based on current target and decision.
3818
+ * Clamps to valid FPS_STEPS range.
3819
+ */
3820
+ getNextFpsTarget(currentTarget, decision) {
3821
+ const currentIndex = this.FPS_STEPS.indexOf(currentTarget);
3822
+ // If current target is not in FPS_STEPS, find closest one
3823
+ const validIndex = currentIndex === -1
3824
+ ? this.findClosestFpsIndex(currentTarget)
3825
+ : currentIndex;
3826
+ const delta = decision === 'increase' ? 1 : -1;
3827
+ const newIndex = clampf(0, this.FPS_STEPS.length - 1, validIndex + delta);
3828
+ return this.FPS_STEPS[newIndex];
3829
+ }
3830
+ /**
3831
+ * Find the closest FPS step index for a given target value.
3832
+ */
3833
+ findClosestFpsIndex(target) {
3834
+ let closestIndex = 0;
3835
+ let closestDiff = Math.abs(this.FPS_STEPS[0] - target);
3836
+ for (let i = 1; i < this.FPS_STEPS.length; i++) {
3837
+ const diff = Math.abs(this.FPS_STEPS[i] - target);
3838
+ if (diff < closestDiff) {
3839
+ closestDiff = diff;
3840
+ closestIndex = i;
3841
+ }
3842
+ }
3843
+ return closestIndex;
3844
+ }
3845
+ /** Average all collected samples for the current evaluation window. */
3846
+ averageSamples() {
3847
+ const len = this.samples.length;
3848
+ if (len === 0)
3849
+ return { fps: 0, bitrate: 0, qp: 0 };
3850
+ let fps = 0;
3851
+ let bitrate = 0;
3852
+ let qp = 0;
3853
+ for (const s of this.samples) {
3854
+ fps += s.fps;
3855
+ bitrate += s.bitrate;
3856
+ qp += s.qp;
3857
+ }
3858
+ return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };
3859
+ }
3860
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FpsMonitorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3861
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FpsMonitorService }); }
3862
+ }
3863
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FpsMonitorService, decorators: [{
3864
+ type: Injectable
3865
+ }], ctorParameters: () => [] });
3866
+
3539
3867
  function provideAngularUnrealModule(config) {
3540
3868
  return makeEnvironmentProviders([
3541
3869
  provideState(unrealFeature),
@@ -3547,6 +3875,7 @@ function provideAngularUnrealModule(config) {
3547
3875
  RegionsPingService,
3548
3876
  FileReceiverService,
3549
3877
  FileHandlerService,
3878
+ FpsMonitorService,
3550
3879
  AnalyticsService,
3551
3880
  {
3552
3881
  provide: StreamStatusTelemetryService,
@@ -3608,6 +3937,7 @@ function provideAngularUnrealModule(config) {
3608
3937
  inject(AFKService);
3609
3938
  inject(FreezeFrameService);
3610
3939
  inject(AnalyticsService);
3940
+ inject(FpsMonitorService);
3611
3941
  }),
3612
3942
  ]);
3613
3943
  }
@@ -5589,5 +5919,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
5589
5919
  * Generated bundle index. Do not edit.
5590
5920
  */
5591
5921
 
5592
- export { AFKService, AfkPlaywrightService, AggregatorPlaywrightService, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, ClickableOverlayComponent, CommandTelemetryPlaywrightService, CommandTelemetryService, ConfigHandler, ConsoleExtensionsPlaywrightService, ConsoleExtensionsService, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DEFAULT_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_ENABLED, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE, DEFAULT_RECONNECT_ON_ICE_FAILURE, DataFlowMonitor, DevModeService, DisconnectReason, EControlSchemeType, EMessageType, EToClientMessageType, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverPlaywrightService, FileReceiverService, FilterSettingsComponent, FreezeFrameComponent, FreezeFramePlaywrightService, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputPlaywrightService, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RegionsPingService, ResetTelemetry, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingPlaywrightService, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryPlaywrightService, StreamStatusTelemetryService, SubService, TelemetryStart, TelemetryStop, UNREAL_CONFIG, UnrealCommunicatorPlaywrightService, UnrealCommunicatorService, UnrealEffects, UnrealInternalSignalEvents, UnrealSceneComponent, UnrealStatusMessage, VideoRecorder, VideoService, VideoStatsComponent, WSCloseCode_CIRRUS_ABNORMAL_CLOSURE, WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR, WSCloseCode_CIRRUS_PLAYER_DISCONNECTED, WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER, WSCloseCode_FORCE_CIRRUS_CLOSE, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCode_UNKNOWN, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, changeLowBandwidth, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, commandCompleted, commandStarted, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, floatToSmoothPercents, forceResizeUnrealVideo, fromResizeObserver, fromSignal, fromUnrealCallBackSignal, getActiveUrl, getImageFromVideoStream, getRtcErrorMessage, iceConnectionFailed, initSignalling, initialState, isLoaderScreenVisible, keepMaxUntilReset, mapQpToQuality, observeCommandResponse, provideAngularUnrealModule, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, removeExileCommands, resetAfk, resetAfkAction, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetWarnTimeout, saveAnalyticsEvent, selectClientAndViewIds, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsVideoPlayingAndDataChannelConnected, selectLastCommandInProgress, selectLoaderCommands, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, sendSignal, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setDataChannelConnected, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setViewportNotReady, setViewportReady, showPopupWithoutAutoStart, showUnrealErrorMessage, smoothTransition, startStream, trackMixpanelEvent, unrealFeature, unrealReducer, updateCirrusInfo };
5922
+ export { AFKService, AfkPlaywrightService, AggregatorPlaywrightService, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, ClickableOverlayComponent, CommandTelemetryPlaywrightService, CommandTelemetryService, ConfigHandler, ConsoleExtensionsPlaywrightService, ConsoleExtensionsService, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DEFAULT_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_ENABLED, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE, DEFAULT_RECONNECT_ON_ICE_FAILURE, DataFlowMonitor, DevModeService, DisconnectReason, EControlSchemeType, EMessageType, EToClientMessageType, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverPlaywrightService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFramePlaywrightService, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputPlaywrightService, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RegionsPingService, ResetTelemetry, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingPlaywrightService, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryPlaywrightService, StreamStatusTelemetryService, SubService, TelemetryStart, TelemetryStop, UNREAL_CONFIG, UnrealCommunicatorPlaywrightService, UnrealCommunicatorService, UnrealEffects, UnrealInternalSignalEvents, UnrealSceneComponent, UnrealStatusMessage, VideoRecorder, VideoService, VideoStatsComponent, WSCloseCode_CIRRUS_ABNORMAL_CLOSURE, WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR, WSCloseCode_CIRRUS_PLAYER_DISCONNECTED, WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER, WSCloseCode_FORCE_CIRRUS_CLOSE, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCode_UNKNOWN, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, changeLowBandwidth, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, commandCompleted, commandStarted, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, floatToSmoothPercents, forceResizeUnrealVideo, fromResizeObserver, fromSignal, fromUnrealCallBackSignal, getActiveUrl, getImageFromVideoStream, getRtcErrorMessage, iceConnectionFailed, initSignalling, initialState, isLoaderScreenVisible, keepMaxUntilReset, mapQpToQuality, observeCommandResponse, provideAngularUnrealModule, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, removeExileCommands, resetAfk, resetAfkAction, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetWarnTimeout, saveAnalyticsEvent, selectClientAndViewIds, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsVideoPlayingAndDataChannelConnected, selectLastCommandInProgress, selectLoaderCommands, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, sendSignal, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setDataChannelConnected, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setViewportNotReady, setViewportReady, showPopupWithoutAutoStart, showUnrealErrorMessage, smoothTransition, startStream, trackMixpanelEvent, unrealFeature, unrealReducer, updateCirrusInfo };
5593
5923
  //# sourceMappingURL=3dsource-angular-unreal-module.mjs.map