@blockcast/mmt-container 0.1.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/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/loc.d.ts +100 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +198 -0
- package/dist/loc.js.map +1 -0
- package/dist/mfu-reassembler.d.ts +92 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +320 -0
- package/dist/mfu-reassembler.js.map +1 -0
- package/dist/mmtp.d.ts +73 -0
- package/dist/mmtp.d.ts.map +1 -0
- package/dist/mmtp.js +210 -0
- package/dist/mmtp.js.map +1 -0
- package/package.json +45 -0
- package/src/index.ts +44 -0
- package/src/loc.ts +218 -0
- package/src/mfu-reassembler.ts +416 -0
- package/src/mmtp.ts +277 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mmt/container - MMTP/LOC Container Parsing
|
|
3
|
+
*
|
|
4
|
+
* Shared container parsing library for MMT over MoQ and SSM.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { type MMTPHeader, type MPUHeader, type MMTPPacket, MMTP_HEADER_SIZE, MPU_HEADER_SIZE, MFU_DU_HEADER_SIZE, parseMMTPHeader, unwrapMMTP, parseMPUHeader, extractNALUnit, extractTimestamp, isFecRepairPacket, hasFecPayloadId, } from './mmtp.js';
|
|
9
|
+
export { type MFUFragment, type ReassembledMFU, type ReassemblerStats, type MFUReassemblerOptions, MFUReassembler, createFragment, processMMTPWithReassembly, } from './mfu-reassembler.js';
|
|
10
|
+
export { LOCHeaderExtensionId, FEC_PAYLOAD_ID_MAX, fecPack, fecUnpack, FecPayloadId, } from './loc.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,cAAc,EACd,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,YAAY,GACb,MAAM,UAAU,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mmt/container - MMTP/LOC Container Parsing
|
|
3
|
+
*
|
|
4
|
+
* Shared container parsing library for MMT over MoQ and SSM.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
// MMTP Parser
|
|
9
|
+
export { MMTP_HEADER_SIZE, MPU_HEADER_SIZE, MFU_DU_HEADER_SIZE, parseMMTPHeader, unwrapMMTP, parseMPUHeader, extractNALUnit, extractTimestamp, isFecRepairPacket, hasFecPayloadId, } from './mmtp.js';
|
|
10
|
+
// MFU Reassembler
|
|
11
|
+
export { MFUReassembler, createFragment, processMMTPWithReassembly, } from './mfu-reassembler.js';
|
|
12
|
+
// LOC FEC Extensions
|
|
13
|
+
export { LOCHeaderExtensionId, FEC_PAYLOAD_ID_MAX, fecPack, fecUnpack, FecPayloadId, } from './loc.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc;AACd,OAAO,EAIL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,WAAW,CAAA;AAElB,kBAAkB;AAClB,OAAO,EAKL,cAAc,EACd,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAA;AAE7B,qBAAqB;AACrB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,YAAY,GACb,MAAM,UAAU,CAAA"}
|
package/dist/loc.d.ts
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mmt/container - LOC FEC Extensions
|
|
3
|
+
*
|
|
4
|
+
* FEC Payload ID helpers for LOC (Low Overhead Container) format
|
|
5
|
+
* Per draft-ramadan-moq-mmt Section 7.3
|
|
6
|
+
*
|
|
7
|
+
* The FEC Payload ID encodes Source Block Number (SBN) and
|
|
8
|
+
* Encoding Symbol ID (ESI) as a 48-bit value: (SBN << 24) | ESI
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* LOC Header Extension IDs
|
|
14
|
+
*/
|
|
15
|
+
export declare enum LOCHeaderExtensionId {
|
|
16
|
+
CaptureTimestamp = 2,
|
|
17
|
+
VideoFrameMarking = 4,
|
|
18
|
+
AudioLevel = 6,
|
|
19
|
+
VideoConfig = 13,
|
|
20
|
+
/** FEC Payload ID extension (draft-ramadan-moq-mmt Section 7.3) */
|
|
21
|
+
FecPayloadId = 16
|
|
22
|
+
}
|
|
23
|
+
/** Maximum value for SBN and ESI (24 bits each) */
|
|
24
|
+
export declare const FEC_PAYLOAD_ID_MAX = 16777215;
|
|
25
|
+
/**
|
|
26
|
+
* Pack Source Block Number (SBN) and Encoding Symbol ID (ESI) into a 48-bit value.
|
|
27
|
+
*
|
|
28
|
+
* Per draft-ramadan-moq-mmt Section 7.3, the FEC Payload ID is encoded as:
|
|
29
|
+
* `(SBN << 24) | ESI` where both SBN and ESI are 24 bits.
|
|
30
|
+
*
|
|
31
|
+
* @param sbn - Source Block Number (24 bits, 0-16777215)
|
|
32
|
+
* @param esi - Encoding Symbol ID (24 bits, 0-16777215)
|
|
33
|
+
* @returns Packed 48-bit value as bigint
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import { fecPack } from '@mmt/container/loc'
|
|
38
|
+
* const packed = fecPack(100, 5) // 419430405n
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function fecPack(sbn: number, esi: number): bigint;
|
|
42
|
+
/**
|
|
43
|
+
* Unpack a 48-bit FEC Payload ID into Source Block Number and Encoding Symbol ID.
|
|
44
|
+
*
|
|
45
|
+
* Per draft-ramadan-moq-mmt Section 7.3, extracts:
|
|
46
|
+
* - SBN from upper 24 bits
|
|
47
|
+
* - ESI from lower 24 bits
|
|
48
|
+
*
|
|
49
|
+
* @param packed - Packed 48-bit FEC Payload ID value
|
|
50
|
+
* @returns Tuple of [sbn, esi] both as numbers
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { fecPack, fecUnpack } from '@mmt/container/loc'
|
|
55
|
+
* const packed = fecPack(100, 5)
|
|
56
|
+
* const [sbn, esi] = fecUnpack(packed) // [100, 5]
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function fecUnpack(packed: bigint): [sbn: number, esi: number];
|
|
60
|
+
/**
|
|
61
|
+
* FEC Payload ID for LOC extension headers
|
|
62
|
+
*
|
|
63
|
+
* Encodes Source Block Number (SBN) and Encoding Symbol ID (ESI)
|
|
64
|
+
* for FEC recovery with LOC container format.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { FecPayloadId } from '@mmt/container/loc'
|
|
69
|
+
*
|
|
70
|
+
* // Create from SBN/ESI
|
|
71
|
+
* const fecId = new FecPayloadId(100, 5)
|
|
72
|
+
*
|
|
73
|
+
* // Get packed value for extension header
|
|
74
|
+
* const packed = fecId.packed // 419430405n
|
|
75
|
+
*
|
|
76
|
+
* // Create from packed value
|
|
77
|
+
* const fecId2 = FecPayloadId.fromPacked(packed)
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare class FecPayloadId {
|
|
81
|
+
/** Source Block Number (24 bits, 0-16777215) */
|
|
82
|
+
readonly sbn: number;
|
|
83
|
+
/** Encoding Symbol ID (24 bits, 0-16777215) */
|
|
84
|
+
readonly esi: number;
|
|
85
|
+
static readonly TYPE = LOCHeaderExtensionId.FecPayloadId;
|
|
86
|
+
constructor(
|
|
87
|
+
/** Source Block Number (24 bits, 0-16777215) */
|
|
88
|
+
sbn: number,
|
|
89
|
+
/** Encoding Symbol ID (24 bits, 0-16777215) */
|
|
90
|
+
esi: number);
|
|
91
|
+
/** Get packed 48-bit value */
|
|
92
|
+
get packed(): bigint;
|
|
93
|
+
/** Create from packed 48-bit value */
|
|
94
|
+
static fromPacked(packed: bigint): FecPayloadId;
|
|
95
|
+
/** Check if value is within valid 24-bit range */
|
|
96
|
+
static isValidSbn(sbn: number): boolean;
|
|
97
|
+
/** Check if value is within valid 24-bit range */
|
|
98
|
+
static isValidEsi(esi: number): boolean;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=loc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loc.d.ts","sourceRoot":"","sources":["../src/loc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,oBAAY,oBAAoB;IAC9B,gBAAgB,IAAI;IACpB,iBAAiB,IAAI;IACrB,UAAU,IAAI;IACd,WAAW,KAAK;IAChB,mEAAmE;IACnE,YAAY,KAAO;CACpB;AAED,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAE1C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAIpE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IAIrB,gDAAgD;aAChC,GAAG,EAAE,MAAM;IAC3B,+CAA+C;aAC/B,GAAG,EAAE,MAAM;IAN7B,MAAM,CAAC,QAAQ,CAAC,IAAI,qCAAoC;;IAGtD,gDAAgD;IAChC,GAAG,EAAE,MAAM;IAC3B,+CAA+C;IAC/B,GAAG,EAAE,MAAM;IAU7B,8BAA8B;IAC9B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,sCAAsC;IACtC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAK/C,kDAAkD;IAClD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kDAAkD;IAClD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAGxC"}
|
package/dist/loc.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mmt/container - LOC FEC Extensions
|
|
3
|
+
*
|
|
4
|
+
* FEC Payload ID helpers for LOC (Low Overhead Container) format
|
|
5
|
+
* Per draft-ramadan-moq-mmt Section 7.3
|
|
6
|
+
*
|
|
7
|
+
* The FEC Payload ID encodes Source Block Number (SBN) and
|
|
8
|
+
* Encoding Symbol ID (ESI) as a 48-bit value: (SBN << 24) | ESI
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* LOC Header Extension IDs
|
|
14
|
+
*/
|
|
15
|
+
export var LOCHeaderExtensionId;
|
|
16
|
+
(function (LOCHeaderExtensionId) {
|
|
17
|
+
LOCHeaderExtensionId[LOCHeaderExtensionId["CaptureTimestamp"] = 2] = "CaptureTimestamp";
|
|
18
|
+
LOCHeaderExtensionId[LOCHeaderExtensionId["VideoFrameMarking"] = 4] = "VideoFrameMarking";
|
|
19
|
+
LOCHeaderExtensionId[LOCHeaderExtensionId["AudioLevel"] = 6] = "AudioLevel";
|
|
20
|
+
LOCHeaderExtensionId[LOCHeaderExtensionId["VideoConfig"] = 13] = "VideoConfig";
|
|
21
|
+
/** FEC Payload ID extension (draft-ramadan-moq-mmt Section 7.3) */
|
|
22
|
+
LOCHeaderExtensionId[LOCHeaderExtensionId["FecPayloadId"] = 16] = "FecPayloadId";
|
|
23
|
+
})(LOCHeaderExtensionId || (LOCHeaderExtensionId = {}));
|
|
24
|
+
/** Maximum value for SBN and ESI (24 bits each) */
|
|
25
|
+
export const FEC_PAYLOAD_ID_MAX = 0xffffff;
|
|
26
|
+
/**
|
|
27
|
+
* Pack Source Block Number (SBN) and Encoding Symbol ID (ESI) into a 48-bit value.
|
|
28
|
+
*
|
|
29
|
+
* Per draft-ramadan-moq-mmt Section 7.3, the FEC Payload ID is encoded as:
|
|
30
|
+
* `(SBN << 24) | ESI` where both SBN and ESI are 24 bits.
|
|
31
|
+
*
|
|
32
|
+
* @param sbn - Source Block Number (24 bits, 0-16777215)
|
|
33
|
+
* @param esi - Encoding Symbol ID (24 bits, 0-16777215)
|
|
34
|
+
* @returns Packed 48-bit value as bigint
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { fecPack } from '@mmt/container/loc'
|
|
39
|
+
* const packed = fecPack(100, 5) // 419430405n
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function fecPack(sbn, esi) {
|
|
43
|
+
return (BigInt(sbn & 0xffffff) << 24n) | BigInt(esi & 0xffffff);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Unpack a 48-bit FEC Payload ID into Source Block Number and Encoding Symbol ID.
|
|
47
|
+
*
|
|
48
|
+
* Per draft-ramadan-moq-mmt Section 7.3, extracts:
|
|
49
|
+
* - SBN from upper 24 bits
|
|
50
|
+
* - ESI from lower 24 bits
|
|
51
|
+
*
|
|
52
|
+
* @param packed - Packed 48-bit FEC Payload ID value
|
|
53
|
+
* @returns Tuple of [sbn, esi] both as numbers
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* import { fecPack, fecUnpack } from '@mmt/container/loc'
|
|
58
|
+
* const packed = fecPack(100, 5)
|
|
59
|
+
* const [sbn, esi] = fecUnpack(packed) // [100, 5]
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export function fecUnpack(packed) {
|
|
63
|
+
const sbn = Number((packed >> 24n) & 0xffffffn);
|
|
64
|
+
const esi = Number(packed & 0xffffffn);
|
|
65
|
+
return [sbn, esi];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* FEC Payload ID for LOC extension headers
|
|
69
|
+
*
|
|
70
|
+
* Encodes Source Block Number (SBN) and Encoding Symbol ID (ESI)
|
|
71
|
+
* for FEC recovery with LOC container format.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* import { FecPayloadId } from '@mmt/container/loc'
|
|
76
|
+
*
|
|
77
|
+
* // Create from SBN/ESI
|
|
78
|
+
* const fecId = new FecPayloadId(100, 5)
|
|
79
|
+
*
|
|
80
|
+
* // Get packed value for extension header
|
|
81
|
+
* const packed = fecId.packed // 419430405n
|
|
82
|
+
*
|
|
83
|
+
* // Create from packed value
|
|
84
|
+
* const fecId2 = FecPayloadId.fromPacked(packed)
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export class FecPayloadId {
|
|
88
|
+
constructor(
|
|
89
|
+
/** Source Block Number (24 bits, 0-16777215) */
|
|
90
|
+
sbn,
|
|
91
|
+
/** Encoding Symbol ID (24 bits, 0-16777215) */
|
|
92
|
+
esi) {
|
|
93
|
+
this.sbn = sbn;
|
|
94
|
+
this.esi = esi;
|
|
95
|
+
if (sbn < 0 || sbn > 0xffffff) {
|
|
96
|
+
throw new Error('SBN must be 0-16777215 (24 bits)');
|
|
97
|
+
}
|
|
98
|
+
if (esi < 0 || esi > 0xffffff) {
|
|
99
|
+
throw new Error('ESI must be 0-16777215 (24 bits)');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Get packed 48-bit value */
|
|
103
|
+
get packed() {
|
|
104
|
+
return fecPack(this.sbn, this.esi);
|
|
105
|
+
}
|
|
106
|
+
/** Create from packed 48-bit value */
|
|
107
|
+
static fromPacked(packed) {
|
|
108
|
+
const [sbn, esi] = fecUnpack(packed);
|
|
109
|
+
return new FecPayloadId(sbn, esi);
|
|
110
|
+
}
|
|
111
|
+
/** Check if value is within valid 24-bit range */
|
|
112
|
+
static isValidSbn(sbn) {
|
|
113
|
+
return sbn >= 0 && sbn <= 0xffffff;
|
|
114
|
+
}
|
|
115
|
+
/** Check if value is within valid 24-bit range */
|
|
116
|
+
static isValidEsi(esi) {
|
|
117
|
+
return esi >= 0 && esi <= 0xffffff;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
FecPayloadId.TYPE = LOCHeaderExtensionId.FecPayloadId;
|
|
121
|
+
// =============================================================================
|
|
122
|
+
// Inline Tests (vitest)
|
|
123
|
+
// =============================================================================
|
|
124
|
+
if (import.meta.vitest) {
|
|
125
|
+
const { describe, test, expect } = import.meta.vitest;
|
|
126
|
+
describe('FEC Helpers', () => {
|
|
127
|
+
test('fecPack/fecUnpack roundtrip', () => {
|
|
128
|
+
const sbn = 12345;
|
|
129
|
+
const esi = 67890;
|
|
130
|
+
const packed = fecPack(sbn, esi);
|
|
131
|
+
const [unpackedSbn, unpackedEsi] = fecUnpack(packed);
|
|
132
|
+
expect(unpackedSbn).toBe(sbn);
|
|
133
|
+
expect(unpackedEsi).toBe(esi);
|
|
134
|
+
});
|
|
135
|
+
test('fecPack/fecUnpack max values', () => {
|
|
136
|
+
const sbn = FEC_PAYLOAD_ID_MAX;
|
|
137
|
+
const esi = FEC_PAYLOAD_ID_MAX;
|
|
138
|
+
const packed = fecPack(sbn, esi);
|
|
139
|
+
const [unpackedSbn, unpackedEsi] = fecUnpack(packed);
|
|
140
|
+
expect(unpackedSbn).toBe(sbn);
|
|
141
|
+
expect(unpackedEsi).toBe(esi);
|
|
142
|
+
});
|
|
143
|
+
test('fecPack/fecUnpack zero', () => {
|
|
144
|
+
const packed = fecPack(0, 0);
|
|
145
|
+
expect(packed).toBe(0n);
|
|
146
|
+
const [sbn, esi] = fecUnpack(0n);
|
|
147
|
+
expect(sbn).toBe(0);
|
|
148
|
+
expect(esi).toBe(0);
|
|
149
|
+
});
|
|
150
|
+
test('fecPack truncates overflow', () => {
|
|
151
|
+
const sbn = 0x1ffffff; // 25 bits
|
|
152
|
+
const esi = 0x1ffffff; // 25 bits
|
|
153
|
+
const packed = fecPack(sbn, esi);
|
|
154
|
+
const [unpackedSbn, unpackedEsi] = fecUnpack(packed);
|
|
155
|
+
expect(unpackedSbn).toBe(FEC_PAYLOAD_ID_MAX);
|
|
156
|
+
expect(unpackedEsi).toBe(FEC_PAYLOAD_ID_MAX);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('FecPayloadId', () => {
|
|
160
|
+
test('should create and roundtrip', () => {
|
|
161
|
+
const sbn = 12345;
|
|
162
|
+
const esi = 67890;
|
|
163
|
+
const fecId = new FecPayloadId(sbn, esi);
|
|
164
|
+
expect(fecId.sbn).toBe(sbn);
|
|
165
|
+
expect(fecId.esi).toBe(esi);
|
|
166
|
+
const fecId2 = FecPayloadId.fromPacked(fecId.packed);
|
|
167
|
+
expect(fecId2.sbn).toBe(sbn);
|
|
168
|
+
expect(fecId2.esi).toBe(esi);
|
|
169
|
+
});
|
|
170
|
+
test('should handle max 24-bit values', () => {
|
|
171
|
+
const sbn = 0xffffff;
|
|
172
|
+
const esi = 0xffffff;
|
|
173
|
+
const fecId = new FecPayloadId(sbn, esi);
|
|
174
|
+
const fecId2 = FecPayloadId.fromPacked(fecId.packed);
|
|
175
|
+
expect(fecId2.sbn).toBe(sbn);
|
|
176
|
+
expect(fecId2.esi).toBe(esi);
|
|
177
|
+
});
|
|
178
|
+
test('should reject invalid SBN', () => {
|
|
179
|
+
expect(() => new FecPayloadId(-1, 0)).toThrow();
|
|
180
|
+
expect(() => new FecPayloadId(0x1000000, 0)).toThrow();
|
|
181
|
+
});
|
|
182
|
+
test('should reject invalid ESI', () => {
|
|
183
|
+
expect(() => new FecPayloadId(0, -1)).toThrow();
|
|
184
|
+
expect(() => new FecPayloadId(0, 0x1000000)).toThrow();
|
|
185
|
+
});
|
|
186
|
+
test('isValidSbn/isValidEsi', () => {
|
|
187
|
+
expect(FecPayloadId.isValidSbn(0)).toBe(true);
|
|
188
|
+
expect(FecPayloadId.isValidSbn(0xffffff)).toBe(true);
|
|
189
|
+
expect(FecPayloadId.isValidSbn(-1)).toBe(false);
|
|
190
|
+
expect(FecPayloadId.isValidSbn(0x1000000)).toBe(false);
|
|
191
|
+
expect(FecPayloadId.isValidEsi(0)).toBe(true);
|
|
192
|
+
expect(FecPayloadId.isValidEsi(0xffffff)).toBe(true);
|
|
193
|
+
expect(FecPayloadId.isValidEsi(-1)).toBe(false);
|
|
194
|
+
expect(FecPayloadId.isValidEsi(0x1000000)).toBe(false);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=loc.js.map
|
package/dist/loc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loc.js","sourceRoot":"","sources":["../src/loc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mmt/container - MFU Fragment Reassembler
|
|
3
|
+
*
|
|
4
|
+
* Handles out-of-order delivery of fragmented MFUs (Media Fragment Units)
|
|
5
|
+
* according to ISO/IEC 23008-1:2023 Section 9.2.3.3
|
|
6
|
+
*
|
|
7
|
+
* Fragmentation Indicator (FI) values:
|
|
8
|
+
* - 0: Complete MFU (single packet, no fragmentation)
|
|
9
|
+
* - 1: First fragment
|
|
10
|
+
* - 2: Middle fragment
|
|
11
|
+
* - 3: Last fragment
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* MFU Fragment for reassembly
|
|
17
|
+
*/
|
|
18
|
+
export interface MFUFragment {
|
|
19
|
+
fragmentationIndicator: number;
|
|
20
|
+
mpuSequenceNumber: number;
|
|
21
|
+
fragmentCounter: number;
|
|
22
|
+
data: Uint8Array;
|
|
23
|
+
timestamp: bigint;
|
|
24
|
+
receivedAt: number;
|
|
25
|
+
/** Random Access Point flag from MMTP header - indicates keyframe */
|
|
26
|
+
rapFlag: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reassembled MFU result
|
|
30
|
+
*/
|
|
31
|
+
export interface ReassembledMFU {
|
|
32
|
+
mpuSequenceNumber: number;
|
|
33
|
+
data: Uint8Array;
|
|
34
|
+
timestamp: bigint;
|
|
35
|
+
fragmentCount: number;
|
|
36
|
+
/** Random Access Point flag - indicates keyframe (from first fragment) */
|
|
37
|
+
rapFlag: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Reassembler statistics
|
|
41
|
+
*/
|
|
42
|
+
export interface ReassemblerStats {
|
|
43
|
+
totalFragments: number;
|
|
44
|
+
reassembledMFUs: number;
|
|
45
|
+
timedOutMFUs: number;
|
|
46
|
+
outOfOrderFragments: number;
|
|
47
|
+
}
|
|
48
|
+
export interface MFUReassemblerOptions {
|
|
49
|
+
/** Timeout in milliseconds for incomplete MFUs (default: 1000) */
|
|
50
|
+
timeoutMs?: number;
|
|
51
|
+
/** Maximum buffered MFUs before eviction (default: 100) */
|
|
52
|
+
maxBuffered?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* MFU Reassembler for out-of-order fragment delivery
|
|
56
|
+
* Based on ISO/IEC 23008-1:2023 Section 9.2.3.3
|
|
57
|
+
*/
|
|
58
|
+
export declare class MFUReassembler {
|
|
59
|
+
#private;
|
|
60
|
+
/** Statistics for debugging */
|
|
61
|
+
readonly stats: ReassemblerStats;
|
|
62
|
+
constructor(options?: MFUReassemblerOptions);
|
|
63
|
+
/**
|
|
64
|
+
* Add a fragment and return reassembled MFU if complete
|
|
65
|
+
*/
|
|
66
|
+
addFragment(fragment: MFUFragment): ReassembledMFU | null;
|
|
67
|
+
/**
|
|
68
|
+
* Flush all buffered fragments
|
|
69
|
+
*/
|
|
70
|
+
flush(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Get number of pending MFUs
|
|
73
|
+
*/
|
|
74
|
+
get pendingCount(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Get current buffer status
|
|
77
|
+
*/
|
|
78
|
+
getStatus(): {
|
|
79
|
+
bufferedMFUs: number;
|
|
80
|
+
pendingFragments: number;
|
|
81
|
+
stats: ReassemblerStats;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create MFU fragment from MMTP packet for reassembly
|
|
86
|
+
*/
|
|
87
|
+
export declare function createFragment(mmtpPacket: Uint8Array): MFUFragment;
|
|
88
|
+
/**
|
|
89
|
+
* Process MMTP packet with fragment reassembly
|
|
90
|
+
*/
|
|
91
|
+
export declare function processMMTPWithReassembly(mmtpPacket: Uint8Array, reassembler: MFUReassembler): ReassembledMFU | null;
|
|
92
|
+
//# sourceMappingURL=mfu-reassembler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mfu-reassembler.d.ts","sourceRoot":"","sources":["../src/mfu-reassembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,qBAAa,cAAc;;IAMzB,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAK/B;gBAEW,OAAO,CAAC,EAAE,qBAAqB;IAK3C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;IAqIzD;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,SAAS,IAAI;QACX,YAAY,EAAE,MAAM,CAAA;QACpB,gBAAgB,EAAE,MAAM,CAAA;QACxB,KAAK,EAAE,gBAAgB,CAAA;KACxB;CAYF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAwBlE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,cAAc,GAC1B,cAAc,GAAG,IAAI,CAQvB"}
|