@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,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebCodecs Player Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the WebCodecs-based low-latency player.
|
|
5
|
+
*/
|
|
6
|
+
export type LatencyProfileName = 'ultra-low' | 'low' | 'balanced' | 'quality';
|
|
7
|
+
export interface LatencyProfile {
|
|
8
|
+
name: string;
|
|
9
|
+
/** Base buffer before decoding (ms) */
|
|
10
|
+
keepAway: number;
|
|
11
|
+
/** Multiplier for jitter in buffer calculation */
|
|
12
|
+
jitterMultiplier: number;
|
|
13
|
+
/** Buffer ratio threshold to trigger speed up (e.g., 2.0 = 200%) */
|
|
14
|
+
speedUpThreshold: number;
|
|
15
|
+
/** Buffer ratio threshold to trigger slow down (e.g., 0.6 = 60%) */
|
|
16
|
+
speedDownThreshold: number;
|
|
17
|
+
/** Maximum playback speed for catchup */
|
|
18
|
+
maxSpeedUp: number;
|
|
19
|
+
/** Minimum playback speed for slowdown */
|
|
20
|
+
minSpeedDown: number;
|
|
21
|
+
/** AudioWorklet ring buffer duration (ms) */
|
|
22
|
+
audioBufferMs: number;
|
|
23
|
+
/** Whether to use optimizeForLatency hint for decoders */
|
|
24
|
+
optimizeForLatency: boolean;
|
|
25
|
+
}
|
|
26
|
+
export type ChunkType = 'key' | 'delta' | 'init';
|
|
27
|
+
export interface RawChunk {
|
|
28
|
+
/** Track index from server */
|
|
29
|
+
trackIndex: number;
|
|
30
|
+
/** Frame type: key (keyframe), delta (P/B frame), init (codec init data) */
|
|
31
|
+
type: ChunkType;
|
|
32
|
+
/** Presentation timestamp in milliseconds */
|
|
33
|
+
timestamp: number;
|
|
34
|
+
/** Server-calculated offset in milliseconds (for A/V sync) */
|
|
35
|
+
offset: number;
|
|
36
|
+
/** Actual frame data */
|
|
37
|
+
data: Uint8Array;
|
|
38
|
+
}
|
|
39
|
+
export type TrackType = 'video' | 'audio' | 'meta';
|
|
40
|
+
export interface TrackInfo {
|
|
41
|
+
idx: number;
|
|
42
|
+
type: TrackType;
|
|
43
|
+
codec: string;
|
|
44
|
+
codecstring?: string;
|
|
45
|
+
init?: string;
|
|
46
|
+
width?: number;
|
|
47
|
+
height?: number;
|
|
48
|
+
fpks?: number;
|
|
49
|
+
channels?: number;
|
|
50
|
+
rate?: number;
|
|
51
|
+
size?: number;
|
|
52
|
+
}
|
|
53
|
+
export type ControlMessageType = 'codec_data' | 'info' | 'on_time' | 'tracks' | 'set_speed' | 'pause' | 'on_stop' | 'error';
|
|
54
|
+
export interface CodecDataMessage {
|
|
55
|
+
type: 'codec_data';
|
|
56
|
+
/** Current stream position in milliseconds */
|
|
57
|
+
current?: number;
|
|
58
|
+
/** List of WebCodecs-compatible codec strings (e.g., "avc1.42001f", "mp4a.40.2") */
|
|
59
|
+
codecs?: string[];
|
|
60
|
+
/** Track indices selected by server based on supported_combinations */
|
|
61
|
+
tracks?: number[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stream info message with track metadata
|
|
65
|
+
* Sent by MistServer with full stream information
|
|
66
|
+
*/
|
|
67
|
+
export interface InfoMessage {
|
|
68
|
+
type: 'info';
|
|
69
|
+
/** Stream metadata including tracks */
|
|
70
|
+
meta?: {
|
|
71
|
+
tracks?: Record<string, TrackInfo>;
|
|
72
|
+
};
|
|
73
|
+
/** Stream type ('live' or 'vod') */
|
|
74
|
+
type_?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface OnTimeMessage {
|
|
77
|
+
type: 'on_time';
|
|
78
|
+
/** Current playback time (seconds) */
|
|
79
|
+
current: number;
|
|
80
|
+
/** Total duration (seconds, Infinity for live) */
|
|
81
|
+
total: number;
|
|
82
|
+
/** Available buffer end time (seconds) */
|
|
83
|
+
available?: number;
|
|
84
|
+
/** End time of available content (seconds) */
|
|
85
|
+
end?: number;
|
|
86
|
+
/** Server-reported jitter (ms) */
|
|
87
|
+
jitter?: number;
|
|
88
|
+
/** Current play rate */
|
|
89
|
+
play_rate?: number | 'auto';
|
|
90
|
+
/** Current play rate (alias) */
|
|
91
|
+
play_rate_curr?: number | 'auto' | 'fast-forward';
|
|
92
|
+
/** Active track indices */
|
|
93
|
+
tracks?: number[];
|
|
94
|
+
}
|
|
95
|
+
export interface TracksMessage {
|
|
96
|
+
type: 'tracks';
|
|
97
|
+
tracks: TrackInfo[];
|
|
98
|
+
codecs?: string[];
|
|
99
|
+
}
|
|
100
|
+
export interface SetSpeedMessage {
|
|
101
|
+
type: 'set_speed';
|
|
102
|
+
play_rate: number | 'auto';
|
|
103
|
+
}
|
|
104
|
+
export interface PauseMessage {
|
|
105
|
+
type: 'pause';
|
|
106
|
+
}
|
|
107
|
+
export interface OnStopMessage {
|
|
108
|
+
type: 'on_stop';
|
|
109
|
+
}
|
|
110
|
+
export interface ErrorMessage {
|
|
111
|
+
type: 'error';
|
|
112
|
+
message: string;
|
|
113
|
+
}
|
|
114
|
+
export type ControlMessage = CodecDataMessage | InfoMessage | OnTimeMessage | TracksMessage | SetSpeedMessage | PauseMessage | OnStopMessage | ErrorMessage;
|
|
115
|
+
export interface PlayCommand {
|
|
116
|
+
type: 'play';
|
|
117
|
+
}
|
|
118
|
+
export interface HoldCommand {
|
|
119
|
+
type: 'hold';
|
|
120
|
+
}
|
|
121
|
+
export interface SeekCommand {
|
|
122
|
+
type: 'seek';
|
|
123
|
+
seek_time: number;
|
|
124
|
+
ff_add?: number;
|
|
125
|
+
}
|
|
126
|
+
export interface SetSpeedCommand {
|
|
127
|
+
type: 'set_speed';
|
|
128
|
+
play_rate: number | 'auto';
|
|
129
|
+
}
|
|
130
|
+
export interface RequestCodecDataCommand {
|
|
131
|
+
type: 'request_codec_data';
|
|
132
|
+
/** Supported codec combinations - array of [video codecs[], audio codecs[]] */
|
|
133
|
+
supported_combinations?: string[][][];
|
|
134
|
+
}
|
|
135
|
+
export interface FastForwardCommand {
|
|
136
|
+
type: 'fast_forward';
|
|
137
|
+
ff_add: number;
|
|
138
|
+
}
|
|
139
|
+
export type ControlCommand = PlayCommand | HoldCommand | SeekCommand | SetSpeedCommand | RequestCodecDataCommand | FastForwardCommand;
|
|
140
|
+
export interface CreatePipelineMessage {
|
|
141
|
+
type: 'create';
|
|
142
|
+
idx: number;
|
|
143
|
+
track: TrackInfo;
|
|
144
|
+
opts: {
|
|
145
|
+
optimizeForLatency: boolean;
|
|
146
|
+
};
|
|
147
|
+
uid?: number;
|
|
148
|
+
}
|
|
149
|
+
export interface ConfigurePipelineMessage {
|
|
150
|
+
type: 'configure';
|
|
151
|
+
idx: number;
|
|
152
|
+
header: Uint8Array;
|
|
153
|
+
uid?: number;
|
|
154
|
+
}
|
|
155
|
+
export interface ReceiveChunkMessage {
|
|
156
|
+
type: 'receive';
|
|
157
|
+
idx: number;
|
|
158
|
+
chunk: {
|
|
159
|
+
type: 'key' | 'delta';
|
|
160
|
+
timestamp: number;
|
|
161
|
+
data: Uint8Array;
|
|
162
|
+
};
|
|
163
|
+
uid?: number;
|
|
164
|
+
}
|
|
165
|
+
export interface SetWritableMessage {
|
|
166
|
+
type: 'setwritable';
|
|
167
|
+
idx: number;
|
|
168
|
+
writable: WritableStream;
|
|
169
|
+
uid?: number;
|
|
170
|
+
}
|
|
171
|
+
export interface CreateGeneratorMessage {
|
|
172
|
+
type: 'creategenerator';
|
|
173
|
+
idx: number;
|
|
174
|
+
uid?: number;
|
|
175
|
+
}
|
|
176
|
+
export interface ClosePipelineMessage {
|
|
177
|
+
type: 'close';
|
|
178
|
+
idx: number;
|
|
179
|
+
waitEmpty?: boolean;
|
|
180
|
+
uid?: number;
|
|
181
|
+
}
|
|
182
|
+
export interface FrameTimingMessage {
|
|
183
|
+
type: 'frametiming';
|
|
184
|
+
action: 'setSpeed' | 'reset';
|
|
185
|
+
speed?: number;
|
|
186
|
+
tweak?: number;
|
|
187
|
+
uid?: number;
|
|
188
|
+
}
|
|
189
|
+
export interface SeekWorkerMessage {
|
|
190
|
+
type: 'seek';
|
|
191
|
+
seekTime: number;
|
|
192
|
+
uid?: number;
|
|
193
|
+
}
|
|
194
|
+
export interface DebuggingMessage {
|
|
195
|
+
type: 'debugging';
|
|
196
|
+
value: boolean | 'verbose';
|
|
197
|
+
uid?: number;
|
|
198
|
+
}
|
|
199
|
+
export type MainToWorkerMessage = CreatePipelineMessage | ConfigurePipelineMessage | ReceiveChunkMessage | SetWritableMessage | CreateGeneratorMessage | ClosePipelineMessage | FrameTimingMessage | SeekWorkerMessage | DebuggingMessage;
|
|
200
|
+
export interface AddTrackMessage {
|
|
201
|
+
type: 'addtrack';
|
|
202
|
+
idx: number;
|
|
203
|
+
track?: MediaStreamTrack;
|
|
204
|
+
uid?: number;
|
|
205
|
+
}
|
|
206
|
+
export interface RemoveTrackMessage {
|
|
207
|
+
type: 'removetrack';
|
|
208
|
+
idx: number;
|
|
209
|
+
uid?: number;
|
|
210
|
+
}
|
|
211
|
+
export interface SetPlaybackRateMessage {
|
|
212
|
+
type: 'setplaybackrate';
|
|
213
|
+
speed: number;
|
|
214
|
+
uid?: number;
|
|
215
|
+
}
|
|
216
|
+
export interface ClosedMessage {
|
|
217
|
+
type: 'closed';
|
|
218
|
+
idx: number;
|
|
219
|
+
uid?: number;
|
|
220
|
+
}
|
|
221
|
+
export interface LogMessage {
|
|
222
|
+
type: 'log';
|
|
223
|
+
msg: string;
|
|
224
|
+
level?: 'info' | 'warn' | 'error';
|
|
225
|
+
uid?: number;
|
|
226
|
+
}
|
|
227
|
+
export interface SendEventMessage {
|
|
228
|
+
type: 'sendevent';
|
|
229
|
+
kind: string;
|
|
230
|
+
message?: string;
|
|
231
|
+
idx?: number;
|
|
232
|
+
uid?: number;
|
|
233
|
+
}
|
|
234
|
+
export interface StatsMessage {
|
|
235
|
+
type: 'stats';
|
|
236
|
+
stats: WorkerStats;
|
|
237
|
+
uid?: number;
|
|
238
|
+
}
|
|
239
|
+
export interface AckMessage {
|
|
240
|
+
type: 'ack';
|
|
241
|
+
idx?: number;
|
|
242
|
+
uid?: number;
|
|
243
|
+
status?: 'ok' | 'error';
|
|
244
|
+
error?: string;
|
|
245
|
+
}
|
|
246
|
+
export type WorkerToMainMessage = AddTrackMessage | RemoveTrackMessage | SetPlaybackRateMessage | ClosedMessage | LogMessage | SendEventMessage | StatsMessage | AckMessage;
|
|
247
|
+
export interface FrameTimingStats {
|
|
248
|
+
/** Timestamp when frame entered decoder (microseconds) */
|
|
249
|
+
in: number;
|
|
250
|
+
/** Timestamp when frame exited decoder (microseconds) */
|
|
251
|
+
decoded: number;
|
|
252
|
+
/** Timestamp when frame reached trackwriter (microseconds) */
|
|
253
|
+
out: number;
|
|
254
|
+
speed: {
|
|
255
|
+
main: number;
|
|
256
|
+
tweak: number;
|
|
257
|
+
combined: number;
|
|
258
|
+
};
|
|
259
|
+
seeking: boolean;
|
|
260
|
+
paused: boolean;
|
|
261
|
+
}
|
|
262
|
+
export interface PipelineStats {
|
|
263
|
+
/** How early frames arrive at trackwriter (negative = late) */
|
|
264
|
+
early: number | null;
|
|
265
|
+
/** Duration between frames (ms) */
|
|
266
|
+
frameDuration: number | null;
|
|
267
|
+
frames: {
|
|
268
|
+
in: number;
|
|
269
|
+
decoded: number;
|
|
270
|
+
out: number;
|
|
271
|
+
};
|
|
272
|
+
queues: {
|
|
273
|
+
in: number;
|
|
274
|
+
decoder: number;
|
|
275
|
+
out: number;
|
|
276
|
+
};
|
|
277
|
+
timing: {
|
|
278
|
+
decoder: FrameTrackerStats;
|
|
279
|
+
writable: FrameTrackerStats;
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
export interface FrameTrackerStats {
|
|
283
|
+
lastIn: number | undefined;
|
|
284
|
+
lastOut: number | undefined;
|
|
285
|
+
delay: number | undefined;
|
|
286
|
+
delta: number | undefined;
|
|
287
|
+
shift: number | undefined;
|
|
288
|
+
}
|
|
289
|
+
export interface WorkerStats {
|
|
290
|
+
frameTiming: FrameTimingStats;
|
|
291
|
+
pipelines: Record<number, PipelineStats>;
|
|
292
|
+
}
|
|
293
|
+
export interface BufferState {
|
|
294
|
+
/** Current buffer level (ms) */
|
|
295
|
+
current: number;
|
|
296
|
+
/** Desired buffer level (ms) */
|
|
297
|
+
desired: number;
|
|
298
|
+
/** Ratio of current/desired */
|
|
299
|
+
ratio: number;
|
|
300
|
+
}
|
|
301
|
+
export interface JitterState {
|
|
302
|
+
/** Current jitter estimate (ms) */
|
|
303
|
+
current: number;
|
|
304
|
+
/** Peak jitter over sliding window (ms) */
|
|
305
|
+
peak: number;
|
|
306
|
+
/** Weighted average jitter (ms) */
|
|
307
|
+
weighted: number;
|
|
308
|
+
}
|
|
309
|
+
export interface SyncState {
|
|
310
|
+
buffer: BufferState;
|
|
311
|
+
jitter: JitterState;
|
|
312
|
+
/** Current playback speed (main * tweak) */
|
|
313
|
+
playbackSpeed: number;
|
|
314
|
+
/** Server-reported current time (seconds) */
|
|
315
|
+
serverTime: number;
|
|
316
|
+
/** Server delay estimate (ms) */
|
|
317
|
+
serverDelay: number;
|
|
318
|
+
/** A/V sync offset (ms, positive = audio ahead) */
|
|
319
|
+
avOffset: number;
|
|
320
|
+
}
|
|
321
|
+
export interface WebCodecsPlayerEvents {
|
|
322
|
+
ready: HTMLVideoElement;
|
|
323
|
+
error: string | Error;
|
|
324
|
+
play: void;
|
|
325
|
+
pause: void;
|
|
326
|
+
ended: void;
|
|
327
|
+
timeupdate: number;
|
|
328
|
+
waiting: void;
|
|
329
|
+
playing: void;
|
|
330
|
+
seeking: void;
|
|
331
|
+
seeked: void;
|
|
332
|
+
progress: void;
|
|
333
|
+
trackchange: {
|
|
334
|
+
trackIndex: number;
|
|
335
|
+
type: TrackType;
|
|
336
|
+
};
|
|
337
|
+
statsupdate: SyncState;
|
|
338
|
+
}
|
|
339
|
+
export interface WebCodecsPlayerOptions {
|
|
340
|
+
/** Latency profile preset */
|
|
341
|
+
latencyProfile?: LatencyProfileName;
|
|
342
|
+
/** Custom latency profile (overrides preset) */
|
|
343
|
+
customLatencyProfile?: Partial<LatencyProfile>;
|
|
344
|
+
/** Enable debug logging */
|
|
345
|
+
debug?: boolean;
|
|
346
|
+
/** Enable verbose frame logging */
|
|
347
|
+
verboseDebug?: boolean;
|
|
348
|
+
/** Stats update interval (ms), 0 to disable */
|
|
349
|
+
statsInterval?: number;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Comprehensive player statistics for monitoring and debugging
|
|
353
|
+
*/
|
|
354
|
+
export interface WebCodecsStats {
|
|
355
|
+
/** Latency/buffer statistics */
|
|
356
|
+
latency: {
|
|
357
|
+
/** Current buffer level (ms) */
|
|
358
|
+
buffer: number;
|
|
359
|
+
/** Target buffer level (ms) */
|
|
360
|
+
target: number;
|
|
361
|
+
/** Estimated network jitter (ms) */
|
|
362
|
+
jitter: number;
|
|
363
|
+
};
|
|
364
|
+
/** Audio/Video sync statistics */
|
|
365
|
+
sync: {
|
|
366
|
+
/** A/V drift (ms, positive = video ahead of audio) */
|
|
367
|
+
avDrift: number;
|
|
368
|
+
/** Current playback speed (including adjustments) */
|
|
369
|
+
playbackSpeed: number;
|
|
370
|
+
};
|
|
371
|
+
/** Decoder statistics */
|
|
372
|
+
decoder: {
|
|
373
|
+
/** Video decoder queue size */
|
|
374
|
+
videoQueueSize: number;
|
|
375
|
+
/** Audio decoder queue size */
|
|
376
|
+
audioQueueSize: number;
|
|
377
|
+
/** Total frames dropped */
|
|
378
|
+
framesDropped: number;
|
|
379
|
+
/** Total frames decoded */
|
|
380
|
+
framesDecoded: number;
|
|
381
|
+
};
|
|
382
|
+
/** Network statistics */
|
|
383
|
+
network: {
|
|
384
|
+
/** Total bytes received */
|
|
385
|
+
bytesReceived: number;
|
|
386
|
+
/** Total messages received */
|
|
387
|
+
messagesReceived: number;
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
export interface DeferredPromise<T> {
|
|
391
|
+
promise: Promise<T>;
|
|
392
|
+
resolve: (value: T) => void;
|
|
393
|
+
reject: (reason?: any) => void;
|
|
394
|
+
}
|
|
395
|
+
export declare function createDeferredPromise<T>(): DeferredPromise<T>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebCodecs Decoder Worker
|
|
3
|
+
*
|
|
4
|
+
* Handles VideoDecoder and AudioDecoder in a dedicated worker thread.
|
|
5
|
+
* This keeps decoding off the main thread for better performance.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Video/Audio pipeline management per track
|
|
9
|
+
* - Frame scheduling based on timestamps and playback speed
|
|
10
|
+
* - Stats collection and reporting
|
|
11
|
+
* - Seek handling with queue flush
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-specific Types for WebCodecs Player
|
|
3
|
+
*
|
|
4
|
+
* These types define the message protocol between main thread and worker.
|
|
5
|
+
*/
|
|
6
|
+
import type { TrackInfo, FrameTimingStats, PipelineStats } from '../types';
|
|
7
|
+
export interface CreateMessage {
|
|
8
|
+
type: 'create';
|
|
9
|
+
idx: number;
|
|
10
|
+
track: TrackInfo;
|
|
11
|
+
opts: {
|
|
12
|
+
optimizeForLatency: boolean;
|
|
13
|
+
};
|
|
14
|
+
uid: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ConfigureMessage {
|
|
17
|
+
type: 'configure';
|
|
18
|
+
idx: number;
|
|
19
|
+
header: Uint8Array;
|
|
20
|
+
uid: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ReceiveMessage {
|
|
23
|
+
type: 'receive';
|
|
24
|
+
idx: number;
|
|
25
|
+
chunk: {
|
|
26
|
+
type: 'key' | 'delta';
|
|
27
|
+
timestamp: number;
|
|
28
|
+
data: Uint8Array;
|
|
29
|
+
};
|
|
30
|
+
uid: number;
|
|
31
|
+
}
|
|
32
|
+
export interface SetWritableMessage {
|
|
33
|
+
type: 'setwritable';
|
|
34
|
+
idx: number;
|
|
35
|
+
writable: WritableStream<VideoFrame | AudioData>;
|
|
36
|
+
uid: number;
|
|
37
|
+
}
|
|
38
|
+
export interface CreateGeneratorMessage {
|
|
39
|
+
type: 'creategenerator';
|
|
40
|
+
idx: number;
|
|
41
|
+
uid: number;
|
|
42
|
+
}
|
|
43
|
+
export interface CloseMessage {
|
|
44
|
+
type: 'close';
|
|
45
|
+
idx: number;
|
|
46
|
+
waitEmpty?: boolean;
|
|
47
|
+
uid: number;
|
|
48
|
+
}
|
|
49
|
+
export interface FrameTimingMessage {
|
|
50
|
+
type: 'frametiming';
|
|
51
|
+
action: 'setSpeed' | 'reset';
|
|
52
|
+
speed?: number;
|
|
53
|
+
tweak?: number;
|
|
54
|
+
uid: number;
|
|
55
|
+
}
|
|
56
|
+
export interface SeekMessage {
|
|
57
|
+
type: 'seek';
|
|
58
|
+
seekTime: number;
|
|
59
|
+
uid: number;
|
|
60
|
+
}
|
|
61
|
+
export interface DebuggingMessage {
|
|
62
|
+
type: 'debugging';
|
|
63
|
+
value: boolean | 'verbose';
|
|
64
|
+
uid: number;
|
|
65
|
+
}
|
|
66
|
+
export type MainToWorkerMessage = CreateMessage | ConfigureMessage | ReceiveMessage | SetWritableMessage | CreateGeneratorMessage | CloseMessage | FrameTimingMessage | SeekMessage | DebuggingMessage;
|
|
67
|
+
export interface AddTrackMessage {
|
|
68
|
+
type: 'addtrack';
|
|
69
|
+
idx: number;
|
|
70
|
+
track?: MediaStreamTrack;
|
|
71
|
+
uid: number;
|
|
72
|
+
status: 'ok';
|
|
73
|
+
}
|
|
74
|
+
export interface RemoveTrackMessage {
|
|
75
|
+
type: 'removetrack';
|
|
76
|
+
idx: number;
|
|
77
|
+
uid: number;
|
|
78
|
+
}
|
|
79
|
+
export interface SetPlaybackRateMessage {
|
|
80
|
+
type: 'setplaybackrate';
|
|
81
|
+
speed: number;
|
|
82
|
+
uid: number;
|
|
83
|
+
}
|
|
84
|
+
export interface ClosedMessage {
|
|
85
|
+
type: 'closed';
|
|
86
|
+
idx: number;
|
|
87
|
+
uid: number;
|
|
88
|
+
status: 'ok';
|
|
89
|
+
}
|
|
90
|
+
export interface LogMessage {
|
|
91
|
+
type: 'log';
|
|
92
|
+
msg: string;
|
|
93
|
+
level?: 'info' | 'warn' | 'error';
|
|
94
|
+
uid: number;
|
|
95
|
+
}
|
|
96
|
+
export interface SendEventMessage {
|
|
97
|
+
type: 'sendevent';
|
|
98
|
+
kind: string;
|
|
99
|
+
message?: string;
|
|
100
|
+
idx?: number;
|
|
101
|
+
uid: number;
|
|
102
|
+
}
|
|
103
|
+
export interface StatsUpdateMessage {
|
|
104
|
+
type: 'stats';
|
|
105
|
+
stats: {
|
|
106
|
+
frameTiming: FrameTimingStats;
|
|
107
|
+
pipelines: Record<number, PipelineStats>;
|
|
108
|
+
};
|
|
109
|
+
uid: number;
|
|
110
|
+
}
|
|
111
|
+
export interface AckMessage {
|
|
112
|
+
type: 'ack';
|
|
113
|
+
idx?: number;
|
|
114
|
+
uid: number;
|
|
115
|
+
status: 'ok' | 'error';
|
|
116
|
+
error?: string;
|
|
117
|
+
}
|
|
118
|
+
/** Safari audio: worker sends frames to main thread for writing */
|
|
119
|
+
export interface WriteFrameMessage {
|
|
120
|
+
type: 'writeframe';
|
|
121
|
+
idx: number;
|
|
122
|
+
frame: AudioData;
|
|
123
|
+
uid: number;
|
|
124
|
+
}
|
|
125
|
+
export type WorkerToMainMessage = AddTrackMessage | RemoveTrackMessage | SetPlaybackRateMessage | ClosedMessage | LogMessage | SendEventMessage | StatsUpdateMessage | AckMessage | WriteFrameMessage;
|
|
126
|
+
export interface FrameTiming {
|
|
127
|
+
/** When frame entered decoder (microseconds, performance.now() * 1000) */
|
|
128
|
+
in: number;
|
|
129
|
+
/** When frame exited decoder (microseconds) */
|
|
130
|
+
decoded: number;
|
|
131
|
+
/** When frame was written to output (microseconds) */
|
|
132
|
+
out: number;
|
|
133
|
+
speed: {
|
|
134
|
+
main: number;
|
|
135
|
+
tweak: number;
|
|
136
|
+
combined: number;
|
|
137
|
+
};
|
|
138
|
+
seeking: boolean;
|
|
139
|
+
paused: boolean;
|
|
140
|
+
/** Server-sent current time */
|
|
141
|
+
serverTime: number;
|
|
142
|
+
}
|
|
143
|
+
export interface DecodedFrame {
|
|
144
|
+
frame: VideoFrame | AudioData;
|
|
145
|
+
timestamp: number;
|
|
146
|
+
decodedAt: number;
|
|
147
|
+
}
|
|
148
|
+
export interface PipelineState {
|
|
149
|
+
idx: number;
|
|
150
|
+
track: TrackInfo;
|
|
151
|
+
configured: boolean;
|
|
152
|
+
closed: boolean;
|
|
153
|
+
decoder: VideoDecoder | AudioDecoder | null;
|
|
154
|
+
writable: WritableStream<VideoFrame | AudioData> | null;
|
|
155
|
+
writer: WritableStreamDefaultWriter<VideoFrame | AudioData> | null;
|
|
156
|
+
inputQueue: Array<{
|
|
157
|
+
type: 'key' | 'delta';
|
|
158
|
+
timestamp: number;
|
|
159
|
+
data: Uint8Array;
|
|
160
|
+
}>;
|
|
161
|
+
outputQueue: DecodedFrame[];
|
|
162
|
+
stats: {
|
|
163
|
+
framesIn: number;
|
|
164
|
+
framesDecoded: number;
|
|
165
|
+
framesOut: number;
|
|
166
|
+
framesDropped: number;
|
|
167
|
+
lastInputTimestamp: number;
|
|
168
|
+
lastOutputTimestamp: number;
|
|
169
|
+
decoderQueueSize: number;
|
|
170
|
+
lastChunkType: string;
|
|
171
|
+
lastChunkSize: number;
|
|
172
|
+
lastChunkBytes: string;
|
|
173
|
+
};
|
|
174
|
+
optimizeForLatency: boolean;
|
|
175
|
+
}
|
|
176
|
+
export interface ScheduleResult {
|
|
177
|
+
/** Whether frame should be output now */
|
|
178
|
+
shouldOutput: boolean;
|
|
179
|
+
/** How early/late frame is (negative = late) in ms */
|
|
180
|
+
earliness: number;
|
|
181
|
+
/** Suggested delay before next check (ms) */
|
|
182
|
+
checkDelayMs: number;
|
|
183
|
+
}
|
|
184
|
+
export interface VideoDecoderInit {
|
|
185
|
+
codec: string;
|
|
186
|
+
codedWidth?: number;
|
|
187
|
+
codedHeight?: number;
|
|
188
|
+
description?: Uint8Array;
|
|
189
|
+
hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software';
|
|
190
|
+
optimizeForLatency?: boolean;
|
|
191
|
+
}
|
|
192
|
+
export interface AudioDecoderInit {
|
|
193
|
+
codec: string;
|
|
194
|
+
sampleRate: number;
|
|
195
|
+
numberOfChannels: number;
|
|
196
|
+
description?: Uint8Array;
|
|
197
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player Implementations
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic player implementations that extend BasePlayer.
|
|
5
|
+
* These are used by PlayerRegistry for dynamic player selection.
|
|
6
|
+
*/
|
|
7
|
+
export { NativePlayerImpl, DirectPlaybackPlayerImpl } from './NativePlayer';
|
|
8
|
+
export { HlsJsPlayerImpl } from './HlsJsPlayer';
|
|
9
|
+
export { DashJsPlayerImpl } from './DashJsPlayer';
|
|
10
|
+
export { VideoJsPlayerImpl } from './VideoJsPlayer';
|
|
11
|
+
export { MistPlayerImpl } from './MistPlayer';
|
|
12
|
+
export { MewsWsPlayerImpl } from './MewsWsPlayer';
|
|
13
|
+
export { MistWebRTCPlayerImpl } from './MistWebRTCPlayer';
|
|
14
|
+
export { WebCodecsPlayerImpl } from './WebCodecsPlayer';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures the compiled player stylesheet is imported once. When bundling with
|
|
3
|
+
* tools that respect package `style` fields, simply importing the module is enough.
|
|
4
|
+
* For host environments that do not, calling this helper will inject a link tag.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ensurePlayerStyles(): void;
|
|
7
|
+
/**
|
|
8
|
+
* For SSR-first apps, inject the CSS manually and mark it as applied.
|
|
9
|
+
*/
|
|
10
|
+
export declare function injectPlayerStyles(href?: string): void;
|
|
11
|
+
export default ensurePlayerStyles;
|