@vindral/web-sdk 4.1.8 → 4.1.9-10-g6fb644c9

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/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.1.8",
2
+ "version": "4.1.9-10-g6fb644c9",
3
3
  "name": "@vindral/web-sdk",
4
4
  "main": "./legacy.umd.js",
5
5
  "module": "./legacy.es.js",
package/player.d.ts CHANGED
@@ -20,17 +20,6 @@ interface Channel {
20
20
  */
21
21
  timeshiftUrls?: string[];
22
22
  }
23
- interface ClientOverrides {
24
- maxVideoBitRate?: number;
25
- minBufferTime?: number;
26
- maxBufferTime?: number;
27
- burstEnabled?: boolean;
28
- sizeBasedResolutionCapEnabled?: boolean;
29
- separateVideoSocketEnabled?: boolean;
30
- videoCodecs?: string[];
31
- }
32
- type AudioCodec = "aac" | "opus" | "mp3";
33
- type VideoCodec = "h264" | "av1";
34
23
  interface MinMaxAverage {
35
24
  last: number;
36
25
  /**
@@ -103,44 +92,16 @@ type Tagged<BaseType, Tag extends PropertyKey> = BaseType & {
103
92
  [K in Tag]: void;
104
93
  };
105
94
  };
106
- type Namespace = Tagged<Array<string>, "Namespace">;
107
- interface TrackObject {
108
- namespace?: Namespace;
109
- name: string;
110
- format: string;
111
- label?: string;
112
- renderGroup?: number;
113
- altGroup?: number;
114
- initData?: string;
115
- initTrack?: string;
116
- depends?: Array<string>;
117
- temporalId?: number;
118
- spatialId?: number;
119
- codec?: string;
120
- mimeType?: string;
121
- framerate?: [
122
- number,
123
- number
124
- ];
125
- bitrate?: number;
126
- width?: number;
127
- height?: number;
128
- samplerate?: number;
129
- channelConfig?: string;
130
- displayWidth?: number;
131
- displayHeight?: number;
132
- language?: string;
133
- ["com.vindral.variant_uid"]?: string;
134
- ["com.vindral.drm"]?: string;
135
- }
136
- interface CatalogRoot {
137
- version: number;
138
- streamingFormat?: number;
139
- streamingFormatVersion?: string;
140
- }
141
- interface TracksCatalog extends CatalogRoot {
142
- namespace: Namespace;
143
- tracks: Array<TrackObject>;
95
+ type AudioCodec = "aac" | "opus" | "mp3";
96
+ type VideoCodec = "h264" | "av1";
97
+ interface ReconnectState {
98
+ /**
99
+ * The number or retry attempts so far.
100
+ * This gets reset on every successful connect, so it will start from zero every
101
+ * time the client instance gets disconnected and will increment until the
102
+ * client instance makes a connection attempt is successful.
103
+ */
104
+ reconnectRetries: number;
144
105
  }
