@livepeer-frameworks/player-core 0.0.3
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/index.js +19493 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.js +19398 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/player.css +2140 -0
- package/dist/types/core/ABRController.d.ts +164 -0
- package/dist/types/core/CodecUtils.d.ts +54 -0
- package/dist/types/core/Disposable.d.ts +61 -0
- package/dist/types/core/EventEmitter.d.ts +73 -0
- package/dist/types/core/GatewayClient.d.ts +144 -0
- package/dist/types/core/InteractionController.d.ts +121 -0
- package/dist/types/core/LiveDurationProxy.d.ts +102 -0
- package/dist/types/core/MetaTrackManager.d.ts +220 -0
- package/dist/types/core/MistReporter.d.ts +163 -0
- package/dist/types/core/MistSignaling.d.ts +148 -0
- package/dist/types/core/PlayerController.d.ts +665 -0
- package/dist/types/core/PlayerInterface.d.ts +230 -0
- package/dist/types/core/PlayerManager.d.ts +182 -0
- package/dist/types/core/PlayerRegistry.d.ts +27 -0
- package/dist/types/core/QualityMonitor.d.ts +184 -0
- package/dist/types/core/ScreenWakeLockManager.d.ts +70 -0
- package/dist/types/core/SeekingUtils.d.ts +142 -0
- package/dist/types/core/StreamStateClient.d.ts +108 -0
- package/dist/types/core/SubtitleManager.d.ts +111 -0
- package/dist/types/core/TelemetryReporter.d.ts +79 -0
- package/dist/types/core/TimeFormat.d.ts +97 -0
- package/dist/types/core/TimerManager.d.ts +83 -0
- package/dist/types/core/UrlUtils.d.ts +81 -0
- package/dist/types/core/detector.d.ts +149 -0
- package/dist/types/core/index.d.ts +49 -0
- package/dist/types/core/scorer.d.ts +167 -0
- package/dist/types/core/selector.d.ts +9 -0
- package/dist/types/index.d.ts +45 -0
- package/dist/types/lib/utils.d.ts +2 -0
- package/dist/types/players/DashJsPlayer.d.ts +102 -0
- package/dist/types/players/HlsJsPlayer.d.ts +70 -0
- package/dist/types/players/MewsWsPlayer/SourceBufferManager.d.ts +119 -0
- package/dist/types/players/MewsWsPlayer/WebSocketManager.d.ts +60 -0
- package/dist/types/players/MewsWsPlayer/index.d.ts +220 -0
- package/dist/types/players/MewsWsPlayer/types.d.ts +89 -0
- package/dist/types/players/MistPlayer.d.ts +25 -0
- package/dist/types/players/MistWebRTCPlayer/index.d.ts +133 -0
- package/dist/types/players/NativePlayer.d.ts +143 -0
- package/dist/types/players/VideoJsPlayer.d.ts +59 -0
- package/dist/types/players/WebCodecsPlayer/JitterBuffer.d.ts +118 -0
- package/dist/types/players/WebCodecsPlayer/LatencyProfiles.d.ts +64 -0
- package/dist/types/players/WebCodecsPlayer/RawChunkParser.d.ts +63 -0
- package/dist/types/players/WebCodecsPlayer/SyncController.d.ts +174 -0
- package/dist/types/players/WebCodecsPlayer/WebSocketController.d.ts +164 -0
- package/dist/types/players/WebCodecsPlayer/index.d.ts +149 -0
- package/dist/types/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.d.ts +105 -0
- package/dist/types/players/WebCodecsPlayer/types.d.ts +395 -0
- package/dist/types/players/WebCodecsPlayer/worker/decoder.worker.d.ts +13 -0
- package/dist/types/players/WebCodecsPlayer/worker/types.d.ts +197 -0
- package/dist/types/players/index.d.ts +14 -0
- package/dist/types/styles/index.d.ts +11 -0
- package/dist/types/types.d.ts +363 -0
- package/dist/types/vanilla/FrameWorksPlayer.d.ts +143 -0
- package/dist/types/vanilla/index.d.ts +19 -0
- package/dist/workers/decoder.worker.js +989 -0
- package/dist/workers/decoder.worker.js.map +1 -0
- package/package.json +80 -0
- package/src/core/ABRController.ts +550 -0
- package/src/core/CodecUtils.ts +257 -0
- package/src/core/Disposable.ts +120 -0
- package/src/core/EventEmitter.ts +113 -0
- package/src/core/GatewayClient.ts +439 -0
- package/src/core/InteractionController.ts +712 -0
- package/src/core/LiveDurationProxy.ts +270 -0
- package/src/core/MetaTrackManager.ts +753 -0
- package/src/core/MistReporter.ts +543 -0
- package/src/core/MistSignaling.ts +346 -0
- package/src/core/PlayerController.ts +2829 -0
- package/src/core/PlayerInterface.ts +432 -0
- package/src/core/PlayerManager.ts +900 -0
- package/src/core/PlayerRegistry.ts +149 -0
- package/src/core/QualityMonitor.ts +597 -0
- package/src/core/ScreenWakeLockManager.ts +163 -0
- package/src/core/SeekingUtils.ts +364 -0
- package/src/core/StreamStateClient.ts +457 -0
- package/src/core/SubtitleManager.ts +297 -0
- package/src/core/TelemetryReporter.ts +308 -0
- package/src/core/TimeFormat.ts +205 -0
- package/src/core/TimerManager.ts +209 -0
- package/src/core/UrlUtils.ts +179 -0
- package/src/core/detector.ts +382 -0
- package/src/core/index.ts +140 -0
- package/src/core/scorer.ts +553 -0
- package/src/core/selector.ts +16 -0
- package/src/global.d.ts +11 -0
- package/src/index.ts +75 -0
- package/src/lib/utils.ts +6 -0
- package/src/players/DashJsPlayer.ts +642 -0
- package/src/players/HlsJsPlayer.ts +483 -0
- package/src/players/MewsWsPlayer/SourceBufferManager.ts +572 -0
- package/src/players/MewsWsPlayer/WebSocketManager.ts +241 -0
- package/src/players/MewsWsPlayer/index.ts +1065 -0
- package/src/players/MewsWsPlayer/types.ts +106 -0
- package/src/players/MistPlayer.ts +188 -0
- package/src/players/MistWebRTCPlayer/index.ts +703 -0
- package/src/players/NativePlayer.ts +820 -0
- package/src/players/VideoJsPlayer.ts +643 -0
- package/src/players/WebCodecsPlayer/JitterBuffer.ts +299 -0
- package/src/players/WebCodecsPlayer/LatencyProfiles.ts +151 -0
- package/src/players/WebCodecsPlayer/RawChunkParser.ts +151 -0
- package/src/players/WebCodecsPlayer/SyncController.ts +456 -0
- package/src/players/WebCodecsPlayer/WebSocketController.ts +564 -0
- package/src/players/WebCodecsPlayer/index.ts +1650 -0
- package/src/players/WebCodecsPlayer/polyfills/MediaStreamTrackGenerator.ts +379 -0
- package/src/players/WebCodecsPlayer/types.ts +542 -0
- package/src/players/WebCodecsPlayer/worker/decoder.worker.ts +1360 -0
- package/src/players/WebCodecsPlayer/worker/types.ts +276 -0
- package/src/players/index.ts +22 -0
- package/src/styles/animations.css +21 -0
- package/src/styles/index.ts +52 -0
- package/src/styles/player.css +2126 -0
- package/src/styles/tailwind.css +1015 -0
- package/src/types.ts +421 -0
- package/src/vanilla/FrameWorksPlayer.ts +367 -0
- package/src/vanilla/index.ts +22 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebCodecs Player Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the WebCodecs-based low-latency player.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Latency Profile Types
|
|
9
|
+
// ============================================================================
|
|
10
|
+
|
|
11
|
+
export type LatencyProfileName = 'ultra-low' | 'low' | 'balanced' | 'quality';
|
|
12
|
+
|
|
13
|
+
export interface LatencyProfile {
|
|
14
|
+
name: string;
|
|
15
|
+
/** Base buffer before decoding (ms) */
|
|
16
|
+
keepAway: number;
|
|
17
|
+
/** Multiplier for jitter in buffer calculation */
|
|
18
|
+
jitterMultiplier: number;
|
|
19
|
+
/** Buffer ratio threshold to trigger speed up (e.g., 2.0 = 200%) */
|
|
20
|
+
speedUpThreshold: number;
|
|
21
|
+
/** Buffer ratio threshold to trigger slow down (e.g., 0.6 = 60%) */
|
|
22
|
+
speedDownThreshold: number;
|
|
23
|
+
/** Maximum playback speed for catchup */
|
|
24
|
+
maxSpeedUp: number;
|
|
25
|
+
/** Minimum playback speed for slowdown */
|
|
26
|
+
minSpeedDown: number;
|
|
27
|
+
/** AudioWorklet ring buffer duration (ms) */
|
|
28
|
+
audioBufferMs: number;
|
|
29
|
+
/** Whether to use optimizeForLatency hint for decoders */
|
|
30
|
+
optimizeForLatency: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Raw Chunk Types (12-byte binary header protocol)
|
|
35
|
+
// ============================================================================
|
|
36
|
+
|
|
37
|
+
export type ChunkType = 'key' | 'delta' | 'init';
|
|
38
|
+
|
|
39
|
+
export interface RawChunk {
|
|
40
|
+
/** Track index from server */
|
|
41
|
+
trackIndex: number;
|
|
42
|
+
/** Frame type: key (keyframe), delta (P/B frame), init (codec init data) */
|
|
43
|
+
type: ChunkType;
|
|
44
|
+
/** Presentation timestamp in milliseconds */
|
|
45
|
+
timestamp: number;
|
|
46
|
+
/** Server-calculated offset in milliseconds (for A/V sync) */
|
|
47
|
+
offset: number;
|
|
48
|
+
/** Actual frame data */
|
|
49
|
+
data: Uint8Array;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Track Types
|
|
54
|
+
// ============================================================================
|
|
55
|
+
|
|
56
|
+
export type TrackType = 'video' | 'audio' | 'meta';
|
|
57
|
+
|
|
58
|
+
export interface TrackInfo {
|
|
59
|
+
idx: number;
|
|
60
|
+
type: TrackType;
|
|
61
|
+
codec: string;
|
|
62
|
+
codecstring?: string;
|
|
63
|
+
init?: string;
|
|
64
|
+
// Video-specific
|
|
65
|
+
width?: number;
|
|
66
|
+
height?: number;
|
|
67
|
+
fpks?: number; // frames per kilosecond
|
|
68
|
+
// Audio-specific
|
|
69
|
+
channels?: number;
|
|
70
|
+
rate?: number; // sample rate
|
|
71
|
+
size?: number; // bits per sample
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// WebSocket Control Messages
|
|
76
|
+
// ============================================================================
|
|
77
|
+
|
|
78
|
+
export type ControlMessageType =
|
|
79
|
+
| 'codec_data'
|
|
80
|
+
| 'info'
|
|
81
|
+
| 'on_time'
|
|
82
|
+
| 'tracks'
|
|
83
|
+
| 'set_speed'
|
|
84
|
+
| 'pause'
|
|
85
|
+
| 'on_stop'
|
|
86
|
+
| 'error';
|
|
87
|
+
|
|
88
|
+
export interface CodecDataMessage {
|
|
89
|
+
type: 'codec_data';
|
|
90
|
+
/** Current stream position in milliseconds */
|
|
91
|
+
current?: number;
|
|
92
|
+
/** List of WebCodecs-compatible codec strings (e.g., "avc1.42001f", "mp4a.40.2") */
|
|
93
|
+
codecs?: string[];
|
|
94
|
+
/** Track indices selected by server based on supported_combinations */
|
|
95
|
+
tracks?: number[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Stream info message with track metadata
|
|
100
|
+
* Sent by MistServer with full stream information
|
|
101
|
+
*/
|
|
102
|
+
export interface InfoMessage {
|
|
103
|
+
type: 'info';
|
|
104
|
+
/** Stream metadata including tracks */
|
|
105
|
+
meta?: {
|
|
106
|
+
tracks?: Record<string, TrackInfo>;
|
|
107
|
+
};
|
|
108
|
+
/** Stream type ('live' or 'vod') */
|
|
109
|
+
type_?: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface OnTimeMessage {
|
|
113
|
+
type: 'on_time';
|
|
114
|
+
/** Current playback time (seconds) */
|
|
115
|
+
current: number;
|
|
116
|
+
/** Total duration (seconds, Infinity for live) */
|
|
117
|
+
total: number;
|
|
118
|
+
/** Available buffer end time (seconds) */
|
|
119
|
+
available?: number;
|
|
120
|
+
/** End time of available content (seconds) */
|
|
121
|
+
end?: number;
|
|
122
|
+
/** Server-reported jitter (ms) */
|
|
123
|
+
jitter?: number;
|
|
124
|
+
/** Current play rate */
|
|
125
|
+
play_rate?: number | 'auto';
|
|
126
|
+
/** Current play rate (alias) */
|
|
127
|
+
play_rate_curr?: number | 'auto' | 'fast-forward';
|
|
128
|
+
/** Active track indices */
|
|
129
|
+
tracks?: number[];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface TracksMessage {
|
|
133
|
+
type: 'tracks';
|
|
134
|
+
tracks: TrackInfo[];
|
|
135
|
+
codecs?: string[];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface SetSpeedMessage {
|
|
139
|
+
type: 'set_speed';
|
|
140
|
+
play_rate: number | 'auto';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface PauseMessage {
|
|
144
|
+
type: 'pause';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface OnStopMessage {
|
|
148
|
+
type: 'on_stop';
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface ErrorMessage {
|
|
152
|
+
type: 'error';
|
|
153
|
+
message: string;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export type ControlMessage =
|
|
157
|
+
| CodecDataMessage
|
|
158
|
+
| InfoMessage
|
|
159
|
+
| OnTimeMessage
|
|
160
|
+
| TracksMessage
|
|
161
|
+
| SetSpeedMessage
|
|
162
|
+
| PauseMessage
|
|
163
|
+
| OnStopMessage
|
|
164
|
+
| ErrorMessage;
|
|
165
|
+
|
|
166
|
+
// Outbound control commands
|
|
167
|
+
export interface PlayCommand {
|
|
168
|
+
type: 'play';
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export interface HoldCommand {
|
|
172
|
+
type: 'hold';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export interface SeekCommand {
|
|
176
|
+
type: 'seek';
|
|
177
|
+
seek_time: number; // milliseconds
|
|
178
|
+
ff_add?: number; // fast-forward buffer request (ms)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface SetSpeedCommand {
|
|
182
|
+
type: 'set_speed';
|
|
183
|
+
play_rate: number | 'auto';
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface RequestCodecDataCommand {
|
|
187
|
+
type: 'request_codec_data';
|
|
188
|
+
/** Supported codec combinations - array of [video codecs[], audio codecs[]] */
|
|
189
|
+
supported_combinations?: string[][][];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface FastForwardCommand {
|
|
193
|
+
type: 'fast_forward';
|
|
194
|
+
ff_add: number; // milliseconds of additional data to request
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export type ControlCommand =
|
|
198
|
+
| PlayCommand
|
|
199
|
+
| HoldCommand
|
|
200
|
+
| SeekCommand
|
|
201
|
+
| SetSpeedCommand
|
|
202
|
+
| RequestCodecDataCommand
|
|
203
|
+
| FastForwardCommand;
|
|
204
|
+
|
|
205
|
+
// ============================================================================
|
|
206
|
+
// Worker Message Types
|
|
207
|
+
// ============================================================================
|
|
208
|
+
|
|
209
|
+
// Main thread -> Worker messages
|
|
210
|
+
export interface CreatePipelineMessage {
|
|
211
|
+
type: 'create';
|
|
212
|
+
idx: number;
|
|
213
|
+
track: TrackInfo;
|
|
214
|
+
opts: {
|
|
215
|
+
optimizeForLatency: boolean;
|
|
216
|
+
};
|
|
217
|
+
uid?: number;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export interface ConfigurePipelineMessage {
|
|
221
|
+
type: 'configure';
|
|
222
|
+
idx: number;
|
|
223
|
+
header: Uint8Array;
|
|
224
|
+
uid?: number;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export interface ReceiveChunkMessage {
|
|
228
|
+
type: 'receive';
|
|
229
|
+
idx: number;
|
|
230
|
+
chunk: {
|
|
231
|
+
type: 'key' | 'delta';
|
|
232
|
+
timestamp: number; // microseconds
|
|
233
|
+
data: Uint8Array;
|
|
234
|
+
};
|
|
235
|
+
uid?: number;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface SetWritableMessage {
|
|
239
|
+
type: 'setwritable';
|
|
240
|
+
idx: number;
|
|
241
|
+
writable: WritableStream;
|
|
242
|
+
uid?: number;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export interface CreateGeneratorMessage {
|
|
246
|
+
type: 'creategenerator';
|
|
247
|
+
idx: number;
|
|
248
|
+
uid?: number;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
export interface ClosePipelineMessage {
|
|
252
|
+
type: 'close';
|
|
253
|
+
idx: number;
|
|
254
|
+
waitEmpty?: boolean;
|
|
255
|
+
uid?: number;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export interface FrameTimingMessage {
|
|
259
|
+
type: 'frametiming';
|
|
260
|
+
action: 'setSpeed' | 'reset';
|
|
261
|
+
speed?: number;
|
|
262
|
+
tweak?: number;
|
|
263
|
+
uid?: number;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export interface SeekWorkerMessage {
|
|
267
|
+
type: 'seek';
|
|
268
|
+
seekTime: number; // milliseconds
|
|
269
|
+
uid?: number;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export interface DebuggingMessage {
|
|
273
|
+
type: 'debugging';
|
|
274
|
+
value: boolean | 'verbose';
|
|
275
|
+
uid?: number;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export type MainToWorkerMessage =
|
|
279
|
+
| CreatePipelineMessage
|
|
280
|
+
| ConfigurePipelineMessage
|
|
281
|
+
| ReceiveChunkMessage
|
|
282
|
+
| SetWritableMessage
|
|
283
|
+
| CreateGeneratorMessage
|
|
284
|
+
| ClosePipelineMessage
|
|
285
|
+
| FrameTimingMessage
|
|
286
|
+
| SeekWorkerMessage
|
|
287
|
+
| DebuggingMessage;
|
|
288
|
+
|
|
289
|
+
// Worker -> Main thread messages
|
|
290
|
+
export interface AddTrackMessage {
|
|
291
|
+
type: 'addtrack';
|
|
292
|
+
idx: number;
|
|
293
|
+
track?: MediaStreamTrack; // Safari only
|
|
294
|
+
uid?: number;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
export interface RemoveTrackMessage {
|
|
298
|
+
type: 'removetrack';
|
|
299
|
+
idx: number;
|
|
300
|
+
uid?: number;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export interface SetPlaybackRateMessage {
|
|
304
|
+
type: 'setplaybackrate';
|
|
305
|
+
speed: number;
|
|
306
|
+
uid?: number;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export interface ClosedMessage {
|
|
310
|
+
type: 'closed';
|
|
311
|
+
idx: number;
|
|
312
|
+
uid?: number;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export interface LogMessage {
|
|
316
|
+
type: 'log';
|
|
317
|
+
msg: string;
|
|
318
|
+
level?: 'info' | 'warn' | 'error';
|
|
319
|
+
uid?: number;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export interface SendEventMessage {
|
|
323
|
+
type: 'sendevent';
|
|
324
|
+
kind: string;
|
|
325
|
+
message?: string;
|
|
326
|
+
idx?: number;
|
|
327
|
+
uid?: number;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export interface StatsMessage {
|
|
331
|
+
type: 'stats';
|
|
332
|
+
stats: WorkerStats;
|
|
333
|
+
uid?: number;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export interface AckMessage {
|
|
337
|
+
type: 'ack';
|
|
338
|
+
idx?: number;
|
|
339
|
+
uid?: number;
|
|
340
|
+
status?: 'ok' | 'error';
|
|
341
|
+
error?: string;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export type WorkerToMainMessage =
|
|
345
|
+
| AddTrackMessage
|
|
346
|
+
| RemoveTrackMessage
|
|
347
|
+
| SetPlaybackRateMessage
|
|
348
|
+
| ClosedMessage
|
|
349
|
+
| LogMessage
|
|
350
|
+
| SendEventMessage
|
|
351
|
+
| StatsMessage
|
|
352
|
+
| AckMessage;
|
|
353
|
+
|
|
354
|
+
// ============================================================================
|
|
355
|
+
// Stats Types
|
|
356
|
+
// ============================================================================
|
|
357
|
+
|
|
358
|
+
export interface FrameTimingStats {
|
|
359
|
+
/** Timestamp when frame entered decoder (microseconds) */
|
|
360
|
+
in: number;
|
|
361
|
+
/** Timestamp when frame exited decoder (microseconds) */
|
|
362
|
+
decoded: number;
|
|
363
|
+
/** Timestamp when frame reached trackwriter (microseconds) */
|
|
364
|
+
out: number;
|
|
365
|
+
speed: {
|
|
366
|
+
main: number;
|
|
367
|
+
tweak: number;
|
|
368
|
+
combined: number;
|
|
369
|
+
};
|
|
370
|
+
seeking: boolean;
|
|
371
|
+
paused: boolean;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export interface PipelineStats {
|
|
375
|
+
/** How early frames arrive at trackwriter (negative = late) */
|
|
376
|
+
early: number | null;
|
|
377
|
+
/** Duration between frames (ms) */
|
|
378
|
+
frameDuration: number | null;
|
|
379
|
+
frames: {
|
|
380
|
+
in: number;
|
|
381
|
+
decoded: number;
|
|
382
|
+
out: number;
|
|
383
|
+
};
|
|
384
|
+
queues: {
|
|
385
|
+
in: number;
|
|
386
|
+
decoder: number;
|
|
387
|
+
out: number;
|
|
388
|
+
};
|
|
389
|
+
timing: {
|
|
390
|
+
decoder: FrameTrackerStats;
|
|
391
|
+
writable: FrameTrackerStats;
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export interface FrameTrackerStats {
|
|
396
|
+
lastIn: number | undefined;
|
|
397
|
+
lastOut: number | undefined;
|
|
398
|
+
delay: number | undefined;
|
|
399
|
+
delta: number | undefined;
|
|
400
|
+
shift: number | undefined;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
export interface WorkerStats {
|
|
404
|
+
frameTiming: FrameTimingStats;
|
|
405
|
+
pipelines: Record<number, PipelineStats>;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// ============================================================================
|
|
409
|
+
// Sync Controller Types
|
|
410
|
+
// ============================================================================
|
|
411
|
+
|
|
412
|
+
export interface BufferState {
|
|
413
|
+
/** Current buffer level (ms) */
|
|
414
|
+
current: number;
|
|
415
|
+
/** Desired buffer level (ms) */
|
|
416
|
+
desired: number;
|
|
417
|
+
/** Ratio of current/desired */
|
|
418
|
+
ratio: number;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
export interface JitterState {
|
|
422
|
+
/** Current jitter estimate (ms) */
|
|
423
|
+
current: number;
|
|
424
|
+
/** Peak jitter over sliding window (ms) */
|
|
425
|
+
peak: number;
|
|
426
|
+
/** Weighted average jitter (ms) */
|
|
427
|
+
weighted: number;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export interface SyncState {
|
|
431
|
+
buffer: BufferState;
|
|
432
|
+
jitter: JitterState;
|
|
433
|
+
/** Current playback speed (main * tweak) */
|
|
434
|
+
playbackSpeed: number;
|
|
435
|
+
/** Server-reported current time (seconds) */
|
|
436
|
+
serverTime: number;
|
|
437
|
+
/** Server delay estimate (ms) */
|
|
438
|
+
serverDelay: number;
|
|
439
|
+
/** A/V sync offset (ms, positive = audio ahead) */
|
|
440
|
+
avOffset: number;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// ============================================================================
|
|
444
|
+
// Event Types
|
|
445
|
+
// ============================================================================
|
|
446
|
+
|
|
447
|
+
export interface WebCodecsPlayerEvents {
|
|
448
|
+
ready: HTMLVideoElement;
|
|
449
|
+
error: string | Error;
|
|
450
|
+
play: void;
|
|
451
|
+
pause: void;
|
|
452
|
+
ended: void;
|
|
453
|
+
timeupdate: number;
|
|
454
|
+
waiting: void;
|
|
455
|
+
playing: void;
|
|
456
|
+
seeking: void;
|
|
457
|
+
seeked: void;
|
|
458
|
+
progress: void;
|
|
459
|
+
trackchange: { trackIndex: number; type: TrackType };
|
|
460
|
+
statsupdate: SyncState;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// ============================================================================
|
|
464
|
+
// Player Options Extensions
|
|
465
|
+
// ============================================================================
|
|
466
|
+
|
|
467
|
+
export interface WebCodecsPlayerOptions {
|
|
468
|
+
/** Latency profile preset */
|
|
469
|
+
latencyProfile?: LatencyProfileName;
|
|
470
|
+
/** Custom latency profile (overrides preset) */
|
|
471
|
+
customLatencyProfile?: Partial<LatencyProfile>;
|
|
472
|
+
/** Enable debug logging */
|
|
473
|
+
debug?: boolean;
|
|
474
|
+
/** Enable verbose frame logging */
|
|
475
|
+
verboseDebug?: boolean;
|
|
476
|
+
/** Stats update interval (ms), 0 to disable */
|
|
477
|
+
statsInterval?: number;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// ============================================================================
|
|
481
|
+
// Public Stats API (Phase 2A)
|
|
482
|
+
// ============================================================================
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Comprehensive player statistics for monitoring and debugging
|
|
486
|
+
*/
|
|
487
|
+
export interface WebCodecsStats {
|
|
488
|
+
/** Latency/buffer statistics */
|
|
489
|
+
latency: {
|
|
490
|
+
/** Current buffer level (ms) */
|
|
491
|
+
buffer: number;
|
|
492
|
+
/** Target buffer level (ms) */
|
|
493
|
+
target: number;
|
|
494
|
+
/** Estimated network jitter (ms) */
|
|
495
|
+
jitter: number;
|
|
496
|
+
};
|
|
497
|
+
/** Audio/Video sync statistics */
|
|
498
|
+
sync: {
|
|
499
|
+
/** A/V drift (ms, positive = video ahead of audio) */
|
|
500
|
+
avDrift: number;
|
|
501
|
+
/** Current playback speed (including adjustments) */
|
|
502
|
+
playbackSpeed: number;
|
|
503
|
+
};
|
|
504
|
+
/** Decoder statistics */
|
|
505
|
+
decoder: {
|
|
506
|
+
/** Video decoder queue size */
|
|
507
|
+
videoQueueSize: number;
|
|
508
|
+
/** Audio decoder queue size */
|
|
509
|
+
audioQueueSize: number;
|
|
510
|
+
/** Total frames dropped */
|
|
511
|
+
framesDropped: number;
|
|
512
|
+
/** Total frames decoded */
|
|
513
|
+
framesDecoded: number;
|
|
514
|
+
};
|
|
515
|
+
/** Network statistics */
|
|
516
|
+
network: {
|
|
517
|
+
/** Total bytes received */
|
|
518
|
+
bytesReceived: number;
|
|
519
|
+
/** Total messages received */
|
|
520
|
+
messagesReceived: number;
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// ============================================================================
|
|
525
|
+
// Utility Types
|
|
526
|
+
// ============================================================================
|
|
527
|
+
|
|
528
|
+
export interface DeferredPromise<T> {
|
|
529
|
+
promise: Promise<T>;
|
|
530
|
+
resolve: (value: T) => void;
|
|
531
|
+
reject: (reason?: any) => void;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
export function createDeferredPromise<T>(): DeferredPromise<T> {
|
|
535
|
+
let resolve!: (value: T) => void;
|
|
536
|
+
let reject!: (reason?: any) => void;
|
|
537
|
+
const promise = new Promise<T>((res, rej) => {
|
|
538
|
+
resolve = res;
|
|
539
|
+
reject = rej;
|
|
540
|
+
});
|
|
541
|
+
return { promise, resolve, reject };
|
|
542
|
+
}
|