@photivra/engine 0.5.0 → 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.
- package/CHANGELOG.md +38 -0
- package/CITATION.cff +1 -1
- package/README.md +37 -3
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +60 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +95 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +100 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
- package/dist/motion/capture-rotation-inverse-mapping.js +171 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +89 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js +116 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
- package/dist/motion/capture-rotation-trajectory.d.ts +98 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
- package/dist/motion/capture-rotation-trajectory.js +153 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +12 -4
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +4 -2
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +103 -28
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +24 -11
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +211 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.js +423 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts +157 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -0
- package/dist/sensor/capture-mode.js +434 -0
- package/dist/sensor/capture-mode.js.map +1 -0
- package/dist/sensor/color-sampling.d.ts +133 -0
- package/dist/sensor/color-sampling.d.ts.map +1 -0
- package/dist/sensor/color-sampling.js +226 -0
- package/dist/sensor/color-sampling.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +103 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -0
- package/dist/sensor/exposure-window.js +291 -0
- package/dist/sensor/exposure-window.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts +132 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -0
- package/dist/sensor/optical-stack.js +286 -0
- package/dist/sensor/optical-stack.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +111 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
- package/dist/sensor/readout-exposure-linkage.js +210 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -0
- package/dist/sensor/readout-timing.d.ts +124 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -0
- package/dist/sensor/readout-timing.js +230 -0
- package/dist/sensor/readout-timing.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts +154 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -0
- package/dist/sensor/sampling-aperture.js +374 -0
- package/dist/sensor/sampling-aperture.js.map +1 -0
- package/dist/sensor/spatial-sample-reduction.d.ts +128 -0
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
- package/dist/sensor/spatial-sample-reduction.js +299 -0
- package/dist/sensor/spatial-sample-reduction.js.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts +155 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.js +197 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
- package/docs/ARCHITECTURE.md +17 -0
- package/docs/AUTOMATION_COORDINATION.md +188 -0
- package/docs/IMAGE_FORMATION.md +26 -0
- package/docs/MOTION_AND_SIGNAL.md +142 -0
- package/docs/USAGE.md +1273 -3
- package/package.json +5 -3
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { type EvidenceBackedFact, type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
2
|
+
import type { NativeImageRaster, RasterDimensions } from "./sensor-geometry.js";
|
|
3
|
+
export type CaptureModeSampleCombinationDomain = "charge-domain" | "pre-conversion-analog" | "post-conversion-digital";
|
|
4
|
+
export type CaptureModeReconstructionStage = "remosaic" | "pixel-shift-combination" | "multi-frame-computational-combination";
|
|
5
|
+
export type CaptureModeDependency = "color-sampling-model" | "mode-specific-readout-timing" | "radiometric-calibration" | "inter-frame-registration";
|
|
6
|
+
export interface CaptureModeSensorOffsetNativeSamples {
|
|
7
|
+
/**
|
|
8
|
+
* Horizontal sensor displacement in units of the native effective sampling
|
|
9
|
+
* pitch. This is not a claim about physical photodiode pitch.
|
|
10
|
+
*/
|
|
11
|
+
x: number;
|
|
12
|
+
/**
|
|
13
|
+
* Vertical sensor displacement in units of the native effective sampling
|
|
14
|
+
* pitch. This is not a claim about physical photodiode pitch.
|
|
15
|
+
*/
|
|
16
|
+
y: number;
|
|
17
|
+
}
|
|
18
|
+
export type SourcedCaptureModeFact<T> = EvidenceBackedFact<T>;
|
|
19
|
+
export interface SingleFrameCaptureAcquisition {
|
|
20
|
+
kind: "single-frame";
|
|
21
|
+
}
|
|
22
|
+
export interface FixedMultiFrameCaptureAcquisition {
|
|
23
|
+
kind: "fixed-multi-frame";
|
|
24
|
+
frameCount: SourcedCaptureModeFact<number>;
|
|
25
|
+
}
|
|
26
|
+
export interface VariableMultiFrameCaptureAcquisition {
|
|
27
|
+
kind: "variable-multi-frame";
|
|
28
|
+
/**
|
|
29
|
+
* Evidence that the mode is variable/multi-frame, even when exact count
|
|
30
|
+
* bounds are not published.
|
|
31
|
+
*/
|
|
32
|
+
evidence: readonly EvidenceProvenance[];
|
|
33
|
+
minimumFrameCount?: SourcedCaptureModeFact<number>;
|
|
34
|
+
maximumFrameCount?: SourcedCaptureModeFact<number>;
|
|
35
|
+
}
|
|
36
|
+
export type CaptureModeAcquisition = SingleFrameCaptureAcquisition | FixedMultiFrameCaptureAcquisition | VariableMultiFrameCaptureAcquisition;
|
|
37
|
+
export interface NativeEffectiveCaptureSampling {
|
|
38
|
+
kind: "native-effective-raster";
|
|
39
|
+
}
|
|
40
|
+
export interface GroupedNativeCaptureSampling {
|
|
41
|
+
kind: "grouped-native-samples";
|
|
42
|
+
groupWidthSamples: SourcedCaptureModeFact<number>;
|
|
43
|
+
groupHeightSamples: SourcedCaptureModeFact<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Omitted means unknown/unasserted. Do not infer where combination occurs
|
|
46
|
+
* from the word "binning" or from the raster ratio.
|
|
47
|
+
*/
|
|
48
|
+
combinationDomain?: SourcedCaptureModeFact<CaptureModeSampleCombinationDomain>;
|
|
49
|
+
}
|
|
50
|
+
export interface DeclaredEffectiveCaptureSampling {
|
|
51
|
+
kind: "declared-effective-raster";
|
|
52
|
+
/**
|
|
53
|
+
* Per-frame effective sampling raster for a mode whose sampling relationship
|
|
54
|
+
* to the native grid is not safely expressible as simple integer grouping.
|
|
55
|
+
*/
|
|
56
|
+
raster: SourcedCaptureModeFact<RasterDimensions>;
|
|
57
|
+
}
|
|
58
|
+
export type CaptureModePerFrameSampling = NativeEffectiveCaptureSampling | GroupedNativeCaptureSampling | DeclaredEffectiveCaptureSampling;
|
|
59
|
+
export interface CaptureModeDefinition {
|
|
60
|
+
modeId: string;
|
|
61
|
+
/**
|
|
62
|
+
* Evidence supporting the existence/overall acquisition behavior of this
|
|
63
|
+
* mode. Field-level facts below retain their own evidence when needed.
|
|
64
|
+
*/
|
|
65
|
+
evidence: readonly EvidenceProvenance[];
|
|
66
|
+
acquisition: CaptureModeAcquisition;
|
|
67
|
+
perFrameSampling: CaptureModePerFrameSampling;
|
|
68
|
+
/**
|
|
69
|
+
* Optional ordered sensor-displacement sequence for fixed multi-frame modes.
|
|
70
|
+
* The whole sequence is one evidence-backed fact because published mode
|
|
71
|
+
* documentation commonly describes the sequence as a unit.
|
|
72
|
+
*/
|
|
73
|
+
interFrameSensorOffsetsNativeSamples?: SourcedCaptureModeFact<readonly CaptureModeSensorOffsetNativeSamples[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Ordered reconstruction/combination stages owned by later reconstruction
|
|
76
|
+
* work. These labels reserve semantics; they do not implement algorithms.
|
|
77
|
+
*/
|
|
78
|
+
reconstructionStages?: readonly SourcedCaptureModeFact<CaptureModeReconstructionStage>[];
|
|
79
|
+
/**
|
|
80
|
+
* Image raster produced by the capture-mode/reconstruction pipeline before
|
|
81
|
+
* final output crop/resampling.
|
|
82
|
+
*
|
|
83
|
+
* This raster does not redefine physical sensor geometry or field of view.
|
|
84
|
+
*/
|
|
85
|
+
processedImageRaster: SourcedCaptureModeFact<RasterDimensions>;
|
|
86
|
+
/**
|
|
87
|
+
* Explicit downstream scientific/model dependencies for this mode.
|
|
88
|
+
*/
|
|
89
|
+
dependencies?: readonly CaptureModeDependency[];
|
|
90
|
+
}
|
|
91
|
+
export interface CaptureModeProfile {
|
|
92
|
+
schemaVersion: "0.1.0";
|
|
93
|
+
modes: readonly CaptureModeDefinition[];
|
|
94
|
+
}
|
|
95
|
+
export interface ResolveCaptureModeInput {
|
|
96
|
+
nativeRaster: NativeImageRaster;
|
|
97
|
+
profile: CaptureModeProfile;
|
|
98
|
+
modeId: string;
|
|
99
|
+
}
|
|
100
|
+
export interface ResolvedCaptureMode {
|
|
101
|
+
modeId: string;
|
|
102
|
+
modeEvidence: readonly EvidenceProvenance[];
|
|
103
|
+
nativeRaster: NativeImageRaster;
|
|
104
|
+
nativeRasterSemantic: "effective-image-sampling-grid-not-photosite-count";
|
|
105
|
+
acquisition: {
|
|
106
|
+
kind: "single-frame";
|
|
107
|
+
frameCount: 1;
|
|
108
|
+
} | {
|
|
109
|
+
kind: "fixed-multi-frame";
|
|
110
|
+
frameCount: SourcedCaptureModeFact<number>;
|
|
111
|
+
} | {
|
|
112
|
+
kind: "variable-multi-frame";
|
|
113
|
+
evidence: readonly EvidenceProvenance[];
|
|
114
|
+
minimumFrameCount?: SourcedCaptureModeFact<number>;
|
|
115
|
+
maximumFrameCount?: SourcedCaptureModeFact<number>;
|
|
116
|
+
};
|
|
117
|
+
perFrameSampling: {
|
|
118
|
+
kind: "native-effective-raster";
|
|
119
|
+
raster: NativeImageRaster;
|
|
120
|
+
} | {
|
|
121
|
+
kind: "grouped-native-samples";
|
|
122
|
+
raster: RasterDimensions;
|
|
123
|
+
groupWidthSamples: SourcedCaptureModeFact<number>;
|
|
124
|
+
groupHeightSamples: SourcedCaptureModeFact<number>;
|
|
125
|
+
combinationDomain?: SourcedCaptureModeFact<CaptureModeSampleCombinationDomain>;
|
|
126
|
+
} | {
|
|
127
|
+
kind: "declared-effective-raster";
|
|
128
|
+
raster: SourcedCaptureModeFact<RasterDimensions>;
|
|
129
|
+
};
|
|
130
|
+
interFrameSensorOffsetsNativeSamples?: SourcedCaptureModeFact<readonly CaptureModeSensorOffsetNativeSamples[]>;
|
|
131
|
+
reconstructionStages: readonly SourcedCaptureModeFact<CaptureModeReconstructionStage>[];
|
|
132
|
+
processedImageRaster: SourcedCaptureModeFact<RasterDimensions>;
|
|
133
|
+
processedImageMegapixels: number;
|
|
134
|
+
dependencies: readonly CaptureModeDependency[];
|
|
135
|
+
physicalSensorGeometryMutation: false;
|
|
136
|
+
photositeCountInference: "not-permitted-from-native-or-processed-raster";
|
|
137
|
+
finalOutputRasterOwnership: "downstream-capture-output-geometry";
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Parses a capture-mode profile without inferring sensor physics from output
|
|
141
|
+
* resolution or marketing mode names.
|
|
142
|
+
*
|
|
143
|
+
* The profile is intentionally orthogonal: acquisition frame sequence,
|
|
144
|
+
* per-frame sampling, optional inter-frame sensor shift, reconstruction stages,
|
|
145
|
+
* processed raster and downstream dependencies are independent axes.
|
|
146
|
+
*/
|
|
147
|
+
export declare function parseCaptureModeProfile(value: unknown): CaptureModeProfile;
|
|
148
|
+
/**
|
|
149
|
+
* Resolves one capture mode against the selected sensor's native effective
|
|
150
|
+
* image-sampling raster.
|
|
151
|
+
*
|
|
152
|
+
* Resolution changes do not mutate physical sensor geometry. The returned
|
|
153
|
+
* processed raster is pre-output geometry and must not be used to infer crop
|
|
154
|
+
* factor, field of view or physical photosite count.
|
|
155
|
+
*/
|
|
156
|
+
export declare function resolveCaptureMode(input: ResolveCaptureModeInput): ResolvedCaptureMode;
|
|
157
|
+
//# sourceMappingURL=capture-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-mode.d.ts","sourceRoot":"","sources":["../../src/sensor/capture-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
3
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
4
|
+
import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
|
|
5
|
+
const COMBINATION_DOMAINS = new Set([
|
|
6
|
+
"charge-domain",
|
|
7
|
+
"pre-conversion-analog",
|
|
8
|
+
"post-conversion-digital"
|
|
9
|
+
]);
|
|
10
|
+
const RECONSTRUCTION_STAGES = new Set([
|
|
11
|
+
"remosaic",
|
|
12
|
+
"pixel-shift-combination",
|
|
13
|
+
"multi-frame-computational-combination"
|
|
14
|
+
]);
|
|
15
|
+
const DEPENDENCIES = new Set([
|
|
16
|
+
"color-sampling-model",
|
|
17
|
+
"mode-specific-readout-timing",
|
|
18
|
+
"radiometric-calibration",
|
|
19
|
+
"inter-frame-registration"
|
|
20
|
+
]);
|
|
21
|
+
function requireRecord(value, path) {
|
|
22
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
23
|
+
throw new InvalidConfigurationError(path + " must be an object.");
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
function requireNonEmptyString(value, path) {
|
|
28
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
29
|
+
throw new InvalidConfigurationError(path + " must be a non-empty string.");
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function requirePositiveSafeIntegerValue(value, path) {
|
|
34
|
+
if (typeof value !== "number" ||
|
|
35
|
+
!Number.isSafeInteger(value) ||
|
|
36
|
+
value <= 0) {
|
|
37
|
+
throw new InvalidConfigurationError(path + " must be a positive safe integer.");
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function parseIntegerFact(value, path) {
|
|
42
|
+
const record = requireRecord(value, path);
|
|
43
|
+
return {
|
|
44
|
+
value: requirePositiveSafeIntegerValue(record.value, path + ".value"),
|
|
45
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseRasterDimensions(value, path) {
|
|
49
|
+
const record = requireRecord(value, path);
|
|
50
|
+
const pixelWidth = requirePositiveSafeIntegerValue(record.pixelWidth, path + ".pixelWidth");
|
|
51
|
+
const pixelHeight = requirePositiveSafeIntegerValue(record.pixelHeight, path + ".pixelHeight");
|
|
52
|
+
const total = pixelWidth * pixelHeight;
|
|
53
|
+
if (!Number.isSafeInteger(total)) {
|
|
54
|
+
throw new InvalidConfigurationError(path + " total sample count must be a safe integer.");
|
|
55
|
+
}
|
|
56
|
+
return { pixelWidth, pixelHeight };
|
|
57
|
+
}
|
|
58
|
+
function parseRasterFact(value, path) {
|
|
59
|
+
const record = requireRecord(value, path);
|
|
60
|
+
return {
|
|
61
|
+
value: parseRasterDimensions(record.value, path + ".value"),
|
|
62
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function parseCombinationDomainFact(value, path) {
|
|
66
|
+
const record = requireRecord(value, path);
|
|
67
|
+
if (typeof record.value !== "string" ||
|
|
68
|
+
!COMBINATION_DOMAINS.has(record.value)) {
|
|
69
|
+
throw new InvalidConfigurationError(path + ".value is invalid.");
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
value: record.value,
|
|
73
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function parseAcquisition(value, path) {
|
|
77
|
+
const record = requireRecord(value, path);
|
|
78
|
+
if (record.kind === "single-frame") {
|
|
79
|
+
if (record.frameCount !== undefined ||
|
|
80
|
+
record.minimumFrameCount !== undefined ||
|
|
81
|
+
record.maximumFrameCount !== undefined ||
|
|
82
|
+
record.evidence !== undefined) {
|
|
83
|
+
throw new InvalidConfigurationError(path +
|
|
84
|
+
" single-frame acquisition must omit frame-count and evidence fields.");
|
|
85
|
+
}
|
|
86
|
+
return { kind: "single-frame" };
|
|
87
|
+
}
|
|
88
|
+
if (record.kind === "fixed-multi-frame") {
|
|
89
|
+
if (record.minimumFrameCount !== undefined ||
|
|
90
|
+
record.maximumFrameCount !== undefined ||
|
|
91
|
+
record.evidence !== undefined) {
|
|
92
|
+
throw new InvalidConfigurationError(path +
|
|
93
|
+
" fixed-multi-frame acquisition must use frameCount only.");
|
|
94
|
+
}
|
|
95
|
+
const frameCount = parseIntegerFact(record.frameCount, path + ".frameCount");
|
|
96
|
+
if (frameCount.value < 2) {
|
|
97
|
+
throw new InvalidConfigurationError(path +
|
|
98
|
+
".frameCount.value must be at least 2 for fixed-multi-frame acquisition.");
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
kind: "fixed-multi-frame",
|
|
102
|
+
frameCount
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (record.kind === "variable-multi-frame") {
|
|
106
|
+
if (record.frameCount !== undefined) {
|
|
107
|
+
throw new InvalidConfigurationError(path +
|
|
108
|
+
".frameCount must be omitted for variable-multi-frame acquisition.");
|
|
109
|
+
}
|
|
110
|
+
const evidence = parseEvidenceList(record.evidence, path + ".evidence");
|
|
111
|
+
const minimumFrameCount = record.minimumFrameCount === undefined
|
|
112
|
+
? undefined
|
|
113
|
+
: parseIntegerFact(record.minimumFrameCount, path + ".minimumFrameCount");
|
|
114
|
+
const maximumFrameCount = record.maximumFrameCount === undefined
|
|
115
|
+
? undefined
|
|
116
|
+
: parseIntegerFact(record.maximumFrameCount, path + ".maximumFrameCount");
|
|
117
|
+
if (minimumFrameCount !== undefined &&
|
|
118
|
+
minimumFrameCount.value < 2) {
|
|
119
|
+
throw new InvalidConfigurationError(path +
|
|
120
|
+
".minimumFrameCount.value must be at least 2 for variable-multi-frame acquisition.");
|
|
121
|
+
}
|
|
122
|
+
if (maximumFrameCount !== undefined &&
|
|
123
|
+
maximumFrameCount.value < 2) {
|
|
124
|
+
throw new InvalidConfigurationError(path +
|
|
125
|
+
".maximumFrameCount.value must be at least 2 for variable-multi-frame acquisition.");
|
|
126
|
+
}
|
|
127
|
+
if (minimumFrameCount !== undefined &&
|
|
128
|
+
maximumFrameCount !== undefined &&
|
|
129
|
+
minimumFrameCount.value > maximumFrameCount.value) {
|
|
130
|
+
throw new InvalidConfigurationError(path +
|
|
131
|
+
".minimumFrameCount.value must not exceed maximumFrameCount.value.");
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
kind: "variable-multi-frame",
|
|
135
|
+
evidence,
|
|
136
|
+
...(minimumFrameCount === undefined
|
|
137
|
+
? {}
|
|
138
|
+
: { minimumFrameCount }),
|
|
139
|
+
...(maximumFrameCount === undefined
|
|
140
|
+
? {}
|
|
141
|
+
: { maximumFrameCount })
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
145
|
+
}
|
|
146
|
+
function parsePerFrameSampling(value, path) {
|
|
147
|
+
const record = requireRecord(value, path);
|
|
148
|
+
if (record.kind === "native-effective-raster") {
|
|
149
|
+
if (record.groupWidthSamples !== undefined ||
|
|
150
|
+
record.groupHeightSamples !== undefined ||
|
|
151
|
+
record.combinationDomain !== undefined ||
|
|
152
|
+
record.raster !== undefined) {
|
|
153
|
+
throw new InvalidConfigurationError(path +
|
|
154
|
+
" native-effective-raster sampling must omit grouping/raster fields.");
|
|
155
|
+
}
|
|
156
|
+
return { kind: "native-effective-raster" };
|
|
157
|
+
}
|
|
158
|
+
if (record.kind === "grouped-native-samples") {
|
|
159
|
+
if (record.raster !== undefined) {
|
|
160
|
+
throw new InvalidConfigurationError(path +
|
|
161
|
+
".raster must be omitted for grouped-native-samples sampling.");
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
kind: "grouped-native-samples",
|
|
165
|
+
groupWidthSamples: parseIntegerFact(record.groupWidthSamples, path + ".groupWidthSamples"),
|
|
166
|
+
groupHeightSamples: parseIntegerFact(record.groupHeightSamples, path + ".groupHeightSamples"),
|
|
167
|
+
...(record.combinationDomain === undefined
|
|
168
|
+
? {}
|
|
169
|
+
: {
|
|
170
|
+
combinationDomain: parseCombinationDomainFact(record.combinationDomain, path + ".combinationDomain")
|
|
171
|
+
})
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
if (record.kind === "declared-effective-raster") {
|
|
175
|
+
if (record.groupWidthSamples !== undefined ||
|
|
176
|
+
record.groupHeightSamples !== undefined ||
|
|
177
|
+
record.combinationDomain !== undefined) {
|
|
178
|
+
throw new InvalidConfigurationError(path +
|
|
179
|
+
" declared-effective-raster sampling must omit grouping fields.");
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
kind: "declared-effective-raster",
|
|
183
|
+
raster: parseRasterFact(record.raster, path + ".raster")
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
187
|
+
}
|
|
188
|
+
function parseOffsetsFact(value, path) {
|
|
189
|
+
const record = requireRecord(value, path);
|
|
190
|
+
if (!Array.isArray(record.value) ||
|
|
191
|
+
record.value.length === 0) {
|
|
192
|
+
throw new InvalidConfigurationError(path + ".value must be a non-empty array.");
|
|
193
|
+
}
|
|
194
|
+
const offsets = record.value.map((entry, index) => {
|
|
195
|
+
const item = requireRecord(entry, path + ".value[" + index + "]");
|
|
196
|
+
if (typeof item.x !== "number" ||
|
|
197
|
+
!Number.isFinite(item.x) ||
|
|
198
|
+
typeof item.y !== "number" ||
|
|
199
|
+
!Number.isFinite(item.y)) {
|
|
200
|
+
throw new InvalidConfigurationError(path +
|
|
201
|
+
".value[" +
|
|
202
|
+
index +
|
|
203
|
+
"] x/y must be finite numbers.");
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
x: item.x,
|
|
207
|
+
y: item.y
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
value: offsets,
|
|
212
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function parseReconstructionStages(value, path) {
|
|
216
|
+
if (!Array.isArray(value)) {
|
|
217
|
+
throw new InvalidConfigurationError(path + " must be an array.");
|
|
218
|
+
}
|
|
219
|
+
const stages = value.map((entry, index) => {
|
|
220
|
+
const record = requireRecord(entry, path + "[" + index + "]");
|
|
221
|
+
if (typeof record.value !== "string" ||
|
|
222
|
+
!RECONSTRUCTION_STAGES.has(record.value)) {
|
|
223
|
+
throw new InvalidConfigurationError(path + "[" + index + "].value is invalid.");
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
value: record.value,
|
|
227
|
+
evidence: parseEvidenceList(record.evidence, path + "[" + index + "].evidence")
|
|
228
|
+
};
|
|
229
|
+
});
|
|
230
|
+
const values = stages.map((stage) => stage.value);
|
|
231
|
+
if (new Set(values).size !== values.length) {
|
|
232
|
+
throw new InvalidConfigurationError(path + " must not contain duplicate stages.");
|
|
233
|
+
}
|
|
234
|
+
return stages;
|
|
235
|
+
}
|
|
236
|
+
function parseDependencies(value, path) {
|
|
237
|
+
if (!Array.isArray(value)) {
|
|
238
|
+
throw new InvalidConfigurationError(path + " must be an array.");
|
|
239
|
+
}
|
|
240
|
+
const dependencies = value.map((entry, index) => {
|
|
241
|
+
if (typeof entry !== "string" ||
|
|
242
|
+
!DEPENDENCIES.has(entry)) {
|
|
243
|
+
throw new InvalidConfigurationError(path + "[" + index + "] is invalid.");
|
|
244
|
+
}
|
|
245
|
+
return entry;
|
|
246
|
+
});
|
|
247
|
+
if (new Set(dependencies).size !== dependencies.length) {
|
|
248
|
+
throw new InvalidConfigurationError(path + " must not contain duplicates.");
|
|
249
|
+
}
|
|
250
|
+
return dependencies;
|
|
251
|
+
}
|
|
252
|
+
function parseModeDefinition(value, path) {
|
|
253
|
+
const record = requireRecord(value, path);
|
|
254
|
+
const modeId = requireNonEmptyString(record.modeId, path + ".modeId");
|
|
255
|
+
const acquisition = parseAcquisition(record.acquisition, path + ".acquisition");
|
|
256
|
+
const interFrameSensorOffsetsNativeSamples = record.interFrameSensorOffsetsNativeSamples === undefined
|
|
257
|
+
? undefined
|
|
258
|
+
: parseOffsetsFact(record.interFrameSensorOffsetsNativeSamples, path + ".interFrameSensorOffsetsNativeSamples");
|
|
259
|
+
if (interFrameSensorOffsetsNativeSamples !== undefined &&
|
|
260
|
+
acquisition.kind !== "fixed-multi-frame") {
|
|
261
|
+
throw new InvalidConfigurationError(path +
|
|
262
|
+
".interFrameSensorOffsetsNativeSamples is supported only for fixed-multi-frame acquisition.");
|
|
263
|
+
}
|
|
264
|
+
if (interFrameSensorOffsetsNativeSamples !== undefined &&
|
|
265
|
+
acquisition.kind === "fixed-multi-frame" &&
|
|
266
|
+
interFrameSensorOffsetsNativeSamples.value.length !==
|
|
267
|
+
acquisition.frameCount.value) {
|
|
268
|
+
throw new InvalidConfigurationError(path +
|
|
269
|
+
".interFrameSensorOffsetsNativeSamples.value length must equal acquisition.frameCount.value.");
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
modeId,
|
|
273
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence"),
|
|
274
|
+
acquisition,
|
|
275
|
+
perFrameSampling: parsePerFrameSampling(record.perFrameSampling, path + ".perFrameSampling"),
|
|
276
|
+
...(interFrameSensorOffsetsNativeSamples === undefined
|
|
277
|
+
? {}
|
|
278
|
+
: { interFrameSensorOffsetsNativeSamples }),
|
|
279
|
+
reconstructionStages: record.reconstructionStages === undefined
|
|
280
|
+
? []
|
|
281
|
+
: parseReconstructionStages(record.reconstructionStages, path + ".reconstructionStages"),
|
|
282
|
+
processedImageRaster: parseRasterFact(record.processedImageRaster, path + ".processedImageRaster"),
|
|
283
|
+
dependencies: record.dependencies === undefined
|
|
284
|
+
? []
|
|
285
|
+
: parseDependencies(record.dependencies, path + ".dependencies")
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Parses a capture-mode profile without inferring sensor physics from output
|
|
290
|
+
* resolution or marketing mode names.
|
|
291
|
+
*
|
|
292
|
+
* The profile is intentionally orthogonal: acquisition frame sequence,
|
|
293
|
+
* per-frame sampling, optional inter-frame sensor shift, reconstruction stages,
|
|
294
|
+
* processed raster and downstream dependencies are independent axes.
|
|
295
|
+
*/
|
|
296
|
+
export function parseCaptureModeProfile(value) {
|
|
297
|
+
const profile = requireRecord(value, "captureModes");
|
|
298
|
+
if (profile.schemaVersion !== "0.1.0") {
|
|
299
|
+
throw new InvalidConfigurationError('captureModes.schemaVersion must be "0.1.0".');
|
|
300
|
+
}
|
|
301
|
+
if (!Array.isArray(profile.modes) ||
|
|
302
|
+
profile.modes.length === 0) {
|
|
303
|
+
throw new InvalidConfigurationError("captureModes.modes must be a non-empty array.");
|
|
304
|
+
}
|
|
305
|
+
const modes = profile.modes.map((mode, index) => parseModeDefinition(mode, "captureModes.modes[" + index + "]"));
|
|
306
|
+
const ids = modes.map((mode) => mode.modeId);
|
|
307
|
+
if (new Set(ids).size !== ids.length) {
|
|
308
|
+
throw new InvalidConfigurationError("captureModes.modes must not contain duplicate modeId values.");
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
schemaVersion: "0.1.0",
|
|
312
|
+
modes
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
function validateNativeRaster(raster) {
|
|
316
|
+
requirePositiveInteger("nativeRaster.pixelWidth", raster.pixelWidth);
|
|
317
|
+
requirePositiveInteger("nativeRaster.pixelHeight", raster.pixelHeight);
|
|
318
|
+
const total = raster.pixelWidth * raster.pixelHeight;
|
|
319
|
+
if (!Number.isSafeInteger(total)) {
|
|
320
|
+
throw new InvalidScientificInputError("nativeRaster total image-sample count must be a safe integer.");
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function resolvePerFrameSampling(sampling, nativeRaster) {
|
|
324
|
+
if (sampling.kind === "native-effective-raster") {
|
|
325
|
+
return {
|
|
326
|
+
kind: "native-effective-raster",
|
|
327
|
+
raster: { ...nativeRaster }
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
if (sampling.kind === "declared-effective-raster") {
|
|
331
|
+
return {
|
|
332
|
+
kind: "declared-effective-raster",
|
|
333
|
+
raster: {
|
|
334
|
+
value: { ...sampling.raster.value },
|
|
335
|
+
evidence: sampling.raster.evidence
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
const groupWidth = sampling.groupWidthSamples.value;
|
|
340
|
+
const groupHeight = sampling.groupHeightSamples.value;
|
|
341
|
+
if (nativeRaster.pixelWidth % groupWidth !== 0 ||
|
|
342
|
+
nativeRaster.pixelHeight % groupHeight !== 0) {
|
|
343
|
+
throw new InvalidScientificInputError("Grouped native sampling requires nativeRaster dimensions to be exactly divisible by the declared grouping factors.");
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
kind: "grouped-native-samples",
|
|
347
|
+
raster: {
|
|
348
|
+
pixelWidth: nativeRaster.pixelWidth / groupWidth,
|
|
349
|
+
pixelHeight: nativeRaster.pixelHeight / groupHeight
|
|
350
|
+
},
|
|
351
|
+
groupWidthSamples: sampling.groupWidthSamples,
|
|
352
|
+
groupHeightSamples: sampling.groupHeightSamples,
|
|
353
|
+
...(sampling.combinationDomain === undefined
|
|
354
|
+
? {}
|
|
355
|
+
: {
|
|
356
|
+
combinationDomain: sampling.combinationDomain
|
|
357
|
+
})
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Resolves one capture mode against the selected sensor's native effective
|
|
362
|
+
* image-sampling raster.
|
|
363
|
+
*
|
|
364
|
+
* Resolution changes do not mutate physical sensor geometry. The returned
|
|
365
|
+
* processed raster is pre-output geometry and must not be used to infer crop
|
|
366
|
+
* factor, field of view or physical photosite count.
|
|
367
|
+
*/
|
|
368
|
+
export function resolveCaptureMode(input) {
|
|
369
|
+
validateNativeRaster(input.nativeRaster);
|
|
370
|
+
if (typeof input.modeId !== "string" ||
|
|
371
|
+
input.modeId.trim().length === 0) {
|
|
372
|
+
throw new InvalidScientificInputError("modeId must be a non-empty string.");
|
|
373
|
+
}
|
|
374
|
+
const profile = parseCaptureModeProfile(input.profile);
|
|
375
|
+
const mode = profile.modes.find((candidate) => candidate.modeId === input.modeId);
|
|
376
|
+
if (mode === undefined) {
|
|
377
|
+
throw new InvalidScientificInputError("modeId does not exist in the supplied capture-mode profile.");
|
|
378
|
+
}
|
|
379
|
+
const processedTotal = mode.processedImageRaster.value.pixelWidth *
|
|
380
|
+
mode.processedImageRaster.value.pixelHeight;
|
|
381
|
+
if (!Number.isSafeInteger(processedTotal)) {
|
|
382
|
+
throw new InvalidScientificInputError("processedImageRaster total image-sample count must be a safe integer.");
|
|
383
|
+
}
|
|
384
|
+
const acquisition = mode.acquisition.kind === "single-frame"
|
|
385
|
+
? {
|
|
386
|
+
kind: "single-frame",
|
|
387
|
+
frameCount: 1
|
|
388
|
+
}
|
|
389
|
+
: mode.acquisition.kind === "fixed-multi-frame"
|
|
390
|
+
? {
|
|
391
|
+
kind: "fixed-multi-frame",
|
|
392
|
+
frameCount: mode.acquisition.frameCount
|
|
393
|
+
}
|
|
394
|
+
: {
|
|
395
|
+
kind: "variable-multi-frame",
|
|
396
|
+
evidence: mode.acquisition.evidence,
|
|
397
|
+
...(mode.acquisition.minimumFrameCount === undefined
|
|
398
|
+
? {}
|
|
399
|
+
: {
|
|
400
|
+
minimumFrameCount: mode.acquisition.minimumFrameCount
|
|
401
|
+
}),
|
|
402
|
+
...(mode.acquisition.maximumFrameCount === undefined
|
|
403
|
+
? {}
|
|
404
|
+
: {
|
|
405
|
+
maximumFrameCount: mode.acquisition.maximumFrameCount
|
|
406
|
+
})
|
|
407
|
+
};
|
|
408
|
+
return {
|
|
409
|
+
modeId: mode.modeId,
|
|
410
|
+
modeEvidence: mode.evidence,
|
|
411
|
+
nativeRaster: { ...input.nativeRaster },
|
|
412
|
+
nativeRasterSemantic: "effective-image-sampling-grid-not-photosite-count",
|
|
413
|
+
acquisition,
|
|
414
|
+
perFrameSampling: resolvePerFrameSampling(mode.perFrameSampling, input.nativeRaster),
|
|
415
|
+
...(mode.interFrameSensorOffsetsNativeSamples === undefined
|
|
416
|
+
? {}
|
|
417
|
+
: {
|
|
418
|
+
interFrameSensorOffsetsNativeSamples: mode.interFrameSensorOffsetsNativeSamples
|
|
419
|
+
}),
|
|
420
|
+
reconstructionStages: mode.reconstructionStages ?? [],
|
|
421
|
+
processedImageRaster: {
|
|
422
|
+
value: {
|
|
423
|
+
...mode.processedImageRaster.value
|
|
424
|
+
},
|
|
425
|
+
evidence: mode.processedImageRaster.evidence
|
|
426
|
+
},
|
|
427
|
+
processedImageMegapixels: processedTotal / 1_000_000,
|
|
428
|
+
dependencies: mode.dependencies ?? [],
|
|
429
|
+
physicalSensorGeometryMutation: false,
|
|
430
|
+
photositeCountInference: "not-permitted-from-native-or-processed-raster",
|
|
431
|
+
finalOutputRasterOwnership: "downstream-capture-output-geometry"
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=capture-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-mode.js","sourceRoot":"","sources":["../../src/sensor/capture-mode.ts"],"names":[],"mappings":"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"}
|