@editframe/elements 0.7.0-beta.11 → 0.7.0-beta.15

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.
Files changed (99) hide show
  1. package/dist/EF_INTERACTIVE.d.ts +1 -0
  2. package/dist/{lib/av → assets/dist}/EncodedAsset.js +1 -1
  3. package/dist/{packages/elements/src/elements → elements}/EFAudio.d.ts +2 -2
  4. package/dist/{packages/elements/src/elements → elements}/EFCaptions.d.ts +4 -4
  5. package/dist/{packages/elements/src/elements → elements}/EFImage.d.ts +3 -3
  6. package/dist/{packages/elements/src/elements → elements}/EFMedia.d.ts +3 -3
  7. package/dist/{packages/elements/src/elements → elements}/EFTemporal.d.ts +1 -1
  8. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.browsertest.d.ts +1 -1
  9. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.d.ts +3 -3
  10. package/dist/{packages/elements/src/elements → elements}/EFVideo.d.ts +3 -3
  11. package/dist/{packages/elements/src/elements → elements}/EFWaveform.d.ts +3 -3
  12. package/dist/{packages/elements/src/elements → elements}/TimegroupController.d.ts +1 -1
  13. package/dist/{packages/elements → elements}/src/EF_FRAMEGEN.js +4 -3
  14. package/dist/elements/src/EF_INTERACTIVE.js +7 -0
  15. package/dist/{packages/elements → elements}/src/elements/EFMedia.js +2 -2
  16. package/dist/{packages/elements → elements}/src/elements/EFTemporal.js +37 -2
  17. package/dist/{packages/elements → elements}/src/gui/EFFilmstrip.js +3 -3
  18. package/dist/{packages/elements → elements}/src/gui/EFWorkbench.js +1 -2
  19. package/dist/{packages/elements → elements}/src/gui/TWMixin.js +10 -2
  20. package/dist/{packages/elements → elements}/src/index.js +3 -1
  21. package/dist/{packages/elements/src/elements → elements}/util.d.ts +1 -1
  22. package/dist/{packages/elements/src/gui → gui}/EFFilmstrip.d.ts +10 -10
  23. package/dist/{packages/elements/src/gui → gui}/EFWorkbench.d.ts +3 -3
  24. package/dist/index.d.ts +10 -0
  25. package/dist/msToTimeCode.d.ts +1 -0
  26. package/dist/style.css +9 -0
  27. package/package.json +6 -9
  28. package/src/elements/EFAudio.ts +1 -1
  29. package/src/elements/EFCaptions.ts +7 -7
  30. package/src/elements/EFImage.ts +3 -3
  31. package/src/elements/EFMedia.ts +8 -8
  32. package/src/elements/EFSourceMixin.ts +1 -1
  33. package/src/elements/EFTemporal.ts +42 -5
  34. package/src/elements/EFTimegroup.browsertest.ts +3 -3
  35. package/src/elements/EFTimegroup.ts +4 -4
  36. package/src/elements/EFVideo.ts +2 -2
  37. package/src/elements/EFWaveform.ts +6 -6
  38. package/src/elements/FetchMixin.ts +1 -1
  39. package/src/elements/TimegroupController.ts +1 -1
  40. package/src/elements/durationConverter.ts +1 -1
  41. package/src/elements/util.ts +1 -1
  42. package/src/gui/EFFilmstrip.ts +17 -13
  43. package/src/gui/EFWorkbench.ts +4 -5
  44. package/src/gui/TWMixin.ts +10 -3
  45. package/dist/lib/av/EncodedAsset.cjs +0 -577
  46. package/dist/lib/av/MP4File.cjs +0 -187
  47. package/dist/lib/av/msToTimeCode.cjs +0 -15
  48. package/dist/lib/util/awaitMicrotask.cjs +0 -4
  49. package/dist/lib/util/awaitMicrotask.js +0 -4
  50. package/dist/lib/util/memoize.cjs +0 -14
  51. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
  52. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
  53. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
  54. package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
  55. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
  56. package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
  57. package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
  58. package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
  59. package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
  60. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
  61. package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
  62. package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
  63. package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
  64. package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
  65. package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
  66. package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
  67. package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
  68. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
  69. package/dist/packages/elements/src/elements/util.cjs +0 -11
  70. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
  71. package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
  72. package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
  73. package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
  74. package/dist/packages/elements/src/index.cjs +0 -50
  75. package/dist/packages/elements/src/index.d.ts +0 -10
  76. package/dist/{packages/elements/src/EF_FRAMEGEN.d.ts → EF_FRAMEGEN.d.ts} +0 -0
  77. package/dist/{lib/av → assets/dist}/MP4File.js +0 -0
  78. package/dist/{lib/util → assets/dist}/memoize.js +0 -0
  79. package/dist/{packages/elements/src/elements → elements}/CrossUpdateController.d.ts +0 -0
  80. package/dist/{packages/elements/src/elements → elements}/EFSourceMixin.d.ts +0 -0
  81. package/dist/{packages/elements/src/elements → elements}/FetchMixin.d.ts +0 -0
  82. package/dist/{packages/elements/src/elements → elements}/durationConverter.d.ts +0 -0
  83. package/dist/{packages/elements/src/elements → elements}/parseTimeToMs.d.ts +0 -0
  84. package/dist/{packages/elements → elements}/src/elements/CrossUpdateController.js +0 -0
  85. package/dist/{packages/elements → elements}/src/elements/EFAudio.js +0 -0
  86. package/dist/{packages/elements → elements}/src/elements/EFCaptions.js +1 -1
  87. /package/dist/{packages/elements → elements}/src/elements/EFImage.js +0 -0
  88. /package/dist/{packages/elements → elements}/src/elements/EFSourceMixin.js +0 -0
  89. /package/dist/{packages/elements → elements}/src/elements/EFTimegroup.js +0 -0
  90. /package/dist/{packages/elements → elements}/src/elements/EFVideo.js +0 -0
  91. /package/dist/{packages/elements → elements}/src/elements/EFWaveform.js +0 -0
  92. /package/dist/{packages/elements → elements}/src/elements/FetchMixin.js +0 -0
  93. /package/dist/{packages/elements → elements}/src/elements/TimegroupController.js +0 -0
  94. /package/dist/{packages/elements → elements}/src/elements/durationConverter.js +0 -0
  95. /package/dist/{packages/elements → elements}/src/elements/parseTimeToMs.js +0 -0
  96. /package/dist/{packages/elements → elements}/src/elements/util.js +0 -0
  97. /package/dist/{packages/elements → elements}/src/gui/TWMixin.css.js +0 -0
  98. /package/dist/{lib/av → elements/src}/msToTimeCode.js +0 -0
  99. /package/dist/{packages/elements/src/gui → gui}/TWMixin.d.ts +0 -0
