@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 1.2.4 → 1.3.0

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.
Files changed (106) hide show
  1. package/CHANGELOG.md +25 -2
  2. package/dist/cjs/AFK/AFKController.js +2 -2
  3. package/dist/cjs/AFK/AFKController.js.map +1 -1
  4. package/dist/cjs/Config/Config.js +19 -0
  5. package/dist/cjs/Config/Config.js.map +1 -1
  6. package/dist/cjs/DataChannel/DataChannelController.js +2 -2
  7. package/dist/cjs/DataChannel/DataChannelController.js.map +1 -1
  8. package/dist/cjs/DataChannel/DataChannelSender.js +2 -2
  9. package/dist/cjs/DataChannel/DataChannelSender.js.map +1 -1
  10. package/dist/cjs/Inputs/GamepadController.js +5 -6
  11. package/dist/cjs/Inputs/GamepadController.js.map +1 -1
  12. package/dist/cjs/Inputs/InputClassesFactory.js +3 -3
  13. package/dist/cjs/Inputs/InputClassesFactory.js.map +1 -1
  14. package/dist/cjs/Inputs/KeyCodes.js +13 -1
  15. package/dist/cjs/Inputs/KeyCodes.js.map +1 -1
  16. package/dist/cjs/Inputs/KeyboardController.js +12 -0
  17. package/dist/cjs/Inputs/KeyboardController.js.map +1 -1
  18. package/dist/cjs/Inputs/MouseController.js +2 -1
  19. package/dist/cjs/Inputs/MouseController.js.map +1 -1
  20. package/dist/cjs/Inputs/MouseControllerHovering.js +71 -6
  21. package/dist/cjs/Inputs/MouseControllerHovering.js.map +1 -1
  22. package/dist/cjs/Inputs/MouseControllerLocked.js +18 -3
  23. package/dist/cjs/Inputs/MouseControllerLocked.js.map +1 -1
  24. package/dist/cjs/PeerConnectionController/PeerConnectionController.js +71 -72
  25. package/dist/cjs/PeerConnectionController/PeerConnectionController.js.map +1 -1
  26. package/dist/cjs/PixelStreaming/PixelStreaming.js +25 -0
  27. package/dist/cjs/PixelStreaming/PixelStreaming.js.map +1 -1
  28. package/dist/cjs/UeInstanceMessage/SendMessageController.js +2 -3
  29. package/dist/cjs/UeInstanceMessage/SendMessageController.js.map +1 -1
  30. package/dist/cjs/UeInstanceMessage/StreamMessageController.js.map +1 -1
  31. package/dist/cjs/VideoPlayer/StreamController.js +3 -3
  32. package/dist/cjs/VideoPlayer/StreamController.js.map +1 -1
  33. package/dist/cjs/VideoPlayer/VideoPlayer.js +17 -6
  34. package/dist/cjs/VideoPlayer/VideoPlayer.js.map +1 -1
  35. package/dist/cjs/WebRtcPlayer/WebRtcPlayerController.js +2 -2
  36. package/dist/cjs/WebRtcPlayer/WebRtcPlayerController.js.map +1 -1
  37. package/dist/cjs/WebXR/WebXRController.js +14 -11
  38. package/dist/cjs/WebXR/WebXRController.js.map +1 -1
  39. package/dist/esm/AFK/AFKController.js +2 -2
  40. package/dist/esm/AFK/AFKController.js.map +1 -1
  41. package/dist/esm/Config/Config.js +19 -0
  42. package/dist/esm/Config/Config.js.map +1 -1
  43. package/dist/esm/DataChannel/DataChannelController.js +2 -2
  44. package/dist/esm/DataChannel/DataChannelController.js.map +1 -1
  45. package/dist/esm/DataChannel/DataChannelSender.js +2 -2
  46. package/dist/esm/DataChannel/DataChannelSender.js.map +1 -1
  47. package/dist/esm/Inputs/GamepadController.js +5 -6
  48. package/dist/esm/Inputs/GamepadController.js.map +1 -1
  49. package/dist/esm/Inputs/InputClassesFactory.js +3 -3
  50. package/dist/esm/Inputs/InputClassesFactory.js.map +1 -1
  51. package/dist/esm/Inputs/KeyCodes.js +13 -1
  52. package/dist/esm/Inputs/KeyCodes.js.map +1 -1
  53. package/dist/esm/Inputs/KeyboardController.js +12 -0
  54. package/dist/esm/Inputs/KeyboardController.js.map +1 -1
  55. package/dist/esm/Inputs/MouseController.js +2 -1
  56. package/dist/esm/Inputs/MouseController.js.map +1 -1
  57. package/dist/esm/Inputs/MouseControllerHovering.js +71 -6
  58. package/dist/esm/Inputs/MouseControllerHovering.js.map +1 -1
  59. package/dist/esm/Inputs/MouseControllerLocked.js +18 -3
  60. package/dist/esm/Inputs/MouseControllerLocked.js.map +1 -1
  61. package/dist/esm/PeerConnectionController/PeerConnectionController.js +71 -72
  62. package/dist/esm/PeerConnectionController/PeerConnectionController.js.map +1 -1
  63. package/dist/esm/PixelStreaming/PixelStreaming.js +25 -0
  64. package/dist/esm/PixelStreaming/PixelStreaming.js.map +1 -1
  65. package/dist/esm/UeInstanceMessage/SendMessageController.js +2 -3
  66. package/dist/esm/UeInstanceMessage/SendMessageController.js.map +1 -1
  67. package/dist/esm/UeInstanceMessage/StreamMessageController.js.map +1 -1
  68. package/dist/esm/VideoPlayer/StreamController.js +3 -3
  69. package/dist/esm/VideoPlayer/StreamController.js.map +1 -1
  70. package/dist/esm/VideoPlayer/VideoPlayer.js +18 -7
  71. package/dist/esm/VideoPlayer/VideoPlayer.js.map +1 -1
  72. package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js +2 -2
  73. package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js.map +1 -1
  74. package/dist/esm/WebXR/WebXRController.js +14 -11
  75. package/dist/esm/WebXR/WebXRController.js.map +1 -1
  76. package/dist/types/Config/Config.d.ts +8 -0
  77. package/dist/types/Inputs/InputClassesFactory.d.ts +1 -1
  78. package/dist/types/Inputs/MouseController.d.ts +3 -1
  79. package/dist/types/Inputs/MouseControllerHovering.d.ts +10 -1
  80. package/dist/types/Inputs/MouseControllerLocked.d.ts +2 -1
  81. package/dist/types/PeerConnectionController/PeerConnectionController.d.ts +3 -3
  82. package/dist/types/PixelStreaming/PixelStreaming.d.ts +9 -1
  83. package/dist/types/UeInstanceMessage/StreamMessageController.d.ts +3 -3
  84. package/dist/types/VideoPlayer/VideoPlayer.d.ts +1 -0
  85. package/eslint.config.mjs +1 -8
  86. package/package.json +4 -4
  87. package/src/AFK/AFKController.ts +2 -2
  88. package/src/Config/Config.ts +61 -9
  89. package/src/DataChannel/DataChannelController.ts +2 -2
  90. package/src/DataChannel/DataChannelSender.ts +2 -2
  91. package/src/Inputs/GamepadController.ts +5 -6
  92. package/src/Inputs/InputClassesFactory.ts +5 -3
  93. package/src/Inputs/KeyCodes.ts +13 -1
  94. package/src/Inputs/KeyboardController.ts +11 -1
  95. package/src/Inputs/MouseController.ts +5 -1
  96. package/src/Inputs/MouseControllerHovering.ts +79 -6
  97. package/src/Inputs/MouseControllerLocked.ts +20 -3
  98. package/src/PeerConnectionController/PeerConnectionController.ts +22 -22
  99. package/src/PixelStreaming/PixelStreaming.ts +26 -0
  100. package/src/UeInstanceMessage/SendMessageController.ts +2 -3
  101. package/src/UeInstanceMessage/StreamMessageController.ts +3 -3
  102. package/src/VideoPlayer/StreamController.ts +3 -3
  103. package/src/VideoPlayer/VideoPlayer.test.ts +141 -0
  104. package/src/VideoPlayer/VideoPlayer.ts +26 -10
  105. package/src/WebRtcPlayer/WebRtcPlayerController.ts +2 -2
  106. package/src/WebXR/WebXRController.ts +15 -11
