@camstack/types 1.2.217 → 1.2.219

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.
@@ -60,6 +60,7 @@ function buildInputArgs(input, decodeHwAccel) {
60
60
  if (input.analyzeDurationUs !== void 0) args.push("-analyzeduration", String(input.analyzeDurationUs));
61
61
  if (input.probeSizeBytes !== void 0) args.push("-probesize", String(input.probeSizeBytes));
62
62
  if (input.lowDelay === true) args.push("-flags", "low_delay");
63
+ if (input.useWallclockTimestamps === true) args.push("-use_wallclock_as_timestamps", "1");
63
64
  if (input.fflags?.length) for (const flag of input.fflags) args.push("-fflags", flag);
64
65
  if (input.rtspTransport) args.push("-rtsp_transport", input.rtspTransport);
65
66
  args.push("-i", input.url);
@@ -60,6 +60,7 @@ function buildInputArgs(input, decodeHwAccel) {
60
60
  if (input.analyzeDurationUs !== void 0) args.push("-analyzeduration", String(input.analyzeDurationUs));
61
61
  if (input.probeSizeBytes !== void 0) args.push("-probesize", String(input.probeSizeBytes));
62
62
  if (input.lowDelay === true) args.push("-flags", "low_delay");
63
+ if (input.useWallclockTimestamps === true) args.push("-use_wallclock_as_timestamps", "1");
63
64
  if (input.fflags?.length) for (const flag of input.fflags) args.push("-fflags", flag);
64
65
  if (input.rtspTransport) args.push("-rtsp_transport", input.rtspTransport);
65
66
  args.push("-i", input.url);
@@ -68,6 +68,33 @@ export interface FfmpegInputPlan {
68
68
  * reorder will decode out of order.
69
69
  */
70
70
  readonly lowDelay?: boolean;
71
+ /**
72
+ * `-use_wallclock_as_timestamps 1` — stamp this input by ARRIVAL time.
73
+ *
74
+ * ffmpeg normalises each input so its first frame is pts 0, and a filter that
75
+ * pairs inputs (`overlay`) pairs them BY PTS. Two sources that joined at
76
+ * different moments therefore compose frames from different moments, for the
77
+ * life of the child, with nothing to correct it: each tile's clock started
78
+ * whenever that tile's first frame happened to arrive.
79
+ *
80
+ * The spread is real. Four joins of the SAME restream in one series measured
81
+ * 1830 / 3987 / 3985 / 4025 ms (hub, 2026-09-18) — a `/muted` dial is served
82
+ * at once only within ~500 ms of an IDR and otherwise waits for the next, so
83
+ * two tiles of one composite can start a key-frame interval apart.
84
+ *
85
+ * It is NOT, however, the skew a composite normally has. Measured the same
86
+ * day: two sources joined in PARALLEL landed 438-599 ms apart, while the same
87
+ * two inside one ffmpeg were 4-5 s apart — because ffmpeg opens its inputs
88
+ * SEQUENTIALLY and each open blocks until its probe budget is spent. Shrink
89
+ * `analyzeDurationUs` / `probeSizeBytes` before reaching for this flag: on
90
+ * the live grid that alone took the skew to 0-1 s, and this flag cost the
91
+ * output pacing ten stalls over a second in an 18 s run.
92
+ *
93
+ * Ask for it where several inputs must agree about WHEN. A single-input
94
+ * transcode does not care and should leave it alone: wall-clock stamping ties
95
+ * the output's timing to this machine's clock rather than to the source's.
96
+ */
97
+ readonly useWallclockTimestamps?: boolean;
71
98
  /** Caller-supplied input options (an `EncodeProfile.inputArgs`, probe flags). */
72
99
  readonly extraArgs?: readonly string[];
73
100
  }
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_sleep = require("./sleep-VlZxDyXq.js");
3
3
  const require_event_category = require("./event-category-BVfsrBYA.js");
4
- const require_canonical_hash = require("./canonical-hash-BxuA6beb.js");
4
+ const require_canonical_hash = require("./canonical-hash-sTEH1IHd.js");
5
5
  const require_enums = require("./enums.js");
6
6
  const require_err_msg = require("./err-msg-COpsHMw2.js");
7
7
  let zod = require("zod");
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { $ as CAM_PROFILE_ORDER, A as DeviceType, At as isEvent, B as systemMethod, Bt as isAudioChunkFormat, C as customAction, Ct as SHARE_VIEW_KINDS, D as ChargingStatus, Dt as createDurableState, E as deviceCustomAction, Et as normalizeAddonInitResult, F as event, Ft as hydrateSchema, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, It as resolveHydratedFieldValue, J as readinessKey, K as ReadinessTimeoutError, L as isDeviceConfigCap, Lt as AUDIO_CHUNK_FORMATS, M as DEFAULT_RUNTIME_STATE_DURABILITY, Mt as WELL_KNOWN_TAB_MAP, N as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Nt as collectHydratedFieldEntries, O as DeviceFeature, Ot as createEvent, P as DEVICE_STATUS_METHOD, Pt as collectHydratedFieldValues, Q as BrokerStatusSchema, R as method, Rt as audioChunkBytesPerSample, S as DEVICE_CHILDREN_BATCH_MAX, St as DATAPLANE_SECRET_HEADER, T as describeCustomActions, Tt as BaseAddon, U as readNodePin, V as CAP_NODE_PIN_CONTEXT_KEY, W as toNodeId, X as AudioChunkFormatSchema, Y as scopeKey, Z as BrokerStatsSchema, _ as createMirrorSource, _t as SubscribeFramesResultSchema, a as asJsonObject, at as DecodedFrameSchema, b as deviceOpsCapability, bt as parseProfileBrokerId, c as parseJsonArray, ct as FrameHandleSchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as ProfileSlotStatusSchema, et as CamProfileSchema, f as DEVICE_SCOPED_CAPS, ft as StreamSourceEntrySchema, g as createLazyTrpcSource, gt as SubscribeFramesInputSchema, h as createEventBusSliceSource, ht as SubscribeAudioChunksResultSchema, i as asJsonArray, it as DecodedAudioChunkSchema, j as adminUiCapability, jt as WELL_KNOWN_TABS, k as DeviceRole, kt as emitReadiness, l as parseJsonObject, lt as ProfileRtspEntrySchema, m as createDeviceProxy, mt as SubscribeAudioChunksInputSchema, n as sleepCancellable, nt as CamStreamResolutionSchema, o as asNumber, ot as EncodedPacketSchema, p as isDeviceScopedCap, pt as StreamSourceSchema, q as emitDownForOwnedCaps, r as asBoolean, rt as CameraStreamSchema, s as asString, st as FrameHandleFormatSchema, t as sleep, tt as CamStreamKindSchema, u as parseJsonUnknown, ut as ProfileSlotSchema, v as createSliceHandle, vt as makeProfileBrokerId, w as defineCustomActions, wt as DisposerChain, x as viewerUiCapability, xt as selectAssignedProfileSlots, y as RawStateResultSchema, yt as makeSourceBrokerId, z as resolveCapMount, zt as expandAudioChunkToF32le } from "./sleep-GU_us3DG.mjs";
2
2
  import { t as EventCategory } from "./event-category-BVDXG4tB.mjs";
3
- import { a as buildAudioArgs, c as buildVideoArgs, d as logBannerArgs, f as pickVideoEncoder, i as audioPlanFromEncodeProfile, l as invocationFromEncodeProfile, n as Fmp4BoxSplitter, o as buildFfmpegArgs, p as resolveStreamMaps, r as AUDIO_PRESETS, s as buildInputArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-biq7T_dN.mjs";
3
+ import { a as buildAudioArgs, c as buildVideoArgs, d as logBannerArgs, f as pickVideoEncoder, i as audioPlanFromEncodeProfile, l as invocationFromEncodeProfile, n as Fmp4BoxSplitter, o as buildFfmpegArgs, p as resolveStreamMaps, r as AUDIO_PRESETS, s as buildInputArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-DI7tT-zZ.mjs";
4
4
  import { EventSourceType } from "./enums.mjs";
5
5
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
6
6
  import { z } from "zod";
package/dist/node.js CHANGED
@@ -21,7 +21,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_canonical_hash = require("./canonical-hash-BxuA6beb.js");
24
+ const require_canonical_hash = require("./canonical-hash-sTEH1IHd.js");
25
25
  const require_err_msg = require("./err-msg-COpsHMw2.js");
26
26
  let node_crypto = require("node:crypto");
27
27
  let node_fs = require("node:fs");
package/dist/node.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { n as Fmp4BoxSplitter, o as buildFfmpegArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-biq7T_dN.mjs";
1
+ import { n as Fmp4BoxSplitter, o as buildFfmpegArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-DI7tT-zZ.mjs";
2
2
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
3
3
  import { createHash, createHmac, randomUUID, timingSafeEqual } from "node:crypto";
4
4
  import * as fs from "node:fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.217",
3
+ "version": "1.2.219",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",