dsh-pf-stream 0.0.0-stage → 0.1.2
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/LICENSE +201 -0
- package/README.en.md +110 -0
- package/README.md +109 -2
- package/cordis.patch.yml +2 -0
- package/lib/entry/adapter.d.ts +21 -0
- package/lib/entry/adapter.js +112 -0
- package/lib/entry/adapter.js.map +1 -0
- package/lib/entry/legacyNormalizer.d.ts +16 -0
- package/lib/entry/legacyNormalizer.js +86 -0
- package/lib/entry/legacyNormalizer.js.map +1 -0
- package/lib/errors.d.ts +7 -0
- package/lib/errors.js +12 -0
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +108 -0
- package/lib/index.js +109 -0
- package/lib/index.js.map +1 -0
- package/lib/session/state.d.ts +25 -0
- package/lib/session/state.js +255 -0
- package/lib/session/state.js.map +1 -0
- package/lib/stage0/decoder.d.ts +57 -0
- package/lib/stage0/decoder.js +229 -0
- package/lib/stage0/decoder.js.map +1 -0
- package/lib/stage0/ffmpeg.d.ts +34 -0
- package/lib/stage0/ffmpeg.js +90 -0
- package/lib/stage0/ffmpeg.js.map +1 -0
- package/lib/stage0/probe.d.ts +47 -0
- package/lib/stage0/probe.js +150 -0
- package/lib/stage0/probe.js.map +1 -0
- package/lib/stage1/gradient.d.ts +27 -0
- package/lib/stage1/gradient.js +85 -0
- package/lib/stage1/gradient.js.map +1 -0
- package/lib/stage1/perceive.d.ts +66 -0
- package/lib/stage1/perceive.js +233 -0
- package/lib/stage1/perceive.js.map +1 -0
- package/lib/stage2/stateMachine.d.ts +70 -0
- package/lib/stage2/stateMachine.js +180 -0
- package/lib/stage2/stateMachine.js.map +1 -0
- package/lib/stage2/switchDetector.d.ts +18 -0
- package/lib/stage2/switchDetector.js +34 -0
- package/lib/stage2/switchDetector.js.map +1 -0
- package/lib/stage3/deterministicRouter.d.ts +44 -0
- package/lib/stage3/deterministicRouter.js +203 -0
- package/lib/stage3/deterministicRouter.js.map +1 -0
- package/lib/stage3/streamSampler.d.ts +74 -0
- package/lib/stage3/streamSampler.js +497 -0
- package/lib/stage3/streamSampler.js.map +1 -0
- package/lib/stage4/canvasPacker.d.ts +60 -0
- package/lib/stage4/canvasPacker.js +161 -0
- package/lib/stage4/canvasPacker.js.map +1 -0
- package/lib/stage4/markers.d.ts +19 -0
- package/lib/stage4/markers.js +98 -0
- package/lib/stage4/markers.js.map +1 -0
- package/lib/stage4/viewport.d.ts +61 -0
- package/lib/stage4/viewport.js +151 -0
- package/lib/stage4/viewport.js.map +1 -0
- package/lib/stage5/controller.d.ts +61 -0
- package/lib/stage5/controller.js +260 -0
- package/lib/stage5/controller.js.map +1 -0
- package/lib/stage5/intent.d.ts +27 -0
- package/lib/stage5/intent.js +87 -0
- package/lib/stage5/intent.js.map +1 -0
- package/lib/stage6/history.d.ts +52 -0
- package/lib/stage6/history.js +155 -0
- package/lib/stage6/history.js.map +1 -0
- package/lib/stage6/precheck.d.ts +56 -0
- package/lib/stage6/precheck.js +86 -0
- package/lib/stage6/precheck.js.map +1 -0
- package/lib/tool/handler.d.ts +35 -0
- package/lib/tool/handler.js +56 -0
- package/lib/tool/handler.js.map +1 -0
- package/lib/tool/schema.d.ts +29 -0
- package/lib/tool/schema.js +59 -0
- package/lib/tool/schema.js.map +1 -0
- package/lib/tool/streamCall.d.ts +41 -0
- package/lib/tool/streamCall.js +105 -0
- package/lib/tool/streamCall.js.map +1 -0
- package/lib/types.d.ts +355 -0
- package/lib/types.js +11 -0
- package/lib/types.js.map +1 -0
- package/lib/utils/ffmpegBin.d.ts +20 -0
- package/lib/utils/ffmpegBin.js +62 -0
- package/lib/utils/ffmpegBin.js.map +1 -0
- package/lib/utils/hash.d.ts +13 -0
- package/lib/utils/hash.js +24 -0
- package/lib/utils/hash.js.map +1 -0
- package/lib/utils/image.d.ts +32 -0
- package/lib/utils/image.js +135 -0
- package/lib/utils/image.js.map +1 -0
- package/lib/utils/pts.d.ts +15 -0
- package/lib/utils/pts.js +50 -0
- package/lib/utils/pts.js.map +1 -0
- package/package.json +55 -4
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 2 —— 施密特四状态机(规格《三》§3)。
|
|
3
|
+
*
|
|
4
|
+
* STATIC / MOTION / SETTLE / SWITCH:
|
|
5
|
+
* - 高阈值 H_high_eff(动态,默认 0.10),低阈值联动 H_low_eff = 0.5×H_high_eff;
|
|
6
|
+
* - SETTLE 满 T_settle_eff(PTS 差值)→ 锁定 F、A←0、转 STATIC,再经 T_merge=50ms 打包;
|
|
7
|
+
* - SWITCH 原子抢占:清积分、清 P 队列、废擂台、EMA 重置 + 3 帧预热、R4 快定格、
|
|
8
|
+
* 捕获 F_switch(黑场顺延由流式引擎执行)、转 STATIC 观察 250ms。
|
|
9
|
+
*
|
|
10
|
+
* 所有时间判定基于 PTS(契约 5)。积分器 A 与擂台归状态机管,
|
|
11
|
+
* 待发 P 队列与 F 编码由 Stage 3 流式采样器执行。
|
|
12
|
+
*/
|
|
13
|
+
export class SchmittMachine {
|
|
14
|
+
state = 'STATIC';
|
|
15
|
+
enteredAtPtsMs = 0;
|
|
16
|
+
integratorA = 0;
|
|
17
|
+
gEma = 0;
|
|
18
|
+
emaWarmupLeft = 0;
|
|
19
|
+
settleStartPtsMs = null;
|
|
20
|
+
/** SETTLE 锁定后的防碎合并窗起点。 */
|
|
21
|
+
mergeStartPtsMs = null;
|
|
22
|
+
lastAnchorGlobalId = null;
|
|
23
|
+
/** SWITCH 后静态观察起点与 F_switch 待发标志。 */
|
|
24
|
+
switchStaticSincePtsMs = null;
|
|
25
|
+
fSwitchPending = false;
|
|
26
|
+
constructor(init) {
|
|
27
|
+
if (init)
|
|
28
|
+
Object.assign(this, init);
|
|
29
|
+
}
|
|
30
|
+
snapshot() {
|
|
31
|
+
return {
|
|
32
|
+
state: this.state,
|
|
33
|
+
enteredAtPtsMs: this.enteredAtPtsMs,
|
|
34
|
+
integratorA: this.integratorA,
|
|
35
|
+
gEma: this.gEma,
|
|
36
|
+
emaWarmupLeft: this.emaWarmupLeft,
|
|
37
|
+
settleStartPtsMs: this.settleStartPtsMs,
|
|
38
|
+
lastKCandidates: null,
|
|
39
|
+
lastMotionVec: null,
|
|
40
|
+
arena: null,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** H_low_eff 联动。 */
|
|
44
|
+
static hLowOf(hHighEff) {
|
|
45
|
+
return 0.5 * hHighEff;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 单帧步进。switchVerdict 由 SwitchDetector 先行判定;
|
|
49
|
+
* settleArena 由流式引擎维护(观察窗内 g 最高帧),settle_lock 时取用。
|
|
50
|
+
*/
|
|
51
|
+
step(ptsMs, d, th, switchVerdict) {
|
|
52
|
+
const effects = [];
|
|
53
|
+
const hLow = SchmittMachine.hLowOf(th.hHighEff);
|
|
54
|
+
if (switchVerdict === 'SWITCH') {
|
|
55
|
+
// 原子抢占(步骤 1-5、7):清积分、清队列(采样器响应)、废擂台、EMA 重置、
|
|
56
|
+
// R4 由流式引擎直写 T_settle_eff=80;转 STATIC 观察。
|
|
57
|
+
this.integratorA = 0;
|
|
58
|
+
this.gEma = 0;
|
|
59
|
+
this.emaWarmupLeft = 3;
|
|
60
|
+
this.settleStartPtsMs = null;
|
|
61
|
+
this.mergeStartPtsMs = null;
|
|
62
|
+
this.state = 'STATIC';
|
|
63
|
+
this.enteredAtPtsMs = ptsMs;
|
|
64
|
+
this.switchStaticSincePtsMs = ptsMs;
|
|
65
|
+
this.fSwitchPending = true;
|
|
66
|
+
effects.push('switch');
|
|
67
|
+
return { state: this.state, effects };
|
|
68
|
+
}
|
|
69
|
+
switch (this.state) {
|
|
70
|
+
case 'STATIC': {
|
|
71
|
+
if (this.switchStaticSincePtsMs !== null) {
|
|
72
|
+
// SWITCH 后静态观察窗(250ms)
|
|
73
|
+
if (d > th.hHighEff) {
|
|
74
|
+
this.switchStaticSincePtsMs = null;
|
|
75
|
+
if (this.fSwitchPending) {
|
|
76
|
+
this.fSwitchPending = false;
|
|
77
|
+
effects.push('switch_motion_void');
|
|
78
|
+
}
|
|
79
|
+
this.toMotion(ptsMs, effects);
|
|
80
|
+
}
|
|
81
|
+
else if (ptsMs - this.switchStaticSincePtsMs >= th.switchStaticMs) {
|
|
82
|
+
this.switchStaticSincePtsMs = null;
|
|
83
|
+
if (this.fSwitchPending) {
|
|
84
|
+
this.fSwitchPending = false;
|
|
85
|
+
effects.push('switch_static_emit');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 合并窗在 SWITCH 场景不存在
|
|
89
|
+
if (this.mergeStartPtsMs !== null)
|
|
90
|
+
this.mergeStartPtsMs = null;
|
|
91
|
+
return { state: this.state, effects };
|
|
92
|
+
}
|
|
93
|
+
// 常规 STATIC:防碎合并窗
|
|
94
|
+
if (this.mergeStartPtsMs !== null && ptsMs - this.mergeStartPtsMs >= th.tMergeMs) {
|
|
95
|
+
this.mergeStartPtsMs = null;
|
|
96
|
+
effects.push('merge_emit');
|
|
97
|
+
}
|
|
98
|
+
if (d > th.hHighEff) {
|
|
99
|
+
// 合并窗内运动复发:锁定的 F 留待与新 P 簇合并发出(mergeStart 清除)
|
|
100
|
+
this.mergeStartPtsMs = null;
|
|
101
|
+
this.toMotion(ptsMs, effects);
|
|
102
|
+
}
|
|
103
|
+
return { state: this.state, effects };
|
|
104
|
+
}
|
|
105
|
+
case 'MOTION': {
|
|
106
|
+
if (d < hLow) {
|
|
107
|
+
this.state = 'SETTLE';
|
|
108
|
+
this.enteredAtPtsMs = ptsMs;
|
|
109
|
+
this.settleStartPtsMs = ptsMs;
|
|
110
|
+
effects.push('settle_enter');
|
|
111
|
+
}
|
|
112
|
+
return { state: this.state, effects };
|
|
113
|
+
}
|
|
114
|
+
case 'SETTLE': {
|
|
115
|
+
if (d >= hLow) {
|
|
116
|
+
this.state = 'MOTION';
|
|
117
|
+
this.enteredAtPtsMs = ptsMs;
|
|
118
|
+
this.settleStartPtsMs = null;
|
|
119
|
+
effects.push('settle_cancel'); // 积分器 A 保持不清零
|
|
120
|
+
return { state: this.state, effects };
|
|
121
|
+
}
|
|
122
|
+
const start = this.settleStartPtsMs ?? ptsMs;
|
|
123
|
+
if (ptsMs - start >= th.tSettleEff) {
|
|
124
|
+
// 锁定观察窗最清晰帧生成 F(采样器执行),清零积分器,转 STATIC + 合并窗
|
|
125
|
+
this.integratorA = 0;
|
|
126
|
+
this.settleStartPtsMs = null;
|
|
127
|
+
this.state = 'STATIC';
|
|
128
|
+
this.enteredAtPtsMs = ptsMs;
|
|
129
|
+
this.mergeStartPtsMs = ptsMs;
|
|
130
|
+
effects.push('settle_lock');
|
|
131
|
+
}
|
|
132
|
+
return { state: this.state, effects };
|
|
133
|
+
}
|
|
134
|
+
default:
|
|
135
|
+
return { state: this.state, effects };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
toMotion(ptsMs, effects) {
|
|
139
|
+
this.state = 'MOTION';
|
|
140
|
+
this.enteredAtPtsMs = ptsMs;
|
|
141
|
+
this.emaWarmupLeft = 3; // EMA 3 帧预热
|
|
142
|
+
effects.push('enter_motion');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function createClarityState() {
|
|
146
|
+
return { gEma: 0, warmupLeft: 3, rhoHistory: [] };
|
|
147
|
+
}
|
|
148
|
+
/** 更新 EMA(1/8 系数)与 ρ;预热期内用当前帧梯度初始化/推进。 */
|
|
149
|
+
export function updateClarity(cs, g, opts = {}) {
|
|
150
|
+
if (opts.resetWarmup)
|
|
151
|
+
cs.warmupLeft = 3;
|
|
152
|
+
if (cs.warmupLeft > 0) {
|
|
153
|
+
// 预热:均值初始化并逐帧推进
|
|
154
|
+
cs.gEma = cs.gEma === 0 ? g : g / 8 + (7 / 8) * cs.gEma;
|
|
155
|
+
cs.warmupLeft -= 1;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
cs.gEma = g / 8 + (7 / 8) * cs.gEma;
|
|
159
|
+
}
|
|
160
|
+
const rho = g / (cs.gEma + 1e-6);
|
|
161
|
+
cs.rhoHistory.push(rho);
|
|
162
|
+
if (cs.rhoHistory.length > 3)
|
|
163
|
+
cs.rhoHistory.shift();
|
|
164
|
+
return rho;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* PEAK 局部波峰判定:ρ_{t-1} ≥ ρ_{t-2} 且 ρ_{t-1} > ρ_t 且 ρ_{t-1} ≥ ρ_min。
|
|
168
|
+
* 预热期(warmupLeft > 0 或历史不足 3 帧)不判波峰(返回 false)。
|
|
169
|
+
*/
|
|
170
|
+
export function isLocalPeak(cs, rhoMin) {
|
|
171
|
+
if (cs.rhoHistory.length < 3)
|
|
172
|
+
return false;
|
|
173
|
+
const [prev2, prev1, curr] = [cs.rhoHistory[0], cs.rhoHistory[1], cs.rhoHistory[2]];
|
|
174
|
+
return prev1 >= prev2 && prev1 > curr && prev1 >= rhoMin;
|
|
175
|
+
}
|
|
176
|
+
/** 擂台比较:候选是否击败当前记录(ρ 更高;无记录时恒真)。 */
|
|
177
|
+
export function beatsArena(candidate, rho) {
|
|
178
|
+
return candidate === null || rho > candidate.rho;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=stateMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateMachine.js","sourceRoot":"","sources":["../../src/stage2/stateMachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 2 —— 硬切(SWITCH)与极速甩镜解耦(规格《三》§2)。
|
|
3
|
+
*
|
|
4
|
+
* H_switch = 0.10 为固定常量,与动态调节的 H_high_eff 解耦;
|
|
5
|
+
* ≥ 26 块(> 80%)满足 δ_raw > 0.30 或 δ > 0.30 时进入直方图判据:
|
|
6
|
+
* D_hist ≥ 0.35 → 场景硬切;D_hist < 0.35 → 极速甩镜(维持/切入 MOTION)。
|
|
7
|
+
*/
|
|
8
|
+
export declare const H_SWITCH = 0.1;
|
|
9
|
+
export declare const SWITCH_BLOCK_THRESHOLD = 0.3;
|
|
10
|
+
export declare const SWITCH_MIN_BLOCKS = 26;
|
|
11
|
+
export declare const SWITCH_HIST_L1 = 0.35;
|
|
12
|
+
export type SwitchVerdict = 'none' | 'SWITCH' | 'WHIP';
|
|
13
|
+
export declare function classifySceneChange(switchCandidateBlocks: number, histL1: number): SwitchVerdict;
|
|
14
|
+
/**
|
|
15
|
+
* 黑场/过曝帧判定(SWITCH 原子步骤 6 顺延条件):
|
|
16
|
+
* μ_I < 0.05 或 μ_I > 0.95 且 σ_I < 0.01。
|
|
17
|
+
*/
|
|
18
|
+
export declare function isBlackOrBlownFrame(gray: Float64Array): boolean;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 2 —— 硬切(SWITCH)与极速甩镜解耦(规格《三》§2)。
|
|
3
|
+
*
|
|
4
|
+
* H_switch = 0.10 为固定常量,与动态调节的 H_high_eff 解耦;
|
|
5
|
+
* ≥ 26 块(> 80%)满足 δ_raw > 0.30 或 δ > 0.30 时进入直方图判据:
|
|
6
|
+
* D_hist ≥ 0.35 → 场景硬切;D_hist < 0.35 → 极速甩镜(维持/切入 MOTION)。
|
|
7
|
+
*/
|
|
8
|
+
export const H_SWITCH = 0.1;
|
|
9
|
+
export const SWITCH_BLOCK_THRESHOLD = 0.3;
|
|
10
|
+
export const SWITCH_MIN_BLOCKS = 26;
|
|
11
|
+
export const SWITCH_HIST_L1 = 0.35;
|
|
12
|
+
export function classifySceneChange(switchCandidateBlocks, histL1) {
|
|
13
|
+
if (switchCandidateBlocks < SWITCH_MIN_BLOCKS)
|
|
14
|
+
return 'none';
|
|
15
|
+
return histL1 >= SWITCH_HIST_L1 ? 'SWITCH' : 'WHIP';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 黑场/过曝帧判定(SWITCH 原子步骤 6 顺延条件):
|
|
19
|
+
* μ_I < 0.05 或 μ_I > 0.95 且 σ_I < 0.01。
|
|
20
|
+
*/
|
|
21
|
+
export function isBlackOrBlownFrame(gray) {
|
|
22
|
+
let mean = 0;
|
|
23
|
+
for (let i = 0; i < gray.length; i++)
|
|
24
|
+
mean += gray[i];
|
|
25
|
+
mean /= gray.length;
|
|
26
|
+
if (mean >= 0.05 && mean <= 0.95)
|
|
27
|
+
return false;
|
|
28
|
+
let variance = 0;
|
|
29
|
+
for (let i = 0; i < gray.length; i++)
|
|
30
|
+
variance += (gray[i] - mean) ** 2;
|
|
31
|
+
variance /= gray.length;
|
|
32
|
+
return Math.sqrt(variance) < 0.01;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=switchDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switchDetector.js","sourceRoot":"","sources":["../../src/stage2/switchDetector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAC5B,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAInC,MAAM,UAAU,mBAAmB,CACjC,qBAA6B,EAC7B,MAAc;IAEd,IAAI,qBAAqB,GAAG,iBAAiB;QAAE,OAAO,MAAM,CAAC;IAC7D,OAAO,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC;IACvD,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 3 —— 确定性检视路由(《四、采样逻辑…》§3)。
|
|
3
|
+
*
|
|
4
|
+
* 旁路状态机与自闭环,复用 Stage 0(解码)与 Stage 4(视窗归一化与画布打包):
|
|
5
|
+
* - 单时间戳 / focus=detail 逐帧 → FORM_3(1F,274 Tokens,slot F 全分辨率);
|
|
6
|
+
* - uniform + focus=motion → 每 4 帧一组 FORM_2(4P 概览);
|
|
7
|
+
* - 默认 balanced → 每组前 1~3 帧 P + 组末帧 F(FORM_1 / FORM_4);
|
|
8
|
+
* - 批量退化:目标数 ≥32 且平均间隔 ≤2s → 单遍区间解码 + 最近 PTS 帧映射;
|
|
9
|
+
* - 空帧回退复用最后一个有效解码帧。
|
|
10
|
+
*/
|
|
11
|
+
import { type PacketArtifact } from '../stage4/canvasPacker.js';
|
|
12
|
+
import type { IntentDirective, ProbeResult } from '../types.js';
|
|
13
|
+
export interface RouterOptions {
|
|
14
|
+
ffmpegPath: string;
|
|
15
|
+
renderVisualId: boolean;
|
|
16
|
+
packetIdStart: number;
|
|
17
|
+
globalIdStart: number;
|
|
18
|
+
appliedIntentId: string;
|
|
19
|
+
/** 请求字节水位(Base64 后口径;缺省不校验)。规格《六》§2 对 PATH_DETERMINISTIC 同样生效。 */
|
|
20
|
+
maxRequestBytes?: number | undefined;
|
|
21
|
+
/** 单图视觉 Token 上限(meteringProfile 口径;缺省不校验)。 */
|
|
22
|
+
maxTokensPerImage?: number | undefined;
|
|
23
|
+
signal?: AbortSignal | undefined;
|
|
24
|
+
}
|
|
25
|
+
export interface InspectionResult {
|
|
26
|
+
packets: PacketArtifact[];
|
|
27
|
+
hintLines: string[];
|
|
28
|
+
/** 实际抽帧 PTS 序列(毫秒,排序去重后)。 */
|
|
29
|
+
sampledPtsMs: number[];
|
|
30
|
+
}
|
|
31
|
+
/** 目标 PTS 列表推导:排序、去重、钳制。 */
|
|
32
|
+
export declare function resolveTargets(intent: IntentDirective, probe: ProbeResult): number[];
|
|
33
|
+
/** 批量退化判定。 */
|
|
34
|
+
export declare function shouldBatchDecode(targets: number[]): boolean;
|
|
35
|
+
interface GroupPlan {
|
|
36
|
+
form: 'FORM_1_STANDARD_STRIP' | 'FORM_2_COMPACT_4P' | 'FORM_3_COMPACT_1F' | 'FORM_4_PARTIAL_STRIP';
|
|
37
|
+
pCount: number;
|
|
38
|
+
hasF: boolean;
|
|
39
|
+
}
|
|
40
|
+
/** 分组与形态规划。 */
|
|
41
|
+
export declare function planGroups(targets: number[], focus: IntentDirective['focus'], singleTimestamp: boolean): GroupPlan[];
|
|
42
|
+
/** 执行确定性检视。 */
|
|
43
|
+
export declare function runDeterministicInspection(videoPath: string, probe: ProbeResult, intent: IntentDirective, options: RouterOptions): Promise<InspectionResult>;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 3 —— 确定性检视路由(《四、采样逻辑…》§3)。
|
|
3
|
+
*
|
|
4
|
+
* 旁路状态机与自闭环,复用 Stage 0(解码)与 Stage 4(视窗归一化与画布打包):
|
|
5
|
+
* - 单时间戳 / focus=detail 逐帧 → FORM_3(1F,274 Tokens,slot F 全分辨率);
|
|
6
|
+
* - uniform + focus=motion → 每 4 帧一组 FORM_2(4P 概览);
|
|
7
|
+
* - 默认 balanced → 每组前 1~3 帧 P + 组末帧 F(FORM_1 / FORM_4);
|
|
8
|
+
* - 批量退化:目标数 ≥32 且平均间隔 ≤2s → 单遍区间解码 + 最近 PTS 帧映射;
|
|
9
|
+
* - 空帧回退复用最后一个有效解码帧。
|
|
10
|
+
*/
|
|
11
|
+
import { decodePointWithFallback, decodeRangeStreaming } from '../stage0/decoder.js';
|
|
12
|
+
import { packCanvas, timelineHintLine } from '../stage4/canvasPacker.js';
|
|
13
|
+
import { applyViewport, planViewport } from '../stage4/viewport.js';
|
|
14
|
+
import { assertCanvasTokenLegal, encodedSizeOf } from '../stage6/precheck.js';
|
|
15
|
+
import { PfStreamError } from '../errors.js';
|
|
16
|
+
/** 目标 PTS 列表推导:排序、去重、钳制。 */
|
|
17
|
+
export function resolveTargets(intent, probe) {
|
|
18
|
+
const last = probe.lastPtsMs;
|
|
19
|
+
if (intent.action === 'timestamps') {
|
|
20
|
+
const list = (intent.timestamps_ms ?? []).map((t) => Math.min(Math.max(Math.round(t), 0), last));
|
|
21
|
+
return dedupeSorted(list.sort((a, b) => a - b));
|
|
22
|
+
}
|
|
23
|
+
// uniform
|
|
24
|
+
const w0raw = intent.pts_window?.[0] ?? 0;
|
|
25
|
+
const w1raw = intent.pts_window?.[1] ?? last;
|
|
26
|
+
const w0 = Math.min(Math.max(Math.round(Math.min(w0raw, w1raw)), 0), last);
|
|
27
|
+
const w1 = Math.min(Math.max(Math.round(Math.max(w0raw, w1raw)), 0), last);
|
|
28
|
+
const out = [];
|
|
29
|
+
if (intent.frame_count != null && intent.frame_count >= 1) {
|
|
30
|
+
if (intent.frame_count === 1)
|
|
31
|
+
return [w0];
|
|
32
|
+
const step = (w1 - w0) / (intent.frame_count - 1);
|
|
33
|
+
for (let i = 0; i < intent.frame_count; i++)
|
|
34
|
+
out.push(Math.round(w0 + step * i));
|
|
35
|
+
}
|
|
36
|
+
else if (intent.interval_ms != null && intent.interval_ms > 0) {
|
|
37
|
+
for (let t = w0; t <= w1; t += intent.interval_ms)
|
|
38
|
+
out.push(Math.round(t));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
out.push(w0);
|
|
42
|
+
}
|
|
43
|
+
return dedupeSorted(out.map((t) => Math.min(t, last)));
|
|
44
|
+
}
|
|
45
|
+
function dedupeSorted(list) {
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const t of list) {
|
|
48
|
+
if (out.length === 0 || out[out.length - 1] !== t)
|
|
49
|
+
out.push(t);
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/** 批量退化判定。 */
|
|
54
|
+
export function shouldBatchDecode(targets) {
|
|
55
|
+
if (targets.length < 32)
|
|
56
|
+
return false;
|
|
57
|
+
const span = targets[targets.length - 1] - targets[0];
|
|
58
|
+
const avgGap = span / (targets.length - 1);
|
|
59
|
+
return avgGap <= 2000;
|
|
60
|
+
}
|
|
61
|
+
/** 分组与形态规划。 */
|
|
62
|
+
export function planGroups(targets, focus, singleTimestamp) {
|
|
63
|
+
const detailMode = focus === 'detail' || singleTimestamp;
|
|
64
|
+
if (detailMode) {
|
|
65
|
+
return targets.map(() => ({ form: 'FORM_3_COMPACT_1F', pCount: 0, hasF: true }));
|
|
66
|
+
}
|
|
67
|
+
if (focus === 'motion') {
|
|
68
|
+
const groups = [];
|
|
69
|
+
for (let i = 0; i < targets.length; i += 4) {
|
|
70
|
+
groups.push({ form: 'FORM_2_COMPACT_4P', pCount: Math.min(4, targets.length - i), hasF: false });
|
|
71
|
+
}
|
|
72
|
+
return groups;
|
|
73
|
+
}
|
|
74
|
+
// balanced:每组 5 帧满组(前 4 帧 P + 组末帧 F → FORM_1);
|
|
75
|
+
// 余组 2~4 帧(前 k-1 帧 P + 组末帧 F → FORM_4),单帧余量 → FORM_3
|
|
76
|
+
const groups = [];
|
|
77
|
+
for (let i = 0; i < targets.length; i += 5) {
|
|
78
|
+
const n = Math.min(5, targets.length - i);
|
|
79
|
+
if (n === 1) {
|
|
80
|
+
groups.push({ form: 'FORM_3_COMPACT_1F', pCount: 0, hasF: true });
|
|
81
|
+
}
|
|
82
|
+
else if (n === 5) {
|
|
83
|
+
groups.push({ form: 'FORM_1_STANDARD_STRIP', pCount: 4, hasF: true });
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
groups.push({ form: 'FORM_4_PARTIAL_STRIP', pCount: n - 1, hasF: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return groups;
|
|
90
|
+
}
|
|
91
|
+
/** 执行确定性检视。 */
|
|
92
|
+
export async function runDeterministicInspection(videoPath, probe, intent, options) {
|
|
93
|
+
const targets = resolveTargets(intent, probe);
|
|
94
|
+
if (targets.length === 0) {
|
|
95
|
+
return { packets: [], hintLines: [], sampledPtsMs: [] };
|
|
96
|
+
}
|
|
97
|
+
const decodeOptions = {
|
|
98
|
+
ffmpegPath: options.ffmpegPath,
|
|
99
|
+
displayWidth: probe.displayWidth,
|
|
100
|
+
displayHeight: probe.displayHeight,
|
|
101
|
+
signal: options.signal,
|
|
102
|
+
};
|
|
103
|
+
// 解码:批量退化(单遍流式 + 最近 PTS 帧映射)或逐点
|
|
104
|
+
const frames = new Map();
|
|
105
|
+
if (shouldBatchDecode(targets)) {
|
|
106
|
+
const best = new Map();
|
|
107
|
+
let firstUnfinalized = 0;
|
|
108
|
+
await decodeRangeStreaming(videoPath, targets[0], targets[targets.length - 1], decodeOptions, (image, ptsMs) => {
|
|
109
|
+
// 帧按 PTS 升序到达:越过目标即定稿
|
|
110
|
+
while (firstUnfinalized < targets.length && ptsMs > targets[firstUnfinalized]) {
|
|
111
|
+
const t = targets[firstUnfinalized];
|
|
112
|
+
const hit = best.get(t);
|
|
113
|
+
if (hit)
|
|
114
|
+
frames.set(t, hit.image);
|
|
115
|
+
firstUnfinalized++;
|
|
116
|
+
}
|
|
117
|
+
for (let j = firstUnfinalized; j < Math.min(targets.length, firstUnfinalized + 8); j++) {
|
|
118
|
+
const t = targets[j];
|
|
119
|
+
const dist = Math.abs(ptsMs - t);
|
|
120
|
+
const prev = best.get(t);
|
|
121
|
+
if (!prev || dist < prev.dist)
|
|
122
|
+
best.set(t, { dist, image });
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
for (let j = firstUnfinalized; j < targets.length; j++) {
|
|
126
|
+
const t = targets[j];
|
|
127
|
+
const hit = best.get(t);
|
|
128
|
+
if (hit)
|
|
129
|
+
frames.set(t, hit.image);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
let lastValid = null;
|
|
134
|
+
for (const target of targets) {
|
|
135
|
+
const frame = await decodePointWithFallback(videoPath, target, probe.lastPtsMs, decodeOptions, lastValid);
|
|
136
|
+
lastValid = frame;
|
|
137
|
+
frames.set(target, frame);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// 视窗计划(同组共享源帧参数,槽位不同)
|
|
141
|
+
const groups = planGroups(targets, intent.focus, targets.length === 1 && intent.action === 'timestamps');
|
|
142
|
+
const packets = [];
|
|
143
|
+
// 提示行(let:字节水位截断时需同步移除对应行)
|
|
144
|
+
let hintLines = [];
|
|
145
|
+
let globalId = options.globalIdStart;
|
|
146
|
+
let packetId = options.packetIdStart;
|
|
147
|
+
let targetIdx = 0;
|
|
148
|
+
for (const group of groups) {
|
|
149
|
+
const units = [];
|
|
150
|
+
const groupTargets = targets.slice(targetIdx, targetIdx + group.pCount + (group.hasF ? 1 : 0));
|
|
151
|
+
for (let i = 0; i < groupTargets.length; i++) {
|
|
152
|
+
const isF = group.hasF && i === groupTargets.length - 1;
|
|
153
|
+
const pts = groupTargets[i];
|
|
154
|
+
const frame = frames.get(pts);
|
|
155
|
+
if (!frame)
|
|
156
|
+
continue;
|
|
157
|
+
const plan = planViewport({
|
|
158
|
+
displayWidth: probe.displayWidth,
|
|
159
|
+
displayHeight: probe.displayHeight,
|
|
160
|
+
roi: intent.roi_hint,
|
|
161
|
+
fullFrame: intent.full_frame === true,
|
|
162
|
+
slot: isF ? 'F' : 'P',
|
|
163
|
+
});
|
|
164
|
+
units.push({
|
|
165
|
+
globalId: globalId++,
|
|
166
|
+
ptsMs: pts,
|
|
167
|
+
scale: isF ? '2x2_F' : '1x1_P',
|
|
168
|
+
eventType: 'DETERMINISTIC',
|
|
169
|
+
image: applyViewport(frame, plan, isF ? 'F' : 'P'),
|
|
170
|
+
sourceCropBbox: plan.sourceCropBbox,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
targetIdx += groupTargets.length;
|
|
174
|
+
if (units.length === 0)
|
|
175
|
+
continue;
|
|
176
|
+
const artifact = packCanvas(group.form, units, {
|
|
177
|
+
packetId: packetId++,
|
|
178
|
+
appliedIntentId: options.appliedIntentId,
|
|
179
|
+
renderVisualId: options.renderVisualId,
|
|
180
|
+
triggerPath: 'DETERMINISTIC',
|
|
181
|
+
});
|
|
182
|
+
packets.push(artifact);
|
|
183
|
+
hintLines.push(timelineHintLine(artifact.packet, intent.roi_hint ?? null));
|
|
184
|
+
if (intent.max_packets != null && packets.length >= intent.max_packets)
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
// 预检(规格《六》§2 对 PATH_DETERMINISTIC 同样生效):
|
|
188
|
+
// 单图 Token 上限逐包校验(违规即错误);字节水位超限从尾部截断增量包。
|
|
189
|
+
if (options.maxTokensPerImage !== undefined) {
|
|
190
|
+
for (const p of packets)
|
|
191
|
+
assertCanvasTokenLegal(p, options.maxTokensPerImage);
|
|
192
|
+
}
|
|
193
|
+
if (options.maxRequestBytes !== undefined) {
|
|
194
|
+
let total = packets.reduce((acc, p) => acc + encodedSizeOf(p.imageBytes), 0);
|
|
195
|
+
while (total > options.maxRequestBytes && packets.length > 0) {
|
|
196
|
+
const last = packets.pop();
|
|
197
|
+
total -= encodedSizeOf(last.imageBytes);
|
|
198
|
+
hintLines = hintLines.filter((l) => !l.includes(`Packet #${last.packet.packetId} `));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return { packets, hintLines, sampledPtsMs: targets };
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=deterministicRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministicRouter.js","sourceRoot":"","sources":["../../src/stage3/deterministicRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage 3 —— 流式采样引擎(pf_stream 主体,规格《三》《四》《六》)。
|
|
3
|
+
*
|
|
4
|
+
* 单遍顺序解码(decodeRangeStreaming)+ 逐帧感知 + 施密特状态机驱动:
|
|
5
|
+
* - P 单元:MOTION 位移积分(A += α·d·ΔPTS/33.3,A ≥ S_eff 出一张 336 P);
|
|
6
|
+
* - F 单元:SETTLE 观察窗最清晰帧 / MOTION PEAK 擂台 / SWITCH 静态保底(黑场顺延 ≤300ms);
|
|
7
|
+
* - 四路流式发包:PATH_SETTLE / PEAK_FULL / PEAK_TIMEOUT / SWITCH_STATIC(DETERMINISTIC 在
|
|
8
|
+
* deterministicRouter);M2 阶段全部 history_mode = 'initial';
|
|
9
|
+
* - R4 快定格:SWITCH 时 T_settle_eff 直写 80ms,首个 MOTION 或静态稳定后恢复基准;
|
|
10
|
+
* - 近邻去重:<500ms 且期间 d < H_low 的未发出 F 原地覆盖;
|
|
11
|
+
* - 长静止心跳:每 5s(PTS)一条轻量 JSON,独立编号空间,不参与包龄计算;
|
|
12
|
+
* - 时间判定全部基于 PTS(契约 5);相同视频输入产出幂等事件流(case 19 断言)。
|
|
13
|
+
*/
|
|
14
|
+
import { type PacketArtifact } from '../stage4/canvasPacker.js';
|
|
15
|
+
import { type StreamBaselines } from '../stage5/intent.js';
|
|
16
|
+
import type { CtrlTickLogEntry, ProbeResult, SessionIntent, StreamCursor } from '../types.js';
|
|
17
|
+
export declare const STEP_MS = 33.3;
|
|
18
|
+
export declare const T_MERGE_MS = 50;
|
|
19
|
+
export declare const SWITCH_STATIC_MS = 250;
|
|
20
|
+
export declare const F_SWITCH_DEFER_MAX_MS = 300;
|
|
21
|
+
export declare const NEAR_DUP_MS = 500;
|
|
22
|
+
export declare const HEARTBEAT_INTERVAL_MS = 5000;
|
|
23
|
+
export interface StreamRunOptions {
|
|
24
|
+
ffmpegPath: string;
|
|
25
|
+
renderVisualId: boolean;
|
|
26
|
+
/** 流式窗口长度(defaultStreamWindowMs)。 */
|
|
27
|
+
windowMs: number;
|
|
28
|
+
/** 窗口起点(intent.pts_window[0]);缺省从会话游标续流。 */
|
|
29
|
+
windowStartMs?: number | undefined;
|
|
30
|
+
/** 流式工作副本上限(streamWorkMaxEdge,0 = 不限)。 */
|
|
31
|
+
streamWorkMaxEdge: number;
|
|
32
|
+
maxPackets: number;
|
|
33
|
+
maxTokensBudget: number;
|
|
34
|
+
appliedIntentId: string;
|
|
35
|
+
packetIdStart: number;
|
|
36
|
+
globalIdStart: number;
|
|
37
|
+
heartbeatSeqStart: number;
|
|
38
|
+
signal?: AbortSignal | undefined;
|
|
39
|
+
}
|
|
40
|
+
export interface StreamTelemetry {
|
|
41
|
+
decodeMs: number;
|
|
42
|
+
perceiveMs: number;
|
|
43
|
+
packMs: number;
|
|
44
|
+
pathLatencyMs: number;
|
|
45
|
+
framesDecoded: number;
|
|
46
|
+
framesStepped: number;
|
|
47
|
+
ptsRealign: number;
|
|
48
|
+
/** 每次 ffmpeg 解码进程的 argv 快照(单遍解码断言:计数=1、单次 -ss)。 */
|
|
49
|
+
ffmpegSpawns: string[][];
|
|
50
|
+
/** 运行期间同一时刻持有的 672 擂台槽位数峰值(单槽位约束:≤2 = MOTION 1 + SETTLE 1)。 */
|
|
51
|
+
arenaMaxHeld: number;
|
|
52
|
+
window: [number, number];
|
|
53
|
+
stopReason: 'budget_packets' | 'budget_tokens' | 'end_of_window' | 'end_of_stream';
|
|
54
|
+
ctrlParams: StreamBaselines;
|
|
55
|
+
/** 500ms 节拍生效值轨迹(R1/R2/R3/R4 断言用)。 */
|
|
56
|
+
ctrlTickLog: CtrlTickLogEntry[];
|
|
57
|
+
}
|
|
58
|
+
export interface StreamRunResult {
|
|
59
|
+
packets: PacketArtifact[];
|
|
60
|
+
hintLines: string[];
|
|
61
|
+
heartbeats: Array<{
|
|
62
|
+
seq: number;
|
|
63
|
+
ptsMs: number;
|
|
64
|
+
}>;
|
|
65
|
+
telemetry: StreamTelemetry;
|
|
66
|
+
nextCursor: StreamCursor;
|
|
67
|
+
/** 本次运行实际消耗的序号终值(含本次)。 */
|
|
68
|
+
counters: {
|
|
69
|
+
packetSeq: number;
|
|
70
|
+
globalUnitSeq: number;
|
|
71
|
+
heartbeatSeq: number;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export declare function runStreamPass(videoPath: string, probe: ProbeResult, sessionIntent: SessionIntent, cursor: StreamCursor, options: StreamRunOptions): Promise<StreamRunResult>;
|