@oddin-gg/havik-player 2.15.2 → 2.15.4

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
@@ -265,6 +265,11 @@ don't need to set any of the live or ABR knobs:
265
265
  aren't reliably published yet; chasing that edge causes constant rebuffering.
266
266
  Set `liveLatencyTarget` lower for closer‑to‑live (more rebuffer‑prone) or
267
267
  higher for steadier playback. _Lowered from 3 s; see the migration note below._
268
+ - **Catch‑up dead band**: the player only speeds up when it is more than
269
+ **0.5 s** behind its target. Smaller gaps, like the 0.1 to 0.4 s a viewer
270
+ typically lands behind on joining, are left alone, because even 1.05× is
271
+ audible as a crackle in Chrome's and Firefox's pitch correction. Once catch‑up
272
+ starts it runs until playback is back on target.
268
273
  - **Drift ceiling**: after a stall, the player catches up at up to **1.1×** (gentle
269
274
  enough to be invisible; it was 1.5×, which showed as the picture speeding up
270
275
  between stalls on a jittery edge) and,
@@ -315,6 +320,17 @@ can't crash the player: if you pass the count‑based `liveSyncDurationCount` /
315
320
  rejects mixing the two); if you set `liveSyncDuration` alone, a matching ceiling
316
321
  is derived above it.
317
322
 
323
+ - **Quality steps down when the device can't decode it.** If the browser keeps
324
+ dropping more than 20% of frames for two 3 s checks in a row, the SDK caps
325
+ ABR one rendition below the one playing (counted in `fpsDownCaps`). This is
326
+ what keeps a laptop without hardware decoding from showing a stuttering
327
+ picture that drifts away from the sound. It folds into the same cap as the
328
+ player‑size and `maxBitrate` limits, never applies to a quality the viewer
329
+ pinned, and stays down for the session. Setting
330
+ `hlsConfig.capLevelOnFPSDrop: false` turns frame‑drop capping off; `true` runs
331
+ hls.js's own controller instead, whose cap a later player‑size or `maxBitrate`
332
+ recompute can overwrite.
333
+
318
334
  - **Futile catch‑up is stopped.** hls.js speeds playback up (to 1.1×) whenever
319
335
  latency sits above the target, and only lowers its ambition after a counted
320
336
  rebuffer. On an edge that is itself seconds behind, a player that keeps a
@@ -1246,6 +1262,8 @@ interface PlaybackStats {
1246
1262
  lowLatency?: boolean; // whether LL-HLS was detected in the manifest
1247
1263
  isLive?: boolean; // current media playlist is live
1248
1264
  atLiveEdge?: boolean; // playback is at/near the live edge
1265
+ liveRetargets?: number; // times a futile catch-up moved the live target (hls.js engine)
1266
+ fpsDownCaps?: number; // times quality was capped because the device dropped frames (hls.js engine)
1249
1267
  }
1250
1268
  ```
1251
1269
 
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.4/dist/havik-player.global.js" integrity="sha384-KHquOQfjrHz3RnxzF+WQxpiXOiQb/ypcpe5Ny5oJmonEPggkQy+8BV5D5rrRfHkT" 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.4/dist/havik-player.global.js" integrity="sha384-KHquOQfjrHz3RnxzF+WQxpiXOiQb/ypcpe5Ny5oJmonEPggkQy+8BV5D5rrRfHkT" 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.4",
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,