@blockcast/mmt-base 0.5.0 → 1.0.0-main.3cb7359ea316

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.
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Runtime FEC bindings (BLO-50171): what each source track's FEC resolves to
3
+ * for this library's receiver, read from `validateFecCatalog`'s per-instance
4
+ * result and never re-derived.
5
+ *
6
+ * Every runtime reader (the container's `resolveCatalogTrackFec`,
7
+ * `resolveRepairLayers`, `MulticastManager.configureMultiTrack`, transport's
8
+ * `catalogRepairTracks`) goes through `resolveFecBindings`, so they cannot
9
+ * disagree with the validator or with each other about which tracks have FEC
10
+ * and which repair tracks belong to them.
11
+ *
12
+ * The draft-ramadan-moq-fec-catalog-00 array is the only shape. Both catalog
13
+ * dialects bind through it: an MSF `tracks[]` entry directly, and a hang
14
+ * `video`/`audio` rendition (`fec` the same array) with its `repair.renditions`
15
+ * entries (`source` + `instanceId`), mapped onto a `tracks[]` view so the same
16
+ * validator runs. A hang rendition is authoritative over a `tracks[]` entry of
17
+ * the same name.
18
+ *
19
+ * Fail closed per instance: a source whose base instance is not `ok` resolves
20
+ * to `unavailable` with the validator's code and path, and costs no other
21
+ * track anything. A draft-01 object `fec` is `fec_member` at that track's
22
+ * `fec`: the track plays without FEC.
23
+ */
24
+ import { type FecCatalogCode, type FecCatalogReceiver } from './fec-catalog.js';
25
+ /** The receiver this runtime is: it decodes `iso-ssbg1-v1` only. */
26
+ export declare const RUNTIME_FEC_RECEIVER: FecCatalogReceiver;
27
+ /** Repair track priority when the track states none (MoQT scale, 192..255). */
28
+ export declare const DEFAULT_FEC_REPAIR_PRIORITY = 240;
29
+ /** One `ok` instance's geometry. */
30
+ export interface FecInstanceGeometry {
31
+ readonly instanceId: number;
32
+ readonly scheme: 'raptorq' | 'reed-solomon';
33
+ /** `iso-ssbg1-v1` under `RUNTIME_FEC_RECEIVER`. */
34
+ readonly blockProfile: string;
35
+ /** K. */
36
+ readonly sourceSymbols: number;
37
+ /** P_0 for a base instance; the overlay's own P for an overlay. */
38
+ readonly repairSymbols: number;
39
+ /** T. */
40
+ readonly symbolSize: number;
41
+ readonly interleaveDepthMs?: number;
42
+ readonly reorderToleranceMs?: number;
43
+ readonly repairTrack: string;
44
+ readonly symbolTrack?: string;
45
+ }
46
+ export interface FecLayerBinding {
47
+ readonly layer: number;
48
+ readonly repairTrackName: string;
49
+ readonly repairSymbols: number;
50
+ /** O_i = sum(P_j, j < i). */
51
+ readonly rsIdOffset: number;
52
+ readonly priority: number;
53
+ }
54
+ export interface FecOverlayBinding {
55
+ readonly repairTrackName: string;
56
+ readonly scope: 'keyframe';
57
+ readonly sourceSymbols: number;
58
+ readonly repairSymbols: number;
59
+ readonly priority: number;
60
+ readonly geometry: FecInstanceGeometry;
61
+ }
62
+ export interface FecBindingUnavailable {
63
+ /** The validator's code, or `fec_base_instances` for a track with no base
64
+ * instance or more than one `ok` one (the MMTP wire carries one base Source FEC Payload
65
+ * ID, mmt-02 7.4.1). */
66
+ readonly code: FecCatalogCode | 'fec_base_instances';
67
+ /** JSON Pointer into the catalog (a hang path starts `/video` or `/audio`). */
68
+ readonly path: string;
69
+ readonly outcome: 'unavailable' | 'violation';
70
+ }
71
+ export type FecSourceBinding = {
72
+ readonly status: 'ok';
73
+ readonly track: string;
74
+ /** JSON Pointer of the source track (`/tracks/<i>`, `/video/renditions/<name>`). */
75
+ readonly pointer: string;
76
+ readonly base: FecInstanceGeometry;
77
+ /** Base layers in order, layer 0 first. */
78
+ readonly layers: readonly FecLayerBinding[];
79
+ /** Sum of P over the base layers: the wire RSB_length. */
80
+ readonly totalBaseRepairSymbols: number;
81
+ readonly overlay?: FecOverlayBinding;
82
+ /** Why a declared overlay is not used, when one is not. */
83
+ readonly overlayUnavailable?: FecBindingUnavailable;
84
+ } | {
85
+ readonly status: 'unavailable';
86
+ readonly track: string;
87
+ readonly pointer: string;
88
+ readonly reason: FecBindingUnavailable;
89
+ };
90
+ /**
91
+ * The `tracks[]` view of a catalog in either dialect, with each view track's
92
+ * JSON Pointer in the original catalog.
93
+ */
94
+ export declare function fecCatalogTracks(catalog: unknown): {
95
+ tracks: unknown[];
96
+ pointers: string[];
97
+ };
98
+ /**
99
+ * Every source track's runtime FEC binding, by track name. A track with no
100
+ * `fec`, or an empty `fec` array, declares no FEC and has no entry.
101
+ */
102
+ export declare function resolveFecBindings(catalog: unknown, receiver?: FecCatalogReceiver): ReadonlyMap<string, FecSourceBinding>;
103
+ //# sourceMappingURL=fec-bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fec-bindings.d.ts","sourceRoot":"","sources":["../src/fec-bindings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAsB,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEnG,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,EAAE,kBAIjC,CAAA;AAEF,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAE9C,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAAA;IAC3C,mDAAmD;IACnD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,SAAS;IACT,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,SAAS;IACT,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAA;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC;;6BAEyB;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,oBAAoB,CAAA;IACpD,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,CAAA;CAC9C;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;IAClC,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,qBAAqB,CAAA;CACpD,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;CACvC,CAAA;AAOL;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAmD5F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,kBAAyC,GAClD,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CA2FvC"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Runtime FEC bindings (BLO-50171): what each source track's FEC resolves to
3
+ * for this library's receiver, read from `validateFecCatalog`'s per-instance
4
+ * result and never re-derived.
5
+ *
6
+ * Every runtime reader (the container's `resolveCatalogTrackFec`,
7
+ * `resolveRepairLayers`, `MulticastManager.configureMultiTrack`, transport's
8
+ * `catalogRepairTracks`) goes through `resolveFecBindings`, so they cannot
9
+ * disagree with the validator or with each other about which tracks have FEC
10
+ * and which repair tracks belong to them.
11
+ *
12
+ * The draft-ramadan-moq-fec-catalog-00 array is the only shape. Both catalog
13
+ * dialects bind through it: an MSF `tracks[]` entry directly, and a hang
14
+ * `video`/`audio` rendition (`fec` the same array) with its `repair.renditions`
15
+ * entries (`source` + `instanceId`), mapped onto a `tracks[]` view so the same
16
+ * validator runs. A hang rendition is authoritative over a `tracks[]` entry of
17
+ * the same name.
18
+ *
19
+ * Fail closed per instance: a source whose base instance is not `ok` resolves
20
+ * to `unavailable` with the validator's code and path, and costs no other
21
+ * track anything. A draft-01 object `fec` is `fec_member` at that track's
22
+ * `fec`: the track plays without FEC.
23
+ */
24
+ import { validateFecCatalog } from './fec-catalog.js';
25
+ /** The receiver this runtime is: it decodes `iso-ssbg1-v1` only. */
26
+ export const RUNTIME_FEC_RECEIVER = Object.freeze({
27
+ schemes: Object.freeze(['raptorq', 'reed-solomon']),
28
+ blockProfiles: Object.freeze(['iso-ssbg1-v1']),
29
+ overlays: true,
30
+ });
31
+ /** Repair track priority when the track states none (MoQT scale, 192..255). */
32
+ export const DEFAULT_FEC_REPAIR_PRIORITY = 240;
33
+ const recordOf = (v) => typeof v === 'object' && v !== null && !Array.isArray(v) ? v : undefined;
34
+ const escape = (s) => s.replace(/~/g, '~0').replace(/\//g, '~1');
35
+ /**
36
+ * The `tracks[]` view of a catalog in either dialect, with each view track's
37
+ * JSON Pointer in the original catalog.
38
+ */
39
+ export function fecCatalogTracks(catalog) {
40
+ const root = recordOf(catalog) ?? {};
41
+ const tracks = [];
42
+ const pointers = [];
43
+ const hangNames = new Set();
44
+ for (const role of ['video', 'audio']) {
45
+ for (const [name, r] of Object.entries(recordOf(recordOf(root[role])?.['renditions']) ?? {})) {
46
+ const entry = recordOf(r);
47
+ if (!entry)
48
+ continue;
49
+ hangNames.add(name);
50
+ const kind = recordOf(entry['container'])?.['kind'];
51
+ // A hang rendition carries no `packaging`; its container kind is it.
52
+ // `mmtp-fec` is hang's kind for MMTP that carries FEC (the FFmpeg
53
+ // publisher's `moq_publish_set_video_packaging`): MMTP packaging.
54
+ const view = { name, packaging: kind === undefined || kind === 'mmtp-fec' ? 'mmtp' : kind };
55
+ if (entry['fec'] !== undefined)
56
+ view['fec'] = entry['fec'];
57
+ tracks.push(view);
58
+ pointers.push(`/${role}/renditions/${escape(name)}`);
59
+ }
60
+ }
61
+ const hangRenditions = tracks.length;
62
+ for (const [name, r] of Object.entries(recordOf(recordOf(root['repair'])?.['renditions']) ?? {})) {
63
+ hangNames.add(name);
64
+ tracks.push({ packaging: 'fec-repair', ...recordOf(r), name });
65
+ pointers.push(`/repair/renditions/${escape(name)}`);
66
+ }
67
+ const raw = Array.isArray(root['tracks']) ? root['tracks'] : [];
68
+ const named = new Set(hangNames);
69
+ raw.forEach((t, i) => {
70
+ const name = recordOf(t)?.['name'];
71
+ if (typeof name === 'string')
72
+ named.add(name);
73
+ if (typeof name === 'string' && hangNames.has(name))
74
+ return;
75
+ tracks.push(t);
76
+ pointers.push(`/tracks/${i}`);
77
+ });
78
+ // hang layer 0 needs no `repair.renditions` entry: the rendition's instance
79
+ // names it, and a hang Root (hang's toHang) carries no repair block. Such a
80
+ // name stands for a repair track of that instance.
81
+ tracks.slice(0, hangRenditions).forEach((t, ti) => {
82
+ const view = t;
83
+ if (!Array.isArray(view['fec']))
84
+ return;
85
+ view['fec'].forEach((o, ii) => {
86
+ const repairTrack = recordOf(o)?.['repairTrack'];
87
+ if (typeof repairTrack !== 'string' || named.has(repairTrack))
88
+ return;
89
+ named.add(repairTrack);
90
+ const instanceId = recordOf(o)?.['instanceId'];
91
+ tracks.push({ name: repairTrack, packaging: 'fec-repair', source: view['name'], ...(instanceId === undefined ? {} : { instanceId }) });
92
+ pointers.push(`${pointers[ti]}/fec/${ii}/repairTrack`);
93
+ });
94
+ });
95
+ return { tracks, pointers };
96
+ }
97
+ /**
98
+ * Every source track's runtime FEC binding, by track name. A track with no
99
+ * `fec`, or an empty `fec` array, declares no FEC and has no entry.
100
+ */
101
+ export function resolveFecBindings(catalog, receiver = RUNTIME_FEC_RECEIVER) {
102
+ const { tracks, pointers } = fecCatalogTracks(catalog);
103
+ const report = validateFecCatalog({ tracks }, receiver);
104
+ const at = (path) => {
105
+ const m = /^\/tracks\/(\d+)(.*)$/.exec(path);
106
+ return m ? pointers[Number(m[1])] + m[2] : path;
107
+ };
108
+ const trackAt = (i) => recordOf(tracks[i]) ?? {};
109
+ const nameAt = (i) => (i === null ? undefined : trackAt(i)['name']);
110
+ const why = (i) => Object.freeze({
111
+ code: i.issues[0]?.code ?? 'fec_member',
112
+ path: at(i.issues[0]?.path ?? i.path),
113
+ outcome: i.outcome === 'unavailable' ? 'unavailable' : 'violation',
114
+ });
115
+ const out = new Map();
116
+ tracks.forEach((t, ti) => {
117
+ const track = recordOf(t);
118
+ const name = track?.['name'];
119
+ if (!track || typeof name !== 'string' || out.has(name))
120
+ return;
121
+ if (track['packaging'] === 'fec-repair' || track['packaging'] === 'fec-source')
122
+ return;
123
+ const fec = track['fec'];
124
+ if (fec === undefined)
125
+ return;
126
+ if (!Array.isArray(fec)) {
127
+ const reason = { code: 'fec_member', path: at(`/tracks/${ti}/fec`), outcome: 'violation' };
128
+ out.set(name, Object.freeze({ status: 'unavailable', track: name, pointer: pointers[ti], reason: Object.freeze(reason) }));
129
+ return;
130
+ }
131
+ if (fec.length === 0)
132
+ return;
133
+ const insts = report.instances.filter((i) => i.trackIndex === ti);
134
+ const isOverlay = (i) => Object.hasOwn(recordOf(fec[Number(i.path.split('/').pop())]) ?? {}, 'scope');
135
+ const bases = insts.filter((i) => !isOverlay(i));
136
+ const okBases = bases.filter((i) => i.outcome === 'ok');
137
+ if (okBases.length !== 1) {
138
+ const reason =
139
+ // No base instance at all (overlay-only `fec`) is a count of 0, not
140
+ // the overlay's own issue.
141
+ okBases.length > 1 || bases.length === 0
142
+ ? Object.freeze({ code: 'fec_base_instances', path: at(`/tracks/${ti}/fec`), outcome: 'violation' })
143
+ : why(bases[0] ?? insts[0]);
144
+ out.set(name, Object.freeze({ status: 'unavailable', track: name, pointer: pointers[ti], reason }));
145
+ return;
146
+ }
147
+ const b = okBases[0];
148
+ const base = geometry(recordOf(fec[Number(b.path.split('/').pop())]), b.instanceId, nameAt(b.symbolTrack));
149
+ const priorityOf = (i) => {
150
+ const p = i === null ? undefined : trackAt(i)['priority'];
151
+ return typeof p === 'number' ? p : DEFAULT_FEC_REPAIR_PRIORITY;
152
+ };
153
+ const layers = [
154
+ { layer: 0, repairTrackName: base.repairTrack, repairSymbols: base.repairSymbols, rsIdOffset: 0, priority: priorityOf(b.repairTrack) },
155
+ ];
156
+ const more = b.boundRepairTracks
157
+ .map((tj) => ({ tj, layer: trackAt(tj)['repairLayer'] }))
158
+ .sort((x, y) => x.layer - y.layer);
159
+ let offset = base.repairSymbols;
160
+ for (const { tj, layer } of more) {
161
+ const repairSymbols = trackAt(tj)['repairSymbols'];
162
+ layers.push({ layer, repairTrackName: nameAt(tj), repairSymbols, rsIdOffset: offset, priority: priorityOf(tj) });
163
+ offset += repairSymbols;
164
+ }
165
+ let overlay;
166
+ let overlayUnavailable;
167
+ const ov = insts.find(isOverlay);
168
+ if (ov?.outcome === 'ok') {
169
+ const g = geometry(recordOf(fec[Number(ov.path.split('/').pop())]), ov.instanceId, nameAt(ov.symbolTrack));
170
+ overlay = Object.freeze({
171
+ repairTrackName: g.repairTrack,
172
+ scope: 'keyframe',
173
+ sourceSymbols: g.sourceSymbols,
174
+ repairSymbols: g.repairSymbols,
175
+ priority: priorityOf(ov.repairTrack),
176
+ geometry: g,
177
+ });
178
+ }
179
+ else if (ov)
180
+ overlayUnavailable = why(ov);
181
+ out.set(name, Object.freeze({
182
+ status: 'ok',
183
+ track: name,
184
+ pointer: pointers[ti],
185
+ base,
186
+ layers: Object.freeze(layers.map((l) => Object.freeze(l))),
187
+ totalBaseRepairSymbols: offset,
188
+ ...(overlay ? { overlay } : {}),
189
+ ...(overlayUnavailable ? { overlayUnavailable } : {}),
190
+ }));
191
+ });
192
+ return out;
193
+ }
194
+ // The validator passed this instance for this receiver, so every member read
195
+ // here is present and in range.
196
+ function geometry(o, instanceId, symbolTrack) {
197
+ return Object.freeze({
198
+ instanceId,
199
+ scheme: o['scheme'],
200
+ blockProfile: o['blockProfile'],
201
+ sourceSymbols: o['sourceSymbols'],
202
+ repairSymbols: o['repairSymbols'],
203
+ symbolSize: o['symbolSize'],
204
+ ...(typeof o['interleaveDepthMs'] === 'number' ? { interleaveDepthMs: o['interleaveDepthMs'] } : {}),
205
+ ...(typeof o['reorderToleranceMs'] === 'number' ? { reorderToleranceMs: o['reorderToleranceMs'] } : {}),
206
+ repairTrack: o['repairTrack'],
207
+ ...(symbolTrack !== undefined ? { symbolTrack } : {}),
208
+ });
209
+ }
210
+ //# sourceMappingURL=fec-bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fec-bindings.js","sourceRoot":"","sources":["../src/fec-bindings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type FecCatalogOutcome = "ok" | "unavailable" | "violation";
2
+ export type FecCatalogCode = "fec_scheme_absent" | "fec_scheme_unimplemented" | "fec_block_profile_absent" | "fec_block_profile_unimplemented" | "fec_block_profile_packaging" | "fec_member" | "fec_naming" | "fec_resolution" | "fec_enhancement_repair" | "fec_orphan" | "fec_layers" | "fec_layer0" | "fec_bounds" | "fec_instance_id" | "fec_symbol_tracks" | "fec_track_geometry" | "fec_priority" | "fec_overlay" | "fec_overlay_unsupported";
3
+ export interface FecCatalogIssue {
4
+ readonly code: FecCatalogCode;
5
+ /** JSON Pointer into the catalog. */
6
+ readonly path: string;
7
+ }
8
+ export interface FecCatalogInstance {
9
+ /** JSON Pointer of the instance object, `/tracks/<i>/fec/<j>`. */
10
+ readonly path: string;
11
+ readonly track: string | null;
12
+ /** Resolved Instance ID; null when `instanceId` is malformed. */
13
+ readonly instanceId: number | null;
14
+ readonly outcome: FecCatalogOutcome;
15
+ readonly issues: readonly FecCatalogIssue[];
16
+ /** Index into `tracks` of the source track declaring the instance. */
17
+ readonly trackIndex: number;
18
+ /** Track index of the repair track `repairTrack` names, or null. */
19
+ readonly repairTrack: number | null;
20
+ /** Track indices of the other repair tracks bound by `source` + `instanceId`. */
21
+ readonly boundRepairTracks: readonly number[];
22
+ /** Track index of the instance's symbol track (named or bound), or null. */
23
+ readonly symbolTrack: number | null;
24
+ }
25
+ export interface FecCatalogReport {
26
+ readonly instances: readonly FecCatalogInstance[];
27
+ /** Every report, instance-attributed or not, in discovery order. */
28
+ readonly issues: readonly FecCatalogIssue[];
29
+ }
30
+ export interface FecCatalogReceiver {
31
+ /** Schemes the receiver implements. Default: reed-solomon, raptorq. */
32
+ readonly schemes?: readonly string[];
33
+ /** Block profiles the receiver implements. Default: moq-object-v1, iso-ssbg1-v1. */
34
+ readonly blockProfiles?: readonly string[];
35
+ /** Whether the receiver implements the mmt-02 7.4 keyframe overlay. Default true. */
36
+ readonly overlays?: boolean;
37
+ }
38
+ type Json = unknown;
39
+ export declare function validateFecCatalog(catalog: Json, receiver?: FecCatalogReceiver): FecCatalogReport;
40
+ export {};
41
+ //# sourceMappingURL=fec-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fec-catalog.d.ts","sourceRoot":"","sources":["../src/fec-catalog.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,aAAa,GAAG,WAAW,CAAC;AAEnE,MAAM,MAAM,cAAc,GAEvB,mBAAmB,GACnB,0BAA0B,GAC1B,0BAA0B,GAC1B,iCAAiC,GACjC,6BAA6B,GAE7B,YAAY,GACZ,YAAY,GACZ,gBAAgB,GAChB,wBAAwB,GACxB,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,iBAAiB,GACjB,mBAAmB,GACnB,oBAAoB,GACpB,cAAc,GACd,aAAa,GACb,yBAAyB,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAClC,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAClD,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IAClC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,oFAAoF;IACpF,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B;AAoBD,KAAK,IAAI,GAAG,OAAO,CAAC;AAgCpB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAE,kBAAuB,GAAG,gBAAgB,CAsTrG"}