@camstack/addon-provider-reolink 1.2.23 → 1.2.24

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/addon.js CHANGED
@@ -25586,13 +25586,24 @@ method(object({
25586
25586
  /** Playback-speed multiplier for the render (1 = realtime). */
25587
25587
  var ExportSpeedSchema = number().min(.25).max(32);
25588
25588
  /**
25589
- * One dense interval, in SECONDS FROM THE EXPORT'S OWN `fromMs`.
25589
+ * One dense interval, in WALL-CLOCK SECONDS FROM THE EXPORT'S OWN `fromMs`.
25590
25590
  *
25591
- * Relative and not absolute epoch on purpose: the renderer's frame-select
25592
- * expression sees ffmpeg's `t`, which starts at 0 for the export's source
25593
- * playlist. Handing it absolute epochs would make every call site responsible
25594
- * for the same subtraction, and the one that forgot would emit a filter that
25595
- * selects nothing silently, as a uniform timelapse.
25591
+ * **Wall clock, not ffmpeg's `t`** and the recorder translates. A caller
25592
+ * derives these bounds from things that happened at a TIME (a track's
25593
+ * `firstSeen`), while `t` runs over the source playlist: the concatenation of
25594
+ * every segment present for the range, with each recording GAP removed. The
25595
+ * two agree only on a window that recorded without one interruption, and only
25596
+ * the render side knows the segments, so the translation lives there
25597
+ * (`export-dense-map.ts`, addon-pipeline).
25598
+ *
25599
+ * It was not always so. These seconds were fed to `between(t,…)` verbatim, and
25600
+ * on a 10 h window holding 29,393 s of footage every range landed late by the
25601
+ * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
25602
+ * the video was a uniform timelapse, and the log line reported the five ranges
25603
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
25604
+ *
25605
+ * Relative and not absolute epoch, because an absolute epoch would make every
25606
+ * call site responsible for the same subtraction.
25596
25607
  */
25597
25608
  var ExportDenseRangeSchema = object({
25598
25609
  fromSec: number().nonnegative(),
@@ -34497,25 +34508,32 @@ object({
34497
34508
  var NativeLeaseAdmissionSchema = _enum(["all", "inferred"]);
34498
34509
  object({
34499
34510
  /**
34500
- * How long a retained native frame is served before it counts as a miss.
34511
+ * How many delivered frames the worker HOLDS at once, waiting for each one's
34512
+ * detection result.
34501
34513
  *
34502
- * Must cover the FULL late-crop horizon: detection inference + the
34503
- * cross-process inference-result hop to hub post-analysis + tracking + the
34504
- * tRPC crop round-trip back. Below ~500 ms the busiest cameras' subject crops
34505
- * outrun it and fall back to the ≤640 detection frame; above ~3 s the resident
34506
- * RAM per busy camera grows linearly with no measured hit-rate gain.
34514
+ * This replaced a TTL on 2026-08-13, and the replacement is the whole point:
34515
+ * a time window was never related to the event the pixels were waiting for.
34516
+ * A held frame now lives from delivery until the runner has its `FrameResult`
34517
+ * at which moment the runner cuts the subject tiles it actually wanted and
34518
+ * releases the frame. The bound exists only so a runner that stops answering
34519
+ * cannot pin RAM: above it the OLDEST held frame is dropped and counted.
34520
+ *
34521
+ * Sizing: the steady state is `inferenceLatency × deliveredFps`, measured at
34522
+ * 40-160 ms × ≤25 fps = 1-4 frames. The default leaves headroom for a hiccup
34523
+ * without ever approaching the old resident set (43 frames × 24.9 MB at 4K).
34524
+ * Raising it does not buy hit rate — it buys tolerance for a slow runner, and
34525
+ * `holdOverflow` on the metrics line is what says you need it.
34507
34526
  */
34508
- ttlMs: number().int().min(250).max(1e4),
34527
+ holdFrames: number().int().min(1).max(64),
34509
34528
  /**
34510
34529
  * Hard per-decode-worker RAM ceiling for retained native frames, in MB.
34511
34530
  *
34512
- * Intended as a SAFETY ceiling with the TTL as the effective cap — but check
34513
- * which one is actually binding before reasoning from that. At the shipped
34514
- * 1024 MB and a 2 800 ms TTL, a 4K camera hits the CEILING first (~43 frames
34515
- * at ~24 MB each) and the TTL never gets to expire anything; `leaseMb` /
34516
- * `leaseFrames` on the metrics line say which. When the ceiling binds, a
34517
- * change that admits fewer frames buys retention WINDOW at constant RAM
34518
- * rather than giving RAM back — lower this knob if RAM is what you wanted.
34531
+ * Since 2026-08-13 this is a SAFETY ceiling and nothing else: `holdFrames`
34532
+ * is what decides how much is held, and the ceiling is the number above which
34533
+ * something is wrong. Before that it was the effective cap at 1024 MB with
34534
+ * a 2 800 ms TTL a 4K camera sat pinned at `leaseMb:1020, leaseFrames:43`
34535
+ * with the TTL expiring nothing, which is exactly the confusion the hold
34536
+ * removes. `leaseMb` / `leaseFrames` still say what is resident.
34519
34537
  * `0` DISABLES the lease entirely and falls the worker back to the tiny
34520
34538
  * leak-prone GPU surface ring (~85% crop miss; that is what the lease exists
34521
34539
  * to replace).
@@ -34541,22 +34559,45 @@ object({
34541
34559
  * there is the signal that some caller names frames outside the inference set
34542
34560
  * and that this must go back to `all`.
34543
34561
  */
34544
- admission: NativeLeaseAdmissionSchema
34562
+ admission: NativeLeaseAdmissionSchema,
34563
+ /**
34564
+ * RAM ceiling per decode worker, in MB, for the SUBJECT TILES — the
34565
+ * compressed native crops the worker cuts at the moment a frame's detection
34566
+ * result arrives, and keeps long after the frame itself is freed.
34567
+ *
34568
+ * This is the knob that replaced the old retention window, and it buys about
34569
+ * three orders of magnitude more of it: a tile is one subject at native
34570
+ * resolution, JPEG-encoded (~60-120 KB on a 4K person), against ~24.9 MB for
34571
+ * the frame it was cut from. A frame on which nothing was detected costs
34572
+ * nothing at all, which is the real change — the old lease paid per FRAME and
34573
+ * was interrogated per SUBJECT.
34574
+ *
34575
+ * `0` DISABLES tiles, leaving only the hold window and the ≤640 RAM
34576
+ * fallback — i.e. the pre-2026-08-13 miss profile. Set it there only to
34577
+ * reproduce that.
34578
+ */
34579
+ tileBudgetMb: number().int().min(0).max(1024)
34545
34580
  });
34546
34581
  /**
34547
- * The values in force when the operator has set nothing — byte-for-byte the
34548
- * constants the decode worker shipped with as env-var defaults, so making these
34549
- * settings changed no behaviour on the day it landed.
34582
+ * The values in force when the operator has set nothing.
34583
+ *
34584
+ * `budgetMb` stays at 1024 on the day the hold landed, deliberately: it stopped
34585
+ * being the retention window and became the OOM ceiling, and lowering a ceiling
34586
+ * in the same change that redefines it would make a regression and a retune
34587
+ * indistinguishable. Cut it once `tileHits` / `holdOverflow` have been read on
34588
+ * live traffic.
34550
34589
  */
34551
34590
  var DEFAULT_NATIVE_LEASE_SETTINGS = {
34552
- ttlMs: 1200,
34591
+ holdFrames: 8,
34553
34592
  budgetMb: 1024,
34554
34593
  activityMs: 15e3,
34594
+ tileBudgetMb: 64,
34555
34595
  admission: "inferred"
34556
34596
  };
34557
- DEFAULT_NATIVE_LEASE_SETTINGS.ttlMs;
34597
+ DEFAULT_NATIVE_LEASE_SETTINGS.holdFrames;
34558
34598
  DEFAULT_NATIVE_LEASE_SETTINGS.budgetMb;
34559
34599
  DEFAULT_NATIVE_LEASE_SETTINGS.activityMs;
34600
+ DEFAULT_NATIVE_LEASE_SETTINGS.tileBudgetMb;
34560
34601
  DEFAULT_NATIVE_LEASE_SETTINGS.admission;
34561
34602
  //#endregion
34562
34603
  //#region ../../node_modules/undici/lib/core/symbols.js
package/dist/addon.mjs CHANGED
@@ -25581,13 +25581,24 @@ method(object({
25581
25581
  /** Playback-speed multiplier for the render (1 = realtime). */
25582
25582
  var ExportSpeedSchema = number().min(.25).max(32);
25583
25583
  /**
25584
- * One dense interval, in SECONDS FROM THE EXPORT'S OWN `fromMs`.
25584
+ * One dense interval, in WALL-CLOCK SECONDS FROM THE EXPORT'S OWN `fromMs`.
25585
25585
  *
25586
- * Relative and not absolute epoch on purpose: the renderer's frame-select
25587
- * expression sees ffmpeg's `t`, which starts at 0 for the export's source
25588
- * playlist. Handing it absolute epochs would make every call site responsible
25589
- * for the same subtraction, and the one that forgot would emit a filter that
25590
- * selects nothing silently, as a uniform timelapse.
25586
+ * **Wall clock, not ffmpeg's `t`** and the recorder translates. A caller
25587
+ * derives these bounds from things that happened at a TIME (a track's
25588
+ * `firstSeen`), while `t` runs over the source playlist: the concatenation of
25589
+ * every segment present for the range, with each recording GAP removed. The
25590
+ * two agree only on a window that recorded without one interruption, and only
25591
+ * the render side knows the segments, so the translation lives there
25592
+ * (`export-dense-map.ts`, addon-pipeline).
25593
+ *
25594
+ * It was not always so. These seconds were fed to `between(t,…)` verbatim, and
25595
+ * on a 10 h window holding 29,393 s of footage every range landed late by the
25596
+ * gap accumulated before it — up to 6,607 s, well past EOF. Nothing matched,
25597
+ * the video was a uniform timelapse, and the log line reported the five ranges
25598
+ * that had been ASKED for (2026-08-13, export `57d14363`, camera 615).
25599
+ *
25600
+ * Relative and not absolute epoch, because an absolute epoch would make every
25601
+ * call site responsible for the same subtraction.
25591
25602
  */
25592
25603
  var ExportDenseRangeSchema = object({
25593
25604
  fromSec: number().nonnegative(),
@@ -34492,25 +34503,32 @@ object({
34492
34503
  var NativeLeaseAdmissionSchema = _enum(["all", "inferred"]);
34493
34504
  object({
34494
34505
  /**
34495
- * How long a retained native frame is served before it counts as a miss.
34506
+ * How many delivered frames the worker HOLDS at once, waiting for each one's
34507
+ * detection result.
34496
34508
  *
34497
- * Must cover the FULL late-crop horizon: detection inference + the
34498
- * cross-process inference-result hop to hub post-analysis + tracking + the
34499
- * tRPC crop round-trip back. Below ~500 ms the busiest cameras' subject crops
34500
- * outrun it and fall back to the ≤640 detection frame; above ~3 s the resident
34501
- * RAM per busy camera grows linearly with no measured hit-rate gain.
34509
+ * This replaced a TTL on 2026-08-13, and the replacement is the whole point:
34510
+ * a time window was never related to the event the pixels were waiting for.
34511
+ * A held frame now lives from delivery until the runner has its `FrameResult`
34512
+ * at which moment the runner cuts the subject tiles it actually wanted and
34513
+ * releases the frame. The bound exists only so a runner that stops answering
34514
+ * cannot pin RAM: above it the OLDEST held frame is dropped and counted.
34515
+ *
34516
+ * Sizing: the steady state is `inferenceLatency × deliveredFps`, measured at
34517
+ * 40-160 ms × ≤25 fps = 1-4 frames. The default leaves headroom for a hiccup
34518
+ * without ever approaching the old resident set (43 frames × 24.9 MB at 4K).
34519
+ * Raising it does not buy hit rate — it buys tolerance for a slow runner, and
34520
+ * `holdOverflow` on the metrics line is what says you need it.
34502
34521
  */
34503
- ttlMs: number().int().min(250).max(1e4),
34522
+ holdFrames: number().int().min(1).max(64),
34504
34523
  /**
34505
34524
  * Hard per-decode-worker RAM ceiling for retained native frames, in MB.
34506
34525
  *
34507
- * Intended as a SAFETY ceiling with the TTL as the effective cap — but check
34508
- * which one is actually binding before reasoning from that. At the shipped
34509
- * 1024 MB and a 2 800 ms TTL, a 4K camera hits the CEILING first (~43 frames
34510
- * at ~24 MB each) and the TTL never gets to expire anything; `leaseMb` /
34511
- * `leaseFrames` on the metrics line say which. When the ceiling binds, a
34512
- * change that admits fewer frames buys retention WINDOW at constant RAM
34513
- * rather than giving RAM back — lower this knob if RAM is what you wanted.
34526
+ * Since 2026-08-13 this is a SAFETY ceiling and nothing else: `holdFrames`
34527
+ * is what decides how much is held, and the ceiling is the number above which
34528
+ * something is wrong. Before that it was the effective cap at 1024 MB with
34529
+ * a 2 800 ms TTL a 4K camera sat pinned at `leaseMb:1020, leaseFrames:43`
34530
+ * with the TTL expiring nothing, which is exactly the confusion the hold
34531
+ * removes. `leaseMb` / `leaseFrames` still say what is resident.
34514
34532
  * `0` DISABLES the lease entirely and falls the worker back to the tiny
34515
34533
  * leak-prone GPU surface ring (~85% crop miss; that is what the lease exists
34516
34534
  * to replace).
@@ -34536,22 +34554,45 @@ object({
34536
34554
  * there is the signal that some caller names frames outside the inference set
34537
34555
  * and that this must go back to `all`.
34538
34556
  */
34539
- admission: NativeLeaseAdmissionSchema
34557
+ admission: NativeLeaseAdmissionSchema,
34558
+ /**
34559
+ * RAM ceiling per decode worker, in MB, for the SUBJECT TILES — the
34560
+ * compressed native crops the worker cuts at the moment a frame's detection
34561
+ * result arrives, and keeps long after the frame itself is freed.
34562
+ *
34563
+ * This is the knob that replaced the old retention window, and it buys about
34564
+ * three orders of magnitude more of it: a tile is one subject at native
34565
+ * resolution, JPEG-encoded (~60-120 KB on a 4K person), against ~24.9 MB for
34566
+ * the frame it was cut from. A frame on which nothing was detected costs
34567
+ * nothing at all, which is the real change — the old lease paid per FRAME and
34568
+ * was interrogated per SUBJECT.
34569
+ *
34570
+ * `0` DISABLES tiles, leaving only the hold window and the ≤640 RAM
34571
+ * fallback — i.e. the pre-2026-08-13 miss profile. Set it there only to
34572
+ * reproduce that.
34573
+ */
34574
+ tileBudgetMb: number().int().min(0).max(1024)
34540
34575
  });
34541
34576
  /**
34542
- * The values in force when the operator has set nothing — byte-for-byte the
34543
- * constants the decode worker shipped with as env-var defaults, so making these
34544
- * settings changed no behaviour on the day it landed.
34577
+ * The values in force when the operator has set nothing.
34578
+ *
34579
+ * `budgetMb` stays at 1024 on the day the hold landed, deliberately: it stopped
34580
+ * being the retention window and became the OOM ceiling, and lowering a ceiling
34581
+ * in the same change that redefines it would make a regression and a retune
34582
+ * indistinguishable. Cut it once `tileHits` / `holdOverflow` have been read on
34583
+ * live traffic.
34545
34584
  */
34546
34585
  var DEFAULT_NATIVE_LEASE_SETTINGS = {
34547
- ttlMs: 1200,
34586
+ holdFrames: 8,
34548
34587
  budgetMb: 1024,
34549
34588
  activityMs: 15e3,
34589
+ tileBudgetMb: 64,
34550
34590
  admission: "inferred"
34551
34591
  };
34552
- DEFAULT_NATIVE_LEASE_SETTINGS.ttlMs;
34592
+ DEFAULT_NATIVE_LEASE_SETTINGS.holdFrames;
34553
34593
  DEFAULT_NATIVE_LEASE_SETTINGS.budgetMb;
34554
34594
  DEFAULT_NATIVE_LEASE_SETTINGS.activityMs;
34595
+ DEFAULT_NATIVE_LEASE_SETTINGS.tileBudgetMb;
34555
34596
  DEFAULT_NATIVE_LEASE_SETTINGS.admission;
34556
34597
  //#endregion
34557
34598
  //#region ../../node_modules/undici/lib/core/symbols.js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.2.23",
3
+ "version": "1.2.24",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",