@browser-mc/media-container 0.0.1

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,31 @@
1
+ # @browser-mc/media-container
2
+
3
+ Media container helpers layered above `@browser-mc/binary`.
4
+
5
+ ## Layers
6
+
7
+ - `isobmff`: low-level box creation and iteration.
8
+ - `riff`: low-level RIFF chunk creation and iteration.
9
+ - `avif`: minimal still-image AVIF muxing and AV1 `av1C` helpers.
10
+ - `webp`: animated WebP muxing from still WebP frames.
11
+ - `isobmff-gps`: MOV/MP4 GPS metadata sanitization helpers.
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ import { muxStillAvif, muxAnimatedWebp } from '@browser-mc/media-container';
17
+ ```
18
+
19
+ ## MOV/MP4 GPS Sanitization
20
+
21
+ The ISOBMFF GPS sanitizer detects iPhone-style `moov/meta/keys` + `moov/meta/ilst` metadata, common coordinate items such as `com.apple.quicktime.location.ISO6709`, `location.ISO6709`, ItemList `GPSCoordinates`, and `©xyz`, plus likely GPS timed metadata tracks.
22
+
23
+ GPS-bearing payloads are replaced or zeroed while preserving the original box structure, byte length, and media data offsets. Horizontal accuracy metadata is left unchanged. `free` boxes are also scanned for stale embedded metadata copies and zeroed when GPS metadata is found there.
24
+
25
+ ## Commands
26
+
27
+ ```sh
28
+ pnpm --filter @browser-mc/media-container build
29
+ pnpm --filter @browser-mc/media-container typecheck
30
+ pnpm --filter @browser-mc/media-container test
31
+ ```
package/dist/avif.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ export type EncodedStillAv1 = {
2
+ chunk: Uint8Array;
3
+ decoderConfig: VideoDecoderConfig;
4
+ av1Config: Uint8Array;
5
+ width: number;
6
+ height: number;
7
+ };
8
+ export type AvifMetadataItem = {
9
+ type: 'Exif';
10
+ data: Uint8Array;
11
+ name?: string;
12
+ };
13
+ export type MuxStillAvifOptions = {
14
+ metadata?: AvifMetadataItem[];
15
+ };
16
+ export declare function muxStillAvif(encoded: EncodedStillAv1, options?: MuxStillAvifOptions): Uint8Array;
17
+ export declare function makeAv1Config(codec: string, sequenceHeaderObu: Uint8Array | null): Uint8Array<ArrayBuffer>;
18
+ export declare function findSequenceHeaderObu(data: Uint8Array): Uint8Array<ArrayBuffer> | null;
19
+ //# sourceMappingURL=avif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avif.d.ts","sourceRoot":"","sources":["../src/avif.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,aAAa,EAAE,kBAAkB,CAAC;IAClC,SAAS,EAAE,UAAU,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B,CAAC;AAEF,wBAAgB,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,GAAE,mBAAwB,GAAG,UAAU,CA6BpG;AAiGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,GAAG,IAAI,2BAyBhF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,kCAsBrD"}
package/dist/avif.js ADDED
@@ -0,0 +1,285 @@
1
+ import { ascii, bytesEqual, concat, cstr, u16, u32 } from '@browser-mc/binary';
2
+ import { box, fullBox } from './isobmff.js';
3
+ export function muxStillAvif(encoded, options = {}) {
4
+ const sequenceHeaderObu = findSequenceHeaderObu(encoded.chunk);
5
+ if (!sequenceHeaderObu)
6
+ throw new Error('Encoded AV1 chunk does not contain a Sequence Header OBU');
7
+ const sequence = parseSequenceHeaderObu(sequenceHeaderObu);
8
+ const expectedAv1Config = makeAv1Config(encoded.decoderConfig.codec, sequenceHeaderObu);
9
+ if (!bytesEqual(encoded.av1Config, expectedAv1Config)) {
10
+ throw new Error('encoded.av1Config does not match encoded.chunk Sequence Header OBU');
11
+ }
12
+ if (sequence.monochrome)
13
+ throw new Error('Monochrome AVIF output is not supported yet');
14
+ if (sequence.bitDepth !== 8 && sequence.bitDepth !== 10 && sequence.bitDepth !== 12)
15
+ throw new Error(`Unsupported AV1 bit depth: ${sequence.bitDepth}`);
16
+ const imageItemId = 1;
17
+ const metadata = options.metadata ?? [];
18
+ const itemData = [encoded.chunk, ...metadata.map((item) => item.data)];
19
+ const metadataItems = metadata.map((item, index) => ({
20
+ ...item,
21
+ id: imageItemId + index + 1,
22
+ offset: 0,
23
+ }));
24
+ const meta = makeMetaBox(encoded, imageItemId, 0, sequence, metadataItems);
25
+ const ftyp = makeFtypBox(encoded, sequence);
26
+ const mdatPayload = concat(itemData);
27
+ const mdat = box('mdat', mdatPayload);
28
+ let offset = ftyp.length + meta.length + 8;
29
+ const fixedMetadataItems = metadataItems.map((item, index) => {
30
+ offset += index === 0 ? encoded.chunk.length : metadata[index - 1].data.length;
31
+ return { ...item, offset };
32
+ });
33
+ const fixedMeta = makeMetaBox(encoded, imageItemId, ftyp.length + meta.length + 8, sequence, fixedMetadataItems);
34
+ return concat([ftyp, fixedMeta, mdat]);
35
+ }
36
+ function makeMetaBox(encoded, imageItemId, dataOffset, sequence, metadataItems = []) {
37
+ return fullBox('meta', 0, 0, fullBox('hdlr', 0, 0, u32(0), ascii('pict'), u32(0), u32(0), u32(0), new Uint8Array([0])), fullBox('pitm', 0, 0, u16(imageItemId)), fullBox('iloc', 0, 0, new Uint8Array([0x44, 0x00]), u16(1 + metadataItems.length), makeIlocItem(imageItemId, dataOffset, encoded.chunk.length), metadataItems.map((item) => makeIlocItem(item.id, item.offset, item.data.length))), fullBox('iinf', 0, 0, u16(1 + metadataItems.length), fullBox('infe', 2, 0, u16(imageItemId), u16(0), ascii('av01'), cstr('Color')), metadataItems.map((item) => fullBox('infe', 2, 0, u16(item.id), u16(0), ascii(item.type), cstr(item.name ?? item.type)))), metadataItems.length === 0
38
+ ? []
39
+ : fullBox('iref', 0, 0, metadataItems.map((item) => box('cdsc', u16(item.id), u16(1), u16(imageItemId)))), box('iprp', box('ipco', fullBox('ispe', 0, 0, u32(encoded.width), u32(encoded.height)), fullBox('pixi', 0, 0, new Uint8Array([sequence.monochrome ? 1 : 3, ...Array(sequence.monochrome ? 1 : 3).fill(sequence.bitDepth)])), box('av1C', encoded.av1Config), makeColrBox(sequence)), fullBox('ipma', 0, 0, u32(1), u16(imageItemId), new Uint8Array([4, 0x81, 0x02, 0x03, 0x04]))));
40
+ }
41
+ function makeIlocItem(itemId, offset, length) {
42
+ return concat([
43
+ u16(itemId),
44
+ u16(0),
45
+ u16(1),
46
+ u32(offset),
47
+ u32(length),
48
+ ]);
49
+ }
50
+ function makeFtypBox(encoded, sequence) {
51
+ const brands = [ascii('avif'), ascii('mif1'), ascii('miaf')];
52
+ if (isAvifBaselineCompatible(encoded, sequence))
53
+ brands.push(ascii('MA1B'));
54
+ return box('ftyp', ascii('avif'), u32(0), brands);
55
+ }
56
+ function isAvifBaselineCompatible(encoded, sequence) {
57
+ return sequence.seqProfile === 0
58
+ && sequence.seqLevelIdx0 <= 13
59
+ && encoded.width * encoded.height <= 8_912_896
60
+ && encoded.width <= 8192
61
+ && encoded.height <= 4352
62
+ && !sequence.monochrome
63
+ && (sequence.bitDepth === 8 || sequence.bitDepth === 10);
64
+ }
65
+ function makeColrBox(sequence) {
66
+ return box('colr', ascii('nclx'), u16(sequence.colorPrimaries), u16(sequence.transferCharacteristics), u16(sequence.matrixCoefficients), new Uint8Array([sequence.colorRange ? 0x80 : 0x00]));
67
+ }
68
+ export function makeAv1Config(codec, sequenceHeaderObu) {
69
+ const parsed = /^av01\.(\d+)\.(\d{2})([A-Z])\.(\d{2})/.exec(codec);
70
+ const sequence = sequenceHeaderObu ? parseSequenceHeaderObu(sequenceHeaderObu) : null;
71
+ const seqProfile = sequence?.seqProfile ?? (parsed ? Number(parsed[1]) : 0);
72
+ const seqLevelIdx0 = sequence?.seqLevelIdx0 ?? (parsed ? Number(parsed[2]) : 8);
73
+ const seqTier0 = sequence?.seqTier0 ?? (parsed?.[3] === 'H' ? 1 : 0);
74
+ const highBitdepth = sequence?.highBitdepth ?? (parsed ? Number(parsed[4]) > 8 : false);
75
+ const twelveBit = sequence?.twelveBit ?? (parsed ? Number(parsed[4]) === 12 : false);
76
+ const monochrome = sequence?.monochrome ?? false;
77
+ const chromaSubsamplingX = sequence?.chromaSubsamplingX ?? (seqProfile === 1 ? 0 : 1);
78
+ const chromaSubsamplingY = sequence?.chromaSubsamplingY ?? (seqProfile === 1 ? 0 : 1);
79
+ const chromaSamplePosition = sequence?.chromaSamplePosition ?? 0;
80
+ return new Uint8Array([
81
+ 0x81,
82
+ ((seqProfile & 0x07) << 5) | (seqLevelIdx0 & 0x1f),
83
+ ((seqTier0 & 1) << 7)
84
+ | (Number(highBitdepth) << 6)
85
+ | (Number(twelveBit) << 5)
86
+ | (Number(monochrome) << 4)
87
+ | (Number(chromaSubsamplingX) << 3)
88
+ | (Number(chromaSubsamplingY) << 2)
89
+ | (chromaSamplePosition & 0x03),
90
+ 0,
91
+ ...(sequenceHeaderObu ? [...sequenceHeaderObu] : []),
92
+ ]);
93
+ }
94
+ export function findSequenceHeaderObu(data) {
95
+ let offset = 0;
96
+ while (offset < data.length) {
97
+ const obuStart = offset;
98
+ const header = data[offset++];
99
+ const obuType = (header >> 3) & 0x0f;
100
+ const extensionFlag = (header >> 2) & 1;
101
+ const hasSizeField = (header >> 1) & 1;
102
+ if (extensionFlag)
103
+ offset++;
104
+ if (!hasSizeField) {
105
+ if (obuType === 1)
106
+ return data.slice(obuStart);
107
+ return null;
108
+ }
109
+ const size = readLeb128(data, offset);
110
+ offset = size.nextOffset;
111
+ const payloadStart = offset;
112
+ const payloadEnd = payloadStart + size.value;
113
+ if (payloadEnd > data.length)
114
+ return null;
115
+ if (obuType === 1)
116
+ return data.slice(obuStart, payloadEnd);
117
+ offset = payloadEnd;
118
+ }
119
+ return null;
120
+ }
121
+ function parseSequenceHeaderObu(obu) {
122
+ let offset = 1;
123
+ if ((obu[0] >> 2) & 1)
124
+ offset++;
125
+ if ((obu[0] >> 1) & 1)
126
+ offset = readLeb128(obu, offset).nextOffset;
127
+ const bits = new BitReader(obu.subarray(offset));
128
+ const seqProfile = bits.read(3);
129
+ bits.read(1);
130
+ const reducedStillPictureHeader = bits.read(1) === 1;
131
+ let seqLevelIdx0 = 0;
132
+ let seqTier0 = 0;
133
+ let decoderModelInfoPresentFlag = false;
134
+ let initialDisplayDelayPresentFlag = false;
135
+ if (reducedStillPictureHeader) {
136
+ seqLevelIdx0 = bits.read(5);
137
+ }
138
+ else {
139
+ const timingInfoPresentFlag = bits.read(1) === 1;
140
+ if (timingInfoPresentFlag) {
141
+ bits.skip(32 + 32);
142
+ if (bits.read(1))
143
+ bits.skipUvlc();
144
+ decoderModelInfoPresentFlag = bits.read(1) === 1;
145
+ if (decoderModelInfoPresentFlag)
146
+ bits.skip(5 + 32 + 5 + 5);
147
+ }
148
+ initialDisplayDelayPresentFlag = bits.read(1) === 1;
149
+ const operatingPointsCntMinus1 = bits.read(5);
150
+ for (let i = 0; i <= operatingPointsCntMinus1; i++) {
151
+ bits.skip(12);
152
+ const level = bits.read(5);
153
+ const tier = level > 7 ? bits.read(1) : 0;
154
+ if (i === 0) {
155
+ seqLevelIdx0 = level;
156
+ seqTier0 = tier;
157
+ }
158
+ if (decoderModelInfoPresentFlag && bits.read(1))
159
+ bits.skip(5 + 32 + 5);
160
+ if (initialDisplayDelayPresentFlag && bits.read(1))
161
+ bits.skip(4);
162
+ }
163
+ }
164
+ const frameWidthBitsMinus1 = bits.read(4);
165
+ const frameHeightBitsMinus1 = bits.read(4);
166
+ bits.skip(frameWidthBitsMinus1 + 1);
167
+ bits.skip(frameHeightBitsMinus1 + 1);
168
+ if (!reducedStillPictureHeader && bits.read(1))
169
+ bits.skip(4 + 3);
170
+ bits.skip(1 + 1 + 1);
171
+ if (!reducedStillPictureHeader) {
172
+ bits.skip(1 + 1 + 1 + 1);
173
+ const enableOrderHint = bits.read(1);
174
+ if (enableOrderHint)
175
+ bits.skip(1 + 1);
176
+ const chooseScreenContent = bits.read(1);
177
+ const forceScreenContent = chooseScreenContent ? 2 : bits.read(1);
178
+ if (forceScreenContent > 0) {
179
+ if (!bits.read(1))
180
+ bits.skip(1);
181
+ }
182
+ if (enableOrderHint)
183
+ bits.skip(3);
184
+ }
185
+ bits.skip(1 + 1 + 1);
186
+ const highBitdepth = bits.read(1) === 1;
187
+ const twelveBit = seqProfile === 2 && highBitdepth ? bits.read(1) === 1 : false;
188
+ const bitDepth = seqProfile === 2 && highBitdepth ? (twelveBit ? 12 : 10) : (highBitdepth ? 10 : 8);
189
+ const monochrome = seqProfile === 1 ? false : bits.read(1) === 1;
190
+ const colorDescriptionPresent = bits.read(1) === 1;
191
+ let colorPrimaries = 2;
192
+ let transferCharacteristics = 2;
193
+ let matrixCoefficients = 2;
194
+ if (colorDescriptionPresent) {
195
+ colorPrimaries = bits.read(8);
196
+ transferCharacteristics = bits.read(8);
197
+ matrixCoefficients = bits.read(8);
198
+ }
199
+ const colorRange = bits.read(1) === 1;
200
+ let chromaSubsamplingX = 0;
201
+ let chromaSubsamplingY = 0;
202
+ let chromaSamplePosition = 0;
203
+ if (monochrome) {
204
+ chromaSubsamplingX = 1;
205
+ chromaSubsamplingY = 1;
206
+ }
207
+ else if (colorPrimaries === 1 && transferCharacteristics === 13 && matrixCoefficients === 0) {
208
+ chromaSubsamplingX = 0;
209
+ chromaSubsamplingY = 0;
210
+ }
211
+ else {
212
+ if (seqProfile === 0) {
213
+ chromaSubsamplingX = 1;
214
+ chromaSubsamplingY = 1;
215
+ }
216
+ else if (seqProfile === 1) {
217
+ chromaSubsamplingX = 0;
218
+ chromaSubsamplingY = 0;
219
+ }
220
+ else if (twelveBit) {
221
+ chromaSubsamplingX = bits.read(1);
222
+ chromaSubsamplingY = chromaSubsamplingX ? bits.read(1) : 0;
223
+ }
224
+ else {
225
+ chromaSubsamplingX = 1;
226
+ chromaSubsamplingY = 0;
227
+ }
228
+ if (chromaSubsamplingX && chromaSubsamplingY)
229
+ chromaSamplePosition = bits.read(2);
230
+ }
231
+ return {
232
+ seqProfile,
233
+ seqLevelIdx0,
234
+ seqTier0,
235
+ highBitdepth,
236
+ twelveBit,
237
+ bitDepth,
238
+ monochrome,
239
+ colorDescriptionPresent,
240
+ colorPrimaries,
241
+ transferCharacteristics,
242
+ matrixCoefficients,
243
+ colorRange,
244
+ chromaSubsamplingX,
245
+ chromaSubsamplingY,
246
+ chromaSamplePosition,
247
+ };
248
+ }
249
+ function readLeb128(data, offset) {
250
+ let value = 0;
251
+ for (let i = 0; i < 8; i++) {
252
+ const byte = data[offset + i];
253
+ value |= (byte & 0x7f) << (i * 7);
254
+ if ((byte & 0x80) === 0)
255
+ return { value, nextOffset: offset + i + 1 };
256
+ }
257
+ throw new Error('Invalid LEB128 value');
258
+ }
259
+ class BitReader {
260
+ #data;
261
+ #bitOffset = 0;
262
+ constructor(data) {
263
+ this.#data = data;
264
+ }
265
+ read(count) {
266
+ let value = 0;
267
+ for (let i = 0; i < count; i++) {
268
+ const byte = this.#data[this.#bitOffset >> 3] ?? 0;
269
+ value = (value << 1) | ((byte >> (7 - (this.#bitOffset & 7))) & 1);
270
+ this.#bitOffset++;
271
+ }
272
+ return value;
273
+ }
274
+ skip(count) {
275
+ this.#bitOffset += count;
276
+ }
277
+ skipUvlc() {
278
+ let leadingZeroes = 0;
279
+ while (this.read(1) === 0)
280
+ leadingZeroes++;
281
+ if (leadingZeroes > 0)
282
+ this.skip(leadingZeroes);
283
+ }
284
+ }
285
+ //# sourceMappingURL=avif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avif.js","sourceRoot":"","sources":["../src/avif.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './isobmff.js';
2
+ export * from './riff.js';
3
+ export * from './avif.js';
4
+ export * from './webp.js';
5
+ export * from './isobmff-gps.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './isobmff.js';
2
+ export * from './riff.js';
3
+ export * from './avif.js';
4
+ export * from './webp.js';
5
+ export * from './isobmff-gps.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type SanitizeIsobmffGpsResult = {
2
+ data: Uint8Array;
3
+ removed: number;
4
+ };
5
+ export declare function hasIsobmffGpsMetadata(data: Uint8Array): boolean;
6
+ export declare function sanitizeIsobmffGpsMetadata(data: Uint8Array): SanitizeIsobmffGpsResult;
7
+ /** @deprecated Use SanitizeIsobmffGpsResult. */
8
+ export type RemoveQuickTimeGpsMetadataResult = SanitizeIsobmffGpsResult;
9
+ /** @deprecated Use hasIsobmffGpsMetadata. */
10
+ export declare const hasQuickTimeGpsMetadata: typeof hasIsobmffGpsMetadata;
11
+ /** @deprecated Use sanitizeIsobmffGpsMetadata. */
12
+ export declare const removeQuickTimeGpsMetadata: typeof sanitizeIsobmffGpsMetadata;
13
+ //# sourceMappingURL=isobmff-gps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isobmff-gps.d.ts","sourceRoot":"","sources":["../src/isobmff-gps.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAOF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,UAAU,WAGrD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,UAAU,GAAG,wBAAwB,CAgBrF;AAED,gDAAgD;AAChD,MAAM,MAAM,gCAAgC,GAAG,wBAAwB,CAAC;AAExE,6CAA6C;AAC7C,eAAO,MAAM,uBAAuB,8BAAwB,CAAC;AAE7D,kDAAkD;AAClD,eAAO,MAAM,0BAA0B,mCAA6B,CAAC"}
@@ -0,0 +1,341 @@
1
+ import { readAscii, readU32, readU64 } from '@browser-mc/binary';
2
+ import { boxes, readBox } from './isobmff.js';
3
+ const QUICKTIME_LOCATION_KEYS = new Set([
4
+ 'com.apple.quicktime.location.ISO6709',
5
+ 'location.ISO6709',
6
+ 'GPSCoordinates',
7
+ ]);
8
+ const GPS_TEXT_MARKERS = [
9
+ 'GPSCoordinates',
10
+ 'location.ISO6709',
11
+ 'com.apple.quicktime.location.ISO6709',
12
+ 'GPS5',
13
+ 'GPSU',
14
+ 'GPMF',
15
+ 'gpmd',
16
+ ];
17
+ export function hasIsobmffGpsMetadata(data) {
18
+ const gpsMetadata = collectIsobmffGpsMetadata(data);
19
+ return gpsMetadata.coordinatePayloads.length > 0 || gpsMetadata.zeroPayloads.length > 0 || gpsMetadata.freeBoxes.length > 0;
20
+ }
21
+ export function sanitizeIsobmffGpsMetadata(data) {
22
+ const gpsMetadata = collectIsobmffGpsMetadata(data);
23
+ if (gpsMetadata.coordinatePayloads.length === 0 && gpsMetadata.zeroPayloads.length === 0 && gpsMetadata.freeBoxes.length === 0)
24
+ return { data, removed: 0 };
25
+ const output = new Uint8Array(data);
26
+ for (const payload of gpsMetadata.coordinatePayloads) {
27
+ output.set(makeReplacement(payload), payload.start);
28
+ }
29
+ for (const payload of gpsMetadata.zeroPayloads) {
30
+ output.fill(0, payload.start, payload.end);
31
+ }
32
+ for (const freeBox of gpsMetadata.freeBoxes) {
33
+ output.fill(0, freeBox.start + freeBox.headerSize, freeBox.end);
34
+ }
35
+ return { data: output, removed: gpsMetadata.coordinatePayloads.length + gpsMetadata.zeroPayloads.length + gpsMetadata.freeBoxes.length };
36
+ }
37
+ /** @deprecated Use hasIsobmffGpsMetadata. */
38
+ export const hasQuickTimeGpsMetadata = hasIsobmffGpsMetadata;
39
+ /** @deprecated Use sanitizeIsobmffGpsMetadata. */
40
+ export const removeQuickTimeGpsMetadata = sanitizeIsobmffGpsMetadata;
41
+ function collectIsobmffGpsMetadata(data) {
42
+ const result = {
43
+ coordinatePayloads: [],
44
+ zeroPayloads: [],
45
+ freeBoxes: [],
46
+ };
47
+ visitBoxes(data, 0, data.length, (box) => {
48
+ if (box.type === 'meta') {
49
+ collectMetaGpsPayloads(data, box, result.coordinatePayloads);
50
+ }
51
+ else if (box.type === 'trak') {
52
+ collectTimedMetadataGpsPayloads(data, box, result.zeroPayloads);
53
+ }
54
+ else if (box.type === '\xa9xyz') {
55
+ collectUserDataGpsPayload(data, box, result.coordinatePayloads);
56
+ }
57
+ else if (box.type === 'free') {
58
+ if (hasStaleMetaGpsItems(data, box))
59
+ result.freeBoxes.push(box);
60
+ }
61
+ });
62
+ return result;
63
+ }
64
+ function collectMetaGpsPayloads(data, meta, result) {
65
+ const childrenStart = metaChildrenStart(data, meta);
66
+ if (childrenStart === null)
67
+ return;
68
+ const children = [...boxes(data, childrenStart, meta.end)];
69
+ const keys = children.find((child) => child.type === 'keys');
70
+ const ilst = children.find((child) => child.type === 'ilst');
71
+ if (!keys || !ilst)
72
+ return;
73
+ const keyNames = readQuickTimeKeys(data, keys);
74
+ if (keyNames.length === 0)
75
+ return;
76
+ for (const item of boxes(data, ilst.start + ilst.headerSize, ilst.end)) {
77
+ if (item.type === 'free')
78
+ continue;
79
+ if (item.type === '\xa9xyz') {
80
+ collectItemDataPayloads(data, item, result);
81
+ continue;
82
+ }
83
+ const index = readU32(data, item.start + 4);
84
+ const key = keyNames[index];
85
+ if (key && QUICKTIME_LOCATION_KEYS.has(key)) {
86
+ collectItemDataPayloads(data, item, result);
87
+ }
88
+ }
89
+ }
90
+ function collectTimedMetadataGpsPayloads(data, trak, result) {
91
+ if (!isLikelyGpsTimedMetadataTrack(data, trak))
92
+ return;
93
+ const stbl = findDescendantBox(data, trak, ['mdia', 'minf', 'stbl']);
94
+ if (!stbl)
95
+ return;
96
+ const sampleSizes = readSampleSizes(data, findChildBox(data, stbl, 'stsz'));
97
+ const chunks = readChunkOffsets(data, findChildBox(data, stbl, 'stco'), findChildBox(data, stbl, 'co64'));
98
+ const sampleToChunks = readSampleToChunks(data, findChildBox(data, stbl, 'stsc'));
99
+ if (sampleSizes.length === 0 || chunks.length === 0 || sampleToChunks.length === 0)
100
+ return;
101
+ const sampleOffsets = expandSampleOffsets(chunks, sampleSizes, sampleToChunks);
102
+ for (let index = 0; index < sampleOffsets.length; index++) {
103
+ const start = sampleOffsets[index];
104
+ const end = start + sampleSizes[index];
105
+ if (start >= 0 && end <= data.length && containsGpsTextMarker(data, start, end))
106
+ result.push({ start, end });
107
+ }
108
+ }
109
+ function hasStaleMetaGpsItems(data, free) {
110
+ if (containsGpsTextMarker(data, free.start + free.headerSize, free.end))
111
+ return true;
112
+ for (let offset = free.start + free.headerSize; offset + 8 <= free.end; offset++) {
113
+ const box = readBox(data, offset);
114
+ if (!box || box.type !== 'meta' || box.end > free.end)
115
+ continue;
116
+ const stalePayloads = [];
117
+ collectMetaGpsPayloads(data, box, stalePayloads);
118
+ if (stalePayloads.length > 0)
119
+ return true;
120
+ }
121
+ return false;
122
+ }
123
+ function isLikelyGpsTimedMetadataTrack(data, trak) {
124
+ const handler = findDescendantBox(data, trak, ['mdia', 'hdlr']);
125
+ if (!handler)
126
+ return false;
127
+ const handlerType = handler.start + handler.headerSize + 8 <= handler.end
128
+ ? readAscii(data, handler.start + handler.headerSize + 8, 4)
129
+ : '';
130
+ if (handlerType !== 'meta' && handlerType !== 'text' && handlerType !== 'sbtl')
131
+ return false;
132
+ return containsGpsTextMarker(data, trak.start, trak.end);
133
+ }
134
+ function containsGpsTextMarker(data, start, end) {
135
+ return GPS_TEXT_MARKERS.some((marker) => containsBytes(data, new TextEncoder().encode(marker), start, end));
136
+ }
137
+ function readSampleSizes(data, stsz) {
138
+ if (!stsz)
139
+ return [];
140
+ const content = stsz.start + stsz.headerSize;
141
+ if (content + 12 > stsz.end)
142
+ return [];
143
+ const sampleSize = readU32(data, content + 4);
144
+ const sampleCount = readU32(data, content + 8);
145
+ if (sampleSize !== 0)
146
+ return Array.from({ length: sampleCount }, () => sampleSize);
147
+ const sizes = [];
148
+ let offset = content + 12;
149
+ for (let index = 0; index < sampleCount; index++) {
150
+ if (offset + 4 > stsz.end)
151
+ return [];
152
+ sizes.push(readU32(data, offset));
153
+ offset += 4;
154
+ }
155
+ return sizes;
156
+ }
157
+ function readChunkOffsets(data, stco, co64) {
158
+ const box = stco ?? co64;
159
+ if (!box)
160
+ return [];
161
+ const content = box.start + box.headerSize;
162
+ if (content + 8 > box.end)
163
+ return [];
164
+ const count = readU32(data, content + 4);
165
+ const offsets = [];
166
+ let offset = content + 8;
167
+ for (let index = 0; index < count; index++) {
168
+ const size = box.type === 'co64' ? 8 : 4;
169
+ if (offset + size > box.end)
170
+ return [];
171
+ offsets.push(box.type === 'co64' ? Number(readU64(data, offset)) : readU32(data, offset));
172
+ offset += size;
173
+ }
174
+ return offsets;
175
+ }
176
+ function readSampleToChunks(data, stsc) {
177
+ if (!stsc)
178
+ return [];
179
+ const content = stsc.start + stsc.headerSize;
180
+ if (content + 8 > stsc.end)
181
+ return [];
182
+ const count = readU32(data, content + 4);
183
+ const entries = [];
184
+ let offset = content + 8;
185
+ for (let index = 0; index < count; index++) {
186
+ if (offset + 12 > stsc.end)
187
+ return [];
188
+ entries.push({
189
+ firstChunk: readU32(data, offset),
190
+ samplesPerChunk: readU32(data, offset + 4),
191
+ });
192
+ offset += 12;
193
+ }
194
+ return entries;
195
+ }
196
+ function expandSampleOffsets(chunks, sampleSizes, sampleToChunks) {
197
+ const offsets = [];
198
+ let sampleIndex = 0;
199
+ for (let chunkIndex = 0; chunkIndex < chunks.length && sampleIndex < sampleSizes.length; chunkIndex++) {
200
+ const samplesPerChunk = samplesPerChunkFor(chunkIndex + 1, sampleToChunks);
201
+ let offset = chunks[chunkIndex];
202
+ for (let index = 0; index < samplesPerChunk && sampleIndex < sampleSizes.length; index++) {
203
+ offsets[sampleIndex] = offset;
204
+ offset += sampleSizes[sampleIndex];
205
+ sampleIndex++;
206
+ }
207
+ }
208
+ return offsets;
209
+ }
210
+ function samplesPerChunkFor(chunkNumber, sampleToChunks) {
211
+ let result = sampleToChunks[0]?.samplesPerChunk ?? 0;
212
+ for (const entry of sampleToChunks) {
213
+ if (entry.firstChunk > chunkNumber)
214
+ break;
215
+ result = entry.samplesPerChunk;
216
+ }
217
+ return result;
218
+ }
219
+ function collectItemDataPayloads(data, item, result) {
220
+ for (const child of boxes(data, item.start + item.headerSize, item.end)) {
221
+ if (child.type !== 'data')
222
+ continue;
223
+ const payload = {
224
+ start: child.start + child.headerSize + 8,
225
+ end: child.end,
226
+ };
227
+ if (!isSanitizedPayload(data, payload))
228
+ result.push(payload);
229
+ }
230
+ }
231
+ function collectUserDataGpsPayload(data, box, result) {
232
+ const payload = { start: box.start + box.headerSize, end: box.end };
233
+ if (!isSanitizedPayload(data, payload))
234
+ result.push(payload);
235
+ }
236
+ function isSanitizedPayload(data, payload) {
237
+ const bytes = data.subarray(payload.start, payload.end);
238
+ if (bytes.every((byte) => byte === 0))
239
+ return true;
240
+ const sanitized = makeReplacement(payload);
241
+ return bytes.length === sanitized.length && bytes.every((byte, index) => byte === sanitized[index]);
242
+ }
243
+ function makeReplacement(payload) {
244
+ return asciiReplacement('+00.0000+000.0000+000.000/', payload.end - payload.start);
245
+ }
246
+ function asciiReplacement(text, size) {
247
+ const result = new Uint8Array(size);
248
+ const bytes = new TextEncoder().encode(text);
249
+ result.set(bytes.subarray(0, size));
250
+ if (bytes.length < size)
251
+ result.fill(0x30, bytes.length);
252
+ return result;
253
+ }
254
+ function visitBoxes(data, start, end, visitor) {
255
+ for (const box of boxes(data, start, end)) {
256
+ visitor(box);
257
+ const childStart = containerChildrenStart(data, box);
258
+ if (childStart !== null)
259
+ visitBoxes(data, childStart, box.end, visitor);
260
+ }
261
+ }
262
+ function containerChildrenStart(data, box) {
263
+ if (box.type === 'meta')
264
+ return metaChildrenStart(data, box);
265
+ if (isContainerBox(box.type))
266
+ return box.start + box.headerSize;
267
+ return null;
268
+ }
269
+ function findDescendantBox(data, box, path) {
270
+ let current = box;
271
+ for (const type of path) {
272
+ if (!current)
273
+ return null;
274
+ current = findChildBox(data, current, type);
275
+ }
276
+ return current;
277
+ }
278
+ function findChildBox(data, box, type) {
279
+ const childStart = containerChildrenStart(data, box);
280
+ if (childStart === null)
281
+ return null;
282
+ for (const child of boxes(data, childStart, box.end)) {
283
+ if (child.type === type)
284
+ return child;
285
+ }
286
+ return null;
287
+ }
288
+ function metaChildrenStart(data, box) {
289
+ const plainStart = box.start + box.headerSize;
290
+ const plainChild = readBox(data, plainStart);
291
+ if (plainChild && plainChild.end <= box.end)
292
+ return plainStart;
293
+ const fullBoxStart = plainStart + 4;
294
+ const fullBoxChild = readBox(data, fullBoxStart);
295
+ if (fullBoxChild && fullBoxChild.end <= box.end)
296
+ return fullBoxStart;
297
+ return null;
298
+ }
299
+ function readQuickTimeKeys(data, keys) {
300
+ const contentStart = keys.start + keys.headerSize;
301
+ if (contentStart + 8 > keys.end)
302
+ return [];
303
+ const count = readU32(data, contentStart + 4);
304
+ const names = [];
305
+ let offset = contentStart + 8;
306
+ for (let index = 1; index <= count; index++) {
307
+ if (offset + 8 > keys.end)
308
+ return [];
309
+ const size = readU32(data, offset);
310
+ if (size < 8 || offset + size > keys.end)
311
+ return [];
312
+ const namespace = readAscii(data, offset + 4, 4);
313
+ names[index] = namespace === 'mdta' ? readUtf8(data.subarray(offset + 8, offset + size)) : '';
314
+ offset += size;
315
+ }
316
+ return names;
317
+ }
318
+ function readUtf8(data) {
319
+ return new TextDecoder().decode(data);
320
+ }
321
+ function containsBytes(data, needle, start, end) {
322
+ if (needle.length === 0)
323
+ return true;
324
+ outer: for (let offset = start; offset <= end - needle.length; offset++) {
325
+ for (let index = 0; index < needle.length; index++) {
326
+ if (data[offset + index] !== needle[index])
327
+ continue outer;
328
+ }
329
+ return true;
330
+ }
331
+ return false;
332
+ }
333
+ function isContainerBox(type) {
334
+ return type === 'moov'
335
+ || type === 'trak'
336
+ || type === 'mdia'
337
+ || type === 'minf'
338
+ || type === 'stbl'
339
+ || type === 'udta';
340
+ }
341
+ //# sourceMappingURL=isobmff-gps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isobmff-gps.js","sourceRoot":"","sources":["../src/isobmff-gps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC;AAE/D,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,sCAAsC;IACtC,kBAAkB;IAClB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG;IACvB,gBAAgB;IAChB,kBAAkB;IAClB,sCAAsC;IACtC,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC;AAYF,MAAM,UAAU,qBAAqB,CAAC,IAAgB;IACpD,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,WAAW,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9H,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAgB;IACzD,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,WAAW,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAE5J,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,kBAAkB,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,kBAAkB,CAAC,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;AAC3I,CAAC;AAKD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D,kDAAkD;AAClD,MAAM,CAAC,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAErE,SAAS,yBAAyB,CAAC,IAAgB;IACjD,MAAM,MAAM,GAAG;QACb,kBAAkB,EAAE,EAAwB;QAC5C,YAAY,EAAE,EAAwB;QACtC,SAAS,EAAE,EAAkB;KAC9B,CAAC;IACF,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,+BAA+B,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,IAAI,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC;gBAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAgB,EAAE,IAAgB,EAAE,MAA0B;IAC5F,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO;IAEnC,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO;IAE3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAEnC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5C,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,+BAA+B,CAAC,IAAgB,EAAE,IAAgB,EAAE,MAA0B;IACrG,IAAI,CAAC,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO;IAEvD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1G,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE3F,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAC/E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAgB,EAAE,IAAgB;IAC9D,IAAI,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAErF,KAAK,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;QACjF,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;YAAE,SAAS;QAEhE,MAAM,aAAa,GAAuB,EAAE,CAAC;QAC7C,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACjD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,6BAA6B,CAAC,IAAgB,EAAE,IAAgB;IACvE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG;QACvE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAE7F,OAAO,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAgB,EAAE,KAAa,EAAE,GAAW;IACzE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB,EAAE,IAAuB;IAChE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAC7C,IAAI,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IAEnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC;IAC1B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAgB,EAAE,IAAuB,EAAE,IAAuB;IAC1F,MAAM,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1F,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB,EAAE,IAAuB;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAC7C,IAAI,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAA2D,EAAE,CAAC;IAC3E,IAAI,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3C,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YACjC,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC;SAC3C,CAAC,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAgB,EAAE,WAAqB,EAAE,cAAsE;IAC1I,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,IAAI,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;QACtG,MAAM,eAAe,GAAG,kBAAkB,CAAC,UAAU,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;QAC3E,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAEhC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,IAAI,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACzF,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;YAC9B,MAAM,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;YACnC,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,cAAsE;IACrH,IAAI,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,eAAe,IAAI,CAAC,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,UAAU,GAAG,WAAW;YAAE,MAAM;QAC1C,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAgB,EAAE,IAAgB,EAAE,MAA0B;IAC7F,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC;YACzC,GAAG,EAAE,KAAK,CAAC,GAAG;SACf,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAgB,EAAE,GAAe,EAAE,MAA0B;IAC9F,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IACpE,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB,EAAE,OAAyB;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,eAAe,CAAC,OAAyB;IAChD,OAAO,gBAAgB,CAAC,4BAA4B,EAAE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,IAAY;IAClD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,KAAa,EAAE,GAAW,EAAE,OAAkC;IAClG,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,IAAI;YAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAgB,EAAE,GAAe;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB,EAAE,GAAe,EAAE,IAAc;IAC1E,IAAI,OAAO,GAAsB,GAAG,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB,EAAE,GAAe,EAAE,IAAY;IACnE,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB,EAAE,GAAe;IAC1D,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,UAAU,IAAI,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO,UAAU,CAAC;IAE/D,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,YAAY,IAAI,YAAY,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAErE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB,EAAE,IAAgB;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAClD,IAAI,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC;IAE9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAErC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,IAAI,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAgB;IAChC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB,EAAE,MAAkB,EAAE,KAAa,EAAE,GAAW;IACrF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,KAAK,EACL,KAAK,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACjE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;gBAAE,SAAS,KAAK,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,KAAK,MAAM;WACjB,IAAI,KAAK,MAAM;WACf,IAAI,KAAK,MAAM;WACf,IAAI,KAAK,MAAM;WACf,IAAI,KAAK,MAAM;WACf,IAAI,KAAK,MAAM,CAAC;AACvB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type BoxInput = Uint8Array | BoxInput[];
2
+ export type IsobmffBox = {
3
+ type: string;
4
+ start: number;
5
+ end: number;
6
+ headerSize: number;
7
+ };
8
+ export declare function box(type: string, ...payloads: BoxInput[]): Uint8Array;
9
+ export declare function fullBox(type: string, version: number, flags: number, ...payloads: BoxInput[]): Uint8Array;
10
+ export declare function boxes(data: Uint8Array, start: number, end: number): Generator<IsobmffBox>;
11
+ export declare function readBox(data: Uint8Array, offset: number): IsobmffBox | null;
12
+ //# sourceMappingURL=isobmff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isobmff.d.ts","sourceRoot":"","sources":["../src/isobmff.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC;AAE/C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAOrE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAEzG;AAED,wBAAiB,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAQ1F;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAO3E"}
@@ -0,0 +1,46 @@
1
+ import { concat, readAscii, readU32, readU64, writeAscii, writeU32 } from '@browser-mc/binary';
2
+ export function box(type, ...payloads) {
3
+ const payload = flatten(payloads);
4
+ const result = new Uint8Array(8 + payload.length);
5
+ writeU32(result, 0, result.length);
6
+ writeAscii(result, 4, type);
7
+ result.set(payload, 8);
8
+ return result;
9
+ }
10
+ export function fullBox(type, version, flags, ...payloads) {
11
+ return box(type, new Uint8Array([version, flags >> 16, flags >> 8, flags]), ...payloads);
12
+ }
13
+ export function* boxes(data, start, end) {
14
+ let offset = start;
15
+ while (offset + 8 <= end) {
16
+ const parsed = readBox(data, offset);
17
+ if (!parsed || parsed.end > end)
18
+ break;
19
+ yield parsed;
20
+ offset = parsed.end;
21
+ }
22
+ }
23
+ export function readBox(data, offset) {
24
+ const size32 = readU32(data, offset);
25
+ const type = readAscii(data, offset + 4, 4);
26
+ const headerSize = size32 === 1 ? 16 : 8;
27
+ const size = size32 === 1 ? Number(readU64(data, offset + 8)) : size32;
28
+ if (size < headerSize)
29
+ return null;
30
+ return { type, start: offset, end: offset + size, headerSize };
31
+ }
32
+ function flatten(input) {
33
+ const chunks = [];
34
+ for (const item of input)
35
+ collectChunks(item, chunks);
36
+ return concat(chunks);
37
+ }
38
+ function collectChunks(input, chunks) {
39
+ if (input instanceof Uint8Array) {
40
+ chunks.push(input);
41
+ return;
42
+ }
43
+ for (const item of input)
44
+ collectChunks(item, chunks);
45
+ }
46
+ //# sourceMappingURL=isobmff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isobmff.js","sourceRoot":"","sources":["../src/isobmff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAW/F,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,GAAG,QAAoB;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,KAAa,EAAE,GAAG,QAAoB;IAC3F,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,KAAK,CAAC,IAAgB,EAAE,KAAa,EAAE,GAAW;IACjE,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,GAAG,GAAG;YAAE,MAAM;QACvC,MAAM,MAAM,CAAC;QACb,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAgB,EAAE,MAAc;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvE,IAAI,IAAI,GAAG,UAAU;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,OAAO,CAAC,KAAiB;IAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,aAAa,CAAC,KAAe,EAAE,MAAoB;IAC1D,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type RemoveQuickTimeGpsMetadataResult = {
2
+ data: Uint8Array;
3
+ removed: number;
4
+ };
5
+ export declare function hasQuickTimeGpsMetadata(data: Uint8Array): boolean;
6
+ export declare function removeQuickTimeGpsMetadata(data: Uint8Array): RemoveQuickTimeGpsMetadataResult;
7
+ //# sourceMappingURL=quicktime-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quicktime-metadata.d.ts","sourceRoot":"","sources":["../src/quicktime-metadata.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,gCAAgC,GAAG;IAC7C,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAOF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,WAGvD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,UAAU,GAAG,gCAAgC,CAgB7F"}
package/dist/riff.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export type RiffChunk = {
2
+ type: string;
3
+ headerStart: number;
4
+ start: number;
5
+ end: number;
6
+ paddedEnd: number;
7
+ };
8
+ export declare function riffChunks(data: Uint8Array, startOffset?: number): Generator<RiffChunk>;
9
+ export declare function makeRiffChunk(type: string, data: Uint8Array): Uint8Array<ArrayBuffer>;
10
+ //# sourceMappingURL=riff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"riff.d.ts","sourceRoot":"","sources":["../src/riff.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAiB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,SAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAYpF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,2BAM3D"}
package/dist/riff.js ADDED
@@ -0,0 +1,23 @@
1
+ import { readAscii, readU32le, writeAscii, writeU32le } from '@browser-mc/binary';
2
+ export function* riffChunks(data, startOffset = 12) {
3
+ let offset = startOffset;
4
+ while (offset + 8 <= data.length) {
5
+ const type = readAscii(data, offset, 4);
6
+ const size = readU32le(data, offset + 4);
7
+ const start = offset + 8;
8
+ const end = start + size;
9
+ const paddedEnd = end + (size % 2);
10
+ if (end > data.length || paddedEnd > data.length)
11
+ break;
12
+ yield { type, headerStart: offset, start, end, paddedEnd };
13
+ offset = paddedEnd;
14
+ }
15
+ }
16
+ export function makeRiffChunk(type, data) {
17
+ const chunk = new Uint8Array(8 + data.length + (data.length % 2));
18
+ writeAscii(chunk, 0, type);
19
+ writeU32le(chunk, 4, data.length);
20
+ chunk.set(data, 8);
21
+ return chunk;
22
+ }
23
+ //# sourceMappingURL=riff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"riff.js","sourceRoot":"","sources":["../src/riff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUlF,MAAM,SAAS,CAAC,CAAC,UAAU,CAAC,IAAgB,EAAE,WAAW,GAAG,EAAE;IAC5D,IAAI,MAAM,GAAG,WAAW,CAAC;IACzB,OAAO,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM;YAAE,MAAM;QACxD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAC3D,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAgB;IAC1D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3B,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/webp.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ export type AnimatedWebpFrame = {
2
+ data: Uint8Array;
3
+ x?: number;
4
+ y?: number;
5
+ width: number;
6
+ height: number;
7
+ duration: number;
8
+ blend?: boolean;
9
+ dispose?: boolean;
10
+ };
11
+ export type AnimatedWebpMuxOptions = {
12
+ width: number;
13
+ height: number;
14
+ frames: AnimatedWebpFrame[];
15
+ loopCount?: number;
16
+ backgroundColor?: {
17
+ red?: number;
18
+ green?: number;
19
+ blue?: number;
20
+ alpha?: number;
21
+ };
22
+ };
23
+ export declare function muxAnimatedWebp(options: AnimatedWebpMuxOptions): Uint8Array;
24
+ export declare function extractStillWebpFrameChunks(data: Uint8Array): Uint8Array[];
25
+ //# sourceMappingURL=webp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webp.d.ts","sourceRoot":"","sources":["../src/webp.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,UAAU,CAY3E;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,CAU1E"}
package/dist/webp.js ADDED
@@ -0,0 +1,75 @@
1
+ import { ascii, concat, readAscii, u16le, u24le, u32le } from '@browser-mc/binary';
2
+ import { makeRiffChunk, riffChunks } from './riff.js';
3
+ export function muxAnimatedWebp(options) {
4
+ if (options.frames.length === 0)
5
+ throw new Error('Animated WebP requires at least one frame');
6
+ assertVp8xDimension(options.width, 'canvas width');
7
+ assertVp8xDimension(options.height, 'canvas height');
8
+ const vp8x = makeVp8xChunk(options.width, options.height, hasAlpha(options.frames), true);
9
+ const anim = makeRiffChunk('ANIM', concat([
10
+ bgra(options.backgroundColor),
11
+ u16le(options.loopCount ?? 0),
12
+ ]));
13
+ const frames = options.frames.map((frame) => makeAnimatedFrameChunk(frame, options.width, options.height));
14
+ const payload = concat([ascii('WEBP'), vp8x, anim, ...frames]);
15
+ return concat([ascii('RIFF'), u32le(payload.length), payload]);
16
+ }
17
+ export function extractStillWebpFrameChunks(data) {
18
+ if (readAscii(data, 0, 4) !== 'RIFF' || readAscii(data, 8, 4) !== 'WEBP')
19
+ throw new Error('Expected RIFF WEBP data');
20
+ const chunks = [];
21
+ for (const chunk of riffChunks(data)) {
22
+ if (chunk.type === 'ALPH' || chunk.type === 'VP8 ' || chunk.type === 'VP8L') {
23
+ chunks.push(data.slice(chunk.headerStart, chunk.paddedEnd));
24
+ }
25
+ }
26
+ if (chunks.length === 0)
27
+ throw new Error('Still WebP did not contain VP8/VP8L frame data');
28
+ return chunks;
29
+ }
30
+ function makeVp8xChunk(width, height, alpha, animation) {
31
+ return makeRiffChunk('VP8X', concat([
32
+ new Uint8Array([Number(alpha) << 4 | Number(animation) << 1, 0, 0, 0]),
33
+ u24le(width - 1),
34
+ u24le(height - 1),
35
+ ]));
36
+ }
37
+ function makeAnimatedFrameChunk(frame, canvasWidth, canvasHeight) {
38
+ const x = frame.x ?? 0;
39
+ const y = frame.y ?? 0;
40
+ if (x % 2 !== 0 || y % 2 !== 0)
41
+ throw new Error('Animated WebP frame x/y offsets must be even');
42
+ assertVp8xDimension(frame.width, 'frame width');
43
+ assertVp8xDimension(frame.height, 'frame height');
44
+ if (x + frame.width > canvasWidth || y + frame.height > canvasHeight)
45
+ throw new Error('Animated WebP frame exceeds canvas bounds');
46
+ const flags = Number(frame.blend === false) << 1 | Number(frame.dispose === true);
47
+ return makeRiffChunk('ANMF', concat([
48
+ u24le(x / 2),
49
+ u24le(y / 2),
50
+ u24le(frame.width - 1),
51
+ u24le(frame.height - 1),
52
+ u24le(clamp(Math.round(frame.duration), 0, 0xffffff)),
53
+ new Uint8Array([flags]),
54
+ ...extractStillWebpFrameChunks(frame.data),
55
+ ]));
56
+ }
57
+ function hasAlpha(frames) {
58
+ return frames.some((frame) => extractStillWebpFrameChunks(frame.data).some((chunk) => readAscii(chunk, 0, 4) === 'ALPH' || readAscii(chunk, 0, 4) === 'VP8L'));
59
+ }
60
+ function bgra(color = {}) {
61
+ return new Uint8Array([
62
+ color.blue ?? 0,
63
+ color.green ?? 0,
64
+ color.red ?? 0,
65
+ color.alpha ?? 0,
66
+ ]);
67
+ }
68
+ function assertVp8xDimension(value, name) {
69
+ if (!Number.isInteger(value) || value <= 0 || value > 0x1000000)
70
+ throw new Error(`Invalid WebP ${name}: ${value}`);
71
+ }
72
+ function clamp(value, min, max) {
73
+ return Math.min(max, Math.max(min, value));
74
+ }
75
+ //# sourceMappingURL=webp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webp.js","sourceRoot":"","sources":["../src/webp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AA0BtD,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC9F,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACnD,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;KAC9B,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3G,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAgB;IAC1D,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,MAAc,EAAE,KAAc,EAAE,SAAkB;IACtF,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QAClC,IAAI,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;KAClB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAwB,EAAE,WAAmB,EAAE,YAAoB;IACjG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAChG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAChD,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,WAAW,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACnI,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IAClF,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QAClC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;QACvB,GAAG,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC;KAC3C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,MAA2B;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;AACjK,CAAC;AAED,SAAS,IAAI,CAAC,QAAmD,EAAE;IACjE,OAAO,IAAI,UAAU,CAAC;QACpB,KAAK,CAAC,IAAI,IAAI,CAAC;QACf,KAAK,CAAC,KAAK,IAAI,CAAC;QAChB,KAAK,CAAC,GAAG,IAAI,CAAC;QACd,KAAK,CAAC,KAAK,IAAI,CAAC;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,IAAY;IACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@browser-mc/media-container",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "dependencies": {
14
+ "@browser-mc/binary": "^0.0.1"
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "prebuild": "pnpm --filter @browser-mc/binary build",
25
+ "build": "tsc -p tsconfig.json",
26
+ "pretypecheck": "pnpm --filter @browser-mc/binary build",
27
+ "typecheck": "tsc -p tsconfig.json --noEmit",
28
+ "test": "pnpm build && node --test test/*.test.mjs"
29
+ }
30
+ }