@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.4.6 → 0.4.7
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.
- package/.eslintignore +1 -1
- package/.eslintrc.js +1 -0
- package/dist/esm/AFK/AFKController.js +16 -20
- package/dist/esm/AFK/AFKController.js.map +1 -1
- package/dist/esm/Config/Config.js +69 -81
- package/dist/esm/Config/Config.js.map +1 -1
- package/dist/esm/Config/SettingBase.js +1 -5
- package/dist/esm/Config/SettingBase.js.map +1 -1
- package/dist/esm/Config/SettingFlag.js +2 -6
- package/dist/esm/Config/SettingFlag.js.map +1 -1
- package/dist/esm/Config/SettingNumber.js +2 -6
- package/dist/esm/Config/SettingNumber.js.map +1 -1
- package/dist/esm/Config/SettingOption.js +4 -8
- package/dist/esm/Config/SettingOption.js.map +1 -1
- package/dist/esm/Config/SettingText.js +2 -6
- package/dist/esm/Config/SettingText.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelController.js +6 -10
- package/dist/esm/DataChannel/DataChannelController.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelLatencyTestController.js +5 -9
- package/dist/esm/DataChannel/DataChannelLatencyTestController.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelLatencyTestResults.js +1 -5
- package/dist/esm/DataChannel/DataChannelLatencyTestResults.js.map +1 -1
- package/dist/esm/DataChannel/DataChannelSender.js +4 -8
- package/dist/esm/DataChannel/DataChannelSender.js.map +1 -1
- package/dist/esm/DataChannel/InitialSettings.js +4 -11
- package/dist/esm/DataChannel/InitialSettings.js.map +1 -1
- package/dist/esm/DataChannel/LatencyTestResults.js +4 -8
- package/dist/esm/DataChannel/LatencyTestResults.js.map +1 -1
- package/dist/esm/FreezeFrame/FreezeFrame.js +1 -5
- package/dist/esm/FreezeFrame/FreezeFrame.js.map +1 -1
- package/dist/esm/FreezeFrame/FreezeFrameController.js +7 -11
- package/dist/esm/FreezeFrame/FreezeFrameController.js.map +1 -1
- package/dist/esm/Inputs/GamepadController.js +7 -11
- package/dist/esm/Inputs/GamepadController.js.map +1 -1
- package/dist/esm/Inputs/GamepadTypes.js +1 -4
- package/dist/esm/Inputs/GamepadTypes.js.map +1 -1
- package/dist/esm/Inputs/IInputController.js +1 -2
- package/dist/esm/Inputs/InputClassesFactory.js +21 -26
- package/dist/esm/Inputs/InputClassesFactory.js.map +1 -1
- package/dist/esm/Inputs/KeyCodes.js +1 -4
- package/dist/esm/Inputs/KeyCodes.js.map +1 -1
- package/dist/esm/Inputs/KeyboardController.js +18 -22
- package/dist/esm/Inputs/KeyboardController.js.map +1 -1
- package/dist/esm/Inputs/MouseButtons.js +2 -7
- package/dist/esm/Inputs/MouseButtons.js.map +1 -1
- package/dist/esm/Inputs/MouseController.js +22 -26
- package/dist/esm/Inputs/MouseController.js.map +1 -1
- package/dist/esm/Inputs/MouseControllerHovering.js +2 -6
- package/dist/esm/Inputs/MouseControllerHovering.js.map +1 -1
- package/dist/esm/Inputs/MouseControllerLocked.js +5 -9
- package/dist/esm/Inputs/MouseControllerLocked.js.map +1 -1
- package/dist/esm/Inputs/SpecialKeyCodes.js +1 -5
- package/dist/esm/Inputs/SpecialKeyCodes.js.map +1 -1
- package/dist/esm/Inputs/TouchController.js +4 -8
- package/dist/esm/Inputs/TouchController.js.map +1 -1
- package/dist/esm/Inputs/TouchControllerFake.js +4 -8
- package/dist/esm/Inputs/TouchControllerFake.js.map +1 -1
- package/dist/esm/Inputs/XRGamepadController.js +4 -8
- package/dist/esm/Inputs/XRGamepadController.js.map +1 -1
- package/dist/esm/PeerConnectionController/AggregatedStats.js +19 -23
- package/dist/esm/PeerConnectionController/AggregatedStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/CandidatePairStats.js +1 -5
- package/dist/esm/PeerConnectionController/CandidatePairStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/CandidateStat.js +1 -5
- package/dist/esm/PeerConnectionController/CandidateStat.js.map +1 -1
- package/dist/esm/PeerConnectionController/CodecStats.js +1 -5
- package/dist/esm/PeerConnectionController/CodecStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/DataChannelStats.js +1 -5
- package/dist/esm/PeerConnectionController/DataChannelStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/InboundRTPStats.js +3 -9
- package/dist/esm/PeerConnectionController/InboundRTPStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/InboundTrackStats.js +1 -5
- package/dist/esm/PeerConnectionController/InboundTrackStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js +2 -7
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/PeerConnectionController.js +37 -41
- package/dist/esm/PeerConnectionController/PeerConnectionController.js.map +1 -1
- package/dist/esm/PeerConnectionController/SessionStats.js +1 -5
- package/dist/esm/PeerConnectionController/SessionStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/StreamStats.js +1 -5
- package/dist/esm/PeerConnectionController/StreamStats.js.map +1 -1
- package/dist/esm/PixelStreaming/PixelStreaming.js +115 -119
- package/dist/esm/PixelStreaming/PixelStreaming.js.map +1 -1
- package/dist/esm/UI/OnScreenKeyboard.js +1 -5
- package/dist/esm/UI/OnScreenKeyboard.js.map +1 -1
- package/dist/esm/UeInstanceMessage/ResponseController.js +4 -8
- package/dist/esm/UeInstanceMessage/ResponseController.js.map +1 -1
- package/dist/esm/UeInstanceMessage/SendMessageController.js +5 -9
- package/dist/esm/UeInstanceMessage/SendMessageController.js.map +1 -1
- package/dist/esm/UeInstanceMessage/StreamMessageController.js +6 -11
- package/dist/esm/UeInstanceMessage/StreamMessageController.js.map +1 -1
- package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js +1 -5
- package/dist/esm/UeInstanceMessage/ToStreamerMessagesController.js.map +1 -1
- package/dist/esm/Util/EventEmitter.js +38 -79
- package/dist/esm/Util/EventEmitter.js.map +1 -1
- package/dist/esm/Util/FileUtil.js +11 -16
- package/dist/esm/Util/FileUtil.js.map +1 -1
- package/dist/esm/Util/IURLSearchParams.js +1 -5
- package/dist/esm/Util/IURLSearchParams.js.map +1 -1
- package/dist/esm/Util/InputCoordTranslator.js +1 -5
- package/dist/esm/Util/InputCoordTranslator.js.map +1 -1
- package/dist/esm/Util/RTCUtils.js +1 -5
- package/dist/esm/Util/RTCUtils.js.map +1 -1
- package/dist/esm/VideoPlayer/StreamController.js +6 -10
- package/dist/esm/VideoPlayer/StreamController.js.map +1 -1
- package/dist/esm/VideoPlayer/VideoPlayer.js +7 -11
- package/dist/esm/VideoPlayer/VideoPlayer.js.map +1 -1
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js +225 -229
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js.map +1 -1
- package/dist/esm/WebXR/WebXRController.js +12 -16
- package/dist/esm/WebXR/WebXRController.js.map +1 -1
- package/dist/esm/pixelstreamingfrontend.js +23 -58
- package/dist/esm/pixelstreamingfrontend.js.map +1 -1
- package/package.json +2 -2
- package/tsconfig.esm.json +2 -2
- package/tsconfig.json +1 -1
|
@@ -1,31 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const EventEmitter_1 = require("../Util/EventEmitter");
|
|
24
|
-
const IURLSearchParams_1 = require("../Util/IURLSearchParams");
|
|
2
|
+
import { WebSocketTransport, Logger, SignallingProtocol, Messages, MessageHelpers } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
|
|
3
|
+
import { StreamController } from '../VideoPlayer/StreamController';
|
|
4
|
+
import { FreezeFrameController } from '../FreezeFrame/FreezeFrameController';
|
|
5
|
+
import { AFKController } from '../AFK/AFKController';
|
|
6
|
+
import { DataChannelController } from '../DataChannel/DataChannelController';
|
|
7
|
+
import { PeerConnectionController } from '../PeerConnectionController/PeerConnectionController';
|
|
8
|
+
import { Flags, ControlSchemeType, TextParameters, OptionParameters, NumericParameters } from '../Config/Config';
|
|
9
|
+
import { InitialSettings } from '../DataChannel/InitialSettings';
|
|
10
|
+
import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
|
|
11
|
+
import { FileTemplate, FileUtil } from '../Util/FileUtil';
|
|
12
|
+
import { InputClassesFactory } from '../Inputs/InputClassesFactory';
|
|
13
|
+
import { VideoPlayer } from '../VideoPlayer/VideoPlayer';
|
|
14
|
+
import { StreamMessageController, MessageDirection } from '../UeInstanceMessage/StreamMessageController';
|
|
15
|
+
import { ResponseController } from '../UeInstanceMessage/ResponseController';
|
|
16
|
+
import { SendMessageController } from '../UeInstanceMessage/SendMessageController';
|
|
17
|
+
import { ToStreamerMessagesController } from '../UeInstanceMessage/ToStreamerMessagesController';
|
|
18
|
+
import { DataChannelSender } from '../DataChannel/DataChannelSender';
|
|
19
|
+
import { InputCoordTranslator } from '../Util/InputCoordTranslator';
|
|
20
|
+
import { DataChannelCloseEvent, DataChannelErrorEvent, DataChannelOpenEvent, HideFreezeFrameEvent, LoadFreezeFrameEvent, PlayStreamErrorEvent, PlayStreamEvent, PlayStreamRejectedEvent, StreamerListMessageEvent, StreamerIDChangedMessageEvent } from '../Util/EventEmitter';
|
|
21
|
+
import { IURLSearchParams } from '../Util/IURLSearchParams';
|
|
25
22
|
/**
|
|
26
23
|
* Entry point for the WebRTC Player
|
|
27
24
|
*/
|
|
28
|
-
class WebRtcPlayerController {
|
|
25
|
+
export class WebRtcPlayerController {
|
|
29
26
|
/**
|
|
30
27
|
*
|
|
31
28
|
* @param config - the frontend config object
|
|
@@ -36,19 +33,19 @@ class WebRtcPlayerController {
|
|
|
36
33
|
this.autoJoinTimer = undefined;
|
|
37
34
|
this.config = config;
|
|
38
35
|
this.pixelStreaming = pixelStreaming;
|
|
39
|
-
this.responseController = new
|
|
40
|
-
this.file = new
|
|
36
|
+
this.responseController = new ResponseController();
|
|
37
|
+
this.file = new FileTemplate();
|
|
41
38
|
this.sdpConstraints = {
|
|
42
39
|
offerToReceiveAudio: true,
|
|
43
40
|
offerToReceiveVideo: true
|
|
44
41
|
};
|
|
45
42
|
// set up the afk logic class and connect up its method for closing the signaling server
|
|
46
|
-
this.afkController = new
|
|
43
|
+
this.afkController = new AFKController(this.config, this.pixelStreaming, this.onAfkTriggered.bind(this));
|
|
47
44
|
this.afkController.onAFKTimedOutCallback = () => {
|
|
48
45
|
this.closeSignalingServer('You have been disconnected due to inactivity.', false);
|
|
49
46
|
};
|
|
50
|
-
this.freezeFrameController = new
|
|
51
|
-
this.videoPlayer = new
|
|
47
|
+
this.freezeFrameController = new FreezeFrameController(this.pixelStreaming.videoElementParent);
|
|
48
|
+
this.videoPlayer = new VideoPlayer(this.pixelStreaming.videoElementParent, this.config);
|
|
52
49
|
this.videoPlayer.onVideoInitialized = () => this.handleVideoInitialized();
|
|
53
50
|
// When in match viewport resolution mode, when the browser viewport is resized we send a resize command back to UE.
|
|
54
51
|
this.videoPlayer.onMatchViewportResolutionCallback = (width, height) => {
|
|
@@ -62,41 +59,41 @@ class WebRtcPlayerController {
|
|
|
62
59
|
this.videoPlayer.onResizePlayerCallback = () => {
|
|
63
60
|
this.setUpMouseAndFreezeFrame();
|
|
64
61
|
};
|
|
65
|
-
this.streamController = new
|
|
66
|
-
this.coordinateConverter = new
|
|
67
|
-
this.sendrecvDataChannelController = new
|
|
68
|
-
this.recvDataChannelController = new
|
|
62
|
+
this.streamController = new StreamController(this.videoPlayer);
|
|
63
|
+
this.coordinateConverter = new InputCoordTranslator();
|
|
64
|
+
this.sendrecvDataChannelController = new DataChannelController();
|
|
65
|
+
this.recvDataChannelController = new DataChannelController();
|
|
69
66
|
this.registerDataChannelEventEmitters(this.sendrecvDataChannelController);
|
|
70
67
|
this.registerDataChannelEventEmitters(this.recvDataChannelController);
|
|
71
|
-
this.dataChannelSender = new
|
|
68
|
+
this.dataChannelSender = new DataChannelSender(this.sendrecvDataChannelController);
|
|
72
69
|
this.dataChannelSender.resetAfkWarningTimerOnDataSend = () => this.afkController.resetAfkWarningTimer();
|
|
73
|
-
this.streamMessageController = new
|
|
70
|
+
this.streamMessageController = new StreamMessageController();
|
|
74
71
|
// set up websocket methods
|
|
75
|
-
this.transport = new
|
|
76
|
-
this.protocol = new
|
|
77
|
-
this.protocol.addListener(
|
|
78
|
-
this.protocol.addListener(
|
|
79
|
-
this.protocol.addListener(
|
|
80
|
-
this.protocol.addListener(
|
|
72
|
+
this.transport = new WebSocketTransport();
|
|
73
|
+
this.protocol = new SignallingProtocol(this.transport);
|
|
74
|
+
this.protocol.addListener(Messages.config.typeName, (msg) => this.handleOnConfigMessage(msg));
|
|
75
|
+
this.protocol.addListener(Messages.streamerList.typeName, (msg) => this.handleStreamerListMessage(msg));
|
|
76
|
+
this.protocol.addListener(Messages.streamerIdChanged.typeName, (msg) => this.handleStreamerIDChangedMessage(msg));
|
|
77
|
+
this.protocol.addListener(Messages.playerCount.typeName, (msg) => {
|
|
81
78
|
const playerCountMessage = msg;
|
|
82
79
|
this.pixelStreaming._onPlayerCount(playerCountMessage.count);
|
|
83
80
|
});
|
|
84
|
-
this.protocol.addListener(
|
|
85
|
-
this.protocol.addListener(
|
|
86
|
-
this.protocol.addListener(
|
|
87
|
-
this.protocol.addListener(
|
|
81
|
+
this.protocol.addListener(Messages.answer.typeName, (msg) => this.handleWebRtcAnswer(msg));
|
|
82
|
+
this.protocol.addListener(Messages.offer.typeName, (msg) => this.handleWebRtcOffer(msg));
|
|
83
|
+
this.protocol.addListener(Messages.peerDataChannels.typeName, (msg) => this.handleWebRtcSFUPeerDatachannels(msg));
|
|
84
|
+
this.protocol.addListener(Messages.iceCandidate.typeName, (msg) => {
|
|
88
85
|
const iceCandidateMessage = msg;
|
|
89
86
|
this.handleIceCandidate(iceCandidateMessage.candidate);
|
|
90
87
|
});
|
|
91
88
|
this.protocol.transport.addListener('open', () => {
|
|
92
|
-
const message =
|
|
89
|
+
const message = MessageHelpers.createMessage(Messages.listStreamers);
|
|
93
90
|
this.protocol.sendMessage(message);
|
|
94
91
|
this.reconnectAttempt = 0;
|
|
95
92
|
this.isReconnecting = false;
|
|
96
93
|
});
|
|
97
94
|
this.protocol.transport.addListener('error', () => {
|
|
98
95
|
// dont really need to do anything here since the close event should follow.
|
|
99
|
-
|
|
96
|
+
Logger.Error(`Got a transport error.`);
|
|
100
97
|
});
|
|
101
98
|
this.protocol.transport.addListener('close', (event) => {
|
|
102
99
|
// when we refresh the page during a stream we get the going away code.
|
|
@@ -104,7 +101,7 @@ class WebRtcPlayerController {
|
|
|
104
101
|
// https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
|
|
105
102
|
// lists all the codes.
|
|
106
103
|
const CODE_GOING_AWAY = 1001;
|
|
107
|
-
const maxReconnectAttempts = this.config.getNumericSettingValue(
|
|
104
|
+
const maxReconnectAttempts = this.config.getNumericSettingValue(NumericParameters.MaxReconnectAttempts);
|
|
108
105
|
const attemptsLeft = this.reconnectAttempt < maxReconnectAttempts;
|
|
109
106
|
const reconnectEnabled = this.forceReconnect || (this.enableAutoReconnect && maxReconnectAttempts > 0 && attemptsLeft);
|
|
110
107
|
const willTryReconnect = reconnectEnabled && event.code != CODE_GOING_AWAY;
|
|
@@ -133,11 +130,11 @@ class WebRtcPlayerController {
|
|
|
133
130
|
}
|
|
134
131
|
});
|
|
135
132
|
// set up the final webRtc player controller methods from within our application so a connection can be activated
|
|
136
|
-
this.sendMessageController = new
|
|
137
|
-
this.toStreamerMessagesController = new
|
|
133
|
+
this.sendMessageController = new SendMessageController(this.dataChannelSender, this.streamMessageController);
|
|
134
|
+
this.toStreamerMessagesController = new ToStreamerMessagesController(this.sendMessageController);
|
|
138
135
|
this.registerMessageHandlers();
|
|
139
136
|
this.streamMessageController.populateDefaultProtocol();
|
|
140
|
-
this.inputClassesFactory = new
|
|
137
|
+
this.inputClassesFactory = new InputClassesFactory(this.streamMessageController, this.videoPlayer, this.coordinateConverter);
|
|
141
138
|
this.isUsingSFU = false;
|
|
142
139
|
this.isUsingSVC = false;
|
|
143
140
|
this.isQualityController = false;
|
|
@@ -146,7 +143,7 @@ class WebRtcPlayerController {
|
|
|
146
143
|
this.forceReconnect = false;
|
|
147
144
|
this.reconnectAttempt = 0;
|
|
148
145
|
this.isReconnecting = false;
|
|
149
|
-
this.config._addOnOptionSettingChangedListener(
|
|
146
|
+
this.config._addOnOptionSettingChangedListener(OptionParameters.StreamerId, (streamerid) => {
|
|
150
147
|
if (streamerid === undefined || streamerid === '') {
|
|
151
148
|
return;
|
|
152
149
|
}
|
|
@@ -154,26 +151,26 @@ class WebRtcPlayerController {
|
|
|
154
151
|
this.peerConnectionController.peerConnection.close();
|
|
155
152
|
this.peerConnectionController.createPeerConnection(this.peerConfig, this.preferredCodec);
|
|
156
153
|
this.subscribedStream = streamerid;
|
|
157
|
-
const message =
|
|
154
|
+
const message = MessageHelpers.createMessage(Messages.subscribe, { streamerId: streamerid });
|
|
158
155
|
this.protocol.sendMessage(message);
|
|
159
156
|
});
|
|
160
|
-
this.config._addOnOptionSettingChangedListener(
|
|
157
|
+
this.config._addOnOptionSettingChangedListener(OptionParameters.PreferredQuality, (preferredQuality) => {
|
|
161
158
|
if (preferredQuality === undefined || preferredQuality === '') {
|
|
162
159
|
return;
|
|
163
160
|
}
|
|
164
161
|
let message;
|
|
165
162
|
if (this.isUsingSVC) {
|
|
166
163
|
// User is using SVC so selected quality will be of the form SxTy(h). Just extract the x and y numbers
|
|
167
|
-
message =
|
|
164
|
+
message = MessageHelpers.createMessage(Messages.layerPreference, {
|
|
168
165
|
spatialLayer: +preferredQuality[1] - 1,
|
|
169
166
|
temporalLayer: +preferredQuality[3] - 1
|
|
170
167
|
});
|
|
171
168
|
}
|
|
172
169
|
else {
|
|
173
170
|
// User is not using SVC so the selected quality will be either Low, Medium or High so we extract the appropriate spatial layer index
|
|
174
|
-
const allQualities = this.config.getSettingOption(
|
|
171
|
+
const allQualities = this.config.getSettingOption(OptionParameters.PreferredQuality).options;
|
|
175
172
|
const qualityIndex = allQualities.indexOf(preferredQuality);
|
|
176
|
-
message =
|
|
173
|
+
message = MessageHelpers.createMessage(Messages.layerPreference, {
|
|
177
174
|
spatialLayer: qualityIndex,
|
|
178
175
|
temporalLayer: 0
|
|
179
176
|
});
|
|
@@ -182,7 +179,7 @@ class WebRtcPlayerController {
|
|
|
182
179
|
});
|
|
183
180
|
this.setVideoEncoderAvgQP(-1);
|
|
184
181
|
this.signallingUrlBuilder = () => {
|
|
185
|
-
const signallingServerUrl = this.config.getTextSettingValue(
|
|
182
|
+
const signallingServerUrl = this.config.getTextSettingValue(TextParameters.SignallingServerUrl);
|
|
186
183
|
return signallingServerUrl;
|
|
187
184
|
};
|
|
188
185
|
}
|
|
@@ -200,7 +197,7 @@ class WebRtcPlayerController {
|
|
|
200
197
|
*/
|
|
201
198
|
handleOnMessage(event) {
|
|
202
199
|
const message = new Uint8Array(event.data);
|
|
203
|
-
|
|
200
|
+
Logger.Info('Message incoming:' + message);
|
|
204
201
|
//try {
|
|
205
202
|
const messageType = this.streamMessageController.fromStreamerMessages.get(message[0]);
|
|
206
203
|
this.streamMessageController.fromStreamerHandlers.get(messageType)(event.data);
|
|
@@ -214,75 +211,75 @@ class WebRtcPlayerController {
|
|
|
214
211
|
registerMessageHandlers() {
|
|
215
212
|
// From Streamer
|
|
216
213
|
// Message events from the streamer have a data type of ArrayBuffer as we force this type in the DatachannelController
|
|
217
|
-
this.streamMessageController.registerMessageHandler(
|
|
218
|
-
this.streamMessageController.registerMessageHandler(
|
|
219
|
-
this.streamMessageController.registerMessageHandler(
|
|
214
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'QualityControlOwnership', (data) => this.onQualityControlOwnership(data));
|
|
215
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Response', (data) => this.responseController.onResponse(data));
|
|
216
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Command', (data) => {
|
|
220
217
|
this.onCommand(data);
|
|
221
218
|
});
|
|
222
|
-
this.streamMessageController.registerMessageHandler(
|
|
223
|
-
this.streamMessageController.registerMessageHandler(
|
|
224
|
-
this.streamMessageController.registerMessageHandler(
|
|
225
|
-
this.streamMessageController.registerMessageHandler(
|
|
226
|
-
this.streamMessageController.registerMessageHandler(
|
|
227
|
-
this.streamMessageController.registerMessageHandler(
|
|
228
|
-
this.streamMessageController.registerMessageHandler(
|
|
229
|
-
this.streamMessageController.registerMessageHandler(
|
|
230
|
-
this.streamMessageController.registerMessageHandler(
|
|
231
|
-
this.streamMessageController.registerMessageHandler(
|
|
219
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FreezeFrame', (data) => this.onFreezeFrameMessage(data));
|
|
220
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'UnfreezeFrame', () => this.invalidateFreezeFrameAndEnableVideo());
|
|
221
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'VideoEncoderAvgQP', (data) => this.handleVideoEncoderAvgQP(data));
|
|
222
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'LatencyTest', (data) => this.handleLatencyTestResult(data));
|
|
223
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'DataChannelLatencyTest', (data) => this.handleDataChannelLatencyTestResponse(data));
|
|
224
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'InitialSettings', (data) => this.handleInitialSettings(data));
|
|
225
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FileExtension', (data) => this.onFileExtension(data));
|
|
226
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FileMimeType', (data) => this.onFileMimeType(data));
|
|
227
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'FileContents', (data) => this.onFileContents(data));
|
|
228
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'TestEcho', () => {
|
|
232
229
|
/* Do nothing */
|
|
233
230
|
});
|
|
234
|
-
this.streamMessageController.registerMessageHandler(
|
|
235
|
-
this.streamMessageController.registerMessageHandler(
|
|
236
|
-
this.streamMessageController.registerMessageHandler(
|
|
231
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'InputControlOwnership', (data) => this.onInputControlOwnership(data));
|
|
232
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'GamepadResponse', (data) => this.onGamepadResponse(data));
|
|
233
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Multiplexed', () => {
|
|
237
234
|
/* Do nothing as this message type is used only by the SFU */
|
|
238
235
|
});
|
|
239
|
-
this.streamMessageController.registerMessageHandler(
|
|
236
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.FromStreamer, 'Protocol', (data) => this.onProtocolMessage(data));
|
|
240
237
|
// To Streamer
|
|
241
|
-
this.streamMessageController.registerMessageHandler(
|
|
242
|
-
this.streamMessageController.registerMessageHandler(
|
|
243
|
-
this.streamMessageController.registerMessageHandler(
|
|
244
|
-
this.streamMessageController.registerMessageHandler(
|
|
245
|
-
this.streamMessageController.registerMessageHandler(
|
|
246
|
-
this.streamMessageController.registerMessageHandler(
|
|
247
|
-
this.streamMessageController.registerMessageHandler(
|
|
248
|
-
this.streamMessageController.registerMessageHandler(
|
|
249
|
-
this.streamMessageController.registerMessageHandler(
|
|
238
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'IFrameRequest', () => this.sendMessageController.sendMessageToStreamer('IFrameRequest'));
|
|
239
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'RequestQualityControl', () => this.sendMessageController.sendMessageToStreamer('RequestQualityControl'));
|
|
240
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'FpsRequest', () => this.sendMessageController.sendMessageToStreamer('FpsRequest'));
|
|
241
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'AverageBitrateRequest', () => this.sendMessageController.sendMessageToStreamer('AverageBitrateRequest'));
|
|
242
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'StartStreaming', () => this.sendMessageController.sendMessageToStreamer('StartStreaming'));
|
|
243
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'StopStreaming', () => this.sendMessageController.sendMessageToStreamer('StopStreaming'));
|
|
244
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'LatencyTest', (data) => this.sendMessageController.sendMessageToStreamer('LatencyTest', data));
|
|
245
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'RequestInitialSettings', () => this.sendMessageController.sendMessageToStreamer('RequestInitialSettings'));
|
|
246
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TestEcho', () => {
|
|
250
247
|
/* Do nothing */
|
|
251
248
|
});
|
|
252
|
-
this.streamMessageController.registerMessageHandler(
|
|
253
|
-
this.streamMessageController.registerMessageHandler(
|
|
254
|
-
this.streamMessageController.registerMessageHandler(
|
|
255
|
-
this.streamMessageController.registerMessageHandler(
|
|
256
|
-
this.streamMessageController.registerMessageHandler(
|
|
257
|
-
this.streamMessageController.registerMessageHandler(
|
|
258
|
-
this.streamMessageController.registerMessageHandler(
|
|
259
|
-
this.streamMessageController.registerMessageHandler(
|
|
260
|
-
this.streamMessageController.registerMessageHandler(
|
|
261
|
-
this.streamMessageController.registerMessageHandler(
|
|
262
|
-
this.streamMessageController.registerMessageHandler(
|
|
263
|
-
this.streamMessageController.registerMessageHandler(
|
|
264
|
-
this.streamMessageController.registerMessageHandler(
|
|
265
|
-
this.streamMessageController.registerMessageHandler(
|
|
266
|
-
this.streamMessageController.registerMessageHandler(
|
|
267
|
-
this.streamMessageController.registerMessageHandler(
|
|
268
|
-
this.streamMessageController.registerMessageHandler(
|
|
269
|
-
this.streamMessageController.registerMessageHandler(
|
|
270
|
-
this.streamMessageController.registerMessageHandler(
|
|
271
|
-
this.streamMessageController.registerMessageHandler(
|
|
272
|
-
this.streamMessageController.registerMessageHandler(
|
|
273
|
-
this.streamMessageController.registerMessageHandler(
|
|
274
|
-
this.streamMessageController.registerMessageHandler(
|
|
275
|
-
this.streamMessageController.registerMessageHandler(
|
|
276
|
-
this.streamMessageController.registerMessageHandler(
|
|
277
|
-
this.streamMessageController.registerMessageHandler(
|
|
278
|
-
this.streamMessageController.registerMessageHandler(
|
|
279
|
-
this.streamMessageController.registerMessageHandler(
|
|
280
|
-
this.streamMessageController.registerMessageHandler(
|
|
281
|
-
this.streamMessageController.registerMessageHandler(
|
|
282
|
-
this.streamMessageController.registerMessageHandler(
|
|
249
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'UIInteraction', (data) => this.sendMessageController.sendMessageToStreamer('UIInteraction', data));
|
|
250
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'Command', (data) => this.sendMessageController.sendMessageToStreamer('Command', data));
|
|
251
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TextboxEntry', (data) => this.sendMessageController.sendMessageToStreamer('TextboxEntry', data));
|
|
252
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'KeyDown', (data) => this.sendMessageController.sendMessageToStreamer('KeyDown', data));
|
|
253
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'KeyUp', (data) => this.sendMessageController.sendMessageToStreamer('KeyUp', data));
|
|
254
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'KeyPress', (data) => this.sendMessageController.sendMessageToStreamer('KeyPress', data));
|
|
255
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseEnter', (data) => this.sendMessageController.sendMessageToStreamer('MouseEnter', data));
|
|
256
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseLeave', (data) => this.sendMessageController.sendMessageToStreamer('MouseLeave', data));
|
|
257
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseDown', (data) => this.sendMessageController.sendMessageToStreamer('MouseDown', data));
|
|
258
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseUp', (data) => this.sendMessageController.sendMessageToStreamer('MouseUp', data));
|
|
259
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseMove', (data) => this.sendMessageController.sendMessageToStreamer('MouseMove', data));
|
|
260
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseWheel', (data) => this.sendMessageController.sendMessageToStreamer('MouseWheel', data));
|
|
261
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'MouseDouble', (data) => this.sendMessageController.sendMessageToStreamer('MouseDouble', data));
|
|
262
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TouchStart', (data) => this.sendMessageController.sendMessageToStreamer('TouchStart', data));
|
|
263
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TouchEnd', (data) => this.sendMessageController.sendMessageToStreamer('TouchEnd', data));
|
|
264
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'TouchMove', (data) => this.sendMessageController.sendMessageToStreamer('TouchMove', data));
|
|
265
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadConnected', () => this.sendMessageController.sendMessageToStreamer('GamepadConnected'));
|
|
266
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadButtonPressed', (data) => this.sendMessageController.sendMessageToStreamer('GamepadButtonPressed', data));
|
|
267
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadButtonReleased', (data) => this.sendMessageController.sendMessageToStreamer('GamepadButtonReleased', data));
|
|
268
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadAnalog', (data) => this.sendMessageController.sendMessageToStreamer('GamepadAnalog', data));
|
|
269
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'GamepadDisconnected', (data) => this.sendMessageController.sendMessageToStreamer('GamepadDisconnected', data));
|
|
270
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XREyeViews', (data) => this.sendMessageController.sendMessageToStreamer('XREyeViews', data));
|
|
271
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRHMDTransform', (data) => this.sendMessageController.sendMessageToStreamer('XRHMDTransform', data));
|
|
272
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRControllerTransform', (data) => this.sendMessageController.sendMessageToStreamer('XRControllerTransform', data));
|
|
273
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRSystem', (data) => this.sendMessageController.sendMessageToStreamer('XRSystem', data));
|
|
274
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonTouched', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonTouched', data));
|
|
275
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonTouchReleased', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonTouchReleased', data));
|
|
276
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonPressed', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonPressed', data));
|
|
277
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRButtonReleased', (data) => this.sendMessageController.sendMessageToStreamer('XRButtonReleased', data));
|
|
278
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'XRAnalog', (data) => this.sendMessageController.sendMessageToStreamer('XRAnalog', data));
|
|
279
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'ChannelRelayStatus', () => {
|
|
283
280
|
/* Do nothing as this message type is used only by the SFU */
|
|
284
281
|
});
|
|
285
|
-
this.streamMessageController.registerMessageHandler(
|
|
282
|
+
this.streamMessageController.registerMessageHandler(MessageDirection.ToStreamer, 'Multiplexed', () => {
|
|
286
283
|
/* Do nothing as this message type is used only by the SFU */
|
|
287
284
|
});
|
|
288
285
|
}
|
|
@@ -291,9 +288,9 @@ class WebRtcPlayerController {
|
|
|
291
288
|
* @param message
|
|
292
289
|
*/
|
|
293
290
|
onCommand(message) {
|
|
294
|
-
|
|
291
|
+
Logger.Info('DataChannelReceiveMessageType.Command');
|
|
295
292
|
const commandAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
296
|
-
|
|
293
|
+
Logger.Info('Data Channel Command: ' + commandAsString);
|
|
297
294
|
const command = JSON.parse(commandAsString);
|
|
298
295
|
if (command.command === 'onScreenKeyboard') {
|
|
299
296
|
this.pixelStreaming._activateOnScreenKeyboard(command);
|
|
@@ -308,18 +305,18 @@ class WebRtcPlayerController {
|
|
|
308
305
|
const protocolString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
309
306
|
const protocolJSON = JSON.parse(protocolString);
|
|
310
307
|
if (!Object.prototype.hasOwnProperty.call(protocolJSON, 'Direction')) {
|
|
311
|
-
|
|
308
|
+
Logger.Error('Malformed protocol received. Ensure the protocol message contains a direction');
|
|
312
309
|
}
|
|
313
310
|
const direction = protocolJSON.Direction;
|
|
314
311
|
delete protocolJSON.Direction;
|
|
315
|
-
|
|
312
|
+
Logger.Info(`Received new ${direction == MessageDirection.FromStreamer ? 'FromStreamer' : 'ToStreamer'} protocol. Updating existing protocol...`);
|
|
316
313
|
Object.keys(protocolJSON).forEach((messageType) => {
|
|
317
314
|
const message = protocolJSON[messageType];
|
|
318
315
|
switch (direction) {
|
|
319
|
-
case
|
|
316
|
+
case MessageDirection.ToStreamer:
|
|
320
317
|
// Check that the message contains all the relevant params
|
|
321
318
|
if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
|
|
322
|
-
|
|
319
|
+
Logger.Error(`ToStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
|
|
323
320
|
Definition was: ${JSON.stringify(message, null, 2)}`);
|
|
324
321
|
// return in a forEach is equivalent to a continue in a normal for loop
|
|
325
322
|
return;
|
|
@@ -335,13 +332,13 @@ class WebRtcPlayerController {
|
|
|
335
332
|
this.streamMessageController.toStreamerMessages.set(messageType, message);
|
|
336
333
|
}
|
|
337
334
|
else {
|
|
338
|
-
|
|
335
|
+
Logger.Error(`There was no registered handler for "${messageType}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${messageType}", myHandler)`);
|
|
339
336
|
}
|
|
340
337
|
break;
|
|
341
|
-
case
|
|
338
|
+
case MessageDirection.FromStreamer:
|
|
342
339
|
// Check that the message contains all the relevant params
|
|
343
340
|
if (!Object.prototype.hasOwnProperty.call(message, 'id')) {
|
|
344
|
-
|
|
341
|
+
Logger.Error(`FromStreamer->${messageType} protocol definition was malformed as it didn't contain at least an id\n
|
|
345
342
|
Definition was: ${JSON.stringify(message, null, 2)}`);
|
|
346
343
|
// return in a forEach is equivalent to a continue in a normal for loop
|
|
347
344
|
return;
|
|
@@ -351,11 +348,11 @@ class WebRtcPlayerController {
|
|
|
351
348
|
this.streamMessageController.fromStreamerMessages.set(message.id, messageType);
|
|
352
349
|
}
|
|
353
350
|
else {
|
|
354
|
-
|
|
351
|
+
Logger.Error(`There was no registered handler for "${message}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${messageType}", myHandler)`);
|
|
355
352
|
}
|
|
356
353
|
break;
|
|
357
354
|
default:
|
|
358
|
-
|
|
355
|
+
Logger.Error(`Unknown direction: ${direction}`);
|
|
359
356
|
}
|
|
360
357
|
});
|
|
361
358
|
// Once the protocol has been received, we can send our control messages
|
|
@@ -363,7 +360,7 @@ class WebRtcPlayerController {
|
|
|
363
360
|
this.toStreamerMessagesController.SendRequestQualityControl();
|
|
364
361
|
}
|
|
365
362
|
catch (e) {
|
|
366
|
-
|
|
363
|
+
Logger.Info(e);
|
|
367
364
|
}
|
|
368
365
|
}
|
|
369
366
|
/**
|
|
@@ -372,9 +369,9 @@ class WebRtcPlayerController {
|
|
|
372
369
|
*/
|
|
373
370
|
onInputControlOwnership(message) {
|
|
374
371
|
const view = new Uint8Array(message);
|
|
375
|
-
|
|
372
|
+
Logger.Info('DataChannelReceiveMessageType.InputControlOwnership');
|
|
376
373
|
const inputControlOwnership = new Boolean(view[1]).valueOf();
|
|
377
|
-
|
|
374
|
+
Logger.Info(`Received input controller message - will your input control the stream: ${inputControlOwnership}`);
|
|
378
375
|
this.pixelStreaming._onInputControlOwnership(inputControlOwnership);
|
|
379
376
|
}
|
|
380
377
|
/**
|
|
@@ -418,7 +415,7 @@ class WebRtcPlayerController {
|
|
|
418
415
|
doReconnect(message) {
|
|
419
416
|
// if there is no webSocketController return immediately or this will not work
|
|
420
417
|
if (!this.protocol) {
|
|
421
|
-
|
|
418
|
+
Logger.Info('This player has no protocol connection.');
|
|
422
419
|
return;
|
|
423
420
|
}
|
|
424
421
|
this.isReconnecting = true;
|
|
@@ -438,17 +435,17 @@ class WebRtcPlayerController {
|
|
|
438
435
|
* Loads a freeze frame if it is required otherwise shows the play overlay
|
|
439
436
|
*/
|
|
440
437
|
loadFreezeFrameOrShowPlayOverlay() {
|
|
441
|
-
this.pixelStreaming.dispatchEvent(new
|
|
438
|
+
this.pixelStreaming.dispatchEvent(new LoadFreezeFrameEvent({
|
|
442
439
|
shouldShowPlayOverlay: this.shouldShowPlayOverlay,
|
|
443
440
|
isValid: this.freezeFrameController.valid,
|
|
444
441
|
jpegData: this.freezeFrameController.jpeg
|
|
445
442
|
}));
|
|
446
443
|
if (this.shouldShowPlayOverlay === true) {
|
|
447
|
-
|
|
444
|
+
Logger.Info('showing play overlay');
|
|
448
445
|
this.resizePlayerStyle();
|
|
449
446
|
}
|
|
450
447
|
else {
|
|
451
|
-
|
|
448
|
+
Logger.Info('showing freeze frame');
|
|
452
449
|
this.freezeFrameController.showFreezeFrame();
|
|
453
450
|
}
|
|
454
451
|
setTimeout(() => {
|
|
@@ -460,7 +457,7 @@ class WebRtcPlayerController {
|
|
|
460
457
|
* @param message The freeze frame data in bytes
|
|
461
458
|
*/
|
|
462
459
|
onFreezeFrameMessage(message) {
|
|
463
|
-
|
|
460
|
+
Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
|
|
464
461
|
const view = new Uint8Array(message);
|
|
465
462
|
this.freezeFrameController.processFreezeFrameMessage(view, () => this.loadFreezeFrameOrShowPlayOverlay());
|
|
466
463
|
}
|
|
@@ -468,9 +465,9 @@ class WebRtcPlayerController {
|
|
|
468
465
|
* Enable the video after hiding a freeze frame
|
|
469
466
|
*/
|
|
470
467
|
invalidateFreezeFrameAndEnableVideo() {
|
|
471
|
-
|
|
468
|
+
Logger.Info('DataChannelReceiveMessageType.FreezeFrame');
|
|
472
469
|
setTimeout(() => {
|
|
473
|
-
this.pixelStreaming.dispatchEvent(new
|
|
470
|
+
this.pixelStreaming.dispatchEvent(new HideFreezeFrameEvent());
|
|
474
471
|
this.freezeFrameController.hideFreezeFrame();
|
|
475
472
|
}, this.freezeFrameController.freezeFrameDelay);
|
|
476
473
|
if (this.videoPlayer.getVideoElement()) {
|
|
@@ -483,7 +480,7 @@ class WebRtcPlayerController {
|
|
|
483
480
|
*/
|
|
484
481
|
onFileExtension(data) {
|
|
485
482
|
const view = new Uint8Array(data);
|
|
486
|
-
|
|
483
|
+
FileUtil.setExtensionFromBytes(view, this.file);
|
|
487
484
|
}
|
|
488
485
|
/**
|
|
489
486
|
* Prep datachannel data for processing the file mime type
|
|
@@ -491,7 +488,7 @@ class WebRtcPlayerController {
|
|
|
491
488
|
*/
|
|
492
489
|
onFileMimeType(data) {
|
|
493
490
|
const view = new Uint8Array(data);
|
|
494
|
-
|
|
491
|
+
FileUtil.setMimeTypeFromBytes(view, this.file);
|
|
495
492
|
}
|
|
496
493
|
/**
|
|
497
494
|
* Prep datachannel data for processing the file contents
|
|
@@ -499,7 +496,7 @@ class WebRtcPlayerController {
|
|
|
499
496
|
*/
|
|
500
497
|
onFileContents(data) {
|
|
501
498
|
const view = new Uint8Array(data);
|
|
502
|
-
|
|
499
|
+
FileUtil.setContentsFromBytes(view, this.file);
|
|
503
500
|
}
|
|
504
501
|
/**
|
|
505
502
|
* Plays the stream audio and video source and sets up other pieces while the stream starts
|
|
@@ -507,20 +504,20 @@ class WebRtcPlayerController {
|
|
|
507
504
|
playStream() {
|
|
508
505
|
if (!this.videoPlayer.getVideoElement()) {
|
|
509
506
|
const message = 'Could not play video stream because the video player was not initialized correctly.';
|
|
510
|
-
this.pixelStreaming.dispatchEvent(new
|
|
511
|
-
|
|
507
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamErrorEvent({ message }));
|
|
508
|
+
Logger.Error(message);
|
|
512
509
|
// close the connection
|
|
513
510
|
this.closeSignalingServer('Stream not initialized correctly', false);
|
|
514
511
|
return;
|
|
515
512
|
}
|
|
516
513
|
if (!this.videoPlayer.hasVideoSource()) {
|
|
517
|
-
|
|
514
|
+
Logger.Warning('Cannot play stream, the video element has no srcObject to play.');
|
|
518
515
|
return;
|
|
519
516
|
}
|
|
520
|
-
this.setTouchInputEnabled(this.config.isFlagEnabled(
|
|
521
|
-
this.pixelStreaming.dispatchEvent(new
|
|
517
|
+
this.setTouchInputEnabled(this.config.isFlagEnabled(Flags.TouchInput));
|
|
518
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamEvent());
|
|
522
519
|
if (this.streamController.audioElement.srcObject) {
|
|
523
|
-
const startMuted = this.config.isFlagEnabled(
|
|
520
|
+
const startMuted = this.config.isFlagEnabled(Flags.StartVideoMuted);
|
|
524
521
|
this.streamController.audioElement.muted = startMuted;
|
|
525
522
|
if (startMuted) {
|
|
526
523
|
this.playVideo();
|
|
@@ -532,9 +529,9 @@ class WebRtcPlayerController {
|
|
|
532
529
|
this.playVideo();
|
|
533
530
|
})
|
|
534
531
|
.catch((onRejectedReason) => {
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
this.pixelStreaming.dispatchEvent(new
|
|
532
|
+
Logger.Info(onRejectedReason);
|
|
533
|
+
Logger.Info('Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.');
|
|
534
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamRejectedEvent({
|
|
538
535
|
reason: onRejectedReason
|
|
539
536
|
}));
|
|
540
537
|
});
|
|
@@ -555,16 +552,16 @@ class WebRtcPlayerController {
|
|
|
555
552
|
if (this.streamController.audioElement.srcObject) {
|
|
556
553
|
this.streamController.audioElement.pause();
|
|
557
554
|
}
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
this.pixelStreaming.dispatchEvent(new
|
|
555
|
+
Logger.Info(onRejectedReason);
|
|
556
|
+
Logger.Info('Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay.');
|
|
557
|
+
this.pixelStreaming.dispatchEvent(new PlayStreamRejectedEvent({ reason: onRejectedReason }));
|
|
561
558
|
});
|
|
562
559
|
}
|
|
563
560
|
/**
|
|
564
561
|
* Enable the video to play automatically if enableAutoplay is true
|
|
565
562
|
*/
|
|
566
563
|
autoPlayVideoOrSetUpPlayOverlay() {
|
|
567
|
-
if (this.config.isFlagEnabled(
|
|
564
|
+
if (this.config.isFlagEnabled(Flags.AutoPlayVideo)) {
|
|
568
565
|
// attempt to play the video
|
|
569
566
|
this.playStream();
|
|
570
567
|
}
|
|
@@ -588,18 +585,18 @@ class WebRtcPlayerController {
|
|
|
588
585
|
startSession(peerConfig) {
|
|
589
586
|
this.peerConfig = peerConfig;
|
|
590
587
|
// check for forcing turn
|
|
591
|
-
if (this.config.isFlagEnabled(
|
|
588
|
+
if (this.config.isFlagEnabled(Flags.ForceTURN)) {
|
|
592
589
|
// check for a turn server
|
|
593
590
|
const hasTurnServer = this.checkTurnServerAvailability(peerConfig);
|
|
594
591
|
// close and error if turn is forced and there is no turn server
|
|
595
592
|
if (!hasTurnServer) {
|
|
596
|
-
|
|
593
|
+
Logger.Info('No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead');
|
|
597
594
|
this.closeSignalingServer('TURN cannot be forced, closing connection. Please use STUN instead.', false);
|
|
598
595
|
return;
|
|
599
596
|
}
|
|
600
597
|
}
|
|
601
598
|
// set up the peer connection controller
|
|
602
|
-
this.peerConnectionController = new
|
|
599
|
+
this.peerConnectionController = new PeerConnectionController(this.peerConfig, this.config, this.preferredCodec);
|
|
603
600
|
// set up peer connection controller video stats
|
|
604
601
|
this.peerConnectionController.onVideoStats = (event) => this.handleVideoStats(event);
|
|
605
602
|
/* When the Peer Connection wants to send an offer have it handled */
|
|
@@ -633,19 +630,19 @@ class WebRtcPlayerController {
|
|
|
633
630
|
checkTurnServerAvailability(options) {
|
|
634
631
|
// if iceServers is empty return false this should not be the general use case but is here incase
|
|
635
632
|
if (!options.iceServers) {
|
|
636
|
-
|
|
633
|
+
Logger.Info('A turn sever was not found');
|
|
637
634
|
return false;
|
|
638
635
|
}
|
|
639
636
|
// loop through the ice servers to check for a turn url
|
|
640
637
|
for (const iceServer of options.iceServers) {
|
|
641
638
|
for (const url of iceServer.urls) {
|
|
642
639
|
if (url.includes('turn')) {
|
|
643
|
-
|
|
640
|
+
Logger.Info(`A turn sever was found at ${url}`);
|
|
644
641
|
return true;
|
|
645
642
|
}
|
|
646
643
|
}
|
|
647
644
|
}
|
|
648
|
-
|
|
645
|
+
Logger.Info('A turn sever was not found');
|
|
649
646
|
return false;
|
|
650
647
|
}
|
|
651
648
|
/**
|
|
@@ -661,10 +658,10 @@ class WebRtcPlayerController {
|
|
|
661
658
|
* Handles when the signalling server gives us the list of streamer ids.
|
|
662
659
|
*/
|
|
663
660
|
handleStreamerListMessage(messageStreamerList) {
|
|
664
|
-
|
|
661
|
+
Logger.Info(`Got streamer list ${messageStreamerList.ids}`);
|
|
665
662
|
let wantedStreamerId = '';
|
|
666
663
|
// get the current selected streamer id option
|
|
667
|
-
const streamerIDOption = this.config.getSettingOption(
|
|
664
|
+
const streamerIDOption = this.config.getSettingOption(OptionParameters.StreamerId);
|
|
668
665
|
const existingSelection = streamerIDOption.selected.toString().trim();
|
|
669
666
|
if (existingSelection) {
|
|
670
667
|
// default to selected option if it exists
|
|
@@ -673,17 +670,17 @@ class WebRtcPlayerController {
|
|
|
673
670
|
// add the streamers to the UI
|
|
674
671
|
const settingOptions = [...messageStreamerList.ids]; // copy the original messageStreamerList.ids
|
|
675
672
|
settingOptions.unshift(''); // add an empty option at the top
|
|
676
|
-
this.config.setOptionSettingOptions(
|
|
673
|
+
this.config.setOptionSettingOptions(OptionParameters.StreamerId, settingOptions);
|
|
677
674
|
let autoSelectedStreamerId = '';
|
|
678
|
-
const waitForStreamer = this.config.isFlagEnabled(
|
|
679
|
-
const reconnectLimit = this.config.getNumericSettingValue(
|
|
680
|
-
const reconnectDelay = this.config.getNumericSettingValue(
|
|
675
|
+
const waitForStreamer = this.config.isFlagEnabled(Flags.WaitForStreamer);
|
|
676
|
+
const reconnectLimit = this.config.getNumericSettingValue(NumericParameters.MaxReconnectAttempts);
|
|
677
|
+
const reconnectDelay = this.config.getNumericSettingValue(NumericParameters.StreamerAutoJoinInterval);
|
|
681
678
|
// first we figure out a wanted streamer id through various means
|
|
682
679
|
const useUrlParams = this.config.useUrlParams;
|
|
683
|
-
const urlParams = new
|
|
684
|
-
if (useUrlParams && urlParams.has(
|
|
680
|
+
const urlParams = new IURLSearchParams(window.location.search);
|
|
681
|
+
if (useUrlParams && urlParams.has(OptionParameters.StreamerId)) {
|
|
685
682
|
// if we've set the streamer id on the url we only want that streamer id
|
|
686
|
-
wantedStreamerId = urlParams.get(
|
|
683
|
+
wantedStreamerId = urlParams.get(OptionParameters.StreamerId);
|
|
687
684
|
}
|
|
688
685
|
else if (this.subscribedStream) {
|
|
689
686
|
// we were previously subscribed to a streamer, we want that
|
|
@@ -702,7 +699,7 @@ class WebRtcPlayerController {
|
|
|
702
699
|
if (autoSelectedStreamerId) {
|
|
703
700
|
this.reconnectAttempt = 0;
|
|
704
701
|
this.isReconnecting = false;
|
|
705
|
-
this.config.setOptionSettingValue(
|
|
702
|
+
this.config.setOptionSettingValue(OptionParameters.StreamerId, autoSelectedStreamerId);
|
|
706
703
|
}
|
|
707
704
|
else {
|
|
708
705
|
// no auto selected streamer.
|
|
@@ -713,7 +710,7 @@ class WebRtcPlayerController {
|
|
|
713
710
|
this.reconnectAttempt++;
|
|
714
711
|
this.isReconnecting = true;
|
|
715
712
|
setTimeout(() => {
|
|
716
|
-
this.protocol.sendMessage(
|
|
713
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.listStreamers));
|
|
717
714
|
}, reconnectDelay);
|
|
718
715
|
}
|
|
719
716
|
else {
|
|
@@ -725,7 +722,7 @@ class WebRtcPlayerController {
|
|
|
725
722
|
}
|
|
726
723
|
}
|
|
727
724
|
// dispatch this event finally
|
|
728
|
-
this.pixelStreaming.dispatchEvent(new
|
|
725
|
+
this.pixelStreaming.dispatchEvent(new StreamerListMessageEvent({
|
|
729
726
|
messageStreamerList,
|
|
730
727
|
autoSelectedStreamerId,
|
|
731
728
|
wantedStreamerId
|
|
@@ -734,7 +731,7 @@ class WebRtcPlayerController {
|
|
|
734
731
|
handleStreamerIDChangedMessage(streamerIDChangedMessage) {
|
|
735
732
|
const newID = streamerIDChangedMessage.newID;
|
|
736
733
|
// need to edit the selected streamer in the settings list
|
|
737
|
-
const streamerListOptions = this.config.getSettingOption(
|
|
734
|
+
const streamerListOptions = this.config.getSettingOption(OptionParameters.StreamerId);
|
|
738
735
|
// temporarily prevent onChange from firing (it would try to subscribe to the streamer again)
|
|
739
736
|
const oldOnChange = streamerListOptions.onChange;
|
|
740
737
|
streamerListOptions.onChange = () => { };
|
|
@@ -755,7 +752,7 @@ class WebRtcPlayerController {
|
|
|
755
752
|
// remember which stream we're subscribe to
|
|
756
753
|
this.subscribedStream = streamerIDChangedMessage.newID;
|
|
757
754
|
// notify any listeners
|
|
758
|
-
this.pixelStreaming.dispatchEvent(new
|
|
755
|
+
this.pixelStreaming.dispatchEvent(new StreamerIDChangedMessageEvent({
|
|
759
756
|
newID
|
|
760
757
|
}));
|
|
761
758
|
}
|
|
@@ -764,7 +761,7 @@ class WebRtcPlayerController {
|
|
|
764
761
|
* @param Answer - Answer SDP from the peer.
|
|
765
762
|
*/
|
|
766
763
|
handleWebRtcAnswer(Answer) {
|
|
767
|
-
|
|
764
|
+
Logger.Info(`Got answer sdp ${Answer.sdp}`);
|
|
768
765
|
const sdpAnswer = {
|
|
769
766
|
sdp: Answer.sdp,
|
|
770
767
|
type: 'answer'
|
|
@@ -777,7 +774,7 @@ class WebRtcPlayerController {
|
|
|
777
774
|
* @param Offer - Offer SDP from the peer.
|
|
778
775
|
*/
|
|
779
776
|
handleWebRtcOffer(Offer) {
|
|
780
|
-
|
|
777
|
+
Logger.Info(`Got offer sdp ${Offer.sdp}`);
|
|
781
778
|
this.isUsingSFU = Offer.sfu ? Offer.sfu : false;
|
|
782
779
|
this.isUsingSVC = Offer.scalabilityMode ? Offer.scalabilityMode != 'L1T1' : false;
|
|
783
780
|
if (this.isUsingSFU || this.isUsingSVC) {
|
|
@@ -806,9 +803,9 @@ class WebRtcPlayerController {
|
|
|
806
803
|
}
|
|
807
804
|
}
|
|
808
805
|
// Update the possible video quality options
|
|
809
|
-
this.config.setOptionSettingOptions(
|
|
806
|
+
this.config.setOptionSettingOptions(OptionParameters.PreferredQuality, availableQualities);
|
|
810
807
|
// Update the selected video quality with the highest possible resolution
|
|
811
|
-
this.config.setOptionSettingValue(
|
|
808
|
+
this.config.setOptionSettingValue(OptionParameters.PreferredQuality, availableQualities.slice(-1)[0]);
|
|
812
809
|
const sdpOffer = {
|
|
813
810
|
sdp: Offer.sdp,
|
|
814
811
|
type: 'offer'
|
|
@@ -835,7 +832,7 @@ class WebRtcPlayerController {
|
|
|
835
832
|
id: DataChannels.recvStreamId
|
|
836
833
|
};
|
|
837
834
|
this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection, 'recv-datachannel', RecvOptions);
|
|
838
|
-
this.recvDataChannelController.handleOnOpen = () => this.protocol.sendMessage(
|
|
835
|
+
this.recvDataChannelController.handleOnOpen = () => this.protocol.sendMessage(MessageHelpers.createMessage(Messages.peerDataChannelsReady));
|
|
839
836
|
// If we're uni-directional, only the recv data channel should handle incoming messages
|
|
840
837
|
this.recvDataChannelController.handleOnMessage = (ev) => this.handleOnMessage(ev);
|
|
841
838
|
}
|
|
@@ -854,16 +851,16 @@ class WebRtcPlayerController {
|
|
|
854
851
|
}
|
|
855
852
|
this.statsTimerHandle = window.setInterval(() => this.getStats(), 1000);
|
|
856
853
|
/* */
|
|
857
|
-
this.setMouseInputEnabled(this.config.isFlagEnabled(
|
|
858
|
-
this.setKeyboardInputEnabled(this.config.isFlagEnabled(
|
|
859
|
-
this.setGamePadInputEnabled(this.config.isFlagEnabled(
|
|
854
|
+
this.setMouseInputEnabled(this.config.isFlagEnabled(Flags.MouseInput));
|
|
855
|
+
this.setKeyboardInputEnabled(this.config.isFlagEnabled(Flags.KeyboardInput));
|
|
856
|
+
this.setGamePadInputEnabled(this.config.isFlagEnabled(Flags.GamepadInput));
|
|
860
857
|
}
|
|
861
858
|
/**
|
|
862
859
|
* When an ice Candidate is received from the Signaling server add it to the Peer Connection Client
|
|
863
860
|
* @param iceCandidate - Ice Candidate from Server
|
|
864
861
|
*/
|
|
865
862
|
handleIceCandidate(iceCandidate) {
|
|
866
|
-
|
|
863
|
+
Logger.Info('Web RTC Controller: onWebRtcIce');
|
|
867
864
|
const candidate = new RTCIceCandidate(iceCandidate);
|
|
868
865
|
this.peerConnectionController.handleOnIce(candidate);
|
|
869
866
|
}
|
|
@@ -872,9 +869,9 @@ class WebRtcPlayerController {
|
|
|
872
869
|
* @param iceEvent - RTC Peer ConnectionIceEvent) {
|
|
873
870
|
*/
|
|
874
871
|
handleSendIceCandidate(iceEvent) {
|
|
875
|
-
|
|
872
|
+
Logger.Info('OnIceCandidate');
|
|
876
873
|
if (iceEvent.candidate && iceEvent.candidate.candidate) {
|
|
877
|
-
this.protocol.sendMessage(
|
|
874
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.iceCandidate, { candidate: iceEvent.candidate }));
|
|
878
875
|
}
|
|
879
876
|
}
|
|
880
877
|
/**
|
|
@@ -882,7 +879,7 @@ class WebRtcPlayerController {
|
|
|
882
879
|
* @param iceEvent - RTC Peer ConnectionIceEvent) {
|
|
883
880
|
*/
|
|
884
881
|
handleDataChannel(datachannelEvent) {
|
|
885
|
-
|
|
882
|
+
Logger.Info('Data channel created for us by browser as we are a receiving peer.');
|
|
886
883
|
this.sendrecvDataChannelController.dataChannel = datachannelEvent.channel;
|
|
887
884
|
// Data channel was created for us, so we just need to setup its callbacks and array type
|
|
888
885
|
this.sendrecvDataChannelController.setupDataChannel();
|
|
@@ -893,28 +890,28 @@ class WebRtcPlayerController {
|
|
|
893
890
|
* @param offer - RTC Session Description
|
|
894
891
|
*/
|
|
895
892
|
handleSendWebRTCOffer(offer) {
|
|
896
|
-
|
|
893
|
+
Logger.Info('Sending the offer to the Server');
|
|
897
894
|
const extraParams = {
|
|
898
895
|
sdp: offer.sdp,
|
|
899
|
-
minBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
900
|
-
maxBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
896
|
+
minBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMinBitrate),
|
|
897
|
+
maxBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMaxBitrate)
|
|
901
898
|
};
|
|
902
|
-
this.protocol.sendMessage(
|
|
899
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.offer, extraParams));
|
|
903
900
|
}
|
|
904
901
|
/**
|
|
905
902
|
* Send the RTC Offer Session to the Signaling server via websocket
|
|
906
903
|
* @param answer - RTC Session Description
|
|
907
904
|
*/
|
|
908
905
|
handleSendWebRTCAnswer(answer) {
|
|
909
|
-
|
|
906
|
+
Logger.Info('Sending the answer to the Server');
|
|
910
907
|
const extraParams = {
|
|
911
908
|
sdp: answer.sdp,
|
|
912
|
-
minBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
913
|
-
maxBitrateBps: 1000 * this.config.getNumericSettingValue(
|
|
909
|
+
minBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMinBitrate),
|
|
910
|
+
maxBitrateBps: 1000 * this.config.getNumericSettingValue(NumericParameters.WebRTCMaxBitrate)
|
|
914
911
|
};
|
|
915
|
-
this.protocol.sendMessage(
|
|
912
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.answer, extraParams));
|
|
916
913
|
if (this.isUsingSFU) {
|
|
917
|
-
this.protocol.sendMessage(
|
|
914
|
+
this.protocol.sendMessage(MessageHelpers.createMessage(Messages.dataChannelRequest));
|
|
918
915
|
}
|
|
919
916
|
}
|
|
920
917
|
/**
|
|
@@ -986,7 +983,7 @@ class WebRtcPlayerController {
|
|
|
986
983
|
* to aim for the best quality it can on the given network link.
|
|
987
984
|
*/
|
|
988
985
|
sendEncoderMinQP(minQP) {
|
|
989
|
-
|
|
986
|
+
Logger.Info(`MinQP=${minQP}\n`);
|
|
990
987
|
if (minQP != null) {
|
|
991
988
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
992
989
|
JSON.stringify({
|
|
@@ -1005,7 +1002,7 @@ class WebRtcPlayerController {
|
|
|
1005
1002
|
* to drop quality as low as needed on the given network link.
|
|
1006
1003
|
*/
|
|
1007
1004
|
sendEncoderMaxQP(maxQP) {
|
|
1008
|
-
|
|
1005
|
+
Logger.Info(`MaxQP=${maxQP}\n`);
|
|
1009
1006
|
if (maxQP != null) {
|
|
1010
1007
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1011
1008
|
JSON.stringify({
|
|
@@ -1022,7 +1019,7 @@ class WebRtcPlayerController {
|
|
|
1022
1019
|
* 100 = Best quality.
|
|
1023
1020
|
*/
|
|
1024
1021
|
sendEncoderMinQuality(minQuality) {
|
|
1025
|
-
|
|
1022
|
+
Logger.Info(`MinQuality=${minQuality}\n`);
|
|
1026
1023
|
if (minQuality != null) {
|
|
1027
1024
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1028
1025
|
JSON.stringify({
|
|
@@ -1039,7 +1036,7 @@ class WebRtcPlayerController {
|
|
|
1039
1036
|
* 100 = Best quality.
|
|
1040
1037
|
*/
|
|
1041
1038
|
sendEncoderMaxQuality(maxQuality) {
|
|
1042
|
-
|
|
1039
|
+
Logger.Info(`MaxQuality=${maxQuality}\n`);
|
|
1043
1040
|
if (maxQuality != null) {
|
|
1044
1041
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1045
1042
|
JSON.stringify({
|
|
@@ -1055,7 +1052,7 @@ class WebRtcPlayerController {
|
|
|
1055
1052
|
* @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
|
|
1056
1053
|
*/
|
|
1057
1054
|
sendWebRTCMinBitrate(minBitrate) {
|
|
1058
|
-
|
|
1055
|
+
Logger.Info(`WebRTC Min Bitrate=${minBitrate}`);
|
|
1059
1056
|
if (minBitrate != null) {
|
|
1060
1057
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1061
1058
|
JSON.stringify({
|
|
@@ -1071,7 +1068,7 @@ class WebRtcPlayerController {
|
|
|
1071
1068
|
* @param minBitrate - The minimum bitrate we would like WebRTC to not fall below.
|
|
1072
1069
|
*/
|
|
1073
1070
|
sendWebRTCMaxBitrate(maxBitrate) {
|
|
1074
|
-
|
|
1071
|
+
Logger.Info(`WebRTC Max Bitrate=${maxBitrate}`);
|
|
1075
1072
|
if (maxBitrate != null) {
|
|
1076
1073
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1077
1074
|
JSON.stringify({
|
|
@@ -1087,7 +1084,7 @@ class WebRtcPlayerController {
|
|
|
1087
1084
|
* @param fps - The maximum stream fps.
|
|
1088
1085
|
*/
|
|
1089
1086
|
sendWebRTCFps(fps) {
|
|
1090
|
-
|
|
1087
|
+
Logger.Info(`WebRTC FPS=${fps}`);
|
|
1091
1088
|
if (fps != null) {
|
|
1092
1089
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1093
1090
|
JSON.stringify({ 'WebRTC.Fps': fps })
|
|
@@ -1102,35 +1099,35 @@ class WebRtcPlayerController {
|
|
|
1102
1099
|
* Sends the UI Descriptor `stat fps` to the UE Instance
|
|
1103
1100
|
*/
|
|
1104
1101
|
sendShowFps() {
|
|
1105
|
-
|
|
1102
|
+
Logger.Info('---- Sending show stat to UE ----');
|
|
1106
1103
|
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify({ 'stat.fps': '' })]);
|
|
1107
1104
|
}
|
|
1108
1105
|
/**
|
|
1109
1106
|
* Send an Iframe request to the streamer
|
|
1110
1107
|
*/
|
|
1111
1108
|
sendIframeRequest() {
|
|
1112
|
-
|
|
1109
|
+
Logger.Info('---- Sending Request for an IFrame ----');
|
|
1113
1110
|
this.streamMessageController.toStreamerHandlers.get('IFrameRequest')();
|
|
1114
1111
|
}
|
|
1115
1112
|
/**
|
|
1116
1113
|
* Send a UIInteraction message
|
|
1117
1114
|
*/
|
|
1118
1115
|
emitUIInteraction(descriptor) {
|
|
1119
|
-
|
|
1116
|
+
Logger.Info('---- Sending custom UIInteraction message ----');
|
|
1120
1117
|
this.streamMessageController.toStreamerHandlers.get('UIInteraction')([JSON.stringify(descriptor)]);
|
|
1121
1118
|
}
|
|
1122
1119
|
/**
|
|
1123
1120
|
* Send a Command message
|
|
1124
1121
|
*/
|
|
1125
1122
|
emitCommand(descriptor) {
|
|
1126
|
-
|
|
1123
|
+
Logger.Info('---- Sending custom Command message ----');
|
|
1127
1124
|
this.streamMessageController.toStreamerHandlers.get('Command')([JSON.stringify(descriptor)]);
|
|
1128
1125
|
}
|
|
1129
1126
|
/**
|
|
1130
1127
|
* Send a console command message
|
|
1131
1128
|
*/
|
|
1132
1129
|
emitConsoleCommand(command) {
|
|
1133
|
-
|
|
1130
|
+
Logger.Info('---- Sending custom Command:ConsoleCommand message ----');
|
|
1134
1131
|
this.streamMessageController.toStreamerHandlers.get('Command')([
|
|
1135
1132
|
JSON.stringify({
|
|
1136
1133
|
ConsoleCommand: command
|
|
@@ -1141,7 +1138,7 @@ class WebRtcPlayerController {
|
|
|
1141
1138
|
* Sends a request to the UE Instance to have ownership of Quality
|
|
1142
1139
|
*/
|
|
1143
1140
|
sendRequestQualityControlOwnership() {
|
|
1144
|
-
|
|
1141
|
+
Logger.Info('---- Sending Request to Control Quality ----');
|
|
1145
1142
|
this.toStreamerMessagesController.SendRequestQualityControl();
|
|
1146
1143
|
}
|
|
1147
1144
|
/**
|
|
@@ -1149,9 +1146,9 @@ class WebRtcPlayerController {
|
|
|
1149
1146
|
* @param message - Latency Test Timings
|
|
1150
1147
|
*/
|
|
1151
1148
|
handleLatencyTestResult(message) {
|
|
1152
|
-
|
|
1149
|
+
Logger.Info('DataChannelReceiveMessageType.latencyTest');
|
|
1153
1150
|
const latencyAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1154
|
-
const latencyTestResults = new
|
|
1151
|
+
const latencyTestResults = new LatencyTestResults();
|
|
1155
1152
|
Object.assign(latencyTestResults, JSON.parse(latencyAsString));
|
|
1156
1153
|
latencyTestResults.processFields();
|
|
1157
1154
|
latencyTestResults.testStartTimeMs = this.latencyStartTime;
|
|
@@ -1171,7 +1168,7 @@ class WebRtcPlayerController {
|
|
|
1171
1168
|
* @param message - Data Channel Latency Test Response
|
|
1172
1169
|
*/
|
|
1173
1170
|
handleDataChannelLatencyTestResponse(message) {
|
|
1174
|
-
|
|
1171
|
+
Logger.Info('DataChannelReceiveMessageType.dataChannelLatencyResponse');
|
|
1175
1172
|
const responseAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1176
1173
|
const latencyTestResponse = JSON.parse(responseAsString);
|
|
1177
1174
|
this.pixelStreaming._onDataChannelLatencyTestResponse(latencyTestResponse);
|
|
@@ -1181,10 +1178,10 @@ class WebRtcPlayerController {
|
|
|
1181
1178
|
* @param message - Initial Encoder and Web RTC Settings
|
|
1182
1179
|
*/
|
|
1183
1180
|
handleInitialSettings(message) {
|
|
1184
|
-
|
|
1181
|
+
Logger.Info('DataChannelReceiveMessageType.InitialSettings');
|
|
1185
1182
|
const payloadAsString = new TextDecoder('utf-16').decode(message.slice(1));
|
|
1186
1183
|
const parsedInitialSettings = JSON.parse(payloadAsString);
|
|
1187
|
-
const initialSettings = new
|
|
1184
|
+
const initialSettings = new InitialSettings();
|
|
1188
1185
|
if (parsedInitialSettings.Encoder) {
|
|
1189
1186
|
initialSettings.EncoderSettings = parsedInitialSettings.Encoder;
|
|
1190
1187
|
}
|
|
@@ -1196,10 +1193,10 @@ class WebRtcPlayerController {
|
|
|
1196
1193
|
}
|
|
1197
1194
|
if (parsedInitialSettings.ConfigOptions &&
|
|
1198
1195
|
parsedInitialSettings.ConfigOptions.DefaultToHover !== undefined) {
|
|
1199
|
-
this.config.setFlagEnabled(
|
|
1196
|
+
this.config.setFlagEnabled(Flags.HoveringMouseMode, !!parsedInitialSettings.ConfigOptions.DefaultToHover);
|
|
1200
1197
|
}
|
|
1201
1198
|
initialSettings.ueCompatible();
|
|
1202
|
-
|
|
1199
|
+
Logger.Info(payloadAsString);
|
|
1203
1200
|
this.pixelStreaming._onInitialSettings(initialSettings);
|
|
1204
1201
|
}
|
|
1205
1202
|
/**
|
|
@@ -1207,7 +1204,7 @@ class WebRtcPlayerController {
|
|
|
1207
1204
|
* @param message - Encoders Quantization Parameter
|
|
1208
1205
|
*/
|
|
1209
1206
|
handleVideoEncoderAvgQP(message) {
|
|
1210
|
-
|
|
1207
|
+
Logger.Info('DataChannelReceiveMessageType.VideoEncoderAvgQP');
|
|
1211
1208
|
const AvgQP = Number(new TextDecoder('utf-16').decode(message.slice(1)));
|
|
1212
1209
|
this.setVideoEncoderAvgQP(AvgQP);
|
|
1213
1210
|
}
|
|
@@ -1227,9 +1224,9 @@ class WebRtcPlayerController {
|
|
|
1227
1224
|
*/
|
|
1228
1225
|
onQualityControlOwnership(message) {
|
|
1229
1226
|
const view = new Uint8Array(message);
|
|
1230
|
-
|
|
1227
|
+
Logger.Info('DataChannelReceiveMessageType.QualityControlOwnership');
|
|
1231
1228
|
this.isQualityController = new Boolean(view[1]).valueOf();
|
|
1232
|
-
|
|
1229
|
+
Logger.Info(`Received quality controller message, will control quality: ${this.isQualityController}`);
|
|
1233
1230
|
this.pixelStreaming._onQualityControlOwnership(this.isQualityController);
|
|
1234
1231
|
}
|
|
1235
1232
|
/**
|
|
@@ -1273,9 +1270,9 @@ class WebRtcPlayerController {
|
|
|
1273
1270
|
var _a;
|
|
1274
1271
|
(_a = this.mouseController) === null || _a === void 0 ? void 0 : _a.unregister();
|
|
1275
1272
|
if (isEnabled) {
|
|
1276
|
-
const mouseMode = this.config.isFlagEnabled(
|
|
1277
|
-
?
|
|
1278
|
-
:
|
|
1273
|
+
const mouseMode = this.config.isFlagEnabled(Flags.HoveringMouseMode)
|
|
1274
|
+
? ControlSchemeType.HoveringMouse
|
|
1275
|
+
: ControlSchemeType.LockedMouse;
|
|
1279
1276
|
this.mouseController = this.inputClassesFactory.registerMouse(mouseMode);
|
|
1280
1277
|
}
|
|
1281
1278
|
}
|
|
@@ -1286,7 +1283,7 @@ class WebRtcPlayerController {
|
|
|
1286
1283
|
var _a;
|
|
1287
1284
|
(_a = this.touchController) === null || _a === void 0 ? void 0 : _a.unregister();
|
|
1288
1285
|
if (isEnabled) {
|
|
1289
|
-
this.touchController = this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(
|
|
1286
|
+
this.touchController = this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(Flags.FakeMouseWithTouches));
|
|
1290
1287
|
}
|
|
1291
1288
|
}
|
|
1292
1289
|
/**
|
|
@@ -1300,18 +1297,17 @@ class WebRtcPlayerController {
|
|
|
1300
1297
|
}
|
|
1301
1298
|
}
|
|
1302
1299
|
registerDataChannelEventEmitters(dataChannel) {
|
|
1303
|
-
dataChannel.onOpen = (label, event) => this.pixelStreaming.dispatchEvent(new
|
|
1304
|
-
dataChannel.onClose = (label, event) => this.pixelStreaming.dispatchEvent(new
|
|
1305
|
-
dataChannel.onError = (label, event) => this.pixelStreaming.dispatchEvent(new
|
|
1300
|
+
dataChannel.onOpen = (label, event) => this.pixelStreaming.dispatchEvent(new DataChannelOpenEvent({ label, event }));
|
|
1301
|
+
dataChannel.onClose = (label, event) => this.pixelStreaming.dispatchEvent(new DataChannelCloseEvent({ label, event }));
|
|
1302
|
+
dataChannel.onError = (label, event) => this.pixelStreaming.dispatchEvent(new DataChannelErrorEvent({ label, event }));
|
|
1306
1303
|
}
|
|
1307
1304
|
registerMessageHandler(name, direction, handler) {
|
|
1308
|
-
if (direction ===
|
|
1309
|
-
|
|
1305
|
+
if (direction === MessageDirection.FromStreamer && typeof handler === 'undefined') {
|
|
1306
|
+
Logger.Warning(`Unable to register handler for ${name} as no handler was passed`);
|
|
1310
1307
|
}
|
|
1311
|
-
this.streamMessageController.registerMessageHandler(direction, name, (data) => typeof handler === 'undefined' && direction ===
|
|
1308
|
+
this.streamMessageController.registerMessageHandler(direction, name, (data) => typeof handler === 'undefined' && direction === MessageDirection.ToStreamer
|
|
1312
1309
|
? this.sendMessageController.sendMessageToStreamer(name, data)
|
|
1313
1310
|
: handler(data));
|
|
1314
1311
|
}
|
|
1315
1312
|
}
|
|
1316
|
-
exports.WebRtcPlayerController = WebRtcPlayerController;
|
|
1317
1313
|
//# sourceMappingURL=WebRtcPlayerController.js.map
|