@remotion/media-parser 4.0.292 → 4.0.294

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 (42) hide show
  1. package/dist/containers/iso-base-media/are-samples-complete.d.ts +6 -0
  2. package/dist/containers/iso-base-media/are-samples-complete.js +11 -0
  3. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.d.ts +2 -3
  4. package/dist/containers/iso-base-media/collect-sample-positions-from-moof-boxes.js +1 -3
  5. package/dist/containers/iso-base-media/find-track-to-seek.js +9 -2
  6. package/dist/containers/iso-base-media/get-keyframes.js +6 -2
  7. package/dist/containers/iso-base-media/get-sample-positions-from-track.d.ts +2 -3
  8. package/dist/containers/iso-base-media/get-sample-positions-from-track.js +4 -4
  9. package/dist/containers/iso-base-media/get-seeking-byte-from-fragmented-mp4.js +6 -1
  10. package/dist/containers/iso-base-media/mdat/mdat.js +18 -1
  11. package/dist/containers/iso-base-media/process-box.js +7 -7
  12. package/dist/containers/iso-base-media/seeking-hints.js +1 -1
  13. package/dist/containers/iso-base-media/traversal.d.ts +2 -1
  14. package/dist/containers/iso-base-media/traversal.js +8 -4
  15. package/dist/emit-available-info.js +26 -26
  16. package/dist/esm/index.mjs +160 -88
  17. package/dist/esm/node.mjs +7 -4
  18. package/dist/esm/universal.mjs +29 -37
  19. package/dist/esm/web.mjs +22 -33
  20. package/dist/esm/worker-server-entry.mjs +166 -91
  21. package/dist/esm/worker-web-entry.mjs +159 -87
  22. package/dist/get-duration.js +15 -3
  23. package/dist/has-all-info.js +2 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/readers/fetch/get-body-and-reader.js +3 -1
  26. package/dist/readers/from-node.js +7 -3
  27. package/dist/readers/from-web-file.js +20 -32
  28. package/dist/readers/reader.d.ts +1 -1
  29. package/dist/seek-backwards.js +1 -0
  30. package/dist/seek-forwards.js +1 -0
  31. package/dist/state/iso-base-media/cached-sample-positions.d.ts +5 -2
  32. package/dist/state/iso-base-media/cached-sample-positions.js +17 -7
  33. package/dist/state/iso-base-media/iso-state.d.ts +1 -1
  34. package/dist/state/iso-base-media/last-moof-box.d.ts +2 -0
  35. package/dist/state/iso-base-media/last-moof-box.js +21 -0
  36. package/dist/state/iso-base-media/precomputed-moof.d.ts +1 -0
  37. package/dist/state/iso-base-media/precomputed-moof.js +1 -0
  38. package/dist/state/parser-state.d.ts +1 -1
  39. package/dist/state/parser-state.js +2 -1
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +1 -1
  42. package/package.json +3 -3
