@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.4.8 → 1.0.1
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/dist/cjs/Config/Config.js +4 -0
- package/dist/cjs/Config/Config.js.map +1 -1
- package/dist/cjs/Config/SettingBase.js +1 -3
- package/dist/cjs/Config/SettingBase.js.map +1 -1
- package/dist/cjs/Config/SettingFlag.js +1 -3
- package/dist/cjs/Config/SettingFlag.js.map +1 -1
- package/dist/cjs/Config/SettingNumber.js +1 -3
- package/dist/cjs/Config/SettingNumber.js.map +1 -1
- package/dist/cjs/Config/SettingOption.js +2 -6
- package/dist/cjs/Config/SettingOption.js.map +1 -1
- package/dist/cjs/Config/SettingText.js +1 -3
- package/dist/cjs/Config/SettingText.js.map +1 -1
- package/dist/cjs/Inputs/GamepadController.js +0 -2
- package/dist/cjs/Inputs/GamepadController.js.map +1 -1
- package/dist/cjs/PeerConnectionController/AggregatedStats.js +103 -45
- package/dist/cjs/PeerConnectionController/AggregatedStats.js.map +1 -1
- package/dist/cjs/PeerConnectionController/InboundRTPStats.js.map +1 -1
- package/dist/cjs/PeerConnectionController/LatencyCalculator.js +290 -0
- package/dist/cjs/PeerConnectionController/LatencyCalculator.js.map +1 -0
- package/dist/cjs/PeerConnectionController/OutBoundRTPStats.js +11 -7
- package/dist/cjs/PeerConnectionController/OutBoundRTPStats.js.map +1 -1
- package/dist/cjs/PeerConnectionController/PeerConnectionController.js +53 -19
- package/dist/cjs/PeerConnectionController/PeerConnectionController.js.map +1 -1
- package/dist/cjs/PixelStreaming/PixelStreaming.js +21 -3
- package/dist/cjs/PixelStreaming/PixelStreaming.js.map +1 -1
- package/dist/cjs/Util/EventEmitter.js +31 -1
- package/dist/cjs/Util/EventEmitter.js.map +1 -1
- package/dist/cjs/WebRtcPlayer/WebRtcPlayerController.js +20 -4
- package/dist/cjs/WebRtcPlayer/WebRtcPlayerController.js.map +1 -1
- package/dist/cjs/__test__/mockMediaStream.js +100 -0
- package/dist/cjs/__test__/mockMediaStream.js.map +1 -0
- package/dist/cjs/__test__/mockRTCPeerConnection.js +252 -0
- package/dist/cjs/__test__/mockRTCPeerConnection.js.map +1 -0
- package/dist/cjs/__test__/mockRTCRtpReceiver.js +26 -0
- package/dist/cjs/__test__/mockRTCRtpReceiver.js.map +1 -0
- package/dist/cjs/__test__/mockWebSocket.js +109 -0
- package/dist/cjs/__test__/mockWebSocket.js.map +1 -0
- package/dist/cjs/pixelstreamingfrontend.js +4 -2
- package/dist/cjs/pixelstreamingfrontend.js.map +1 -1
- package/dist/esm/Config/Config.js +4 -0
- package/dist/esm/Config/Config.js.map +1 -1
- package/dist/esm/Config/SettingBase.js +1 -3
- package/dist/esm/Config/SettingBase.js.map +1 -1
- package/dist/esm/Config/SettingFlag.js +1 -3
- package/dist/esm/Config/SettingFlag.js.map +1 -1
- package/dist/esm/Config/SettingNumber.js +1 -3
- package/dist/esm/Config/SettingNumber.js.map +1 -1
- package/dist/esm/Config/SettingOption.js +2 -6
- package/dist/esm/Config/SettingOption.js.map +1 -1
- package/dist/esm/Config/SettingText.js +1 -3
- package/dist/esm/Config/SettingText.js.map +1 -1
- package/dist/esm/Inputs/GamepadController.js +0 -2
- package/dist/esm/Inputs/GamepadController.js.map +1 -1
- package/dist/esm/PeerConnectionController/AggregatedStats.js +104 -46
- package/dist/esm/PeerConnectionController/AggregatedStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/InboundRTPStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/LatencyCalculator.js +284 -0
- package/dist/esm/PeerConnectionController/LatencyCalculator.js.map +1 -0
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js +8 -4
- package/dist/esm/PeerConnectionController/OutBoundRTPStats.js.map +1 -1
- package/dist/esm/PeerConnectionController/PeerConnectionController.js +52 -18
- package/dist/esm/PeerConnectionController/PeerConnectionController.js.map +1 -1
- package/dist/esm/PixelStreaming/PixelStreaming.js +22 -4
- package/dist/esm/PixelStreaming/PixelStreaming.js.map +1 -1
- package/dist/esm/Util/EventEmitter.js +27 -0
- package/dist/esm/Util/EventEmitter.js.map +1 -1
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js +20 -4
- package/dist/esm/WebRtcPlayer/WebRtcPlayerController.js.map +1 -1
- package/dist/esm/__test__/mockMediaStream.js +92 -0
- package/dist/esm/__test__/mockMediaStream.js.map +1 -0
- package/dist/esm/__test__/mockRTCPeerConnection.js +242 -0
- package/dist/esm/__test__/mockRTCPeerConnection.js.map +1 -0
- package/dist/esm/__test__/mockRTCRtpReceiver.js +21 -0
- package/dist/esm/__test__/mockRTCRtpReceiver.js.map +1 -0
- package/dist/esm/__test__/mockWebSocket.js +103 -0
- package/dist/esm/__test__/mockWebSocket.js.map +1 -0
- package/dist/esm/pixelstreamingfrontend.js +2 -1
- package/dist/esm/pixelstreamingfrontend.js.map +1 -1
- package/dist/types/Config/Config.d.ts +1 -0
- package/dist/types/PeerConnectionController/AggregatedStats.d.ts +18 -7
- package/dist/types/PeerConnectionController/InboundRTPStats.d.ts +88 -85
- package/dist/types/PeerConnectionController/LatencyCalculator.d.ts +87 -0
- package/dist/types/PeerConnectionController/OutBoundRTPStats.d.ts +46 -12
- package/dist/types/PeerConnectionController/PeerConnectionController.d.ts +17 -3
- package/dist/types/PixelStreaming/PixelStreaming.d.ts +16 -3
- package/dist/types/Util/EventEmitter.d.ts +34 -1
- package/dist/types/VideoPlayer/VideoPlayer.d.ts +1 -1
- package/dist/types/__test__/mockMediaStream.d.ts +49 -0
- package/dist/types/__test__/mockRTCPeerConnection.d.ts +134 -0
- package/dist/types/__test__/mockRTCRtpReceiver.d.ts +3 -0
- package/dist/types/__test__/mockWebSocket.d.ts +33 -0
- package/dist/types/pixelstreamingfrontend.d.ts +2 -1
- package/eslint.config.mjs +52 -0
- package/package.json +13 -14
- package/src/Config/Config.ts +14 -0
- package/src/Config/SettingBase.ts +1 -1
- package/src/Config/SettingFlag.ts +1 -1
- package/src/Config/SettingNumber.ts +1 -1
- package/src/Config/SettingOption.ts +2 -2
- package/src/Config/SettingText.ts +1 -1
- package/src/Inputs/GamepadController.ts +2 -2
- package/src/PeerConnectionController/AggregatedStats.ts +111 -52
- package/src/PeerConnectionController/InboundRTPStats.ts +88 -85
- package/src/PeerConnectionController/LatencyCalculator.ts +392 -0
- package/src/PeerConnectionController/OutBoundRTPStats.ts +46 -12
- package/src/PeerConnectionController/PeerConnectionController.ts +72 -19
- package/src/PixelStreaming/PixelStreaming.ts +29 -4
- package/src/Util/EventEmitter.ts +48 -0
- package/src/VideoPlayer/VideoPlayer.ts +1 -1
- package/src/WebRtcPlayer/WebRtcPlayerController.ts +23 -5
- package/src/__test__/mockRTCPeerConnection.ts +1 -1
- package/src/pixelstreamingfrontend.ts +2 -1
- package/tsconfig.base.json +2 -2
- package/.eslintignore +0 -12
- package/.eslintrc.js +0 -20
- package/.prettierrc.json +0 -7
|
@@ -2,140 +2,143 @@
|
|
|
2
2
|
* Inbound Audio Stats collected from the RTC Stats Report
|
|
3
3
|
*/
|
|
4
4
|
export declare class InboundAudioStats {
|
|
5
|
-
audioLevel: number;
|
|
5
|
+
audioLevel: number | undefined;
|
|
6
6
|
bytesReceived: number;
|
|
7
7
|
codecId: string;
|
|
8
|
-
concealedSamples: number;
|
|
9
|
-
concealmentEvents: number;
|
|
10
|
-
fecPacketsDiscarded: number;
|
|
11
|
-
fecPacketsReceived: number;
|
|
8
|
+
concealedSamples: number | undefined;
|
|
9
|
+
concealmentEvents: number | undefined;
|
|
10
|
+
fecPacketsDiscarded: number | undefined;
|
|
11
|
+
fecPacketsReceived: number | undefined;
|
|
12
12
|
headerBytesReceived: number;
|
|
13
13
|
id: string;
|
|
14
|
-
insertedSamplesForDeceleration: number;
|
|
14
|
+
insertedSamplesForDeceleration: number | undefined;
|
|
15
15
|
jitter: number;
|
|
16
16
|
jitterBufferDelay: number;
|
|
17
17
|
jitterBufferEmittedCount: number;
|
|
18
|
-
jitterBufferMinimumDelay: number;
|
|
19
|
-
jitterBufferTargetDelay: number;
|
|
18
|
+
jitterBufferMinimumDelay: number | undefined;
|
|
19
|
+
jitterBufferTargetDelay: number | undefined;
|
|
20
20
|
kind: string;
|
|
21
21
|
lastPacketReceivedTimestamp: number;
|
|
22
|
-
mediaType: string;
|
|
22
|
+
mediaType: string | undefined;
|
|
23
23
|
mid: string;
|
|
24
|
-
packetsDiscarded: number;
|
|
24
|
+
packetsDiscarded: number | undefined;
|
|
25
25
|
packetsLost: number;
|
|
26
26
|
packetsReceived: number;
|
|
27
|
-
removedSamplesForAcceleration: number;
|
|
28
|
-
silentConcealedSamples: number;
|
|
27
|
+
removedSamplesForAcceleration: number | undefined;
|
|
28
|
+
silentConcealedSamples: number | undefined;
|
|
29
29
|
ssrc: number;
|
|
30
30
|
timestamp: number;
|
|
31
|
-
totalAudioEnergy: number;
|
|
32
|
-
totalSamplesDuration: number;
|
|
33
|
-
totalSamplesReceived: number;
|
|
34
|
-
trackIdentifier: string;
|
|
35
|
-
transportId: string;
|
|
31
|
+
totalAudioEnergy: number | undefined;
|
|
32
|
+
totalSamplesDuration: number | undefined;
|
|
33
|
+
totalSamplesReceived: number | undefined;
|
|
34
|
+
trackIdentifier: string | undefined;
|
|
35
|
+
transportId: string | undefined;
|
|
36
36
|
type: string;
|
|
37
|
-
bitrate: number;
|
|
37
|
+
bitrate: number | undefined;
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* Inbound Video Stats collected from the RTC Stats Report
|
|
41
41
|
*/
|
|
42
42
|
export declare class InboundVideoStats {
|
|
43
43
|
bytesReceived: number;
|
|
44
|
-
codecId: string;
|
|
45
|
-
firCount: number;
|
|
46
|
-
frameHeight: number;
|
|
47
|
-
frameWidth: number;
|
|
48
|
-
framesAssembledFromMultiplePackets: number;
|
|
49
|
-
framesDecoded: number;
|
|
50
|
-
framesDropped: number;
|
|
51
|
-
framesPerSecond: number;
|
|
52
|
-
framesReceived: number;
|
|
53
|
-
freezeCount: number;
|
|
54
|
-
googTimingFrameInfo: string;
|
|
44
|
+
codecId: string | undefined;
|
|
45
|
+
firCount: number | undefined;
|
|
46
|
+
frameHeight: number | undefined;
|
|
47
|
+
frameWidth: number | undefined;
|
|
48
|
+
framesAssembledFromMultiplePackets: number | undefined;
|
|
49
|
+
framesDecoded: number | undefined;
|
|
50
|
+
framesDropped: number | undefined;
|
|
51
|
+
framesPerSecond: number | undefined;
|
|
52
|
+
framesReceived: number | undefined;
|
|
53
|
+
freezeCount: number | undefined;
|
|
54
|
+
googTimingFrameInfo: string | undefined;
|
|
55
55
|
headerBytesReceived: number;
|
|
56
56
|
id: string;
|
|
57
57
|
jitter: number;
|
|
58
58
|
jitterBufferDelay: number;
|
|
59
59
|
jitterBufferEmittedCount: number;
|
|
60
|
-
keyFramesDecoded: number;
|
|
60
|
+
keyFramesDecoded: number | undefined;
|
|
61
61
|
kind: string;
|
|
62
|
-
lastPacketReceivedTimestamp: number;
|
|
63
|
-
mediaType: string;
|
|
62
|
+
lastPacketReceivedTimestamp: number | undefined;
|
|
63
|
+
mediaType: string | undefined;
|
|
64
64
|
mid: string;
|
|
65
|
-
nackCount: number;
|
|
65
|
+
nackCount: number | undefined;
|
|
66
66
|
packetsLost: number;
|
|
67
67
|
packetsReceived: number;
|
|
68
|
-
pauseCount: number;
|
|
69
|
-
pliCount: number;
|
|
68
|
+
pauseCount: number | undefined;
|
|
69
|
+
pliCount: number | undefined;
|
|
70
70
|
ssrc: number;
|
|
71
71
|
timestamp: number;
|
|
72
|
-
totalAssemblyTime: number;
|
|
73
|
-
totalDecodeTime: number;
|
|
74
|
-
totalFreezesDuration: number;
|
|
75
|
-
totalInterFrameDelay: number;
|
|
76
|
-
totalPausesDuration: number;
|
|
77
|
-
totalProcessingDelay: number;
|
|
78
|
-
totalSquaredInterFrameDelay: number;
|
|
79
|
-
trackIdentifier: string;
|
|
80
|
-
transportId: string;
|
|
72
|
+
totalAssemblyTime: number | undefined;
|
|
73
|
+
totalDecodeTime: number | undefined;
|
|
74
|
+
totalFreezesDuration: number | undefined;
|
|
75
|
+
totalInterFrameDelay: number | undefined;
|
|
76
|
+
totalPausesDuration: number | undefined;
|
|
77
|
+
totalProcessingDelay: number | undefined;
|
|
78
|
+
totalSquaredInterFrameDelay: number | undefined;
|
|
79
|
+
trackIdentifier: string | undefined;
|
|
80
|
+
transportId: string | undefined;
|
|
81
81
|
type: string;
|
|
82
|
-
bitrate: number;
|
|
82
|
+
bitrate: number | undefined;
|
|
83
83
|
}
|
|
84
84
|
/**
|
|
85
85
|
* Inbound Stats collected from the RTC Stats Report
|
|
86
86
|
*/
|
|
87
87
|
export declare class InboundRTPStats {
|
|
88
88
|
bytesReceived: number;
|
|
89
|
-
codecId: string;
|
|
89
|
+
codecId: string | undefined;
|
|
90
90
|
headerBytesReceived: number;
|
|
91
91
|
id: string;
|
|
92
92
|
jitter: number;
|
|
93
93
|
jitterBufferDelay: number;
|
|
94
94
|
jitterBufferEmittedCount: number;
|
|
95
95
|
kind: string;
|
|
96
|
-
lastPacketReceivedTimestamp: number;
|
|
97
|
-
mediaType: string;
|
|
96
|
+
lastPacketReceivedTimestamp: number | undefined;
|
|
97
|
+
mediaType: string | undefined;
|
|
98
98
|
mid: string;
|
|
99
99
|
packetsLost: number;
|
|
100
100
|
packetsReceived: number;
|
|
101
|
+
playoutId: string | undefined;
|
|
102
|
+
qpsum: number | undefined;
|
|
103
|
+
remoteId: string | undefined;
|
|
101
104
|
ssrc: number;
|
|
102
105
|
timestamp: number;
|
|
103
|
-
trackIdentifier: string;
|
|
104
|
-
transportId: string;
|
|
106
|
+
trackIdentifier: string | undefined;
|
|
107
|
+
transportId: string | undefined;
|
|
105
108
|
type: string;
|
|
106
|
-
audioLevel: number;
|
|
107
|
-
concealedSamples: number;
|
|
108
|
-
concealmentEvents: number;
|
|
109
|
-
fecPacketsDiscarded: number;
|
|
110
|
-
fecPacketsReceived: number;
|
|
111
|
-
insertedSamplesForDeceleration: number;
|
|
112
|
-
jitterBufferMinimumDelay: number;
|
|
113
|
-
jitterBufferTargetDelay: number;
|
|
114
|
-
packetsDiscarded: number;
|
|
115
|
-
removedSamplesForAcceleration: number;
|
|
116
|
-
silentConcealedSamples: number;
|
|
117
|
-
totalAudioEnergy: number;
|
|
118
|
-
totalSamplesDuration: number;
|
|
119
|
-
totalSamplesReceived: number;
|
|
120
|
-
firCount: number;
|
|
121
|
-
frameHeight: number;
|
|
122
|
-
frameWidth: number;
|
|
123
|
-
framesAssembledFromMultiplePackets: number;
|
|
124
|
-
framesDecoded: number;
|
|
125
|
-
framesDropped: number;
|
|
126
|
-
framesPerSecond: number;
|
|
127
|
-
framesReceived: number;
|
|
128
|
-
freezeCount: number;
|
|
129
|
-
googTimingFrameInfo: string;
|
|
130
|
-
keyFramesDecoded: number;
|
|
131
|
-
nackCount: number;
|
|
132
|
-
pauseCount: number;
|
|
133
|
-
pliCount: number;
|
|
134
|
-
totalAssemblyTime: number;
|
|
135
|
-
totalDecodeTime: number;
|
|
136
|
-
totalFreezesDuration: number;
|
|
137
|
-
totalInterFrameDelay: number;
|
|
138
|
-
totalPausesDuration: number;
|
|
139
|
-
totalProcessingDelay: number;
|
|
140
|
-
totalSquaredInterFrameDelay: number;
|
|
109
|
+
audioLevel: number | undefined;
|
|
110
|
+
concealedSamples: number | undefined;
|
|
111
|
+
concealmentEvents: number | undefined;
|
|
112
|
+
fecPacketsDiscarded: number | undefined;
|
|
113
|
+
fecPacketsReceived: number | undefined;
|
|
114
|
+
insertedSamplesForDeceleration: number | undefined;
|
|
115
|
+
jitterBufferMinimumDelay: number | undefined;
|
|
116
|
+
jitterBufferTargetDelay: number | undefined;
|
|
117
|
+
packetsDiscarded: number | undefined;
|
|
118
|
+
removedSamplesForAcceleration: number | undefined;
|
|
119
|
+
silentConcealedSamples: number | undefined;
|
|
120
|
+
totalAudioEnergy: number | undefined;
|
|
121
|
+
totalSamplesDuration: number | undefined;
|
|
122
|
+
totalSamplesReceived: number | undefined;
|
|
123
|
+
firCount: number | undefined;
|
|
124
|
+
frameHeight: number | undefined;
|
|
125
|
+
frameWidth: number | undefined;
|
|
126
|
+
framesAssembledFromMultiplePackets: number | undefined;
|
|
127
|
+
framesDecoded: number | undefined;
|
|
128
|
+
framesDropped: number | undefined;
|
|
129
|
+
framesPerSecond: number | undefined;
|
|
130
|
+
framesReceived: number | undefined;
|
|
131
|
+
freezeCount: number | undefined;
|
|
132
|
+
googTimingFrameInfo: string | undefined;
|
|
133
|
+
keyFramesDecoded: number | undefined;
|
|
134
|
+
nackCount: number | undefined;
|
|
135
|
+
pauseCount: number | undefined;
|
|
136
|
+
pliCount: number | undefined;
|
|
137
|
+
totalAssemblyTime: number | undefined;
|
|
138
|
+
totalDecodeTime: number | undefined;
|
|
139
|
+
totalFreezesDuration: number | undefined;
|
|
140
|
+
totalInterFrameDelay: number | undefined;
|
|
141
|
+
totalPausesDuration: number | undefined;
|
|
142
|
+
totalProcessingDelay: number | undefined;
|
|
143
|
+
totalSquaredInterFrameDelay: number | undefined;
|
|
141
144
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { AggregatedStats } from './AggregatedStats';
|
|
2
|
+
/**
|
|
3
|
+
* FrameTimingInfo is a Chromium-specific set of WebRTC stats useful for latency calculation. It is stored in WebRTC stats as `googTimingFrameInfo`.
|
|
4
|
+
* It is defined as an RTP header extension here: https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/rtp-hdrext/video-timing/README.md
|
|
5
|
+
* It is defined in source code here: https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/api/video/video_timing.cc;l=82;drc=8d399817282e3c12ed54eb23ec42a5e418298ec6
|
|
6
|
+
* It is discussed by its author here: https://github.com/w3c/webrtc-provisional-stats/issues/40#issuecomment-1272916692
|
|
7
|
+
* In summary it a comma-delimited string that contains the following (in this order):
|
|
8
|
+
* 1) RTP timestamp: the RTP timestamp of the frame
|
|
9
|
+
* 2) Capture time: timestamp when this frame was captured
|
|
10
|
+
* 3) Encode start: timestamp when this frame started to be encoded
|
|
11
|
+
* 4) Encode finish: timestamp when this frame finished encoding
|
|
12
|
+
* 5) Packetization finish: timestamp when this frame was split into packets and was ready to be sent over the network
|
|
13
|
+
* 6) Pacer exit: timestamp when last packet of this frame was sent over the network by the sender at this timestamp
|
|
14
|
+
* 7) Network timestamp1: place for the SFU to mark when the frame started being forwarded. Application specific.
|
|
15
|
+
* 8) Network timestamp2: place for the SFU to mark when the frame finished being forwarded. Application specific.
|
|
16
|
+
* 9) Receive start: timestamp when the first packet of this frame was received
|
|
17
|
+
* 10) Receive finish: timestamp when the last packet of this frame was received
|
|
18
|
+
* 11) Decode start: timestamp when the frame was passed to decoder
|
|
19
|
+
* 12) Decode finish: timestamp when the frame was decoded
|
|
20
|
+
* 13) Render time: timestamp of the projected render time for this frame
|
|
21
|
+
* 14) "is outlier": a flag for if this frame is bigger in encoded size than the average frame by at least 5x.
|
|
22
|
+
* 15) "triggered by timer": a flag for if this report was triggered by the timer (The report is sent every 200ms)
|
|
23
|
+
*/
|
|
24
|
+
export declare class FrameTimingInfo {
|
|
25
|
+
rtpTimestamp: number;
|
|
26
|
+
captureTimestamp: number;
|
|
27
|
+
encodeStartTimestamp: number;
|
|
28
|
+
encodeFinishTimestamp: number;
|
|
29
|
+
packetizerFinishTimestamp: number;
|
|
30
|
+
pacerExitTimestamp: number;
|
|
31
|
+
networkTimestamp1: number;
|
|
32
|
+
networkTimestamp2: number;
|
|
33
|
+
receiveStart: number;
|
|
34
|
+
receiveFinish: number;
|
|
35
|
+
decodeStart: number;
|
|
36
|
+
decodeFinish: number;
|
|
37
|
+
renderTime: number;
|
|
38
|
+
isOutlier: boolean;
|
|
39
|
+
isTriggeredByTimer: boolean;
|
|
40
|
+
encoderLatencyMs: number;
|
|
41
|
+
packetizeLatencyMs: number;
|
|
42
|
+
pacerLatencyMs: number;
|
|
43
|
+
captureToSendLatencyMs: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calculates a combination of latency statistics using purely WebRTC API.
|
|
47
|
+
*/
|
|
48
|
+
export declare class LatencyCalculator {
|
|
49
|
+
private latestSenderRecvClockOffset;
|
|
50
|
+
calculate(stats: AggregatedStats, receivers: RTCRtpReceiver[]): LatencyInfo;
|
|
51
|
+
private extractFrameTimingInfo;
|
|
52
|
+
private calculateSenderLatency;
|
|
53
|
+
/**
|
|
54
|
+
* Find the first valid ssrc or csrc that has capture time fields present from abs-capture-time header extension.
|
|
55
|
+
* @param receivers The RTP receviers this peer connection has.
|
|
56
|
+
* @returns A single valid ssrc or csrc that has capture time fields or null if there is none (e.g. in non-chromium browsers it will be null).
|
|
57
|
+
*/
|
|
58
|
+
private getCaptureSource;
|
|
59
|
+
private calculateSenderReceiverClockOffset;
|
|
60
|
+
private getRTTMs;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A collection of latency information calculated using the WebRTC API.
|
|
64
|
+
* Most stats are calculated following the spec:
|
|
65
|
+
* https://w3c.github.io/webrtc-stats/#dictionary-rtcinboundrtpstreamstats-members
|
|
66
|
+
*/
|
|
67
|
+
export declare class LatencyInfo {
|
|
68
|
+
/**
|
|
69
|
+
* The time taken from the moment a frame is done capturing to the moment it is sent over the network.
|
|
70
|
+
* Note: This can only be calculated if both offer and answer contain the
|
|
71
|
+
* the RTP header extension for `video-timing` (Chrome only for now)
|
|
72
|
+
*/
|
|
73
|
+
senderLatencyMs: number | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* The time taken from the moment a frame is done capturing to the moment it is sent over the network.
|
|
76
|
+
* Note: This can only be calculated if both offer and answer contain the
|
|
77
|
+
* the RTP header extension for `abs-capture-time` (Chrome only for now)
|
|
78
|
+
*/
|
|
79
|
+
senderLatencyAbsCaptureTimeMs: number | undefined;
|
|
80
|
+
rttMs: number | undefined;
|
|
81
|
+
averageProcessingDelayMs: number | undefined;
|
|
82
|
+
averageJitterBufferDelayMs: number | undefined;
|
|
83
|
+
averageDecodeLatencyMs: number | undefined;
|
|
84
|
+
averageAssemblyDelayMs: number | undefined;
|
|
85
|
+
averageE2ELatency: number | undefined;
|
|
86
|
+
frameTiming: FrameTimingInfo | undefined;
|
|
87
|
+
}
|
|
@@ -1,23 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Outbound
|
|
2
|
+
* Outbound RTP stats collected from the RTC Stats Report under `outbound-rtp`.
|
|
3
|
+
* Wrapper around: https://developer.mozilla.org/en-US/docs/Web/API/RTCOutboundRtpStreamStats
|
|
4
|
+
* These are stats for video we are sending to a remote peer.
|
|
3
5
|
*/
|
|
4
|
-
export declare class
|
|
6
|
+
export declare class OutboundRTPStats {
|
|
7
|
+
active: boolean | undefined;
|
|
8
|
+
codecId: string | undefined;
|
|
5
9
|
bytesSent: number;
|
|
10
|
+
frameHeight: number | undefined;
|
|
11
|
+
frameWidth: number | undefined;
|
|
12
|
+
framesEncoded: number | undefined;
|
|
13
|
+
framesPerSecond: number | undefined;
|
|
14
|
+
framesSent: number | undefined;
|
|
15
|
+
headerBytesSent: number;
|
|
6
16
|
id: string;
|
|
7
|
-
|
|
17
|
+
keyFramesEncoded: number | undefined;
|
|
18
|
+
kind: string;
|
|
19
|
+
mediaSourceId: string | undefined;
|
|
20
|
+
mid: string | undefined;
|
|
21
|
+
nackCount: number | undefined;
|
|
8
22
|
packetsSent: number;
|
|
9
|
-
|
|
23
|
+
qpSum: number | undefined;
|
|
24
|
+
qualityLimitationDurations: number | undefined;
|
|
25
|
+
qualityLimitationReason: string | undefined;
|
|
26
|
+
remoteId: string | undefined;
|
|
27
|
+
retransmittedBytesSent: number;
|
|
28
|
+
rid: string | undefined;
|
|
29
|
+
scalabilityMode: string | undefined;
|
|
30
|
+
ssrc: string;
|
|
31
|
+
targetBitrate: number | undefined;
|
|
10
32
|
timestamp: number;
|
|
33
|
+
totalEncodeTime: number | undefined;
|
|
34
|
+
totalEncodeBytesTarget: number | undefined;
|
|
35
|
+
totalPacketSendDelay: number | undefined;
|
|
36
|
+
transportId: string | undefined;
|
|
11
37
|
}
|
|
12
38
|
/**
|
|
13
|
-
*
|
|
39
|
+
* Remote outbound stats collected from the RTC Stats Report under `remote-outbound-rtp`.
|
|
40
|
+
* Wrapper around: https://developer.mozilla.org/en-US/docs/Web/API/RTCRemoteOutboundRtpStreamStats
|
|
41
|
+
* These are stats for media we are receiving from a remote peer.
|
|
14
42
|
*/
|
|
15
|
-
export declare class
|
|
43
|
+
export declare class RemoteOutboundRTPStats {
|
|
44
|
+
bytesSent: number | undefined;
|
|
45
|
+
codecId: string;
|
|
46
|
+
id: string | undefined;
|
|
16
47
|
kind: string;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
48
|
+
localId: string | undefined;
|
|
49
|
+
packetsSent: number | undefined;
|
|
50
|
+
remoteTimestamp: number | undefined;
|
|
51
|
+
reportsSent: number | undefined;
|
|
52
|
+
roundTripTimeMeasurements: number | undefined;
|
|
53
|
+
ssrc: string;
|
|
54
|
+
timestamp: number | undefined;
|
|
55
|
+
totalRoundTripTime: number | undefined;
|
|
56
|
+
transportId: string | undefined;
|
|
23
57
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Config } from '../Config/Config';
|
|
2
2
|
import { AggregatedStats } from './AggregatedStats';
|
|
3
|
+
import { LatencyCalculator, LatencyInfo } from './LatencyCalculator';
|
|
4
|
+
export declare const kAbsCaptureTime = "http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time";
|
|
3
5
|
/**
|
|
4
6
|
* Handles the Peer Connection
|
|
5
7
|
*/
|
|
@@ -11,6 +13,7 @@ export declare class PeerConnectionController {
|
|
|
11
13
|
updateCodecSelection: boolean;
|
|
12
14
|
videoTrack: MediaStreamTrack;
|
|
13
15
|
audioTrack: MediaStreamTrack;
|
|
16
|
+
latencyCalculator: LatencyCalculator;
|
|
14
17
|
/**
|
|
15
18
|
* Create a new RTC Peer Connection client
|
|
16
19
|
* @param options - Peer connection Options
|
|
@@ -24,7 +27,7 @@ export declare class PeerConnectionController {
|
|
|
24
27
|
*/
|
|
25
28
|
createOffer(offerOptions: RTCOfferOptions, config: Config): Promise<void>;
|
|
26
29
|
/**
|
|
27
|
-
*
|
|
30
|
+
* Receive offer from UE side and process it as the remote description of this peer connection
|
|
28
31
|
*/
|
|
29
32
|
receiveOffer(offer: RTCSessionDescriptionInit, config: Config): Promise<void>;
|
|
30
33
|
/**
|
|
@@ -47,6 +50,7 @@ export declare class PeerConnectionController {
|
|
|
47
50
|
* @returns A modified Session Descriptor
|
|
48
51
|
*/
|
|
49
52
|
mungeSDP(sdp: string, useMic: boolean): string;
|
|
53
|
+
isFirefox(): boolean;
|
|
50
54
|
/**
|
|
51
55
|
* When a Ice Candidate is received add to the RTC Peer Connection
|
|
52
56
|
* @param iceCandidate - RTC Ice Candidate from the Signaling Server
|
|
@@ -121,16 +125,26 @@ export declare class PeerConnectionController {
|
|
|
121
125
|
* @param event - Aggregated Stats
|
|
122
126
|
*/
|
|
123
127
|
onVideoStats(event: AggregatedStats): void;
|
|
128
|
+
/**
|
|
129
|
+
* And override event for when latency info is calculated
|
|
130
|
+
* @param latencyInfo - Calculated latency information.
|
|
131
|
+
*/
|
|
132
|
+
onLatencyCalculated(latencyInfo: LatencyInfo): void;
|
|
124
133
|
/**
|
|
125
134
|
* Event to send the RTC offer to the Signaling server
|
|
126
135
|
* @param offer - RTC Offer
|
|
127
136
|
*/
|
|
128
137
|
onSendWebRTCOffer(offer: RTCSessionDescriptionInit): void;
|
|
129
138
|
/**
|
|
130
|
-
* Event
|
|
139
|
+
* Event fired when remote offer description is set.
|
|
140
|
+
* @param offer - RTC Offer
|
|
141
|
+
*/
|
|
142
|
+
onSetRemoteDescription(offer: RTCSessionDescriptionInit): void;
|
|
143
|
+
/**
|
|
144
|
+
* Event fire when local description answer is set.
|
|
131
145
|
* @param answer - RTC Answer
|
|
132
146
|
*/
|
|
133
|
-
|
|
147
|
+
onSetLocalDescription(answer: RTCSessionDescriptionInit): void;
|
|
134
148
|
/**
|
|
135
149
|
* An override for showing the Peer connection connecting Overlay
|
|
136
150
|
*/
|
|
@@ -8,6 +8,7 @@ import { WebXRController } from '../WebXR/WebXRController';
|
|
|
8
8
|
import { MessageDirection } from '../UeInstanceMessage/StreamMessageController';
|
|
9
9
|
import { DataChannelLatencyTestConfig, DataChannelLatencyTestController } from '../DataChannel/DataChannelLatencyTestController';
|
|
10
10
|
import { DataChannelLatencyTestResponse } from '../DataChannel/DataChannelLatencyTestResults';
|
|
11
|
+
import { LatencyInfo } from '../PeerConnectionController/LatencyCalculator';
|
|
11
12
|
export interface PixelStreamingOverrides {
|
|
12
13
|
/** The DOM element where Pixel Streaming video and user input event handlers are attached to.
|
|
13
14
|
* You can give an existing DOM element here. If not given, the library will create a new div element
|
|
@@ -109,15 +110,27 @@ export declare class PixelStreaming {
|
|
|
109
110
|
muteCamera(): void;
|
|
110
111
|
private setCameraMuted;
|
|
111
112
|
/**
|
|
112
|
-
*
|
|
113
|
+
* Internal function to emit an event when auto connecting occurs
|
|
113
114
|
*/
|
|
114
115
|
_onWebRtcAutoConnect(): void;
|
|
115
116
|
/**
|
|
116
|
-
*
|
|
117
|
+
* Internal function to emit an event for when SDP negotiation is fully finished.
|
|
117
118
|
*/
|
|
118
119
|
_onWebRtcSdp(): void;
|
|
119
120
|
/**
|
|
120
|
-
*
|
|
121
|
+
* Internal function to emit an SDP offer after it has been set.
|
|
122
|
+
*/
|
|
123
|
+
_onWebRtcSdpOffer(offer: RTCSessionDescriptionInit): void;
|
|
124
|
+
/**
|
|
125
|
+
* Internal function to emit an SDP answer after it has been set.
|
|
126
|
+
*/
|
|
127
|
+
_onWebRtcSdpAnswer(answer: RTCSessionDescriptionInit): void;
|
|
128
|
+
/**
|
|
129
|
+
* Internal function call to emit a `latencyCalculated` event.
|
|
130
|
+
*/
|
|
131
|
+
_onLatencyCalculated(latencyInfo: LatencyInfo): void;
|
|
132
|
+
/**
|
|
133
|
+
* Internal function to emits a StreamLoading event
|
|
121
134
|
*/
|
|
122
135
|
_onStreamLoading(): void;
|
|
123
136
|
/**
|
|
@@ -2,6 +2,7 @@ import { FlagsIds, NumericParametersIds, OptionParametersIds, TextParametersIds
|
|
|
2
2
|
import { LatencyTestResults } from '../DataChannel/LatencyTestResults';
|
|
3
3
|
import { AggregatedStats } from '../PeerConnectionController/AggregatedStats';
|
|
4
4
|
import { InitialSettings } from '../DataChannel/InitialSettings';
|
|
5
|
+
import { LatencyInfo } from '../PeerConnectionController/LatencyCalculator';
|
|
5
6
|
import { Messages } from '@epicgames-ps/lib-pixelstreamingcommon-ue5.5';
|
|
6
7
|
import { SettingFlag } from '../Config/SettingFlag';
|
|
7
8
|
import { SettingNumber } from '../Config/SettingNumber';
|
|
@@ -65,6 +66,28 @@ export declare class WebRtcSdpEvent extends Event {
|
|
|
65
66
|
readonly type: 'webRtcSdp';
|
|
66
67
|
constructor();
|
|
67
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* An event that is emitted after the SDP answer is set.
|
|
71
|
+
*/
|
|
72
|
+
export declare class WebRtcSdpAnswerEvent extends Event {
|
|
73
|
+
readonly type: 'webRtcSdpAnswer';
|
|
74
|
+
readonly data: {
|
|
75
|
+
/** The sdp answer */
|
|
76
|
+
sdp: RTCSessionDescriptionInit;
|
|
77
|
+
};
|
|
78
|
+
constructor(data: WebRtcSdpAnswerEvent['data']);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* An event that is emitted after the SDP offer is set.
|
|
82
|
+
*/
|
|
83
|
+
export declare class WebRtcSdpOfferEvent extends Event {
|
|
84
|
+
readonly type: 'webRtcSdpOffer';
|
|
85
|
+
readonly data: {
|
|
86
|
+
/** The sdp offer */
|
|
87
|
+
sdp: RTCSessionDescriptionInit;
|
|
88
|
+
};
|
|
89
|
+
constructor(data: WebRtcSdpOfferEvent['data']);
|
|
90
|
+
}
|
|
68
91
|
/**
|
|
69
92
|
* An event that is emitted when auto connecting.
|
|
70
93
|
*/
|
|
@@ -280,6 +303,16 @@ export declare class LatencyTestResultEvent extends Event {
|
|
|
280
303
|
};
|
|
281
304
|
constructor(data: LatencyTestResultEvent['data']);
|
|
282
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* An event that is emitted everytime latency is calculated using the WebRTC stats API.
|
|
308
|
+
*/
|
|
309
|
+
export declare class LatencyCalculatedEvent extends Event {
|
|
310
|
+
readonly type: 'latencyCalculated';
|
|
311
|
+
readonly data: {
|
|
312
|
+
latencyInfo: LatencyInfo;
|
|
313
|
+
};
|
|
314
|
+
constructor(data: LatencyCalculatedEvent['data']);
|
|
315
|
+
}
|
|
283
316
|
/**
|
|
284
317
|
* An event that is emitted when receiving data channel latency test response from server.
|
|
285
318
|
* This event is handled by DataChannelLatencyTestController
|
|
@@ -408,7 +441,7 @@ export declare class WebRtcTCPRelayDetectedEvent extends Event {
|
|
|
408
441
|
readonly type: 'webRtcTCPRelayDetected';
|
|
409
442
|
constructor();
|
|
410
443
|
}
|
|
411
|
-
export type PixelStreamingEvent = AfkWarningActivateEvent | AfkWarningUpdateEvent | AfkWarningDeactivateEvent | AfkTimedOutEvent | VideoEncoderAvgQPEvent | WebRtcSdpEvent | WebRtcAutoConnectEvent | WebRtcConnectingEvent | WebRtcConnectedEvent | WebRtcFailedEvent | WebRtcDisconnectedEvent | DataChannelOpenEvent | DataChannelCloseEvent | DataChannelErrorEvent | VideoInitializedEvent | StreamLoadingEvent | StreamPreConnectEvent | StreamReconnectEvent | StreamPreDisconnectEvent | PlayStreamErrorEvent | PlayStreamEvent | PlayStreamRejectedEvent | LoadFreezeFrameEvent | HideFreezeFrameEvent | StatsReceivedEvent | StreamerListMessageEvent | StreamerIDChangedMessageEvent | LatencyTestResultEvent | DataChannelLatencyTestResponseEvent | DataChannelLatencyTestResultEvent | SubscribeFailedEvent | InitialSettingsEvent | SettingsChangedEvent | XrSessionStartedEvent | XrSessionEndedEvent | XrFrameEvent | PlayerCountEvent | WebRtcTCPRelayDetectedEvent;
|
|
444
|
+
export type PixelStreamingEvent = AfkWarningActivateEvent | AfkWarningUpdateEvent | AfkWarningDeactivateEvent | AfkTimedOutEvent | VideoEncoderAvgQPEvent | WebRtcSdpEvent | WebRtcSdpOfferEvent | WebRtcSdpAnswerEvent | WebRtcAutoConnectEvent | WebRtcConnectingEvent | WebRtcConnectedEvent | WebRtcFailedEvent | WebRtcDisconnectedEvent | DataChannelOpenEvent | DataChannelCloseEvent | DataChannelErrorEvent | VideoInitializedEvent | StreamLoadingEvent | StreamPreConnectEvent | StreamReconnectEvent | StreamPreDisconnectEvent | PlayStreamErrorEvent | PlayStreamEvent | PlayStreamRejectedEvent | LoadFreezeFrameEvent | HideFreezeFrameEvent | StatsReceivedEvent | StreamerListMessageEvent | StreamerIDChangedMessageEvent | LatencyCalculatedEvent | LatencyTestResultEvent | DataChannelLatencyTestResponseEvent | DataChannelLatencyTestResultEvent | SubscribeFailedEvent | InitialSettingsEvent | SettingsChangedEvent | XrSessionStartedEvent | XrSessionEndedEvent | XrFrameEvent | PlayerCountEvent | WebRtcTCPRelayDetectedEvent;
|
|
412
445
|
export declare class PixelStreamingEventEmitter extends EventTarget {
|
|
413
446
|
/**
|
|
414
447
|
* Dispatch a new event.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare class MockMediaStreamImpl implements MediaStream {
|
|
2
|
+
active: boolean;
|
|
3
|
+
id: string;
|
|
4
|
+
constructor(data?: MediaStream | MediaStreamTrack[]);
|
|
5
|
+
onaddtrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null;
|
|
6
|
+
onremovetrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null;
|
|
7
|
+
addTrack(track: MediaStreamTrack): void;
|
|
8
|
+
clone(): MediaStream;
|
|
9
|
+
getAudioTracks(): MediaStreamTrack[];
|
|
10
|
+
getTrackById(trackId: string): MediaStreamTrack | null;
|
|
11
|
+
getTracks(): MediaStreamTrack[];
|
|
12
|
+
getVideoTracks(): MediaStreamTrack[];
|
|
13
|
+
removeTrack(track: MediaStreamTrack): void;
|
|
14
|
+
addEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, options?: boolean | AddEventListenerOptions | undefined): void;
|
|
15
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void;
|
|
16
|
+
removeEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, options?: boolean | EventListenerOptions | undefined): void;
|
|
17
|
+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined): void;
|
|
18
|
+
dispatchEvent(event: Event): boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare class MockMediaStreamTrackImpl implements MediaStreamTrack {
|
|
21
|
+
contentHint: string;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
id: string;
|
|
24
|
+
kind: string;
|
|
25
|
+
label: string;
|
|
26
|
+
muted: boolean;
|
|
27
|
+
readyState: MediaStreamTrackState;
|
|
28
|
+
constructor();
|
|
29
|
+
onended: ((this: MediaStreamTrack, ev: Event) => any) | null;
|
|
30
|
+
onmute: ((this: MediaStreamTrack, ev: Event) => any) | null;
|
|
31
|
+
onunmute: ((this: MediaStreamTrack, ev: Event) => any) | null;
|
|
32
|
+
applyConstraints(constraints?: MediaTrackConstraints | undefined): Promise<void>;
|
|
33
|
+
clone(): MediaStreamTrack;
|
|
34
|
+
getCapabilities(): MediaTrackCapabilities;
|
|
35
|
+
getConstraints(): MediaTrackConstraints;
|
|
36
|
+
getSettings(): MediaTrackSettings;
|
|
37
|
+
stop(): void;
|
|
38
|
+
addEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions | undefined): void;
|
|
39
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void;
|
|
40
|
+
removeEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | EventListenerOptions | undefined): void;
|
|
41
|
+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined): void;
|
|
42
|
+
dispatchEvent(event: Event): boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare const mockMediaStream: () => void;
|
|
45
|
+
export declare const unmockMediaStream: () => void;
|
|
46
|
+
export declare const mockHTMLMediaElement: (options: {
|
|
47
|
+
ableToPlay: boolean;
|
|
48
|
+
readyState?: number;
|
|
49
|
+
}) => void;
|