@@ -1,6 +1,6 @@
1
1
  // Copyright Epic Games, Inc. All Rights Reserved.
2
2
 
3
- import { Config, Flags } from '../Config/Config';
3
+ import { Config, Flags, NumericParameters } from '../Config/Config';
4
4
  import { Logger } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
5
5
 
6
6
  /**
@@ -16,6 +16,9 @@ declare global {
16
16
  * The video player html element
17
17
  */
18
18
  export class VideoPlayer {
19
+ // Common H.264 maximum encoding dimension. Streams beyond this commonly fail to encode.
20
+ private static readonly maxEncoderDimension = 4096;
21
+
19
22
  private config: Config;
20
23
  private videoElement: HTMLVideoElement;
21
24
  private audioElement?: HTMLAudioElement;
@@ -43,21 +46,21 @@ export class VideoPlayer {
43
46
  videoElementParent.appendChild(this.videoElement);
44
47
 
45
48
  this.onResizePlayerCallback = () => {
46
- console.log('Resolution changed, restyling player, did you forget to override this function?');
49
+ Logger.Warning('Resolution changed, restyling player, did you forget to override this function?');
47
50
  };
48
51
  this.onMatchViewportResolutionCallback = () => {
49
- console.log(
52
+ Logger.Warning(
50
53
  'Resolution changed and match viewport resolution is turned on, did you forget to override this function?'
51
54
  );
52
55
  };
53
56
 
54
57
  // set play for video (and audio)
55
58
  this.videoElement.onclick = () => {
56
- if (this.audioElement != undefined && this.audioElement.paused) {
57
- this.audioElement.play();
59
+ if (this.audioElement !== undefined && this.audioElement.paused) {
60
+ void this.audioElement.play();
58
61
  }
59
62
  if (this.videoElement.paused) {
60
- this.videoElement.play();
63
+ void this.videoElement.play();
61
64
  }
62
65
  };
63
66
 
@@ -222,10 +225,23 @@ export class VideoPlayer {
222
225
  return;
223
226
  }
224
227
 
225
- this.onMatchViewportResolutionCallback(
226
- videoElementParent.clientWidth,
227
- videoElementParent.clientHeight
228
- );
228
+ const viewportResolutionScale = this.config.hasNumericSetting(NumericParameters.ViewportResScale)
229
+ ? this.config.getNumericSettingValue(NumericParameters.ViewportResScale)
230
+ : 1.0;
231
+
232
+ const scaledWidth = Math.round(videoElementParent.clientWidth * viewportResolutionScale);
233
+ const scaledHeight = Math.round(videoElementParent.clientHeight * viewportResolutionScale);
234
+
235
+ if (
236
+ scaledWidth > VideoPlayer.maxEncoderDimension ||
237
+ scaledHeight > VideoPlayer.maxEncoderDimension
238
+ ) {
239
+ Logger.Warning(
240
+ `Requested stream resolution (${scaledWidth}x${scaledHeight}) exceeds the common H.264 encoder limit of ${VideoPlayer.maxEncoderDimension}x${VideoPlayer.maxEncoderDimension}; encoding may fail. Lower ViewportResScale or disable MatchViewportResolution.`
241
+ );
242
+ }
243
+
244
+ this.onMatchViewportResolutionCallback(scaledWidth, scaledHeight);
229
245
 
230
246
  this.lastTimeResized = new Date().getTime();
231
247
  } else {
@@ -244,7 +244,7 @@ export class WebRtcPlayerController {
244
244
  this.afkController.stopAfkWarningTimer();
245
245
 
246
246
  // stop sending stats on interval if we have closed our connection
247
- if (this.statsTimerHandle && this.statsTimerHandle !== undefined) {
247
+ if (this.statsTimerHandle) {
248
248
  window.clearInterval(this.statsTimerHandle);
249
249
  }
250
250
 
@@ -1952,7 +1952,7 @@ export class WebRtcPlayerController {
1952
1952
  const mouseMode = this.config.isFlagEnabled(Flags.HoveringMouseMode)
1953
1953
  ? ControlSchemeType.HoveringMouse
1954
1954
  : ControlSchemeType.LockedMouse;
1955
- this.mouseController = this.inputClassesFactory.registerMouse(mouseMode);
1955
+ this.mouseController = this.inputClassesFactory.registerMouse(mouseMode, this.config);
1956
1956
  }
1957
1957
  }
1958
1958
 
@@ -56,14 +56,14 @@ export class WebXRController {
56
56
  return;
57
57
  }
58
58
 
59
- navigator.xr
59
+ void navigator.xr
60
60
  /* Request immersive-vr session without any optional features. */
61
61
  .requestSession('immersive-vr', { optionalFeatures: [] })
62
62
  .then((session: XRSession) => {
63
63
  this.onXrSessionStarted(session);
64
64
  });
65
65
  } else {
66
- this.xrSession.end();
66
+ void this.xrSession.end();
67
67
  }
68
68
  }
69
69
 
@@ -265,11 +265,11 @@ export class WebXRController {
265
265
  this.initShaders();
266
266
  this.initBuffers();
267
267
 
268
- session.requestReferenceSpace('local').then((refSpace) => {
268
+ void session.requestReferenceSpace('local').then((refSpace) => {
269
269
  this.xrRefSpace = refSpace;
270
270
 
271
271
  // Set up our base layer (i.e. a projection layer that fills the entire XR viewport).
272
- this.xrSession.updateRenderState({
272
+ void this.xrSession.updateRenderState({
273
273
  baseLayer: new XRWebGLLayer(this.xrSession, this.gl)
274
274
  });
275
275
 
@@ -277,7 +277,7 @@ export class WebXRController {
277
277
  if (this.xrSession.supportedFrameRates) {
278
278
  for (const frameRate of this.xrSession.supportedFrameRates) {
279
279
  if (frameRate == 90) {
280
- session.updateTargetFrameRate(90);
280
+ void session.updateTargetFrameRate(90);
281
281
  }
282
282
  }
283
283
  }
@@ -485,12 +485,16 @@ export class WebXRController {
485
485
  Logger.Info('WebXR requires https, if you want WebXR use https.');
486
486
  }
487
487
 
488
- if (navigator.xr) {
489
- return navigator.xr.isSessionSupported(mode);
490
- } else {
491
- return new Promise<boolean>(() => {
492
- return false;
493
- });
488
+ // Wrap in try-catch because access to XR object can be denied due
489
+ // to browser security permissions (e.g. streaming from an iframe)
490
+ try {
491
+ if (navigator.xr) {
492
+ return navigator.xr.isSessionSupported(mode);
493
+ }
494
+ } catch {
495
+ return Promise.resolve(false);
494
496
  }
497
+
498
+ return Promise.resolve(false);
495
499
  }
496
500
  }