@oddin-gg/havik-player 2.15.2 → 2.15.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/docs/API.md CHANGED
@@ -315,6 +315,17 @@ can't crash the player: if you pass the count‑based `liveSyncDurationCount` /
315
315
  rejects mixing the two); if you set `liveSyncDuration` alone, a matching ceiling
316
316
  is derived above it.
317
317
 
318
+ - **Quality steps down when the device can't decode it.** If the browser keeps
319
+ dropping more than 20% of frames for two 3 s checks in a row, the SDK caps
320
+ ABR one rendition below the one playing (counted in `fpsDownCaps`). This is
321
+ what keeps a laptop without hardware decoding from showing a stuttering
322
+ picture that drifts away from the sound. It folds into the same cap as the
323
+ player‑size and `maxBitrate` limits, never applies to a quality the viewer
324
+ pinned, and stays down for the session. Setting
325
+ `hlsConfig.capLevelOnFPSDrop: false` turns frame‑drop capping off; `true` runs
326
+ hls.js's own controller instead, whose cap a later player‑size or `maxBitrate`
327
+ recompute can overwrite.
328
+
318
329
  - **Futile catch‑up is stopped.** hls.js speeds playback up (to 1.1×) whenever
319
330
  latency sits above the target, and only lowers its ambition after a counted
320
331
  rebuffer. On an edge that is itself seconds behind, a player that keeps a
@@ -1246,6 +1257,8 @@ interface PlaybackStats {
1246
1257
  lowLatency?: boolean; // whether LL-HLS was detected in the manifest
1247
1258
  isLive?: boolean; // current media playlist is live
1248
1259
  atLiveEdge?: boolean; // playback is at/near the live edge
1260
+ liveRetargets?: number; // times a futile catch-up moved the live target (hls.js engine)
1261
+ fpsDownCaps?: number; // times quality was capped because the device dropped frames (hls.js engine)
1249
1262
  }
1250
1263
  ```
1251
1264
 
package/embed/index.html CHANGED
@@ -28,7 +28,7 @@
28
28
  beacons endpoint can be derived and QoE analytics is silently off.
29
29
  `analytics` is honoured from the injected config only, never the query.
30
30
  -->
31
- <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.15.2/dist/havik-player.global.js" integrity="sha384-UOJXsjWTIgS9qCPAU4ddwav3Zexd4ElTzFYqOjlLrfn5HpQICTW9mvtdSu+5eAKr" crossorigin="anonymous"></script>
31
+ <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.15.3/dist/havik-player.global.js" integrity="sha384-6QXvumRSWQy+koXgkH0D46YFSKo9W6Pw1Cc6AZfBWxqa8MpAc3T7HKiMHHBTGsZh" crossorigin="anonymous"></script>
32
32
  <script>
33
33
  HavikPlayer.bootEmbed();
34
34
  </script>
@@ -12,7 +12,7 @@
12
12
  shipped in each npm release is pinned to that release with Subresource
13
13
  Integrity, injected at publish time (scripts/inject-sri.mjs). In
14
14
  production, always use a pinned + SRI'd tag like the released copy. -->
15
- <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.15.2/dist/havik-player.global.js" integrity="sha384-UOJXsjWTIgS9qCPAU4ddwav3Zexd4ElTzFYqOjlLrfn5HpQICTW9mvtdSu+5eAKr" crossorigin="anonymous"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/@oddin-gg/havik-player@2.15.3/dist/havik-player.global.js" integrity="sha384-6QXvumRSWQy+koXgkH0D46YFSKo9W6Pw1Cc6AZfBWxqa8MpAc3T7HKiMHHBTGsZh" crossorigin="anonymous"></script>
16
16
  <script>
17
17
  (async () => {
18
18
  const player = await HavikPlayer.createPlayer({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oddin-gg/havik-player",
3
- "version": "2.15.2",
3
+ "version": "2.15.3",
4
4
  "description": "Havik HTML5 player SDK — LL-HLS + DRM playback for Oddin live streams (managed, bring-your-own-player, and iframe-embed modes).",
5
5
  "type": "module",
6
6
  "sideEffects": false,