@openmoq/playback 0.0.0-stage → 0.6.0

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.
Files changed (63) hide show
  1. package/LICENSE.txt +202 -0
  2. package/README.md +18 -2
  3. package/dist/adaptive-tolerance.d.ts +128 -0
  4. package/dist/adaptive-tolerance.d.ts.map +1 -0
  5. package/dist/adaptive-tolerance.js +339 -0
  6. package/dist/adaptive-tolerance.js.map +1 -0
  7. package/dist/bandwidth-estimator.d.ts +49 -0
  8. package/dist/bandwidth-estimator.d.ts.map +1 -0
  9. package/dist/bandwidth-estimator.js +77 -0
  10. package/dist/bandwidth-estimator.js.map +1 -0
  11. package/dist/browser/index.global.js +2813 -0
  12. package/dist/browser/index.global.js.map +1 -0
  13. package/dist/browser/index.js +2788 -0
  14. package/dist/browser/index.js.map +1 -0
  15. package/dist/buffer-based-controller.d.ts +87 -0
  16. package/dist/buffer-based-controller.d.ts.map +1 -0
  17. package/dist/buffer-based-controller.js +85 -0
  18. package/dist/buffer-based-controller.js.map +1 -0
  19. package/dist/decoder-state.d.ts +103 -0
  20. package/dist/decoder-state.d.ts.map +1 -0
  21. package/dist/decoder-state.js +145 -0
  22. package/dist/decoder-state.js.map +1 -0
  23. package/dist/gap-detector.d.ts +83 -0
  24. package/dist/gap-detector.d.ts.map +1 -0
  25. package/dist/gap-detector.js +129 -0
  26. package/dist/gap-detector.js.map +1 -0
  27. package/dist/index.d.ts +33 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +33 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/jitter-buffer.d.ts +73 -0
  32. package/dist/jitter-buffer.d.ts.map +1 -0
  33. package/dist/jitter-buffer.js +216 -0
  34. package/dist/jitter-buffer.js.map +1 -0
  35. package/dist/keyframe-validator.d.ts +26 -0
  36. package/dist/keyframe-validator.d.ts.map +1 -0
  37. package/dist/keyframe-validator.js +170 -0
  38. package/dist/keyframe-validator.js.map +1 -0
  39. package/dist/pipeline.d.ts +215 -0
  40. package/dist/pipeline.d.ts.map +1 -0
  41. package/dist/pipeline.js +852 -0
  42. package/dist/pipeline.js.map +1 -0
  43. package/dist/recovery.d.ts +166 -0
  44. package/dist/recovery.d.ts.map +1 -0
  45. package/dist/recovery.js +176 -0
  46. package/dist/recovery.js.map +1 -0
  47. package/dist/render-scheduler.d.ts +50 -0
  48. package/dist/render-scheduler.d.ts.map +1 -0
  49. package/dist/render-scheduler.js +84 -0
  50. package/dist/render-scheduler.js.map +1 -0
  51. package/dist/startup-buffer.d.ts +68 -0
  52. package/dist/startup-buffer.d.ts.map +1 -0
  53. package/dist/startup-buffer.js +107 -0
  54. package/dist/startup-buffer.js.map +1 -0
  55. package/dist/sync.d.ts +234 -0
  56. package/dist/sync.d.ts.map +1 -0
  57. package/dist/sync.js +343 -0
  58. package/dist/sync.js.map +1 -0
  59. package/dist/types.d.ts +229 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +12 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +56 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Recovery controller — decides how to respond to playback failures.