@@ -1,577 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const MP4Box = require("mp4box");
4
- const debug = require("debug");
5
- const memoize = require("../util/memoize.cjs");
6
- const MP4File = require("./MP4File.cjs");
7
- function _interopNamespaceDefault(e) {
8
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
9
- if (e) {
10
- for (const k in e) {
11
- if (k !== "default") {
12
- const d = Object.getOwnPropertyDescriptor(e, k);
13
- Object.defineProperty(n, k, d.get ? d : {
14
- enumerable: true,
15
- get: () => e[k]
16
- });
17
- }
18
- }
19
- }
20
- n.default = e;
21
- return Object.freeze(n);
22
- }
23
- const MP4Box__namespace = /* @__PURE__ */ _interopNamespaceDefault(MP4Box);
24
- var __defProp = Object.defineProperty;
25
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
26
- var __decorateClass = (decorators, target, key, kind) => {
27
- var result = __getOwnPropDesc(target, key);
28
- for (var i = decorators.length - 1, decorator; i >= 0; i--)
29
- if (decorator = decorators[i])
30
- result = decorator(target, key, result) || result;
31
- if (result) __defProp(target, key, result);
32
- return result;
33
- };
34
- const log = debug("ef:av");
35
- const BUFFER_SIZE = 10;
36
- class AssetNotAvailableLocally extends Error {
37
- }
38
- class FileAsset {
39
- constructor(localName, file) {
40
- this.localName = localName;
41
- this.file = file;
42
- }
43
- async arrayBuffer() {
44
- return this.file.arrayBuffer();
45
- }
46
- get byteSize() {
47
- return this.file.size;
48
- }
49
- get fileExtension() {
50
- return this.file.name.split(".").pop();
51
- }
52
- slice(start, end) {
53
- return this.file.slice(start, end);
54
- }
55
- }
56
- class ISOFileAsset extends FileAsset {
57
- constructor(localName, file, mp4boxFile) {
58
- super(localName, file);
59
- this.localName = localName;
60
- this.file = file;
61
- this.mp4boxFile = mp4boxFile;
62
- }
63
- get fileInfo() {
64
- return this.mp4boxFile.getInfo();
65
- }
66
- get containerFormat() {
67
- return "mp4";
68
- }
69
- }
70
- __decorateClass([
71
- memoize.memoize
72
- ], ISOFileAsset.prototype, "fileInfo");
73
- const _VideoAsset = class _VideoAsset2 extends ISOFileAsset {
74
- constructor(localName, mp4boxFile, file) {
75
- super(localName, file, mp4boxFile);
76
- this.decodedFrames = [];
77
- this.requestedSampleNumber = 0;
78
- this.outCursor = 0;
79
- this.sampleCursor = 0;
80
- this.eventListeners = {};
81
- this.latestSeekCts = 0;
82
- this.videoDecoder = new VideoDecoder({
83
- error: (e) => {
84
- console.error("Video Decoder Error", e);
85
- },
86
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
87
- output: async (decodedFrame) => {
88
- const clone = decodedFrame.clone();
89
- log("🖼️ frame cts=", decodedFrame.timestamp);
90
- this.decodedFrames.push(clone);
91
- this.pruneBuffer();
92
- decodedFrame.close();
93
- this.outCursor = this.samples.findIndex(
94
- (sample) => sample.cts === decodedFrame.timestamp
95
- );
96
- log(`cursor=${this.sampleCursor} outCursor=${this.outCursor}`);
97
- this.emit("frame", clone);
98
- }
99
- });
100
- this.configureDecoder();
101
- }
102
- static async createFromReadableStream(id, stream, file) {
103
- let fileStart = 0;
104
- const inputFile = new MP4File.MP4File();
105
- const reader = stream.getReader();
106
- const processChunk = ({
107
- done,
108
- value
109
- }) => {
110
- if (done) {
111
- return;
112
- }
113
- if (!value) {
114
- return;
115
- }
116
- const mp4buffer = value.buffer;
117
- mp4buffer.fileStart = fileStart;
118
- const isLast = file.size === fileStart + value.byteLength;
119
- inputFile.appendBuffer(mp4buffer, isLast);
120
- fileStart += value.byteLength;
121
- return reader.read().then(processChunk);
122
- };
123
- await reader.read().then(processChunk);
124
- return new _VideoAsset2(id, inputFile, file);
125
- }
126
- /**
127
- * **Only use this function in tests to reset a VideoAsset to its initial state.**
128
- *
129
- * @deprecated
130
- */
131
- async TEST_ONLY_RESET() {
132
- await this.videoDecoder.flush();
133
- this.configureDecoder();
134
- this.requestedSampleNumber = 0;
135
- this.outCursor = 0;
136
- this.sampleCursor = 0;
137
- for (const frame of this.decodedFrames) {
138
- frame.close();
139
- }
140
- this.decodedFrames = [];
141
- this.lastDecodedSample = void 0;
142
- this.lastSoughtFrame?.close();
143
- this.lastSoughtFrame = void 0;
144
- }
145
- addEventListener(type, callback) {
146
- this.eventListeners[type] ||= /* @__PURE__ */ new Set();
147
- this.eventListeners[type]?.add(callback);
148
- }
149
- removeEventListener(type, callback) {
150
- this.eventListeners[type]?.delete(callback);
151
- }
152
- emit(type, ...args) {
153
- for (const listener of this.eventListeners[type] ?? []) {
154
- listener(...args);
155
- }
156
- }
157
- get videoCodec() {
158
- if (!this.defaultVideoTrack) {
159
- throw new Error("No default video track found");
160
- }
161
- return this.defaultVideoTrack?.codec;
162
- }
163
- get fragmentInfo() {
164
- const fragments = [];
165
- const [first, ...samples] = this.samples;
166
- if (!first) {
167
- return fragments;
168
- }
169
- let currentFragment = {
170
- offset: first.offset,
171
- size: first.size,
172
- start_ms: first.cts,
173
- duration_ms: 0
174
- };
175
- for (const sample of samples) {
176
- if (sample.is_sync) {
177
- if (currentFragment) {
178
- currentFragment.duration_ms = sample.cts - currentFragment.start_ms;
179
- fragments.push(currentFragment);
180
- }
181
- currentFragment = {
182
- offset: sample.offset,
183
- size: sample.size,
184
- start_ms: sample.cts,
185
- duration_ms: 0
186
- };
187
- } else {
188
- currentFragment.size += sample.size;
189
- }
190
- }
191
- return fragments;
192
- }
193
- pruneBuffer() {
194
- if (this.decodedFrames.length > BUFFER_SIZE) {
195
- this.decodedFrames.shift()?.close();
196
- }
197
- }
198
- get editsOffset() {
199
- if (!this.defaultVideoTrack?.edits) {
200
- return 0;
201
- }
202
- return this.defaultVideoTrack.edits.reduce((acc, edit) => {
203
- return acc + edit.media_time;
204
- }, 0);
205
- }
206
- async waitUntilVideoQueueDrained() {
207
- if (this.videoDecoder.decodeQueueSize === 0) {
208
- return;
209
- }
210
- await new Promise((resolve) => {
211
- this.videoDecoder.addEventListener(
212
- "dequeue",
213
- () => {
214
- resolve();
215
- },
216
- { once: true }
217
- );
218
- });
219
- await this.waitUntilVideoQueueDrained();
220
- }
221
- get canDecodeNextSample() {
222
- return this.sampleCursor < this.samples.length;
223
- }
224
- async decodeNextSample() {
225
- if (!this.canDecodeNextSample) {
226
- throw new Error("No more samples to decode");
227
- }
228
- await this.decodeSlice(this.sampleCursor, this.sampleCursor);
229
- this.sampleCursor++;
230
- }
231
- async decodeSlice(start, end) {
232
- const samples = this.samples.slice(start, end + 1);
233
- const firstSample = samples[0];
234
- const lastSample = samples[samples.length - 1];
235
- if (!firstSample || !lastSample) {
236
- throw new Error("Samples not found");
237
- }
238
- const sliceStart = firstSample.offset;
239
- const sliceEnd = lastSample.offset + lastSample.size;
240
- const buffer = await this.file.slice(sliceStart, sliceEnd).arrayBuffer();
241
- const firstSampleOffset = firstSample.offset;
242
- for (let i = start; i <= end; i++) {
243
- await this.waitUntilVideoQueueDrained();
244
- const sample = this.getSample(i);
245
- log("Decoding sample #", i, `cts=${sample.cts}`);
246
- const sampleStart = sample.offset - firstSampleOffset;
247
- const sampleEnd = sample.offset + sample.size - firstSampleOffset;
248
- const chunk = new EncodedVideoChunk({
249
- data: buffer.slice(sampleStart, sampleEnd),
250
- timestamp: sample.cts,
251
- duration: sample.duration,
252
- type: sample.is_sync ? "key" : "delta"
253
- });
254
- this.videoDecoder.decode(chunk);
255
- const nextSample = this.defaultVideoTrak?.samples?.[i + 1];
256
- if (nextSample === void 0) {
257
- log("ENDFLUSH");
258
- await this.videoDecoder.flush();
259
- }
260
- }
261
- }
262
- get decoderConfiguration() {
263
- if (!this.defaultVideoTrack) {
264
- throw new Error("No default video track found");
265
- }
266
- let description = new Uint8Array();
267
- const trak = this.mp4boxFile.getTrackById(this.defaultVideoTrack.id);
268
- for (const entry of trak.mdia.minf.stbl.stsd.entries) {
269
- if (entry.avcC ?? entry.hvcC) {
270
- const stream = new MP4Box__namespace.DataStream(
271
- void 0,
272
- 0,
273
- MP4Box__namespace.DataStream.BIG_ENDIAN
274
- );
275
- if (entry.avcC) {
276
- entry.avcC.write(stream);
277
- } else {
278
- entry.hvcC.write(stream);
279
- }
280
- description = new Uint8Array(stream.buffer, 8);
281
- break;
282
- }
283
- }
284
- return {
285
- codec: this.defaultVideoTrack.codec,
286
- codedWidth: this.defaultVideoTrack.track_width,
287
- codedHeight: this.defaultVideoTrack.track_height,
288
- optimizeForLatency: true,
289
- description
290
- };
291
- }
292
- /**
293
- * Configures the video decoder with the appropriate codec, dimensions, and hardware acceleration settings.
294
- * If the decoder is already configured, it will be reset before being reconfigured.
295
- */
296
- configureDecoder() {
297
- if (this.videoDecoder.state === "configured") {
298
- this.videoDecoder.reset();
299
- }
300
- log("Attempting to configure decoder", this.decoderConfiguration);
301
- this.videoDecoder.configure(this.decoderConfiguration);
302
- }
303
- // Default to -1 to throw error if called without an index
304
- getSample(index = -1) {
305
- const sample = this.samples?.[index];
306
- if (!sample) {
307
- throw new Error(`Sample not found at index ${index}`);
308
- }
309
- return sample;
310
- }
311
- get timescale() {
312
- if (!this.defaultVideoTrack) {
313
- throw new Error("No default video track found");
314
- }
315
- return this.defaultVideoTrack.timescale;
316
- }
317
- get samples() {
318
- if (!this.defaultVideoTrak.samples) {
319
- throw new Error("No video samples found");
320
- }
321
- return this.defaultVideoTrak.samples;
322
- }
323
- get displayOrderedSamples() {
324
- return Array.from(this.samples).sort((a, b) => {
325
- return a.cts - b.cts;
326
- });
327
- }
328
- getSampleClosetToTime(seconds) {
329
- const targetTime = Math.round(seconds * this.timescale + this.editsOffset);
330
- const sampleIndex = this.displayOrderedSamples.findIndex(
331
- (sample) => sample.cts >= targetTime
332
- );
333
- if (sampleIndex === -1) {
334
- return this.displayOrderedSamples[this.displayOrderedSamples.length - 1];
335
- }
336
- return this.displayOrderedSamples[sampleIndex];
337
- }
338
- seekingWillEmitNewFrame(seconds) {
339
- if (!this.lastSoughtFrame) {
340
- return true;
341
- }
342
- if (this.seekingWillGoBackwards(seconds)) {
343
- return true;
344
- }
345
- const nextCts = this.getSampleClosetToTime(seconds).cts;
346
- return nextCts > this.lastSoughtFrame.timestamp;
347
- }
348
- seekingWillSkipPictureGroup(seconds) {
349
- let start = this.sampleCursor;
350
- const end = this.getSampleClosetToTime(seconds).number;
351
- let syncFrameCrossings = 0;
352
- while (start <= end) {
353
- const sample = this.getSample(start);
354
- if (sample.is_sync) {
355
- if (syncFrameCrossings > 1) {
356
- return true;
357
- }
358
- syncFrameCrossings++;
359
- }
360
- start++;
361
- }
362
- return false;
363
- }
364
- seekingWillGoBackwards(seconds) {
365
- const targetSample = this.getSampleClosetToTime(seconds);
366
- const targetIndex = this.displayOrderedSamples.indexOf(targetSample);
367
- const targetInCache = this.decodedFrames.find(
368
- (frame) => frame.timestamp === targetSample.cts
369
- );
370
- const atEnd = this.sampleCursor === this.samples.length - 1;
371
- log(
372
- "this.outCursor <= targetSample.number",
373
- this.outCursor <= targetSample.number
374
- );
375
- log("this.outCursor <= targetIndex", this.outCursor <= targetIndex);
376
- if (atEnd) {
377
- return false;
378
- }
379
- if (targetInCache) {
380
- return false;
381
- }
382
- log("========");
383
- log("sampleCursor", this.sampleCursor);
384
- log(" outCursor", this.outCursor);
385
- log(" target", targetSample.number);
386
- log(" targetIndex", targetIndex);
387
- log(" inCache", !!targetInCache);
388
- log(" atEnd", atEnd);
389
- return this.outCursor > targetIndex;
390
- }
391
- async seekToTime(seconds) {
392
- const sample = this.getSampleClosetToTime(seconds);
393
- const cts = sample.cts;
394
- this.latestSeekCts = cts;
395
- const alreadyDecodedFrame = this.decodedFrames.find(
396
- (f) => f.timestamp === cts
397
- );
398
- if (alreadyDecodedFrame) {
399
- return alreadyDecodedFrame;
400
- }
401
- if (this.seekingWillSkipPictureGroup(seconds)) {
402
- await this.videoDecoder.flush();
403
- let syncSampleNumber = sample.number;
404
- while (!this.getSample(syncSampleNumber).is_sync) {
405
- syncSampleNumber--;
406
- if (syncSampleNumber < 0) {
407
- throw new Error("No sync sample found when traversing backwards");
408
- }
409
- }
410
- this.sampleCursor = syncSampleNumber;
411
- }
412
- if (this.seekingWillGoBackwards(seconds)) {
413
- log("BACKWARDS FLUSH");
414
- await this.videoDecoder.flush();
415
- for (const frame2 of this.decodedFrames) {
416
- frame2.close();
417
- }
418
- this.decodedFrames = [];
419
- let syncSampleNumber = sample.number;
420
- while (!this.getSample(syncSampleNumber).is_sync) {
421
- syncSampleNumber--;
422
- if (syncSampleNumber < 0) {
423
- throw new Error("No sync sample found when traversing backwards");
424
- }
425
- }
426
- this.sampleCursor = syncSampleNumber;
427
- }
428
- let frame;
429
- const maybeFrame = (_frame) => {
430
- if (frame) {
431
- return;
432
- }
433
- log("Maybe frame", _frame.timestamp, cts);
434
- if (_frame.timestamp === cts) {
435
- this.removeEventListener("frame", maybeFrame);
436
- frame = _frame;
437
- }
438
- };
439
- this.addEventListener("frame", maybeFrame);
440
- while (frame === void 0 && this.canDecodeNextSample) {
441
- await this.decodeNextSample();
442
- }
443
- this.removeEventListener("frame", maybeFrame);
444
- if (frame) {
445
- if (this.lastSoughtFrame && !this.decodedFrames.includes(this.lastSoughtFrame)) {
446
- try {
447
- this.lastSoughtFrame.close();
448
- } catch (error) {
449
- }
450
- }
451
- this.lastSoughtFrame = frame;
452
- }
453
- return frame;
454
- }
455
- get defaultVideoTrack() {
456
- return this.fileInfo.videoTracks[0];
457
- }
458
- get defaultVideoTrak() {
459
- return this.mp4boxFile.getTrackById(this.defaultVideoTrack?.id ?? -1);
460
- }
461
- get duration() {
462
- return this.fileInfo.duration / this.fileInfo.timescale;
463
- }
464
- };
465
- __decorateClass([
466
- memoize.memoize
467
- ], _VideoAsset.prototype, "editsOffset");
468
- __decorateClass([
469
- memoize.memoize
470
- ], _VideoAsset.prototype, "timescale");
471
- __decorateClass([
472
- memoize.memoize
473
- ], _VideoAsset.prototype, "samples");
474
- __decorateClass([
475
- memoize.memoize
476
- ], _VideoAsset.prototype, "displayOrderedSamples");
477
- __decorateClass([
478
- memoize.memoize
479
- ], _VideoAsset.prototype, "defaultVideoTrack");
480
- __decorateClass([
481
- memoize.memoize
482
- ], _VideoAsset.prototype, "defaultVideoTrak");
483
- __decorateClass([
484
- memoize.memoize
485
- ], _VideoAsset.prototype, "duration");
486
- let VideoAsset = _VideoAsset;
487
- const _AudioAsset = class _AudioAsset2 extends ISOFileAsset {
488
- static async createFromReadableStream(id, stream, file) {
489
- let fileStart = 0;
490
- const inputFile = new MP4File.MP4File();
491
- const reader = stream.getReader();
492
- const processChunk = ({
493
- done,
494
- value
495
- }) => {
496
- if (done) {
497
- return;
498
- }
499
- if (!value) {
500
- return;
501
- }
502
- const mp4buffer = value.buffer;
503
- mp4buffer.fileStart = fileStart;
504
- fileStart += value.byteLength;
505
- inputFile.appendBuffer(mp4buffer);
506
- return reader.read().then(processChunk);
507
- };
508
- await reader.read().then(processChunk);
509
- return new _AudioAsset2(id, file, inputFile);
510
- }
511
- get defaultAudioTrack() {
512
- return this.fileInfo.audioTracks[0];
513
- }
514
- get defaultAudioTrak() {
515
- return this.mp4boxFile.getTrackById(this.defaultAudioTrack?.id ?? -1);
516
- }
517
- get audioCodec() {
518
- if (!this.defaultAudioTrack) {
519
- throw new Error("No default audio track found");
520
- }
521
- return this.defaultAudioTrack.codec;
522
- }
523
- get samplerate() {
524
- if (!this.defaultAudioTrack) {
525
- throw new Error("No default audio track found");
526
- }
527
- return this.defaultAudioTrack.audio.sample_rate;
528
- }
529
- get channelCount() {
530
- if (!this.defaultAudioTrack) {
531
- throw new Error("No default audio track found");
532
- }
533
- return this.defaultAudioTrack.audio.channel_count;
534
- }
535
- };
536
- __decorateClass([
537
- memoize.memoize
538
- ], _AudioAsset.prototype, "defaultAudioTrack");
539
- __decorateClass([
540
- memoize.memoize
541
- ], _AudioAsset.prototype, "defaultAudioTrak");
542
- __decorateClass([
543
- memoize.memoize
544
- ], _AudioAsset.prototype, "audioCodec");
545
- __decorateClass([
546
- memoize.memoize
547
- ], _AudioAsset.prototype, "samplerate");
548
- __decorateClass([
549
- memoize.memoize
550
- ], _AudioAsset.prototype, "channelCount");
551
- const _ImageAsset = class _ImageAsset2 extends FileAsset {
552
- static async createFromReadableStream(id, file) {
553
- if (file.size === 0) {
554
- throw new AssetNotAvailableLocally();
555
- }
556
- return new _ImageAsset2(id, file);
557
- }
558
- get objectUrl() {
559
- return URL.createObjectURL(this.file);
560
- }
561
- get format() {
562
- return this.fileExtension;
563
- }
564
- get type() {
565
- return `image/${this.format}`;
566
- }
567
- };
568
- __decorateClass([
569
- memoize.memoize
570
- ], _ImageAsset.prototype, "objectUrl");
571
- __decorateClass([
572
- memoize.memoize
573
- ], _ImageAsset.prototype, "format");
574
- exports.AssetNotAvailableLocally = AssetNotAvailableLocally;
575
- exports.FileAsset = FileAsset;
576
- exports.ISOFileAsset = ISOFileAsset;
577
- exports.VideoAsset = VideoAsset;