145
106
  interface RenditionProps {
146
107
  id: number;
@@ -183,78 +144,6 @@ type VideoRendition = VideoRenditionProps & RenditionProps;
183
144
  type AudioRendition = AudioRenditionProps & RenditionProps;
184
145
  type TextRendition = TextRenditionProps & RenditionProps;
185
146
  type Rendition = VideoRendition | AudioRendition | TextRendition;
186
- interface Telemetry {
187
- url: string;
188
- probability?: number;
189
- includeErrors?: boolean;
190
- includeEvents?: boolean;
191
- includeStats?: boolean;
192
- maxRetries?: number;
193
- maxErrorReports?: number;
194
- interval?: number;
195
- }
196
- interface ChannelWithCatalog extends Channel {
197
- catalog: TracksCatalog;
198
- renditions: Rendition[];
199
- overrides?: ClientOverrides;
200
- }
201
- interface ChannelWithRenditions extends Channel {
202
- renditions: Rendition[];
203
- overrides?: ClientOverrides;
204
- }
205
- interface ServerCertificateHash {
206
- algorithm: string;
207
- value: string;
208
- }
209
- interface Edge {
210
- moqUrl?: string;
211
- moqWsUrl: string;
212
- serverCertificateHashes?: ServerCertificateHash[];
213
- }
214
- interface MoQConnectInfo {
215
- logsUrl?: string;
216
- statsUrl?: string;
217
- telemetry?: Telemetry;
218
- channels: ChannelWithCatalog[];
219
- edges: Edge[];
220
- timeshift: {
221
- urls: string[];
222
- duration: string;
223
- };
224
- }
225
- interface VindralConnectInfo {
226
- logsUrl?: string;
227
- statsUrl?: string;
228
- telemetry?: Telemetry;
229
- channels: ChannelWithRenditions[];
230
- edges: string[];
231
- }
232
- type ConnectInfo = VindralConnectInfo | MoQConnectInfo;
233
- interface Metadata {
234
- /**
235
- * The raw string content as it was ingested (if using JSON, it needs to be parsed on your end)
236
- */
237
- content: string;
238
- /**
239
- * Timestamp in ms
240
- */
241
- timestamp: number;
242
- }
243
- interface TimeRange {
244
- /** */
245
- start: number;
246
- /** */
247
- end: number;
248
- }
249
- interface ReconnectState {
250
- /**
251
- * The number or retry attempts so far.
252
- * This gets reset on every successful connect, so it will start from zero every
253
- * time the client instance gets disconnected and will increment until the
254
- * client instance makes a connection attempt is successful.
255
- */
256
- reconnectRetries: number;
257
- }
258
147
  interface Size {
259
148
  /** */
260
149
  width: number;
@@ -306,6 +195,7 @@ interface DrmOptions {
306
195
  };
307
196
  }
308
197
  type Media = "audio" | "video" | "audio+video";
198
+ type WebCodecsHardwareAccelerationPreference = "no-preference" | "prefer-hardware" | "prefer-software";
309
199
  interface Options {
310
200
  /**
311
201
  * URL to use when connecting to the stream
@@ -506,6 +396,38 @@ interface Options {
506
396
  * Enables iOS devices to use a media element for playback. This enables fullscreen and picture in picture support on iOS.
507
397
  */
508
398
  iosMediaElementEnabled?: boolean;
399
+ /**
400
+ * Enable WebCodecs API for hardware-accelerated decoding.
401
+ *
402
+ * When enabled, the browser's native VideoDecoder and AudioDecoder APIs will be used instead
403
+ * of WASM decoding on supported browsers (Chrome 94+, Edge 94+, Safari 16.4+). This provides:
404
+ * - Hardware-accelerated decoding (uses GPU for video)
405
+ * - Better performance at higher resolutions
406
+ * - Lower CPU usage and battery consumption
407
+ *
408
+ * Disabled by default to allow gradual rollout and testing.
409
+ *
410
+ * Note: Automatically falls back to WASM decoding if:
411
+ * - The browser doesn't support WebCodecs
412
+ * - WebCodecs initialization fails
413
+ * - This option is set to false or undefined
414
+ */
415
+ webcodecsEnabled?: boolean;
416
+ /**
417
+ * Hardware acceleration preference for WebCodecs video decoding.
418
+ *
419
+ * Defaults to `"no-preference"`.
420
+ */
421
+ webcodecsHardwareAcceleration?: WebCodecsHardwareAccelerationPreference;
422
+ /**
423
+ * Enable OffscreenCanvas rendering in worker thread (requires webcodecsEnabled: true).
424
+ *
425
+ * When enabled, video rendering happens in the worker thread using OffscreenCanvas.
426
+ * Disabled by default to allow gradual rollout and testing.
427
+ *
428
+ * Note: Requires browser support for OffscreenCanvas and webcodecsEnabled must be true, and iosMediaElementEnabled must be false.
429
+ */
430
+ offscreenCanvasEnabled?: boolean;
509
431
  /**
510
432
  * Advanced options to override default behaviour.
511
433
  */
@@ -517,6 +439,120 @@ interface Options {
517
439
  */
518
440
  drm?: DrmOptions;
519
441
  }
442
+ interface ClientOverrides {
443
+ maxVideoBitRate?: number;
444
+ minBufferTime?: number;
445
+ maxBufferTime?: number;
446
+ burstEnabled?: boolean;
447
+ sizeBasedResolutionCapEnabled?: boolean;
448
+ separateVideoSocketEnabled?: boolean;
449
+ webcodecsEnabled?: boolean;
450
+ webcodecsHardwareAcceleration?: WebCodecsHardwareAccelerationPreference;
451
+ offscreenCanvasEnabled?: boolean;
452
+ videoCodecs?: string[];
453
+ }
454
+ type Namespace = Tagged<Array<string>, "Namespace">;
455
+ interface TrackObject {
456
+ namespace?: Namespace;
457
+ name: string;
458
+ format: string;
459
+ label?: string;
460
+ renderGroup?: number;
461
+ altGroup?: number;
462
+ initData?: string;
463
+ initTrack?: string;
464
+ depends?: Array<string>;
465
+ temporalId?: number;
466
+ spatialId?: number;
467
+ codec?: string;
468
+ mimeType?: string;
469
+ framerate?: [
470
+ number,
471
+ number
472
+ ];
473
+ bitrate?: number;
474
+ width?: number;
475
+ height?: number;
476
+ samplerate?: number;
477
+ channelConfig?: string;
478
+ displayWidth?: number;
479
+ displayHeight?: number;
480
+ language?: string;
481
+ ["com.vindral.variant_uid"]?: string;
482
+ ["com.vindral.drm"]?: string;
483
+ }
484
+ interface CatalogRoot {
485
+ version: number;
486
+ streamingFormat?: number;
487
+ streamingFormatVersion?: string;
488
+ }
489
+ interface TracksCatalog extends CatalogRoot {
490
+ namespace: Namespace;
491
+ tracks: Array<TrackObject>;
492
+ }
493
+ interface Telemetry {
494
+ url: string;
495
+ probability?: number;
496
+ includeErrors?: boolean;
497
+ includeEvents?: boolean;
498
+ includeStats?: boolean;
499
+ maxRetries?: number;
500
+ maxErrorReports?: number;
501
+ interval?: number;
502
+ }
503
+ interface ChannelWithCatalog extends Channel {
504
+ catalog: TracksCatalog;
505
+ renditions: Rendition[];
506
+ overrides?: ClientOverrides;
507
+ }
508
+ interface ChannelWithRenditions extends Channel {
509
+ renditions: Rendition[];
510
+ overrides?: ClientOverrides;
511
+ }
512
+ interface ServerCertificateHash {
513
+ algorithm: string;
514
+ value: string;
515
+ }
516
+ interface Edge {
517
+ moqUrl?: string;
518
+ moqWsUrl: string;
519
+ serverCertificateHashes?: ServerCertificateHash[];
520
+ }
521
+ interface MoQConnectInfo {
522
+ logsUrl?: string;
523
+ statsUrl?: string;
524
+ telemetry?: Telemetry;
525
+ channels: ChannelWithCatalog[];
526
+ edges: Edge[];
527
+ timeshift: {
528
+ urls: string[];
529
+ duration: string;
530
+ };
531
+ }
532
+ interface VindralConnectInfo {
533
+ logsUrl?: string;
534
+ statsUrl?: string;
535
+ telemetry?: Telemetry;
536
+ channels: ChannelWithRenditions[];
537
+ edges: string[];
538
+ }
539
+ type ConnectInfo = VindralConnectInfo | MoQConnectInfo;
540
+ interface Metadata {
541
+ /**
542
+ * The raw string content as it was ingested (if using JSON, it needs to be parsed on your end)
543
+ */
544
+ content: string;
545
+ /**
546
+ * Timestamp in ms
547
+ */
548
+ timestamp: number;
549
+ }
550
+ interface TimeRange {
551
+ /** */
552
+ start: number;
553
+ /** */
554
+ end: number;
555
+ }
520
556
  interface RenditionLevel {
521
557
  /** */
522
558
  audio?: AudioRendition;
@@ -1751,6 +1787,9 @@ export declare class Controller extends HTMLElement {
1751
1787
  "drm-playready-video-robustness",
1752
1788
  "drm-playready-audio-robustness",
1753
1789
  "webtransport-enabled",
1790
+ "webcodecs-enabled",
1791
+ "webcodecs-hardware-acceleration",
1792
+ "offscreen-canvas-enabled",
1754
1793
  "reconnect-retries",
1755
1794
  "auto-instance-enabled",
1756
1795
  "language"
@@ -1849,7 +1888,7 @@ export declare class PlayButton extends VindralButton {
1849
1888
  */
1850
1889
  export declare class Player extends HTMLElement {
1851
1890
  #private;
1852
- static observedAttributes: readonly ("title" | "advanced" | "poster" | "language" | "channels" | "buffering" | "paused" | "volume" | "muted" | "duration" | "user-interacting" | "is-casting" | "cast-available" | "cast-receiver-name" | "ui-locked" | "hide-ui-on-pause" | "is-fullscreen" | "is-fullscreen-fallback" | "rendition-levels" | "rendition-level" | "max-video-bit-rate" | "max-initial-bit-rate" | "channel-id" | "channel-group-id" | "pip-available" | "is-pip" | "airplay-available" | "is-airplaying" | "media" | "languages" | "text-tracks" | "text-track" | "needs-user-input-video" | "needs-user-input-audio" | "authentication-token" | "volume-level" | "cast" | "airplay" | "pip" | "fullscreen" | "vu-meter" | "timeshift" | "timeshift-position" | "poster-src" | "url" | "offline" | "edge-url" | "target-buffer-time" | "cast-receiver-id" | "cast-background" | "log-level" | "max-size" | "min-buffer-time" | "max-buffer-time" | "max-audio-bit-rate" | "burst-enabled" | "mse-enabled" | "mse-opus-enabled" | "ios-background-play-enabled" | "ios-wake-lock-enabled" | "ios-media-element-enabled" | "abr-enabled" | "size-based-resolution-cap-enabled" | "telemetry-enabled" | "video-codecs" | "drm-headers" | "drm-queryparams" | "drm-widevine-video-robustness" | "drm-widevine-audio-robustness" | "drm-playready-video-robustness" | "drm-playready-audio-robustness" | "webtransport-enabled" | "reconnect-retries" | "auto-instance-enabled" | "refresh-poster-enabled" | "stream-poll-enabled")[];
1891
+ static observedAttributes: readonly ("title" | "advanced" | "poster" | "language" | "channels" | "buffering" | "paused" | "volume" | "muted" | "duration" | "user-interacting" | "is-casting" | "cast-available" | "cast-receiver-name" | "ui-locked" | "hide-ui-on-pause" | "is-fullscreen" | "is-fullscreen-fallback" | "rendition-levels" | "rendition-level" | "max-video-bit-rate" | "max-initial-bit-rate" | "channel-id" | "channel-group-id" | "pip-available" | "is-pip" | "airplay-available" | "is-airplaying" | "media" | "languages" | "text-tracks" | "text-track" | "needs-user-input-video" | "needs-user-input-audio" | "authentication-token" | "volume-level" | "cast" | "airplay" | "pip" | "fullscreen" | "vu-meter" | "timeshift" | "timeshift-position" | "poster-src" | "url" | "offline" | "edge-url" | "target-buffer-time" | "cast-receiver-id" | "cast-background" | "log-level" | "max-size" | "min-buffer-time" | "max-buffer-time" | "max-audio-bit-rate" | "burst-enabled" | "mse-enabled" | "mse-opus-enabled" | "ios-background-play-enabled" | "ios-wake-lock-enabled" | "ios-media-element-enabled" | "abr-enabled" | "size-based-resolution-cap-enabled" | "telemetry-enabled" | "video-codecs" | "drm-headers" | "drm-queryparams" | "drm-widevine-video-robustness" | "drm-widevine-audio-robustness" | "drm-playready-video-robustness" | "drm-playready-audio-robustness" | "webtransport-enabled" | "webcodecs-enabled" | "webcodecs-hardware-acceleration" | "offscreen-canvas-enabled" | "reconnect-retries" | "auto-instance-enabled" | "refresh-poster-enabled" | "stream-poll-enabled")[];
1853
1892
  constructor();
1854
1893
  connectedCallback(): void;
1855
1894
  disconnectedCallback(): void;