@@ -9,42 +9,30 @@ const webFileReadContent = ({ src, range, controller }) => {
9
9
  ? src
10
10
  : typeof range === 'number'
11
11
  ? src.slice(range)
12
- : src.slice(range[0], range[1]);
13
- const reader = new FileReader();
14
- reader.readAsArrayBuffer(src);
15
- const ownController = new AbortController();
16
- if (ownController) {
17
- ownController.signal.addEventListener('abort', () => {
18
- reader.abort();
19
- }, { once: true });
20
- }
12
+ : src.slice(range[0], range[1] + 1);
13
+ const stream = part.stream();
14
+ const streamReader = stream.getReader();
21
15
  if (controller) {
22
16
  controller._internals.signal.addEventListener('abort', () => {
23
- ownController.abort();
17
+ streamReader.cancel();
24
18
  }, { once: true });
25
19
  }
26
- return new Promise((resolve, reject) => {
27
- reader.onload = () => {
28
- const stream = part.stream();
29
- const streamReader = stream.getReader();
30
- resolve({
31
- reader: {
32
- reader: streamReader,
33
- abort() {
34
- streamReader.cancel();
35
- ownController.abort();
36
- },
37
- },
38
- contentLength: src.size,
39
- name: src instanceof File ? src.name : src.toString(),
40
- supportsContentRange: true,
41
- contentType: src.type,
42
- needsContentRange: true,
43
- });
44
- };
45
- reader.onerror = () => {
46
- reject(reader.error);
47
- };
20
+ return Promise.resolve({
21
+ reader: {
22
+ reader: streamReader,
23
+ async abort() {
24
+ try {
25
+ await streamReader.cancel();
26
+ }
27
+ catch (_a) { }
28
+ return Promise.resolve();
29
+ },
30
+ },
31
+ contentLength: src.size,
32
+ name: src instanceof File ? src.name : src.toString(),
33
+ supportsContentRange: true,
34
+ contentType: src.type,
35
+ needsContentRange: true,
48
36
  });
49
37
  };
50
38
  exports.webFileReadContent = webFileReadContent;
@@ -4,7 +4,7 @@ import type { ParseMediaRange, ParseMediaSrc } from '../options';
4
4
  import type { PrefetchCache } from './from-fetch';
5
5
  export type Reader = {
6
6
  reader: ReadableStreamDefaultReader<Uint8Array>;
7
- abort: () => void;
7
+ abort: () => Promise<void>;
8
8
  };
9
9
  type ReadResult = {
10
10
  reader: Reader;
@@ -13,6 +13,7 @@ const seekBackwards = async ({ iterator, seekTo, readerInterface, src, controlle
13
13
  // (b) data has been discarded, making new reader
14
14
  const time = Date.now();
15
15
  log_1.Log.verbose(logLevel, `Seeking in video from position ${iterator.counter.getOffset()} -> ${seekTo}. Re-reading because this portion is not available.`);
16
+ await currentReader.getCurrent().abort();
16
17
  const { reader: newReader } = await readerInterface.read({
17
18
  src,
18
19
  range: seekTo,
@@ -22,6 +22,7 @@ const seekForward = async ({ seekTo, userInitiated, iterator, fields, logLevel,
22
22
  // (b) starting byte has not been fetched yet, making new reader
23
23
  const time = Date.now();
24
24
  log_1.Log.verbose(logLevel, `Skipping over video data from position ${iterator.counter.getOffset()} -> ${seekTo}. Re-reading because this portion is not available`);
25
+ await currentReader.getCurrent().abort();
25
26
  const { reader: newReader } = await readerInterface.read({
26
27
  src,
27
28
  range: seekTo,
@@ -17,12 +17,15 @@ export type MinimalFlatSampleForTesting = {
17
17
  offset: number;
18
18
  };
19
19
  };
20
- export declare const calculateFlatSamples: (state: ParserState) => {
20
+ export declare const calculateFlatSamples: ({ state, mediaSectionStart, }: {
21
+ state: ParserState;
22
+ mediaSectionStart: number;
23
+ }) => {
21
24
  track: VideoTrack | AudioTrack | OtherTrack;
22
25
  samplePosition: SamplePosition;
23
26
  }[][];
24
27
  export declare const cachedSamplePositionsState: () => {
25
- getSamples: (mdatStart: number) => FlatSample[] | null;
28
+ getSamples: (mdatStart: number) => FlatSample[];
26
29
  setSamples: (mdatStart: number, samples: FlatSample[]) => void;
27
30
  setJumpMarks: (mdatStart: number, marks: JumpMark[]) => void;
28
31
  getJumpMarks: (mdatStart: number) => JumpMark[];
@@ -1,21 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cachedSamplePositionsState = exports.calculateFlatSamples = void 0;
4
+ const are_samples_complete_1 = require("../../containers/iso-base-media/are-samples-complete");
4
5
  const get_sample_positions_from_track_1 = require("../../containers/iso-base-media/get-sample-positions-from-track");
5
6
  const traversal_1 = require("../../containers/iso-base-media/traversal");
6
7
  const get_tracks_1 = require("../../get-tracks");
7
- const calculateFlatSamples = (state) => {
8
+ const precomputed_tfra_1 = require("./precomputed-tfra");
9
+ const calculateFlatSamples = ({ state, mediaSectionStart, }) => {
8
10
  const tracks = (0, get_tracks_1.getTracks)(state, true);
9
11
  const allTracks = [
10
12
  ...tracks.videoTracks,
11
13
  ...tracks.audioTracks,
12
14
  ...tracks.otherTracks,
13
15
  ];
16
+ const moofBoxes = (0, traversal_1.getMoofBoxes)(state.structure.getIsoStructure().boxes);
17
+ const tfraBoxes = (0, precomputed_tfra_1.deduplicateTfraBoxesByOffset)([
18
+ ...state.iso.tfra.getTfraBoxes(),
19
+ ...(0, traversal_1.getTfraBoxes)(state.structure.getIsoStructure().boxes),
20
+ ]);
21
+ const moofComplete = (0, are_samples_complete_1.areSamplesComplete)({ moofBoxes, tfraBoxes });
22
+ const relevantMoofBox = moofBoxes.find((moofBox) => moofBox.offset + moofBox.size + 8 === mediaSectionStart);
23
+ if (moofBoxes.length > 0 && !relevantMoofBox) {
24
+ throw new Error('No relevant moof box found');
25
+ }
14
26
  const flatSamples = allTracks.map((track) => {
15
27
  const { samplePositions } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
16
28
  trakBox: track.trakBox,
17
- moofBoxes: (0, traversal_1.getMoofBoxes)(state.structure.getIsoStructure().boxes),
18
- tfraBoxes: (0, traversal_1.getTfraBoxes)(state.structure.getIsoStructure()),
29
+ moofBoxes: relevantMoofBox ? [relevantMoofBox] : [],
30
+ moofComplete,
19
31
  });
20
32
  return samplePositions.map((samplePosition) => {
21
33
  return {
@@ -32,10 +44,8 @@ const cachedSamplePositionsState = () => {
32
44
  const jumpMarksForMdatStart = {};
33
45
  return {
34
46
  getSamples: (mdatStart) => {
35
- if (cachedForMdatStart[mdatStart]) {
36
- return cachedForMdatStart[mdatStart];
37
- }
38
- return null;
47
+ var _a;
48
+ return (_a = cachedForMdatStart[mdatStart]) !== null && _a !== void 0 ? _a : null;
39
49
  },
40
50
  setSamples: (mdatStart, samples) => {
41
51
  cachedForMdatStart[mdatStart] = samples;
@@ -12,7 +12,7 @@ export declare const isoBaseMediaState: ({ contentLength, controller, readerInte
12
12
  prefetchCache: PrefetchCache;
13
13
  }) => {
14
14
  flatSamples: {
15
- getSamples: (mdatStart: number) => import("./cached-sample-positions").FlatSample[] | null;
15
+ getSamples: (mdatStart: number) => import("./cached-sample-positions").FlatSample[];
16
16
  setSamples: (mdatStart: number, samples: import("./cached-sample-positions").FlatSample[]) => void;
17
17
  setJumpMarks: (mdatStart: number, marks: import("../../containers/iso-base-media/mdat/calculate-jump-marks").JumpMark[]) => void;
18
18
  getJumpMarks: (mdatStart: number) => import("../../containers/iso-base-media/mdat/calculate-jump-marks").JumpMark[];
@@ -0,0 +1,2 @@
1
+ import type { IsoBaseMediaBox } from '../../containers/iso-base-media/base-media-box';
2
+ export declare const getLastMoofBox: (boxes: IsoBaseMediaBox[]) => number | null | undefined;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLastMoofBox = void 0;
4
+ const truthy_1 = require("../../truthy");
5
+ const getLastMoofBox = (boxes) => {
6
+ if (boxes) {
7
+ const tfras = boxes.filter((b) => b.type === 'tfra-box');
8
+ const lastMoofOffsets = tfras.map((f) => {
9
+ if (f.entries.length <= 1) {
10
+ return null;
11
+ }
12
+ return f.entries[f.entries.length - 1].moofOffset;
13
+ });
14
+ if (lastMoofOffsets.length > 0) {
15
+ const maxOffset = Math.max(...lastMoofOffsets.filter(truthy_1.truthy));
16
+ return maxOffset;
17
+ }
18
+ return null;
19
+ }
20
+ };
21
+ exports.getLastMoofBox = getLastMoofBox;
@@ -1,6 +1,7 @@
1
1
  import type { IsoBaseMediaBox } from '../../containers/iso-base-media/base-media-box';
2
2
  export type MoofBox = {
3
3
  offset: number;
4
+ size: number;
4
5
  trafBoxes: IsoBaseMediaBox[];
5
6
  };
6
7
  export declare const precomputedMoofState: () => {
@@ -19,6 +19,7 @@ const toMoofBox = (box) => {
19
19
  return {
20
20
  offset: box.offset,
21
21
  trafBoxes: box.children.filter((c) => c.type === 'regular-box' && c.boxType === 'traf'),
22
+ size: box.boxSize,
22
23
  };
23
24
  };
24
25
  exports.toMoofBox = toMoofBox;
@@ -135,7 +135,7 @@ export declare const makeParserState: ({ hasAudioTrackHandlers, hasVideoTrackHan
135
135
  };
136
136
  iso: {
137
137
  flatSamples: {
138
- getSamples: (mdatStart: number) => import("./iso-base-media/cached-sample-positions").FlatSample[] | null;
138
+ getSamples: (mdatStart: number) => import("./iso-base-media/cached-sample-positions").FlatSample[];
139
139
  setSamples: (mdatStart: number, samples: import("./iso-base-media/cached-sample-positions").FlatSample[]) => void;
140
140
  setJumpMarks: (mdatStart: number, marks: import("../containers/iso-base-media/mdat/calculate-jump-marks").JumpMark[]) => void;
141
141
  getJumpMarks: (mdatStart: number) => import("../containers/iso-base-media/mdat/calculate-jump-marks").JumpMark[];
@@ -52,6 +52,7 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
52
52
  fields: fieldsInReturnValue,
53
53
  callbacks,
54
54
  });
55
+ const mediaSection = (0, video_section_1.mediaSectionState)();
55
56
  return {
56
57
  riff: (0, riff_1.riffSpecificState)({
57
58
  controller,
@@ -112,7 +113,7 @@ const makeParserState = ({ hasAudioTrackHandlers, hasVideoTrackHandlers, control
112
113
  samplesObserved,
113
114
  contentLength,
114
115
  images,
115
- mediaSection: (0, video_section_1.mediaSectionState)(),
116
+ mediaSection,
116
117
  logLevel,
117
118
  iterator,
118
119
  controller,
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.292";
1
+ export declare const VERSION = "4.0.294";
package/dist/version.js CHANGED
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  // Automatically generated on publish
5
- exports.VERSION = '4.0.292';
5
+ exports.VERSION = '4.0.294';
package/package.json CHANGED
@@ -3,15 +3,15 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser"
4
4
  },
5
5
  "name": "@remotion/media-parser",
6
- "version": "4.0.292",
6
+ "version": "4.0.294",
7
7
  "main": "dist/index.js",
8
8
  "sideEffects": false,
9
9
  "devDependencies": {
10
10
  "@types/wicg-file-system-access": "2023.10.5",
11
11
  "eslint": "9.19.0",
12
12
  "@types/bun": "1.2.8",
13
- "@remotion/eslint-config-internal": "4.0.292",
14
- "@remotion/example-videos": "4.0.292"
13
+ "@remotion/example-videos": "4.0.294",
14
+ "@remotion/eslint-config-internal": "4.0.294"
15
15
  },
16
16
  "publishConfig": {
17
17
  "access": "public"