3
+ *
4
+ * Sits between the pipeline and the player. The pipeline detects problems
5
+ * (gaps, buffer overflow, server signals), the recovery controller decides
6
+ * the response (skip, reduce quality, resubscribe, terminate).
7
+ *
8
+ * Purely event-driven: escalation is based on consecutive gap counts,
9
+ * not timing windows. A successful frame decode (notifySuccess) resets
10
+ * the gap counter, closing the feedback loop.
11
+ *
12
+ * Local policy reacting to transport signals:
13
+ * @see draft-ietf-moq-transport-16 §10.2.1.1 (Object Status — gap detection)
14
+ * @see draft-ietf-moq-transport-16 §13.4.3 (TOO_FAR_BEHIND signal)
15
+ * @see draft-ietf-moq-transport-16 §13.4.4 (DELIVERY_TIMEOUT signal)
16
+ * @module
17
+ */
18
+ /**
19
+ * What went wrong — input to the recovery controller.
20
+ */
21
+ export type RecoveryTrigger = {
22
+ readonly type: 'gap';
23
+ readonly groupId: bigint;
24
+ } | {
25
+ readonly type: 'stall';
26
+ readonly durationMs: number;
27
+ } | {
28
+ readonly type: 'buffer_overflow';
29
+ } | {
30
+ readonly type: 'too_far_behind';
31
+ } | {
32
+ readonly type: 'delivery_timeout';
33
+ } | {
34
+ readonly type: 'decode_error';
35
+ readonly message: string;
36
+ };
37
+ /**
38
+ * What to do about it — output from the recovery controller.
39
+ */
40
+ export type RecoveryAction = {
41
+ readonly type: 'skip_forward';
42
+ } | {
43
+ readonly type: 'reduce_quality';
44
+ readonly reason: string;
45
+ } | {
46
+ readonly type: 'pause_subscription';
47
+ readonly reason: string;
48
+ } | {
49
+ readonly type: 'resubscribe';
50
+ readonly startGroup?: bigint;
51
+ } | {
52
+ readonly type: 'terminate';
53
+ readonly reason: string;
54
+ };
55
+ /**
56
+ * Recovery controller interface.
57
+ *
58
+ * Implementations decide how to respond to playback failures.
59
+ * The player layer consumes the returned actions.
60
+ */
61
+ export interface RecoveryController {
62
+ evaluate(trigger: RecoveryTrigger): RecoveryAction;
63
+ /** Signal that a frame was successfully decoded — resets gap escalation. */
64
+ notifySuccess?(): void;
65
+ /** Reset all accumulated state (e.g., pause→resume). */
66
+ reset?(): void;
67
+ }
68
+ /** Configuration for the default recovery controller. */
69
+ export interface DefaultRecoveryConfig {
70
+ /** Number of consecutive gaps that triggers quality reduction. Default: 3. */
71
+ readonly gapEscalationThreshold?: number;
72
+ /** Maximum decode errors before terminating. Default: 2. */
73
+ readonly maxDecodeErrors?: number;
74
+ /**
75
+ * Window-based escalation: emit `reduce_quality` when this many
76
+ * gap events fire within `windowedEscalationWindowMs`, regardless
77
+ * of interleaved `notifySuccess()` calls. Catches the pattern
78
+ * where gaps alternate with successful decodes (so the consecutive
79
+ * counter never reaches threshold) but the overall stall rate is
80
+ * unacceptable. Default: 5.
81
+ */
82
+ readonly windowedEscalationThreshold?: number;
83
+ /**
84
+ * Time window (ms) for the windowed escalation counter.
85
+ * Gap timestamps older than this are evicted before checking the
86
+ * threshold. Default: 30_000 (30 seconds).
87
+ */
88
+ readonly windowedEscalationWindowMs?: number;
89
+ /**
90
+ * Minimum stall duration (ms) to count as a quality-degradation
91
+ * signal. Short stalls (50-100ms) are normal jitter; sustained
92
+ * stalls (300ms+) indicate the network can't keep up. Default: 300.
93
+ */
94
+ readonly stallThresholdMs?: number;
95
+ }
96
+ /**
97
+ * Default recovery controller — event-driven escalation.
98
+ *
99
+ * Policy:
100
+ * - Single gap → skip_forward
101
+ * - N consecutive gaps → reduce_quality (N = gapEscalationThreshold)
102
+ * - M gaps within W seconds → reduce_quality (windowed escalation,
103
+ * catches alternating gap/success patterns that reset the
104
+ * consecutive counter)
105
+ * - After reduce_quality, further gaps → skip_forward until notifySuccess()
106
+ * - notifySuccess() (frame decoded) resets gap counter + re-arms escalation
107
+ * - buffer_overflow → reduce_quality
108
+ * - too_far_behind → reduce_quality (reacting to §13.4.3 signal)
109
+ * - delivery_timeout → resubscribe (reacting to §13.4.4 signal)
110
+ * - decode_error → resubscribe (first), terminate (repeated)
111
+ */
112
+ export declare class DefaultRecoveryController implements RecoveryController {
113
+ private readonly gapEscalationThreshold;
114
+ private readonly maxDecodeErrors;
115
+ private readonly windowedThreshold;
116
+ private readonly windowedWindowUs;
117
+ private readonly stallThresholdMs;
118
+ private readonly clock;
119
+ /** Consecutive gap events without a successful decode. */
120
+ private consecutiveGaps;
121
+ /**
122
+ * True after reduce_quality fires — gates further escalation until
123
+ * notifySuccess() confirms the quality reduction helped.
124
+ */
125
+ private qualityReductionPending;
126
+ /** Number of decode errors seen (for escalation). */
127
+ private decodeErrorCount;
128
+ /** Timestamps (µs) of recent gap events for windowed escalation. */
129
+ private readonly gapTimestamps;
130
+ constructor(config?: DefaultRecoveryConfig);
131
+ /**
132
+ * Attach a clock source for windowed escalation. Without a clock
133
+ * the windowed path is silently disabled (consecutive-only policy).
134
+ * Kept as a setter rather than a constructor param so existing
135
+ * callers that don't need windowed escalation don't break.
136
+ */
137
+ setClock(clock: {
138
+ now(): number;
139
+ }): void;
140
+ evaluate(trigger: RecoveryTrigger): RecoveryAction;
141
+ /**
142
+ * Signal that a frame was successfully decoded/rendered.
143
+ *
144
+ * Resets the consecutive gap counter and re-arms quality escalation.
145
+ * This closes the feedback loop: gaps → reduce_quality → better frames
146
+ * arrive → notifySuccess → ready for next escalation if needed.
147
+ */
148
+ notifySuccess(): void;
149
+ /** Reset all state — e.g., after pause→resume. */
150
+ reset(): void;
151
+ /**
152
+ * Request quality reduction, gated by the pending flag.
153
+ * If a reduce_quality is already pending (waiting for notifySuccess),
154
+ * return skip_forward instead to prevent spam.
155
+ */
156
+ private escalateOrSkip;
157
+ private handleGap;
158
+ /**
159
+ * Relay signals overload via PUBLISH_DONE/TOO_FAR_BEHIND (§9.13);
160
+ * network bottlenecks produce no server signal, so the player must
161
+ * self-detect via stall rate.
162
+ */
163
+ private handleStall;
164
+ private handleDecodeError;
165
+ }
166
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Recovery controller — decides how to respond to playback failures.
3
+ *
4
+ * Sits between the pipeline and the player. The pipeline detects problems
5
+ * (gaps, buffer overflow, server signals), the recovery controller decides
6
+ * the response (skip, reduce quality, resubscribe, terminate).
7
+ *
8
+ * Purely event-driven: escalation is based on consecutive gap counts,
9
+ * not timing windows. A successful frame decode (notifySuccess) resets
10
+ * the gap counter, closing the feedback loop.
11
+ *
12
+ * Local policy reacting to transport signals:
13
+ * @see draft-ietf-moq-transport-16 §10.2.1.1 (Object Status — gap detection)
14
+ * @see draft-ietf-moq-transport-16 §13.4.3 (TOO_FAR_BEHIND signal)
15
+ * @see draft-ietf-moq-transport-16 §13.4.4 (DELIVERY_TIMEOUT signal)
16
+ * @module
17
+ */
18
+ /**
19
+ * Default recovery controller — event-driven escalation.
20
+ *
21
+ * Policy:
22
+ * - Single gap → skip_forward
23
+ * - N consecutive gaps → reduce_quality (N = gapEscalationThreshold)
24
+ * - M gaps within W seconds → reduce_quality (windowed escalation,
25
+ * catches alternating gap/success patterns that reset the
26
+ * consecutive counter)
27
+ * - After reduce_quality, further gaps → skip_forward until notifySuccess()
28
+ * - notifySuccess() (frame decoded) resets gap counter + re-arms escalation
29
+ * - buffer_overflow → reduce_quality
30
+ * - too_far_behind → reduce_quality (reacting to §13.4.3 signal)
31
+ * - delivery_timeout → resubscribe (reacting to §13.4.4 signal)
32
+ * - decode_error → resubscribe (first), terminate (repeated)
33
+ */
34
+ export class DefaultRecoveryController {
35
+ gapEscalationThreshold;
36
+ maxDecodeErrors;
37
+ windowedThreshold;
38
+ windowedWindowUs;
39
+ stallThresholdMs;
40
+ clock;
41
+ /** Consecutive gap events without a successful decode. */
42
+ consecutiveGaps = 0;
43
+ /**
44
+ * True after reduce_quality fires — gates further escalation until
45
+ * notifySuccess() confirms the quality reduction helped.
46
+ */
47
+ qualityReductionPending = false;
48
+ /** Number of decode errors seen (for escalation). */
49
+ decodeErrorCount = 0;
50
+ /** Timestamps (µs) of recent gap events for windowed escalation. */
51
+ gapTimestamps = [];
52
+ constructor(config) {
53
+ this.gapEscalationThreshold = config?.gapEscalationThreshold ?? 3;
54
+ this.maxDecodeErrors = config?.maxDecodeErrors ?? 2;
55
+ this.windowedThreshold = config?.windowedEscalationThreshold ?? 5;
56
+ this.windowedWindowUs = (config?.windowedEscalationWindowMs ?? 30_000) * 1000;
57
+ this.stallThresholdMs = config?.stallThresholdMs ?? 300;
58
+ this.clock = null;
59
+ }
60
+ /**
61
+ * Attach a clock source for windowed escalation. Without a clock
62
+ * the windowed path is silently disabled (consecutive-only policy).
63
+ * Kept as a setter rather than a constructor param so existing
64
+ * callers that don't need windowed escalation don't break.
65
+ */
66
+ setClock(clock) {
67
+ this.clock = clock;
68
+ }
69
+ evaluate(trigger) {
70
+ switch (trigger.type) {
71
+ case 'gap':
72
+ return this.handleGap();
73
+ case 'stall':
74
+ return this.handleStall(trigger.durationMs);
75
+ case 'buffer_overflow':
76
+ return this.escalateOrSkip('jitter buffer overflow');
77
+ case 'too_far_behind':
78
+ return this.escalateOrSkip('server reported TOO_FAR_BEHIND');
79
+ case 'delivery_timeout':
80
+ return { type: 'resubscribe' };
81
+ case 'decode_error':
82
+ return this.handleDecodeError(trigger.message);
83
+ }
84
+ }
85
+ /**
86
+ * Signal that a frame was successfully decoded/rendered.
87
+ *
88
+ * Resets the consecutive gap counter and re-arms quality escalation.
89
+ * This closes the feedback loop: gaps → reduce_quality → better frames
90
+ * arrive → notifySuccess → ready for next escalation if needed.
91
+ */
92
+ notifySuccess() {
93
+ this.consecutiveGaps = 0;
94
+ this.qualityReductionPending = false;
95
+ }
96
+ /** Reset all state — e.g., after pause→resume. */
97
+ reset() {
98
+ this.consecutiveGaps = 0;
99
+ this.qualityReductionPending = false;
100
+ this.decodeErrorCount = 0;
101
+ this.gapTimestamps.length = 0;
102
+ }
103
+ // ─── Internal ───────────────────────────────────────────────────
104
+ /**
105
+ * Request quality reduction, gated by the pending flag.
106
+ * If a reduce_quality is already pending (waiting for notifySuccess),
107
+ * return skip_forward instead to prevent spam.
108
+ */
109
+ escalateOrSkip(reason) {
110
+ if (this.qualityReductionPending) {
111
+ return { type: 'skip_forward' };
112
+ }
113
+ this.qualityReductionPending = true;
114
+ return { type: 'reduce_quality', reason };
115
+ }
116
+ handleGap() {
117
+ this.consecutiveGaps++;
118
+ // Consecutive-gap escalation (original policy)
119
+ if (this.consecutiveGaps >= this.gapEscalationThreshold) {
120
+ this.consecutiveGaps = 0;
121
+ this.gapTimestamps.length = 0;
122
+ return this.escalateOrSkip('repeated gaps detected');
123
+ }
124
+ // Windowed escalation: catches the alternating gap/success
125
+ // pattern where notifySuccess() resets the consecutive counter
126
+ // between every gap but the overall stall rate is unacceptable.
127
+ if (this.clock) {
128
+ const now = this.clock.now();
129
+ this.gapTimestamps.push(now);
130
+ // Evict timestamps outside the window
131
+ const cutoff = now - this.windowedWindowUs;
132
+ while (this.gapTimestamps.length > 0 && this.gapTimestamps[0] < cutoff) {
133
+ this.gapTimestamps.shift();
134
+ }
135
+ if (this.gapTimestamps.length >= this.windowedThreshold) {
136
+ this.gapTimestamps.length = 0;
137
+ this.consecutiveGaps = 0;
138
+ return this.escalateOrSkip('repeated stalls within window');
139
+ }
140
+ }
141
+ return { type: 'skip_forward' };
142
+ }
143
+ /**
144
+ * Relay signals overload via PUBLISH_DONE/TOO_FAR_BEHIND (§9.13);
145
+ * network bottlenecks produce no server signal, so the player must
146
+ * self-detect via stall rate.
147
+ */
148
+ handleStall(durationMs) {
149
+ if (durationMs < this.stallThresholdMs) {
150
+ return { type: 'skip_forward' };
151
+ }
152
+ // Feed into the same windowed counter as gaps — the user doesn't
153
+ // care WHY the video is degraded, only that it is.
154
+ if (this.clock) {
155
+ const now = this.clock.now();
156
+ this.gapTimestamps.push(now);
157
+ const cutoff = now - this.windowedWindowUs;
158
+ while (this.gapTimestamps.length > 0 && this.gapTimestamps[0] < cutoff) {
159
+ this.gapTimestamps.shift();
160
+ }
161
+ if (this.gapTimestamps.length >= this.windowedThreshold) {
162
+ this.gapTimestamps.length = 0;
163
+ return this.escalateOrSkip('sustained stalls within window');
164
+ }
165
+ }
166
+ return { type: 'skip_forward' };
167
+ }
168
+ handleDecodeError(message) {
169
+ this.decodeErrorCount++;
170
+ if (this.decodeErrorCount >= this.maxDecodeErrors) {
171
+ return { type: 'terminate', reason: `repeated decode error: ${message}` };
172
+ }
173
+ return { type: 'resubscribe' };
174
+ }
175
+ }
176
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * PTS-anchored render scheduler.
3
+ *
4
+ * Computes wall-clock render times from CaptureTimestamps at decode OUTPUT,
5
+ * solving the async decode latency problem. Anchors on the first rendered
6
+ * frame's PTS and spaces subsequent frames by PTS delta.
7
+ *
8
+ * This produces correct 33ms pacing regardless of delivery pattern:
9
+ * - Burst delivery (cached GOP): 8 frames decoded in 40ms → render 33ms apart
10
+ * - Live delivery: frames arrive at 33ms intervals → render at 33ms intervals
11
+ * - Burst-to-live transition: automatic rebase when delivery catches up to PTS
12
+ *
13
+ * Used by the CanvasRenderer to schedule frame presentation.
14
+ * Sans-I/O: depends only on ClockSource, no browser APIs.
15
+ *
16
+ * @see draft-ietf-moq-loc-01 §2.3.1.1 (CaptureTimestamp)
17
+ * @module
18
+ */
19
+ import type { ClockSource } from './types.js';
20
+ export interface RenderSchedulerOptions {
21
+ /** Extra future cushion for first frame in microseconds. Default: 16000 (1 rAF tick). */
22
+ readonly cushionUs?: number;
23
+ }
24
+ /**
25
+ * Computes wall-clock render times from CaptureTimestamps.
26
+ *
27
+ * Call `schedule(captureTimestampUs)` when a decoded frame arrives.
28
+ * Returns the wall-clock time (in µs) when the frame should be painted.
29
+ */
30
+ export declare class RenderScheduler {
31
+ private readonly clock;
32
+ private readonly cushionUs;
33
+ /** Wall-clock anchor: local time when the first frame was scheduled. */
34
+ private baseTimeUs;
35
+ /** PTS anchor: captureTimestamp of the first frame. */
36
+ private basePtsUs;
37
+ /** Previous frame's arrival time — for burst-to-live detection. */
38
+ private lastArrivalUs;
39
+ constructor(clock: ClockSource, options?: RenderSchedulerOptions);
40
+ /**
41
+ * Compute the wall-clock render time for a decoded frame.
42
+ *
43
+ * @param captureTimestampUs CaptureTimestamp from LOC header (microseconds)
44
+ * @returns Wall-clock time in microseconds when the frame should be painted
45
+ */
46
+ schedule(captureTimestampUs: bigint): number;
47
+ /** Reset anchor (seek, pause→resume, gap skip). */
48
+ reset(): void;
49
+ }
50
+ //# sourceMappingURL=render-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-scheduler.d.ts","sourceRoot":"","sources":["../src/render-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,wEAAwE;IACxE,OAAO,CAAC,UAAU,CAAuB;IACzC,uDAAuD;IACvD,OAAO,CAAC,SAAS,CAAuB;IAExC,mEAAmE;IACnE,OAAO,CAAC,aAAa,CAAa;gBAEtB,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAKhE;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM;IAuC5C,mDAAmD;IACnD,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * PTS-anchored render scheduler.
3
+ *
4
+ * Computes wall-clock render times from CaptureTimestamps at decode OUTPUT,
5
+ * solving the async decode latency problem. Anchors on the first rendered
6
+ * frame's PTS and spaces subsequent frames by PTS delta.
7
+ *
8
+ * This produces correct 33ms pacing regardless of delivery pattern:
9
+ * - Burst delivery (cached GOP): 8 frames decoded in 40ms → render 33ms apart
10
+ * - Live delivery: frames arrive at 33ms intervals → render at 33ms intervals
11
+ * - Burst-to-live transition: automatic rebase when delivery catches up to PTS
12
+ *
13
+ * Used by the CanvasRenderer to schedule frame presentation.
14
+ * Sans-I/O: depends only on ClockSource, no browser APIs.
15
+ *
16
+ * @see draft-ietf-moq-loc-01 §2.3.1.1 (CaptureTimestamp)
17
+ * @module
18
+ */
19
+ /**
20
+ * Computes wall-clock render times from CaptureTimestamps.
21
+ *
22
+ * Call `schedule(captureTimestampUs)` when a decoded frame arrives.
23
+ * Returns the wall-clock time (in µs) when the frame should be painted.
24
+ */
25
+ export class RenderScheduler {
26
+ clock;
27
+ cushionUs;
28
+ /** Wall-clock anchor: local time when the first frame was scheduled. */
29
+ baseTimeUs = null;
30
+ /** PTS anchor: captureTimestamp of the first frame. */
31
+ basePtsUs = null;
32
+ /** Previous frame's arrival time — for burst-to-live detection. */
33
+ lastArrivalUs = 0;
34
+ constructor(clock, options) {
35
+ this.clock = clock;
36
+ this.cushionUs = options?.cushionUs ?? 16_000;
37
+ }
38
+ /**
39
+ * Compute the wall-clock render time for a decoded frame.
40
+ *
41
+ * @param captureTimestampUs CaptureTimestamp from LOC header (microseconds)
42
+ * @returns Wall-clock time in microseconds when the frame should be painted
43
+ */
44
+ schedule(captureTimestampUs) {
45
+ const nowUs = this.clock.now();
46
+ const ptsUs = Number(captureTimestampUs);
47
+ // INVARIANT: baseTimeUs and basePtsUs are always co-null or co-set —
48
+ // every write site (init / first-frame / rebase / reset) updates both.
49
+ // The `||` here is required for TypeScript narrowing: with `&&`, TS
50
+ // can't prove either is non-null in the else branch.
51
+ if (this.baseTimeUs === null || this.basePtsUs === null) {
52
+ // First frame: set anchor
53
+ this.baseTimeUs = nowUs + this.cushionUs;
54
+ this.basePtsUs = ptsUs;
55
+ this.lastArrivalUs = nowUs;
56
+ return this.baseTimeUs;
57
+ }
58
+ // PTS-relative render time
59
+ const ptsDelta = ptsUs - this.basePtsUs;
60
+ let renderTimeUs = this.baseTimeUs + ptsDelta;
61
+ // Burst-to-live transition detection:
62
+ // During burst, frames arrive faster than their PTS spacing (inter-arrival < 33ms).
63
+ // During live, frames arrive at PTS spacing (inter-arrival ≈ 33ms).
64
+ // When the scheduled render time falls behind the current clock (render time is in
65
+ // the past), and the frame is arriving at real-time rate, snap the anchor forward.
66
+ const arrivalDelta = nowUs - this.lastArrivalUs;
67
+ if (renderTimeUs < nowUs && arrivalDelta > 20_000) {
68
+ // Frame is late AND arrived at real-time rate (not burst)
69
+ // → transition from burst to live, rebase anchor
70
+ this.baseTimeUs = nowUs + this.cushionUs;
71
+ this.basePtsUs = ptsUs;
72
+ renderTimeUs = this.baseTimeUs;
73
+ }
74
+ this.lastArrivalUs = nowUs;
75
+ return renderTimeUs;
76
+ }
77
+ /** Reset anchor (seek, pause→resume, gap skip). */
78
+ reset() {
79
+ this.baseTimeUs = null;
80
+ this.basePtsUs = null;
81
+ this.lastArrivalUs = 0;
82
+ }
83
+ }
84
+ //# sourceMappingURL=render-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-scheduler.js","sourceRoot":"","sources":["../src/render-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACT,KAAK,CAAc;IACnB,SAAS,CAAS;IAEnC,wEAAwE;IAChE,UAAU,GAAkB,IAAI,CAAC;IACzC,uDAAuD;IAC/C,SAAS,GAAkB,IAAI,CAAC;IAExC,mEAAmE;IAC3D,aAAa,GAAW,CAAC,CAAC;IAElC,YAAY,KAAkB,EAAE,OAAgC;QAC9D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,kBAA0B;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAEzC,qEAAqE;QACrE,uEAAuE;QACvE,oEAAoE;QACpE,qDAAqD;QACrD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACxD,0BAA0B;YAC1B,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QACxC,IAAI,YAAY,GAAG,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QAE9C,sCAAsC;QACtC,oFAAoF;QACpF,oEAAoE;QACpE,mFAAmF;QACnF,mFAAmF;QACnF,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;QAEhD,IAAI,YAAY,GAAG,KAAK,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC;YAClD,0DAA0D;YAC1D,iDAAiD;YACjD,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;YACzC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,mDAAmD;IACnD,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * StartupBuffer — holds frames before first drain to warm the jitter estimator.
3
+ *
4
+ * Prevents initial stutter by collecting N frames (determined by network class)
5
+ * before allowing the pipeline to start draining. During the hold, the adaptive
6
+ * tolerance controller calibrates from real arrival timing — so it's ready
7
+ * when playback begins.
8
+ *
9
+ * Network classification uses the QUIC handshake RTT (available before any media)
10
+ * to set initial parameters:
11
+ * - LAN (<1ms): 2 frames / 80ms max — near-zero startup delay
12
+ * - Near-LAN (1-5ms): 3 frames / 120ms
13
+ * - Metro WAN (5-50ms): 8 frames / 300ms
14
+ * - Long-haul WAN (>50ms): 12 frames / 500ms
15
+ *
16
+ * @see draft-ietf-moq-loc-01 §4.2 (decode order)
17
+ * @module
18
+ */
19
+ export interface StartupParams {
20
+ /** Minimum frames to collect before allowing drain. */
21
+ readonly minFrames: number;
22
+ /** Hard timeout — drain regardless of frame count. */
23
+ readonly maxWaitMs: number;
24
+ }
25
+ /**
26
+ * Classify network conditions from QUIC handshake RTT.
27
+ *
28
+ * @param handshakeRttMs Round-trip time from the QUIC/WebTransport handshake
29
+ */
30
+ export declare function classifyNetwork(handshakeRttMs: number): StartupParams;
31
+ /**
32
+ * Gates pipeline draining until enough frames have arrived for smooth startup.
33
+ *
34
+ * Usage:
35
+ * ```ts
36
+ * // In pipeline.pushObject():
37
+ * startupBuffer.recordFrame(clock.now() / 1000);
38
+ *
39
+ * // In pipeline.tick():
40
+ * if (!startupBuffer.shouldDrain) return; // hold frames
41
+ * // ... normal drain logic
42
+ * ```
43
+ */
44
+ export declare class StartupBuffer {
45
+ private readonly minFrames;
46
+ private readonly maxWaitMs;
47
+ private _frameCount;
48
+ private _firstFrameMs;
49
+ private _lastFrameMs;
50
+ private _draining;
51
+ constructor(params: StartupParams);
52
+ /**
53
+ * Record a frame arrival. Call from pushObject().
54
+ * @param nowMs Current time in milliseconds
55
+ */
56
+ recordFrame(nowMs: number): void;
57
+ /** Whether the pipeline should start draining (buffer phase complete). */
58
+ get shouldDrain(): boolean;
59
+ /** Number of frames recorded. */
60
+ get frameCount(): number;
61
+ /** Time elapsed since first frame in milliseconds. */
62
+ get elapsedMs(): number;
63
+ /** Accelerated EMA alpha for warmup (4x standard 1/16). */
64
+ get warmupEmaAlpha(): number;
65
+ /** Reset to buffering state (e.g., after seek or pause→resume). */
66
+ reset(): void;
67
+ }
68
+ //# sourceMappingURL=startup-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-buffer.d.ts","sourceRoot":"","sources":["../src/startup-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,aAAa,CAUrE;AAID;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,aAAa;IAKjC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAgBhC,0EAA0E;IAC1E,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,iCAAiC;IACjC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,sDAAsD;IACtD,IAAI,SAAS,IAAI,MAAM,CAGtB;IAED,2DAA2D;IAC3D,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,mEAAmE;IACnE,KAAK,IAAI,IAAI;CAMd"}