@blockcast/mmt-wasm 0.1.0 → 0.3.0-main.1cd3cdea89da

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.
@@ -10,7 +10,7 @@ export const __wbg_get_fecstats_blocks_recovered: (a: number) => bigint;
10
10
  export const __wbg_get_fecstats_bytes_recovered: (a: number) => bigint;
11
11
  export const __wbg_get_fecstats_repair_packets: (a: number) => bigint;
12
12
  export const __wbg_get_fecstats_source_packets: (a: number) => bigint;
13
- export const __wbg_get_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number) => bigint;
13
+ export const __wbg_get_fecstats_unplaced_evicted: (a: number) => bigint;
14
14
  export const __wbg_mfufragmentjs_free: (a: number, b: number) => void;
15
15
  export const __wbg_mmtfecdecoder_free: (a: number, b: number) => void;
16
16
  export const __wbg_mmtfecencoder_free: (a: number, b: number) => void;
@@ -23,7 +23,6 @@ export const __wbg_moqfecdecoder_free: (a: number, b: number) => void;
23
23
  export const __wbg_moqfecencoder_free: (a: number, b: number) => void;
24
24
  export const __wbg_moqfecstatsjs_free: (a: number, b: number) => void;
25
25
  export const __wbg_reassembledmfujs_free: (a: number, b: number) => void;
26
- export const __wbg_reassemblerstatsjs_free: (a: number, b: number) => void;
27
26
  export const __wbg_recoveredset_free: (a: number, b: number) => void;
28
27
  export const __wbg_samplecombinerstatsjs_free: (a: number, b: number) => void;
29
28
  export const __wbg_set_fecstats_blocks_complete: (a: number, b: bigint) => void;
@@ -33,7 +32,7 @@ export const __wbg_set_fecstats_blocks_recovered: (a: number, b: bigint) => void
33
32
  export const __wbg_set_fecstats_bytes_recovered: (a: number, b: bigint) => void;
34
33
  export const __wbg_set_fecstats_repair_packets: (a: number, b: bigint) => void;
35
34
  export const __wbg_set_fecstats_source_packets: (a: number, b: bigint) => void;
36
- export const __wbg_set_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number, b: bigint) => void;
35
+ export const __wbg_set_fecstats_unplaced_evicted: (a: number, b: bigint) => void;
37
36
  export const __wbg_shredfecbuffer_free: (a: number, b: number) => void;
38
37
  export const __wbg_shredreassembler_free: (a: number, b: number) => void;
39
38
  export const annexb_access_unit_is_keyframe: (a: number, b: number, c: number, d: number) => [number, number, number];
