@blockcast/mmt-base 0.1.0-main.0c300647d0a5

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/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # @blockcast/mmt-base
2
+
3
+ The shared MMTP packet-parsing leaf for libmmt's TypeScript packages. It hosts the low-level MMTP / MPU / MFU header parsers, FEC payload-id predicates, and ALTA-trailer extractor — everything that operates on raw MMTP packet bytes **with zero FEC-decode dependency**. RFC 6330 OTI geometry belongs to `@blockcast/mmt-fec`.
4
+
5
+ It exists for one structural reason. Both `@blockcast/mmt-fec` and `@blockcast/mmt-container` need these primitives. Before this package they lived in `mmt-container`, so `mmt-fec` had to import `mmt-container` for them — while `mmt-container`'s `FecManager` already imports `mmt-fec`. That is a circular dependency. Extracting the primitives into this leaf breaks the cycle: both packages now import **down** into `mmt-base` rather than across into each other. Its only dependency is `@blockcast/mmt-alta-parse` (for the ALTA trailer types it re-exports).
6
+
7
+ ```bash
8
+ pnpm add @blockcast/mmt-base
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```ts
14
+ import {
15
+ unwrapMMTP, extractMFUPayload, extractTimestamp,
16
+ isFecRepairPacket, hasSourceFecPayloadId,
17
+ PACKET_TYPE_MPU,
18
+ } from "@blockcast/mmt-base"
19
+
20
+ const pkt = unwrapMMTP(datagram) // { header, payload }
21
+ if (pkt.header.packetType === PACKET_TYPE_MPU) {
22
+ const mfu = extractMFUPayload(datagram) // { data, fragmentationIndicator, mpuSequenceNumber, ... }
23
+ const ts = extractTimestamp(datagram) // bigint MPU timestamp
24
+ }
25
+
26
+ if (isFecRepairPacket(datagram)) {
27
+ // repair flow — hand the payload to @blockcast/mmt-fec
28
+ }
29
+ ```
30
+
31
+ ## Exports
32
+
33
+ Single entry point — `package.json#exports` declares only `.`, and `src/index.ts` re-exports the packet primitives. Group them as three families:
34
+
35
+ ### Header, MPU & MFU parsing
36
+
37
+ | Symbol | Kind | Purpose |
38
+ |--------|------|---------|
39
+ | `parseMMTPHeader` | function | Parse the 12-byte MMTP header → `MMTPHeader` |
40
+ | `unwrapMMTP` | function | Header + payload split → `MMTPPacket` |
41
+ | `parseMPUHeader` | function | Parse the 8-byte MPU header → `MPUHeader` |
42
+ | `extractMFUPayload` | function | Pull the MFU data unit out of an MMTP packet → `MFUExtraction` (handles timed `T=1` and non-timed `T=0` DU headers) |
43
+ | `extractNALUnit` | function | Extract the NAL unit bytes from an MMTP packet |
44
+ | `extractTimestamp` | function | MPU presentation timestamp as `bigint` |
45
+ | `MMTPHeader`, `MPUHeader`, `MMTPPacket`, `MFUExtraction` | type | Parsed-structure shapes |
46
+ | `MMTP_HEADER_SIZE` (12), `MPU_HEADER_SIZE` (8), `MFU_DU_HEADER_SIZE_TIMED` (14), `MFU_DU_HEADER_SIZE_NONTIMED` (4) | const | Fixed header sizes |
47
+ | `PACKET_TYPE_MPU` (0x00), `PACKET_TYPE_SIGNALING` (0x02), `PACKET_TYPE_REPAIR` (0x03) | const | MMTP `packet_type` values |
48
+
49
+ MPU `payload_length` is interpreted strictly as ISO's length-after-field value: six remaining MPU-header bytes plus the data-unit header and media. ALTA and Source FEC Payload ID suffixes are outside that span; malformed, zero-length, media-only, and ambiguous declarations are rejected.
50
+
51
+ ### FEC payload-id, repair & AL-FEC signaling
52
+
53
+ | Symbol | Kind | Purpose |
54
+ |--------|------|---------|
55
+ | `isFecRepairPacket` | function | Is this a `PACKET_TYPE_REPAIR` packet? |
56
+ | `hasSourceFecPayloadId` | function | Strict predicate for a source packet's declared four-byte FEC payload ID |
57
+ | `extractFecPayloadId` | function | `{ ssId }` from a source packet's FEC payload id (or `null`) |
58
+ | `extractRepairFecPayloadId` | function | Repair-flow FEC payload id (13-byte, `REPAIR_FEC_PID_SIZE`) |
59
+ | `parseMoqRepairFrame` | function | Strictly parse a mode-0 MMTP Annex C repair frame → `MoqRepairFrame` |
60
+ | `parseAlFecMessage` | function | Parse an AL-FEC signaling message → `AlFecConfig` |
61
+ | `MoqRepairFrame`, `AlFecConfig` | type | Repair-frame / AL-FEC config shapes |
62
+ | `ALFEC_MESSAGE_ID` (0x0203), `FEC_CODE_XOR` (1), `FEC_CODE_RAPTORQ` (2), `REPAIR_FEC_PID_SIZE` (13) | const | AL-FEC signaling + payload-id constants |
63
+
64
+ ### ALTA trailer (re-exported from `@blockcast/mmt-alta-parse`)
65
+
66
+ | Symbol | Kind | Purpose |
67
+ |--------|------|---------|
68
+ | `extractAltaTrailer` | function | Extract the ALTA authentication trailer from an MMTP packet |
69
+ | `AltaTrailer` | type | Parsed trailer shape |
70
+ | `MMTP_EXT_TYPE_ALTA_AUTH`, `MMTP_EXT_TRAILER_HEADER_SIZE` | const | ALTA extension-header identifiers |
71
+
72
+ These four are re-exported so callers that already pull MMTP primitives from here don't need a second import from `@blockcast/mmt-alta-parse` just for the trailer.
73
+
74
+ ## Why this package exists
75
+
76
+ ```
77
+ before after
78
+ ┌──────────────┐ ┌──────────────┐
79
+ │ mmt-fec │──needs primitives──► │ mmt-fec │─┐
80
+ └──────────────┘ └──────────────┘ │ import down
81
+ ┌──────────────┐ ┌──────────────┐ │
82
+ │ mmt-container│◄─FecManager needs─┐ │ mmt-container│─┤
83
+ │ (hosts the │ mmt-fec │ └──────────────┘ │
84
+ │ primitives) │───────────────────┘ ▼
85
+ └──────────────┘ ⟲ CYCLE ┌──────────────────────────┐
86
+ │ @blockcast/mmt-base │
87
+ │ (MMTP/MPU/MFU/PID) │
88
+ └──────────────────────────┘
89
+ ```
90
+
91
+ - `@blockcast/mmt-fec` imports the parsers in `src/block-processor.ts` (splitting a decoded FEC block back into MFU fragments).
92
+ - `@blockcast/mmt-container` imports these primitives directly. The obsolete
93
+ container re-export shim and `@blockcast/mmt-container/mmtp` subpath were
94
+ removed so there is one parser authority.
95
+
96
+ Keep this package dependency-light. OTI geometry and anything that needs the WASM FEC decoder belong in `@blockcast/mmt-fec`; anything that needs catalog/CMAF/reassembly state belongs in `@blockcast/mmt-container`. `mmt-base` stays pure MMTP packet parsing so both can depend on it without pulling in the other.
97
+
98
+ ## Build & test
99
+
100
+ ```bash
101
+ npm run build # tsc → dist/
102
+ npm run typecheck # tsc --noEmit
103
+ npm test # vitest run
104
+ ```
105
+
106
+ The direct suite owns header parsing, MFU extraction, payload-ID predicates,
107
+ declared-boundary rejection, C/X optional headers, and
108
+ ALTA/FEC suffix coverage. Downstream suites exercise integration only.
109
+
110
+ ## Related packages
111
+
112
+ | Package | Relationship |
113
+ |---------|-------------|
114
+ | [`@blockcast/mmt-alta-parse`](../mmt-alta-parse) | Only dependency — supplies the ALTA trailer types this package re-exports |
115
+ | [`@blockcast/mmt-fec`](../fec) | Imports these parsers in `block-processor` to turn decoded FEC blocks back into MFU fragments |
116
+ | [`@blockcast/mmt-container`](../container) | Imports these primitives directly and builds the `FecManager`, MFU reassembler, and CMAF demuxer on top |
117
+
118
+ ## License
119
+
120
+ Apache-2.0 — see `LICENSE`.
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './mmtp.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './mmtp.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA"}
package/dist/mmtp.d.ts ADDED
@@ -0,0 +1,275 @@
1
+ import { extractAltaTrailer as _leafExtractAltaTrailer, type AltaTrailer as _LeafAltaTrailer } from '@blockcast/mmt-alta-parse';
2
+ /**
3
+ * @mmt/container - MMTP Parser
4
+ *
5
+ * MMTP (MMT Protocol) packet parser based on ISO/IEC 23008-1:2023 Section 9.2
6
+ *
7
+ * MMTP header format (12 bytes):
8
+ * - Byte 0: V(2) | C(1) | FEC_type(2) | r(1) | X(1) | R(1)
9
+ * - Byte 1: reserved(2) | packet_type(6)
10
+ * - Bytes 2-3: packet_id (big-endian)
11
+ * - Bytes 4-7: timestamp (big-endian, 32-bit)
12
+ * - Bytes 8-11: sequence_number (big-endian)
13
+ *
14
+ * FEC_type values:
15
+ * - 0: No FEC / source packet
16
+ * - 1: FEC mode 0 (source with FEC payload ID)
17
+ * - 2: FEC repair packet mode 0
18
+ * - 3: FEC repair packet mode 1
19
+ *
20
+ * @packageDocumentation
21
+ */
22
+ export interface MMTPHeader {
23
+ version: number;
24
+ /** Packet type: 0x00=MPU, 0x02=Signaling, 0x03=Repair */
25
+ packetType: number;
26
+ packetId: number;
27
+ timestamp: bigint;
28
+ sequenceNumber: number;
29
+ payloadLength: number;
30
+ fecType: number;
31
+ /** C flag: header carries a 32-bit packet_counter. */
32
+ packetCounterFlag: boolean;
33
+ packetCounter?: number;
34
+ /** X flag: header carries an extension header and value. */
35
+ extensionFlag: boolean;
36
+ extension?: {
37
+ type: number;
38
+ data: Uint8Array;
39
+ };
40
+ /** Byte offset at which the MMTP payload begins. */
41
+ headerLength: number;
42
+ /** Random Access Point flag - indicates keyframe (ISO 23008-1, byte 0 bit 0) */
43
+ rapFlag: boolean;
44
+ }
45
+ export interface MPUHeader {
46
+ mpuSequenceNumber: number;
47
+ fragmentationIndicator: number;
48
+ /** 8-bit MPU fragment_counter from byte 3. */
49
+ fragmentCounter: number;
50
+ /** T flag: 1=timed media (14-byte MFU DU header), 0=non-timed (4-byte header) */
51
+ timedFlag: number;
52
+ /** A flag: aggregated MPU payload. This strict profile requires A=0. */
53
+ aggregationFlag: boolean;
54
+ /** MPU payload_length (bytes 0-1): bytes after the length field, including
55
+ * the remaining six MPU-header bytes and all data-unit bytes. */
56
+ payloadLength: number;
57
+ }
58
+ export interface MFUDuHeader {
59
+ movieFragmentSequenceNumber: number;
60
+ sampleNumber: number;
61
+ offset: number;
62
+ priority: number;
63
+ dependencyCounter: number;
64
+ }
65
+ export interface MMTPPacket {
66
+ header: MMTPHeader;
67
+ payload: Uint8Array;
68
+ }
69
+ export declare const MMTP_HEADER_SIZE = 12;
70
+ export declare const MPU_HEADER_SIZE = 8;
71
+ export declare const MFU_DU_HEADER_SIZE_TIMED = 14;
72
+ export declare const MFU_DU_HEADER_SIZE_NONTIMED = 4;
73
+ export declare const PACKET_TYPE_MPU = 0;
74
+ export declare const PACKET_TYPE_SIGNALING = 2;
75
+ export declare const PACKET_TYPE_REPAIR = 3;
76
+ export declare const ALFEC_MESSAGE_ID = 515;
77
+ export declare const FEC_CODE_XOR = 1;
78
+ export declare const FEC_CODE_RAPTORQ = 2;
79
+ /**
80
+ * Parse MMTP header from buffer
81
+ */
82
+ export declare function parseMMTPHeader(buffer: Uint8Array): MMTPHeader;
83
+ /**
84
+ * Unwrap MMTP packet to extract payload
85
+ */
86
+ export declare function unwrapMMTP(buffer: Uint8Array): MMTPPacket;
87
+ /**
88
+ * Parse MPU header from payload
89
+ * ISO/IEC 23008-1:2023 Section 9.2.3.3
90
+ *
91
+ * MPU Header format (8 bytes) as written by FFmpeg/libmmt:
92
+ * - Bytes 0-1: payload_length (16 bits, big-endian)
93
+ * - Byte 2: FT(4) | T(1) | FI(2) | A(1)
94
+ * - Byte 3: fragment_counter (8 bits)
95
+ * - Bytes 4-7: MPU_sequence_number (32 bits, big-endian)
96
+ */
97
+ export declare function parseMPUHeader(payload: Uint8Array): MPUHeader;
98
+ export declare function parseTimedMfuDuHeader(payload: Uint8Array, offset: number): MFUDuHeader | null;
99
+ /**
100
+ * Why `extractMFUPayload` refused a packet.
101
+ *
102
+ * These identifiers are part of the public contract: callers surface them in
103
+ * diagnostics, so renaming one is a breaking change.
104
+ */
105
+ export type MFURejectionGate = 'packet-shorter-than-mmtp-plus-mpu-header' | 'mmtp-header-unparseable' | 'not-an-mpu-packet' | 'payload-shorter-than-mpu-header' | 'aggregation-flag-set' | 'mpu-payload-length-below-header-remainder' | 'mpu-declared-end-exceeds-payload' | 'mfu-offset-at-or-past-declared-end' | 'source-fec-payload-id-width-mismatch' | 'declared-trailers-unresolved';
106
+ export interface MFURejection {
107
+ gate: MFURejectionGate;
108
+ /** Human-readable detail, including the byte arithmetic that decided it. */
109
+ detail: string;
110
+ }
111
+ /**
112
+ * Extract NAL unit payload from MMTP packet
113
+ */
114
+ export declare function extractNALUnit(mmtpPacket: Uint8Array): Uint8Array;
115
+ /** Result of extracting MFU payload from an MMTP packet */
116
+ export interface MFUExtraction {
117
+ /** MMTP header fields */
118
+ header: MMTPHeader;
119
+ /** MPU header fields */
120
+ mpu: MPUHeader;
121
+ /** Fragment type (FT field, 4 bits): 0=metadata, 2=MFU data */
122
+ fragmentType: number;
123
+ /** MFU payload data (video/audio bytes, headers stripped, FEC ID excluded) */
124
+ data: Uint8Array;
125
+ /** Parsed timed MFU DU header when present, otherwise null */
126
+ mfuDuHeader: MFUDuHeader | null;
127
+ /** Non-timed MFU Item_ID when the 4-byte DU header is present. */
128
+ itemId: number | null;
129
+ /** Source FEC Payload ID if present (`FEC_type == 1`), or null */
130
+ fecPayloadId: {
131
+ ssId: number;
132
+ } | null;
133
+ }
134
+ /**
135
+ * Report why `extractMFUPayload` would refuse this packet, or null if it would
136
+ * accept it.
137
+ *
138
+ * `extractMFUPayload` returns bare `null` on ten distinct conditions, which
139
+ * makes a producer/consumer framing disagreement indistinguishable from a
140
+ * publisher that never started — both render as silence. Use this wherever
141
+ * that distinction matters: diagnostics, contract tests, and operator-facing
142
+ * logs.
143
+ */
144
+ export declare function explainMFURejection(mmtpPacket: Uint8Array, options?: {
145
+ skipFecId?: boolean;
146
+ }): MFURejection | null;
147
+ export declare function extractMFUPayload(mmtpPacket: Uint8Array, options?: {
148
+ skipFecId?: boolean;
149
+ }): MFUExtraction | null;
150
+ /**
151
+ * Extract timestamp from MMTP packet
152
+ */
153
+ export declare function extractTimestamp(mmtpPacket: Uint8Array): bigint;
154
+ /**
155
+ * Check if MMTP packet is an FEC repair packet
156
+ * FEC_type 2 and 3 are repair packets
157
+ */
158
+ export declare function isFecRepairPacket(mmtpPacket: Uint8Array): boolean;
159
+ /**
160
+ * Extract Source FEC Payload ID (SS_ID) from the last 4 bytes of an MMTP
161
+ * source packet per ISO/IEC 23008-1:2023 Section C.5.2 Figure C.10.
162
+ *
163
+ * SS_ID is a flat 32-bit monotonic counter (incremented by 1 per packet
164
+ * for ssbg_mode0 and ssbg_mode1). Block membership and ESI are derived
165
+ * at recovery time from repair packet SS_Start and SSB_length:
166
+ * SBN = floor(SS_ID / K), ESI = SS_ID % K
167
+ * SS_Start = SBN * K (first SS_ID of the block)
168
+ *
169
+ * This matches FFmpeg moqenc_mmt.c, the drafts (draft-ramadan-moq-fec §6.2),
170
+ * and ATSC A/331 §8.1.2.5 which defers to ISO 23008-1 Annex C.
171
+ */
172
+ export declare function extractFecPayloadId(mmtpPacket: Uint8Array): {
173
+ ssId: number;
174
+ } | null;
175
+ /**
176
+ * Return true when FEC_type=1 and the exact suffix after the ISO-declared MPU
177
+ * payload contains a four-byte Source FEC Payload ID.
178
+ */
179
+ export declare function hasSourceFecPayloadId(mmtpPacket: Uint8Array): boolean;
180
+ /**
181
+ * MMTP header-extension ext_type assigned to the detached ALTA authenticator
182
+ * trailer (Path 2 / 08-07). Carried in an `[ext_type][ext_length][auth]`
183
+ * block appended after the MPU's declared payload bytes, before the 4-byte
184
+ * Source FEC Payload ID. MMTP X-bit stays 0 — non-ALTA MMTP receivers treat
185
+ * the trailer as bytes past `payload_length` and skip it (per ISO 23008-1
186
+ * §9.2.2 "may be discarded without impacting correct processing").
187
+ */
188
+ export declare const MMTP_EXT_TYPE_ALTA_AUTH = 61601;
189
+ export declare const MMTP_EXT_TRAILER_HEADER_SIZE = 4;
190
+ export type AltaTrailer = _LeafAltaTrailer;
191
+ export declare const extractAltaTrailer: typeof _leafExtractAltaTrailer;
192
+ /** Size of Repair FEC Payload ID per ISO/IEC 23008-1 Section C.5.3 */
193
+ export declare const REPAIR_FEC_PID_SIZE = 13;
194
+ /**
195
+ * Extract Repair FEC Payload ID from a raw-multicast MMTP repair packet.
196
+ * Per ISO/IEC 23008-1:2023 Section C.5.3 (ssbg_mode0, one-stage, no FFSRP_TS):
197
+ * [MMTP header][SS_Start:4][RSB_length:3][RS_ID:3][SSB_length:3][repair data]
198
+ * OTI is delivered via AL-FEC signaling message (Table C.3), not per-packet.
199
+ *
200
+ * Byte 1 is reserved(2)|packet_type(6) for V=0, so repair type 0x03 is 0x03.
201
+ * Pre-migration high-bits bytes (0x0c) are rejected — no compatibility decode.
202
+ */
203
+ export declare function extractRepairFecPayloadId(mmtpPacket: Uint8Array): {
204
+ ssStart: number;
205
+ rsbLength: number;
206
+ rsId: number;
207
+ ssbLength: number;
208
+ } | null;
209
+ /** Parsed MoQ repair frame per ISO/IEC 23008-1 Section C.4.3 + C.5.3 */
210
+ export interface MoqRepairFrame {
211
+ /** MMTP packetId (1=video, 2=audio) — for routing to correct FEC decoder */
212
+ packetId: number;
213
+ /** SS_Start (32 bits): SS_ID of first source symbol in block */
214
+ ssStart: number;
215
+ /** RSB_length (24 bits): number of repair symbols (P) */
216
+ rsbLength: number;
217
+ /** RS_ID (24 bits): repair symbol index (0-based) */
218
+ rsId: number;
219
+ /** SSB_length (24 bits): number of source symbols (K) */
220
+ ssbLength: number;
221
+ /** Repair symbol data after the dynamic MMTP header and 13-byte FEC payload ID. */
222
+ symbolData: Uint8Array;
223
+ }
224
+ /**
225
+ * Parse a MoQ repair frame (ISO/IEC 23008-1 Annex C format).
226
+ *
227
+ * Wire format per ISO 23008-1 §C.4.3 + §C.5.3:
228
+ * MMTP Header: fixed 12 bytes plus C/X optional fields
229
+ * then SS_Start (4 bytes) → block identifier
230
+ * then RSB_length (3 bytes) → P
231
+ * then RS_ID (3 bytes) → ESI = K + RS_ID
232
+ * then SSB_length (3 bytes) → K
233
+ * then Repair Symbol Data (T bytes)
234
+ *
235
+ * @param frame - Raw MoQ repair frame bytes
236
+ * @returns Parsed frame or null if invalid
237
+ */
238
+ export declare function parseMoqRepairFrame(frame: Uint8Array): MoqRepairFrame | null;
239
+ /**
240
+ * AL-FEC signaling configuration parsed from ISO/IEC 23008-1:2023 Table C.3 message.
241
+ */
242
+ export interface AlFecConfig {
243
+ fecCodeId: number;
244
+ fecPayloadIdMode: 0;
245
+ repairSymbolSize: number;
246
+ maximumK: number;
247
+ maximumP: number;
248
+ interleaveDepth: number;
249
+ oti: Uint8Array;
250
+ }
251
+ /**
252
+ * Parse AL-FEC signaling message from a full MMTP signaling packet.
253
+ *
254
+ * Wire format (ISO/IEC 23008-1:2023 Table C.3, Amendment 1:2025):
255
+ * [12-byte MMTP header (packet_type=0x02)]
256
+ * message_id(2) = 0x0203
257
+ * version(1)
258
+ * message_length(2) = length of remaining payload
259
+ * flags(1) = fec_flag(1) | private_fec_flag(1) | reserved(6)
260
+ * fec_flow_descriptor:
261
+ * length(2)
262
+ * num_flows(1)
263
+ * per flow:
264
+ * fec_flow_id(1), source_flow_id(1), num_assets(1), packet_ids(2*N),
265
+ * coding_params(1), repair_symbol_size(2),
266
+ * [one-stage]: repair_flow_id(2), fec_code_id(1),
267
+ * [private_fec_flag]: private_header(1){flag(1)|len(7)},
268
+ * current RaptorQ profile OTI(12) + interleave_depth(1)
269
+ * max_k(3), max_p(3), protection_window_time(4), protection_window_size(4)
270
+ *
271
+ * @param mmtpPacket Full MMTP packet including 12-byte header
272
+ * @returns Parsed config or null if not an AL-FEC signaling message
273
+ */
274
+ export declare function parseAlFecMessage(mmtpPacket: Uint8Array): AlFecConfig | null;
275
+ //# sourceMappingURL=mmtp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mmtp.d.ts","sourceRoot":"","sources":["../src/mmtp.ts"],"names":[],"mappings":"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"}