@@ -64,7 +63,6 @@ export const mfufragmentjs_with_sample_identity: (a: number, b: number, c: numbe
64
63
  export const mmtfecdecoder_add_repair: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
65
64
  export const mmtfecdecoder_add_source: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
66
65
  export const mmtfecdecoder_cleanup_blocks_detailed: (a: number, b: number, c: number) => void;
67
- export const mmtfecdecoder_cleanup_by_sbn: (a: number, b: number) => [number, number, number, number];
68
66
  export const mmtfecdecoder_cleanup_by_ss_start: (a: number, b: number) => [number, number, number, number];
69
67
  export const mmtfecdecoder_configure: (a: number, b: number, c: number) => [number, number];
70
68
  export const mmtfecdecoder_configure_params: (a: number, b: number, c: number) => [number, number];
@@ -159,7 +157,6 @@ export const reassembledmfujs_repaired_packet_sequence_numbers: (a: number) => [
159
157
  export const reassembledmfujs_sample_number: (a: number) => number;
160
158
  export const reassembledmfujs_stream_identity: (a: number) => number;
161
159
  export const reassembledmfujs_timestamp: (a: number) => number;
162
- export const recoveredset_fec_set_index: (a: number) => number;
163
160
  export const recoveredset_payload: (a: number) => [number, number];
164
161
  export const recoveredset_slot: (a: number) => bigint;
165
162
  export const shredfecbuffer_add_shred: (a: number, b: bigint, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
@@ -176,7 +173,9 @@ export const moqencodedblock_p: (a: number) => number;
176
173
  export const moqfecstatsjs_blocksComplete: (a: number) => number;
177
174
  export const moqfecstatsjs_blocksIncomplete: (a: number) => number;
178
175
  export const moqfecstatsjs_totalSymbolsReceived: (a: number) => number;
176
+ export const recoveredset_fec_set_index: (a: number) => number;
179
177
  export const shredreassembler_pending_fec_sets: (a: number) => number;
178
+ export const __wbg_get_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number) => bigint;
180
179
  export const __wbg_get_reassemblerstatsjs_duplicate_fragments: (a: number) => bigint;
181
180
  export const __wbg_get_reassemblerstatsjs_evicted_data_units: (a: number) => bigint;
182
181
  export const __wbg_get_reassemblerstatsjs_evicted_memory_limit: (a: number) => bigint;
@@ -188,6 +187,8 @@ export const __wbg_get_samplecombinerstatsjs_combined_samples: (a: number) => bi
188
187
  export const __wbg_get_samplecombinerstatsjs_evicted_samples: (a: number) => bigint;
189
188
  export const __wbg_get_samplecombinerstatsjs_passthrough_samples: (a: number) => bigint;
190
189
  export const __wbg_get_samplecombinerstatsjs_timed_out_samples: (a: number) => bigint;
190
+ export const __wbg_reassemblerstatsjs_free: (a: number, b: number) => void;
191
+ export const __wbg_set_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number, b: bigint) => void;
191
192
  export const __wbg_set_reassemblerstatsjs_duplicate_fragments: (a: number, b: bigint) => void;
192
193
  export const __wbg_set_reassemblerstatsjs_evicted_data_units: (a: number, b: bigint) => void;
193
194
  export const __wbg_set_reassemblerstatsjs_evicted_memory_limit: (a: number, b: bigint) => void;
@@ -46,6 +46,12 @@ declare namespace wasm_bindgen {
46
46
  * Blocks that expired with fewer than K symbols (delivery issue, not FEC issue)
47
47
  */
48
48
  blocks_delivery_failed: bigint;
49
+ /**
50
+ * `iso-ssbg1-v1` held sources evicted, oldest arrival first, because the
51
+ * unplaced pool was at its `(interleave_depth + 1) * K` cap: no sweep
52
+ * (`cleanup_by_ss_start` / `retire_unplaced`) retired them first.
53
+ */
54
+ unplaced_evicted: bigint;
49
55
  }
50
56
 
51
57
  export class MfuFragmentJs {
@@ -101,27 +107,15 @@ declare namespace wasm_bindgen {
101
107
  /**
102
108
  * Add a repair symbol per ISO 23008-1 §C.5.3.
103
109
  *
104
- * Repair carries (SS_Start, SSB_length, RS_ID).
105
- * SS_Start = SS_ID of first source in block = SBN * K.
106
- * SSB_length = the authored source-symbol count in this block (1..=K).
107
- * SBN = SS_Start / configured K.
108
- * Repair ESI = K + RS_ID.
109
- *
110
- * The decoder's configured K is the fixed RaptorQ geometry. A short
111
- * authored block (`SSB_length < K`) is the producer's K-symbol RaptorQ
112
- * block with ESIs `SSB_length..K` zero-filled and never transmitted
113
- * (fec-raptorq `InterleavedEncoder::force_complete`). The block records
114
- * `SSB_length`, completes once that many source symbols arrived, and
115
- * recovers from `SSB_length` received symbols by supplying the known
116
- * padding itself. A conflicting `SSB_length` for one block is rejected
117
- * without changing that block.
118
- *
119
- * Under `iso-ssbg1-v1` the block is `[SS_Start, SS_Start + SSB_length)`
120
- * with `1 <= SSB_length <= K` (K is only the maximum), its RaptorQ geometry
121
- * is K' = SSB_length with no padding, and repair ESI = SSB_length + RS_ID
122
- * (C.5.3). The first repair defines the block and claims every held source
123
- * in range. A conflicting SSB_length, or a range overlapping a different
124
- * known block, is refused without changing any block. Output is the K'*T
110
+ * Repair carries (SS_Start, SSB_length, RS_ID). The block is
111
+ * `[SS_Start, SS_Start + SSB_length)` with `1 <= SSB_length <= K` (the
112
+ * configured K is only the maximum), its RaptorQ geometry is
113
+ * K' = SSB_length with no padding, and repair ESI = SSB_length + RS_ID.
114
+ * The first repair defines the block and claims every held source in
115
+ * range. A conflicting SSB_length, a range overlapping a different known
116
+ * block, or a start more than `interleave_depth` blocks behind the last
117
+ * `cleanup_by_ss_start`'s `current` (`iso_blocks_behind_lower_bound`), is
118
+ * refused without changing any block. Output is the K'*T
125
119
  * concatenated ssbg_mode1 symbols: split by T and trim by the length field.
126
120
  */
127
121
  add_repair(ss_start: number, ssb_length: number, rs_id: number, data: Uint8Array, timestamp: number): Uint8Array | undefined;
@@ -131,13 +125,12 @@ declare namespace wasm_bindgen {
131
125
  * SS_ID is a flat 32-bit counter. An unconfigured decoder rejects the
132
126
  * packet.
133
127
  *
134
- * - `k-padded-v1`: derives SBN = floor(SS_ID / K), ESI = SS_ID % K and
135
- * zero-pads `data` to T.
136
- * - `iso-ssbg1-v1`: builds the C.3.3 ssbg_mode1 symbol
137
- * `u16be(len) || data || zero padding` (refusing `len + 2 > T`) and
138
- * places it at ESI = serial distance from the start of the known block
139
- * whose `[SS_Start, SS_Start + SSB_length)` contains SS_ID. A source
140
- * whose block no repair has defined yet is held by SS_ID until one does.
128
+ * Builds the C.3.3 ssbg_mode1 symbol `u16be(len) || data || zero padding`
129
+ * (refusing `len + 2 > T`) and places it at ESI = serial distance from the
130
+ * start of the known block whose `[SS_Start, SS_Start + SSB_length)`
131
+ * contains SS_ID. A source whose block no repair has defined yet is held
132
+ * by SS_ID until one does; at most `(interleave_depth + 1) * K` are held, and
133
+ * the oldest arrival is evicted first (`FecStats::unplaced_evicted`).
141
134
  *
142
135
  * # Arguments
143
136
  * * `ss_id` - Source symbol ID (32-bit monotonic counter)
@@ -153,18 +146,6 @@ declare namespace wasm_bindgen {
153
146
  * Get alignment (Al) parameter from OTI
154
147
  */
155
148
  get_alignment(): number;
156
- /**
157
- * `k-padded-v1` only: cleanup blocks more than `interleave_depth` blocks
158
- * behind `current_sbn`. Refused under `iso-ssbg1-v1`, which has no SBN
159
- * (use `cleanup_by_ss_start`).
160
- *
161
- * Blocks are ordered by RFC 1982 serial comparison of their first SS_ID
162
- * (`sbn * K mod 2^32`, ISO/IEC 23008-1 C.5.2; BLO-35597 iso:5). For a
163
- * stream that has not wrapped SS_ID that is exactly the old
164
- * `sbn < current_sbn - interleave_depth`; after the wrap it still retires
165
- * the pre-wrap blocks instead of keeping them forever.
166
- */
167
- cleanup_by_sbn(current_sbn: number): Uint32Array;
168
149
  /**
169
150
  * Get sub-blocks (N) parameter from OTI
170
151
  */
@@ -178,11 +159,11 @@ declare namespace wasm_bindgen {
178
159
  */
179
160
  get_symbol_size(): number;
180
161
  /**
181
- * `iso-ssbg1-v1` only: retire the held source symbols that no repair can
182
- * place any more, by the same rule as `cleanup_by_ss_start`, without
183
- * retiring any block. For a caller that retires blocks itself, by their
184
- * deadlines (`cleanup_blocks_detailed`), and needs only this half. Returns
185
- * how many it retired.
162
+ * Retire the held source symbols that no repair can place any more, by
163
+ * the same rule as `cleanup_by_ss_start`, without retiring any block. For
164
+ * a caller that retires blocks itself, by their deadlines
165
+ * (`cleanup_blocks_detailed`), and needs only this half. Returns how many
166
+ * it retired.
186
167
  */
187
168
  retire_unplaced(current: number): number;
188
169
  /**
@@ -202,11 +183,11 @@ declare namespace wasm_bindgen {
202
183
  */
203
184
  get_source_blocks(): number;
204
185
  /**
205
- * `iso-ssbg1-v1` only: retire every block, and every held source symbol,
206
- * lying more than `interleave_depth` blocks behind SS_ID `current`, the
207
- * newest SS_ID the caller has seen (no block start or held source follows
208
- * it). A block start or held source that `current` has moved at least
209
- * half the SS_ID space past no longer precedes it and is retired too
186
+ * Retire every block, and every held source symbol, lying more than
187
+ * `interleave_depth` blocks behind SS_ID `current`, the newest SS_ID the
188
+ * caller has seen (no block start or held source follows it). A block
189
+ * start or held source that `current` has moved at least half the SS_ID
190
+ * space past no longer precedes it and is retired too
210
191
  * (`iso_past_horizon`).
211
192
  *
212
193
  * Blocks have no SBN under ssbg_mode1, so distance is measured on the
@@ -222,21 +203,21 @@ declare namespace wasm_bindgen {
222
203
  */
223
204
  get_interleave_depth(): number;
224
205
  /**
225
- * Finalize only the source blocks whose host-owned deadlines fired.
226
- * Keys are SBNs under `k-padded-v1` and SS_Starts under `iso-ssbg1-v1`.
206
+ * Finalize only the source blocks whose host-owned deadlines fired,
207
+ * named by their SS_Starts.
227
208
  *
228
209
  * The JavaScript FEC manager owns per-block repair grace. A timeout for one
229
210
  * block must therefore not run the decoder's global age scan and evict a
230
211
  * peer block that is still waiting for fetched repair.
231
212
  */
232
- cleanup_blocks_detailed(sbns: Uint32Array): void;
213
+ cleanup_blocks_detailed(ss_starts: Uint32Array): void;
233
214
  /**
234
215
  * Create a new FEC decoder
235
216
  *
236
217
  * # Arguments
237
218
  * * `interleave_depth` - Explicit positive number of interleaved blocks.
238
- * * `block_profile` - Catalog `fec.blockProfile`: `"k-padded-v1"` or
239
- * `"iso-ssbg1-v1"`. Required; any other value is refused.
219
+ * * `block_profile` - Catalog `fec.blockProfile`: `"iso-ssbg1-v1"`.
220
+ * Required; any other value is refused.
240
221
  */
241
222
  constructor(interleave_depth: number, block_profile: string);
242
223
  /**
@@ -271,33 +252,28 @@ declare namespace wasm_bindgen {
271
252
  * `[SS_Start:4][RSB_length:3][RS_ID:3][SSB_length:3][symbol: T]`.
272
253
  * Callers split on that stride; `entry i` is at `i * (13 + T)`.
273
254
  *
274
- * `k-padded-v1`: `block` is the Source Block Number and `source_block`
275
- * MUST be exactly `K * symbol_size` bytes — the caller pads the final
276
- * (short) block with zeros, mirroring `InterleavedEncoder` and the FFmpeg
277
- * path. `SS_Start = block * K` (wrapping), `SSB_length = K`.
278
- *
279
- * `iso-ssbg1-v1`: `block` is the SS_Start (the block's first SS_ID) and
280
- * `source_block` is the block's K' ssbg_mode1 symbols (`1 <= K' <= K`,
281
- * `len % T == 0`, each a well-formed C.3.3 symbol). RaptorQ runs over K'
282
- * symbols (F = K'*T) and `SSB_length = K'`.
255
+ * `ss_start` is the block's first SS_ID and `source_block` is the
256
+ * block's K' ssbg_mode1 symbols (`1 <= K' <= K`, `len % T == 0`, each a
257
+ * well-formed C.3.3 symbol). RaptorQ runs over K' symbols (F = K'*T) and
258
+ * `SSB_length = K'`.
283
259
  *
284
260
  * # Arguments
285
- * * `block` - SBN (`k-padded-v1`) or SS_Start (`iso-ssbg1-v1`).
261
+ * * `ss_start` - SS_Start: the block's first SS_ID.
286
262
  * * `source_block` - The block's source symbols, as described above.
287
263
  * * `repair_count` - Number of repair symbols (P) to generate.
288
264
  */
289
- encode_repair(block: number, source_block: Uint8Array, repair_count: number): Uint8Array;
265
+ encode_repair(ss_start: number, source_block: Uint8Array, repair_count: number): Uint8Array;
290
266
  /**
291
267
  * Create an encoder for a fixed `(K, symbol_size)` block geometry.
292
268
  *
293
269
  * Builds the OTI as `ObjectTransmissionInformation::new(K*T, T, 1, 1, 8)`
294
- * (single source block, single sub-block, byte alignment) — matching the
295
- * decoder's recovery model in [`FecBlock::try_decode`] — and pre-computes
296
- * the shared `SourceBlockEncodingPlan` so per-block encoding is cheap.
270
+ * (single source block, single sub-block, byte alignment) — the geometry
271
+ * [`MmtFecDecoder::configure`] reads back. K is the maximum SSB_length;
272
+ * each block is encoded over its own K' symbols (see
273
+ * [`MmtFecEncoder::encode_repair`]).
297
274
  *
298
- * `block_profile` is the catalog `fec.blockProfile` (`"k-padded-v1"` or
299
- * `"iso-ssbg1-v1"`); any other value is refused. Under `iso-ssbg1-v1`, K
300
- * is the maximum SSB_length.
275
+ * `block_profile` is the catalog `fec.blockProfile` (`"iso-ssbg1-v1"`);
276
+ * any other value is refused.
301
277
  */
302
278
  constructor(k: number, symbol_size: number, block_profile: string);
303
279
  /**
@@ -811,7 +787,7 @@ declare interface InitOutput {
811
787
  readonly __wbg_get_fecstats_bytes_recovered: (a: number) => bigint;
812
788
  readonly __wbg_get_fecstats_repair_packets: (a: number) => bigint;
813
789
  readonly __wbg_get_fecstats_source_packets: (a: number) => bigint;
814
- readonly __wbg_get_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number) => bigint;
790
+ readonly __wbg_get_fecstats_unplaced_evicted: (a: number) => bigint;
815
791
  readonly __wbg_mfufragmentjs_free: (a: number, b: number) => void;
816
792
  readonly __wbg_mmtfecdecoder_free: (a: number, b: number) => void;
817
793
  readonly __wbg_mmtfecencoder_free: (a: number, b: number) => void;
@@ -824,7 +800,6 @@ declare interface InitOutput {
824
800
  readonly __wbg_moqfecencoder_free: (a: number, b: number) => void;
825
801
  readonly __wbg_moqfecstatsjs_free: (a: number, b: number) => void;
826
802
  readonly __wbg_reassembledmfujs_free: (a: number, b: number) => void;
827
- readonly __wbg_reassemblerstatsjs_free: (a: number, b: number) => void;
828
803
  readonly __wbg_recoveredset_free: (a: number, b: number) => void;
829
804
  readonly __wbg_samplecombinerstatsjs_free: (a: number, b: number) => void;
830
805
  readonly __wbg_set_fecstats_blocks_complete: (a: number, b: bigint) => void;
@@ -834,7 +809,7 @@ declare interface InitOutput {
834
809
  readonly __wbg_set_fecstats_bytes_recovered: (a: number, b: bigint) => void;
835
810
  readonly __wbg_set_fecstats_repair_packets: (a: number, b: bigint) => void;
836
811
  readonly __wbg_set_fecstats_source_packets: (a: number, b: bigint) => void;
837
- readonly __wbg_set_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number, b: bigint) => void;
812
+ readonly __wbg_set_fecstats_unplaced_evicted: (a: number, b: bigint) => void;
838
813
  readonly __wbg_shredfecbuffer_free: (a: number, b: number) => void;
839
814
  readonly __wbg_shredreassembler_free: (a: number, b: number) => void;
840
815
  readonly annexb_access_unit_is_keyframe: (a: number, b: number, c: number, d: number) => [number, number, number];
@@ -865,7 +840,6 @@ declare interface InitOutput {
865
840
  readonly mmtfecdecoder_add_repair: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
866
841
  readonly mmtfecdecoder_add_source: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
867
842
  readonly mmtfecdecoder_cleanup_blocks_detailed: (a: number, b: number, c: number) => void;
868
- readonly mmtfecdecoder_cleanup_by_sbn: (a: number, b: number) => [number, number, number, number];
869
843
  readonly mmtfecdecoder_cleanup_by_ss_start: (a: number, b: number) => [number, number, number, number];
870
844
  readonly mmtfecdecoder_configure: (a: number, b: number, c: number) => [number, number];
871
845
  readonly mmtfecdecoder_configure_params: (a: number, b: number, c: number) => [number, number];
@@ -960,7 +934,6 @@ declare interface InitOutput {
960
934
  readonly reassembledmfujs_sample_number: (a: number) => number;
961
935
  readonly reassembledmfujs_stream_identity: (a: number) => number;
962
936
  readonly reassembledmfujs_timestamp: (a: number) => number;
963
- readonly recoveredset_fec_set_index: (a: number) => number;
964
937
  readonly recoveredset_payload: (a: number) => [number, number];
965
938
  readonly recoveredset_slot: (a: number) => bigint;
966
939
  readonly shredfecbuffer_add_shred: (a: number, b: bigint, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number) => [number, number];
@@ -977,7 +950,9 @@ declare interface InitOutput {
977
950
  readonly moqfecstatsjs_blocksComplete: (a: number) => number;
978
951
  readonly moqfecstatsjs_blocksIncomplete: (a: number) => number;
979
952
  readonly moqfecstatsjs_totalSymbolsReceived: (a: number) => number;
953
+ readonly recoveredset_fec_set_index: (a: number) => number;
980
954
  readonly shredreassembler_pending_fec_sets: (a: number) => number;
955
+ readonly __wbg_get_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number) => bigint;
981
956
  readonly __wbg_get_reassemblerstatsjs_duplicate_fragments: (a: number) => bigint;
982
957
  readonly __wbg_get_reassemblerstatsjs_evicted_data_units: (a: number) => bigint;
983
958
  readonly __wbg_get_reassemblerstatsjs_evicted_memory_limit: (a: number) => bigint;
@@ -989,6 +964,8 @@ declare interface InitOutput {
989
964
  readonly __wbg_get_samplecombinerstatsjs_evicted_samples: (a: number) => bigint;
990
965
  readonly __wbg_get_samplecombinerstatsjs_passthrough_samples: (a: number) => bigint;
991
966
  readonly __wbg_get_samplecombinerstatsjs_timed_out_samples: (a: number) => bigint;
967
+ readonly __wbg_reassemblerstatsjs_free: (a: number, b: number) => void;
968
+ readonly __wbg_set_reassemblerstatsjs_ambiguous_fallback_fragments: (a: number, b: bigint) => void;
992
969
  readonly __wbg_set_reassemblerstatsjs_duplicate_fragments: (a: number, b: bigint) => void;
993
970
  readonly __wbg_set_reassemblerstatsjs_evicted_data_units: (a: number, b: bigint) => void;
994
971
  readonly __wbg_set_reassemblerstatsjs_evicted_memory_limit: (a: number, b: bigint) => void;
@@ -529,6 +529,25 @@ let wasm_bindgen;
529
529
  set blocks_delivery_failed(arg0) {
530
530
  wasm.__wbg_set_fecstats_blocks_delivery_failed(this.__wbg_ptr, arg0);
531
531
  }
532
+ /**
533
+ * `iso-ssbg1-v1` held sources evicted, oldest arrival first, because the
534
+ * unplaced pool was at its `(interleave_depth + 1) * K` cap: no sweep
535
+ * (`cleanup_by_ss_start` / `retire_unplaced`) retired them first.
536
+ * @returns {bigint}
537
+ */
538
+ get unplaced_evicted() {
539
+ const ret = wasm.__wbg_get_fecstats_unplaced_evicted(this.__wbg_ptr);
540
+ return BigInt.asUintN(64, ret);
541
+ }
542
+ /**
543
+ * `iso-ssbg1-v1` held sources evicted, oldest arrival first, because the
544
+ * unplaced pool was at its `(interleave_depth + 1) * K` cap: no sweep
545
+ * (`cleanup_by_ss_start` / `retire_unplaced`) retired them first.
546
+ * @param {bigint} arg0
547
+ */
548
+ set unplaced_evicted(arg0) {
549
+ wasm.__wbg_set_fecstats_unplaced_evicted(this.__wbg_ptr, arg0);
550
+ }
532
551
  /**
533
552
  * Recovery rate as percentage (0-100)
534
553
  * Counts all blocks: complete + recovered + FEC-failed + delivery-failed
@@ -672,27 +691,15 @@ let wasm_bindgen;
672
691
  /**
673
692
  * Add a repair symbol per ISO 23008-1 §C.5.3.
674
693
  *
675
- * Repair carries (SS_Start, SSB_length, RS_ID).
676
- * SS_Start = SS_ID of first source in block = SBN * K.
677
- * SSB_length = the authored source-symbol count in this block (1..=K).
678
- * SBN = SS_Start / configured K.
679
- * Repair ESI = K + RS_ID.
680
- *
681
- * The decoder's configured K is the fixed RaptorQ geometry. A short
682
- * authored block (`SSB_length < K`) is the producer's K-symbol RaptorQ
683
- * block with ESIs `SSB_length..K` zero-filled and never transmitted
684
- * (fec-raptorq `InterleavedEncoder::force_complete`). The block records
685
- * `SSB_length`, completes once that many source symbols arrived, and
686
- * recovers from `SSB_length` received symbols by supplying the known
687
- * padding itself. A conflicting `SSB_length` for one block is rejected
688
- * without changing that block.
689
- *
690
- * Under `iso-ssbg1-v1` the block is `[SS_Start, SS_Start + SSB_length)`
691
- * with `1 <= SSB_length <= K` (K is only the maximum), its RaptorQ geometry
692
- * is K' = SSB_length with no padding, and repair ESI = SSB_length + RS_ID
693
- * (C.5.3). The first repair defines the block and claims every held source
694
- * in range. A conflicting SSB_length, or a range overlapping a different
695
- * known block, is refused without changing any block. Output is the K'*T
694
+ * Repair carries (SS_Start, SSB_length, RS_ID). The block is
695
+ * `[SS_Start, SS_Start + SSB_length)` with `1 <= SSB_length <= K` (the
696
+ * configured K is only the maximum), its RaptorQ geometry is
697
+ * K' = SSB_length with no padding, and repair ESI = SSB_length + RS_ID.
698
+ * The first repair defines the block and claims every held source in
699
+ * range. A conflicting SSB_length, a range overlapping a different known
700
+ * block, or a start more than `interleave_depth` blocks behind the last
701
+ * `cleanup_by_ss_start`'s `current` (`iso_blocks_behind_lower_bound`), is
702
+ * refused without changing any block. Output is the K'*T
696
703
  * concatenated ssbg_mode1 symbols: split by T and trim by the length field.
697
704
  * @param {number} ss_start
698
705
  * @param {number} ssb_length
@@ -721,13 +728,12 @@ let wasm_bindgen;
721
728
  * SS_ID is a flat 32-bit counter. An unconfigured decoder rejects the
722
729
  * packet.
723
730
  *
724
- * - `k-padded-v1`: derives SBN = floor(SS_ID / K), ESI = SS_ID % K and
725
- * zero-pads `data` to T.
726
- * - `iso-ssbg1-v1`: builds the C.3.3 ssbg_mode1 symbol
727
- * `u16be(len) || data || zero padding` (refusing `len + 2 > T`) and
728
- * places it at ESI = serial distance from the start of the known block
729
- * whose `[SS_Start, SS_Start + SSB_length)` contains SS_ID. A source
730
- * whose block no repair has defined yet is held by SS_ID until one does.
731
+ * Builds the C.3.3 ssbg_mode1 symbol `u16be(len) || data || zero padding`
732
+ * (refusing `len + 2 > T`) and places it at ESI = serial distance from the
733
+ * start of the known block whose `[SS_Start, SS_Start + SSB_length)`
734
+ * contains SS_ID. A source whose block no repair has defined yet is held
735
+ * by SS_ID until one does; at most `(interleave_depth + 1) * K` are held, and
736
+ * the oldest arrival is evicted first (`FecStats::unplaced_evicted`).
731
737
  *
732
738
  * # Arguments
733
739
  * * `ss_id` - Source symbol ID (32-bit monotonic counter)
@@ -769,28 +775,6 @@ let wasm_bindgen;
769
775
  }
770
776
  return ret[0];
771
777
  }
772
- /**
773
- * `k-padded-v1` only: cleanup blocks more than `interleave_depth` blocks
774
- * behind `current_sbn`. Refused under `iso-ssbg1-v1`, which has no SBN
775
- * (use `cleanup_by_ss_start`).
776
- *
777
- * Blocks are ordered by RFC 1982 serial comparison of their first SS_ID
778
- * (`sbn * K mod 2^32`, ISO/IEC 23008-1 C.5.2; BLO-35597 iso:5). For a
779
- * stream that has not wrapped SS_ID that is exactly the old
780
- * `sbn < current_sbn - interleave_depth`; after the wrap it still retires
781
- * the pre-wrap blocks instead of keeping them forever.
782
- * @param {number} current_sbn
783
- * @returns {Uint32Array}
784
- */
785
- cleanup_by_sbn(current_sbn) {
786
- const ret = wasm.mmtfecdecoder_cleanup_by_sbn(this.__wbg_ptr, current_sbn);
787
- if (ret[3]) {
788
- throw takeFromExternrefTable0(ret[2]);
789
- }
790
- var v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();
791
- wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
792
- return v1;
793
- }
794
778
  /**
795
779
  * Get sub-blocks (N) parameter from OTI
796
780
  * @returns {number}
@@ -822,11 +806,11 @@ let wasm_bindgen;
822
806
  return ret[0];
823
807
  }
824
808
  /**
825
- * `iso-ssbg1-v1` only: retire the held source symbols that no repair can
826
- * place any more, by the same rule as `cleanup_by_ss_start`, without
827
- * retiring any block. For a caller that retires blocks itself, by their
828
- * deadlines (`cleanup_blocks_detailed`), and needs only this half. Returns
829
- * how many it retired.
809
+ * Retire the held source symbols that no repair can place any more, by
810
+ * the same rule as `cleanup_by_ss_start`, without retiring any block. For
811
+ * a caller that retires blocks itself, by their deadlines
812
+ * (`cleanup_blocks_detailed`), and needs only this half. Returns how many
813
+ * it retired.
830
814
  * @param {number} current
831
815
  * @returns {number}
832
816
  */
@@ -880,11 +864,11 @@ let wasm_bindgen;
880
864
  return ret[0];
881
865
  }
882
866
  /**
883
- * `iso-ssbg1-v1` only: retire every block, and every held source symbol,
884
- * lying more than `interleave_depth` blocks behind SS_ID `current`, the
885
- * newest SS_ID the caller has seen (no block start or held source follows
886
- * it). A block start or held source that `current` has moved at least
887
- * half the SS_ID space past no longer precedes it and is retired too
867
+ * Retire every block, and every held source symbol, lying more than
868
+ * `interleave_depth` blocks behind SS_ID `current`, the newest SS_ID the
869
+ * caller has seen (no block start or held source follows it). A block
870
+ * start or held source that `current` has moved at least half the SS_ID
871
+ * space past no longer precedes it and is retired too
888
872
  * (`iso_past_horizon`).
889
873
  *
890
874
  * Blocks have no SBN under ssbg_mode1, so distance is measured on the
@@ -914,16 +898,16 @@ let wasm_bindgen;
914
898
  return ret >>> 0;
915
899
  }
916
900
  /**
917
- * Finalize only the source blocks whose host-owned deadlines fired.
918
- * Keys are SBNs under `k-padded-v1` and SS_Starts under `iso-ssbg1-v1`.
901
+ * Finalize only the source blocks whose host-owned deadlines fired,
902
+ * named by their SS_Starts.
919
903
  *
920
904
  * The JavaScript FEC manager owns per-block repair grace. A timeout for one
921
905
  * block must therefore not run the decoder's global age scan and evict a
922
906
  * peer block that is still waiting for fetched repair.
923
- * @param {Uint32Array} sbns
907
+ * @param {Uint32Array} ss_starts
924
908
  */
925
- cleanup_blocks_detailed(sbns) {
926
- const ptr0 = passArray32ToWasm0(sbns, wasm.__wbindgen_malloc);
909
+ cleanup_blocks_detailed(ss_starts) {
910
+ const ptr0 = passArray32ToWasm0(ss_starts, wasm.__wbindgen_malloc);
927
911
  const len0 = WASM_VECTOR_LEN;
928
912
  wasm.mmtfecdecoder_cleanup_blocks_detailed(this.__wbg_ptr, ptr0, len0);
929
913
  }
@@ -932,8 +916,8 @@ let wasm_bindgen;
932
916
  *
933
917
  * # Arguments
934
918
  * * `interleave_depth` - Explicit positive number of interleaved blocks.
935
- * * `block_profile` - Catalog `fec.blockProfile`: `"k-padded-v1"` or
936
- * `"iso-ssbg1-v1"`. Required; any other value is refused.
919
+ * * `block_profile` - Catalog `fec.blockProfile`: `"iso-ssbg1-v1"`.
920
+ * Required; any other value is refused.
937
921
  * @param {number} interleave_depth
938
922
  * @param {string} block_profile
939
923
  */
@@ -1014,21 +998,16 @@ let wasm_bindgen;
1014
998
  * [SS_Start:4][RSB_length:3][RS_ID:3][SSB_length:3][repair symbol: T]
1015
999
  * ```
1016
1000
  *
1017
- * with, for a block with Source Block Number `sbn` and `K` source symbols:
1018
- * - `SS_Start = sbn * K` (32-bit) — first SS_ID of the block. The decoder
1019
- * derives `SBN = SS_Start / K`, so this MUST be `sbn * K`.
1001
+ * with, for an `iso-ssbg1-v1` block of K' ssbg_mode1 source symbols
1002
+ * (ISO/IEC 23008-1 C.3.3, C.5.2, C.5.3):
1003
+ * - `SS_Start = ` the block's first SS_ID (SS_IDs are consecutive, 32-bit)
1020
1004
  * - `RSB_length = P` (repair count for this block)
1021
- * - `RS_ID = i` (0-based repair index) ⇒ RaptorQ ESI = `K + i`
1022
- * - `SSB_length <= K` (authored source symbols in this block)
1023
- *
1024
- * OTI (Z=1, N=1, Al=8) is delivered out-of-band via the catalog / AL-FEC
1025
- * signaling message — see [`MmtFecEncoder::oti`] — never per-packet.
1005
+ * - `RS_ID = i` (0-based repair index) ⇒ RaptorQ ESI = `K' + i`
1006
+ * - `SSB_length = K'` (`1..=K`; the configured K is only the maximum)
1026
1007
  *
1027
- * That framing is the `k-padded-v1` profile. Under `iso-ssbg1-v1` the same
1028
- * fields carry ISO/IEC 23008-1 C.5.3 semantics: `SS_Start` is the first SS_ID
1029
- * of a block of consecutive SS_IDs, `SSB_length = K'` (`1..=K`), the RaptorQ
1030
- * block is K' symbols with no padding (F = K'*T), and RS_ID `i` is ESI
1031
- * `K' + i`.
1008
+ * The RaptorQ block is K' symbols with no padding (F = K'*T). The configured
1009
+ * OTI (F = K*T, Z=1, N=1, Al=8) is delivered out-of-band via the catalog /
1010
+ * AL-FEC signaling message — see [`MmtFecEncoder::oti`] — never per-packet.
1032
1011
  */
1033
1012
  class MmtFecEncoder {
1034
1013
  __destroy_into_raw() {
@@ -1073,29 +1052,24 @@ let wasm_bindgen;
1073
1052
  * `[SS_Start:4][RSB_length:3][RS_ID:3][SSB_length:3][symbol: T]`.
1074
1053
  * Callers split on that stride; `entry i` is at `i * (13 + T)`.
1075
1054
  *
1076
- * `k-padded-v1`: `block` is the Source Block Number and `source_block`
1077
- * MUST be exactly `K * symbol_size` bytes — the caller pads the final
1078
- * (short) block with zeros, mirroring `InterleavedEncoder` and the FFmpeg
1079
- * path. `SS_Start = block * K` (wrapping), `SSB_length = K`.
1080
- *
1081
- * `iso-ssbg1-v1`: `block` is the SS_Start (the block's first SS_ID) and
1082
- * `source_block` is the block's K' ssbg_mode1 symbols (`1 <= K' <= K`,
1083
- * `len % T == 0`, each a well-formed C.3.3 symbol). RaptorQ runs over K'
1084
- * symbols (F = K'*T) and `SSB_length = K'`.
1055
+ * `ss_start` is the block's first SS_ID and `source_block` is the
1056
+ * block's K' ssbg_mode1 symbols (`1 <= K' <= K`, `len % T == 0`, each a
1057
+ * well-formed C.3.3 symbol). RaptorQ runs over K' symbols (F = K'*T) and
1058
+ * `SSB_length = K'`.
1085
1059
  *
1086
1060
  * # Arguments
1087
- * * `block` - SBN (`k-padded-v1`) or SS_Start (`iso-ssbg1-v1`).
1061
+ * * `ss_start` - SS_Start: the block's first SS_ID.
1088
1062
  * * `source_block` - The block's source symbols, as described above.
1089
1063
  * * `repair_count` - Number of repair symbols (P) to generate.
1090
- * @param {number} block
1064
+ * @param {number} ss_start
1091
1065
  * @param {Uint8Array} source_block
1092
1066
  * @param {number} repair_count
1093
1067
  * @returns {Uint8Array}
1094
1068
  */
1095
- encode_repair(block, source_block, repair_count) {
1069
+ encode_repair(ss_start, source_block, repair_count) {
1096
1070
  const ptr0 = passArray8ToWasm0(source_block, wasm.__wbindgen_malloc);
1097
1071
  const len0 = WASM_VECTOR_LEN;
1098
- const ret = wasm.mmtfecencoder_encode_repair(this.__wbg_ptr, block, ptr0, len0, repair_count);
1072
+ const ret = wasm.mmtfecencoder_encode_repair(this.__wbg_ptr, ss_start, ptr0, len0, repair_count);
1099
1073
  if (ret[3]) {
1100
1074
  throw takeFromExternrefTable0(ret[2]);
1101
1075
  }
@@ -1115,13 +1089,13 @@ let wasm_bindgen;
1115
1089
  * Create an encoder for a fixed `(K, symbol_size)` block geometry.
1116
1090
  *
1117
1091
  * Builds the OTI as `ObjectTransmissionInformation::new(K*T, T, 1, 1, 8)`
1118
- * (single source block, single sub-block, byte alignment) — matching the
1119
- * decoder's recovery model in [`FecBlock::try_decode`] — and pre-computes
1120
- * the shared `SourceBlockEncodingPlan` so per-block encoding is cheap.
1092
+ * (single source block, single sub-block, byte alignment) — the geometry
1093
+ * [`MmtFecDecoder::configure`] reads back. K is the maximum SSB_length;
1094
+ * each block is encoded over its own K' symbols (see
1095
+ * [`MmtFecEncoder::encode_repair`]).
1121
1096
  *
1122
- * `block_profile` is the catalog `fec.blockProfile` (`"k-padded-v1"` or
1123
- * `"iso-ssbg1-v1"`); any other value is refused. Under `iso-ssbg1-v1`, K
1124
- * is the maximum SSB_length.
1097
+ * `block_profile` is the catalog `fec.blockProfile` (`"iso-ssbg1-v1"`);
1098
+ * any other value is refused.
1125
1099
  * @param {number} k
1126
1100
  * @param {number} symbol_size
1127
1101
  * @param {string} block_profile
@@ -2300,14 +2274,14 @@ let wasm_bindgen;
2300
2274
  * @returns {bigint}
2301
2275
  */
2302
2276
  get ambiguous_fallback_fragments() {
2303
- const ret = wasm.__wbg_get_reassemblerstatsjs_ambiguous_fallback_fragments(this.__wbg_ptr);
2277
+ const ret = wasm.__wbg_get_fecstats_unplaced_evicted(this.__wbg_ptr);
2304
2278
  return BigInt.asUintN(64, ret);
2305
2279
  }
2306
2280
  /**
2307
2281
  * @param {bigint} arg0
2308
2282
  */
2309
2283
  set ambiguous_fallback_fragments(arg0) {
2310
- wasm.__wbg_set_reassemblerstatsjs_ambiguous_fallback_fragments(this.__wbg_ptr, arg0);
2284
+ wasm.__wbg_set_fecstats_unplaced_evicted(this.__wbg_ptr, arg0);
2311
2285
  }
2312
2286
  }
2313
2287
  if (Symbol.dispose) ReassemblerStatsJs.prototype[Symbol.dispose] = ReassemblerStatsJs.prototype.free;
@@ -2353,7 +2327,7 @@ let wasm_bindgen;
2353
2327
  * @returns {number}
2354
2328
  */
2355
2329
  get fec_set_index() {
2356
- const ret = wasm.recoveredset_fec_set_index(this.__wbg_ptr);
2330
+ const ret = wasm.mmtfecencoder_k(this.__wbg_ptr);
2357
2331
  return ret >>> 0;
2358
2332
  }
2359
2333
  /**
Binary file