@remotion/media-parser 4.0.285 → 4.0.286

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 (143) hide show
  1. package/dist/aac-codecprivate.d.ts +1 -1
  2. package/dist/combine-uint8-arrays.d.ts +1 -1
  3. package/dist/containers/aac/parse-aac.js +0 -3
  4. package/dist/containers/avc/create-sps-pps-data.d.ts +1 -1
  5. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  6. package/dist/containers/flac/parse-flac-frame.js +0 -2
  7. package/dist/containers/flac/parse-streaminfo.js +0 -2
  8. package/dist/containers/iso-base-media/collect-sample-positions-from-trak.js +4 -3
  9. package/dist/containers/iso-base-media/get-moov-atom.js +0 -4
  10. package/dist/containers/iso-base-media/mdat/mdat.js +0 -3
  11. package/dist/containers/iso-base-media/mfra/get-mfra-atom.d.ts +3 -3
  12. package/dist/containers/iso-base-media/parse-boxes.js +0 -2
  13. package/dist/containers/iso-base-media/process-box.d.ts +0 -2
  14. package/dist/containers/iso-base-media/process-box.js +1 -3
  15. package/dist/containers/m3u/iterate-over-segment-files.js +1 -0
  16. package/dist/containers/m3u/run-over-m3u.js +0 -3
  17. package/dist/containers/mp3/parse-mpeg-header.js +0 -3
  18. package/dist/containers/riff/expect-riff-box.js +0 -2
  19. package/dist/containers/riff/parse-movi.js +0 -3
  20. package/dist/containers/transport-stream/adts-header.d.ts +1 -1
  21. package/dist/containers/transport-stream/discard-rest-of-packet.d.ts +1 -1
  22. package/dist/containers/transport-stream/find-separator.d.ts +17 -1
  23. package/dist/containers/transport-stream/find-separator.js +6 -5
  24. package/dist/containers/transport-stream/get-seeking-info.d.ts +4 -0
  25. package/dist/containers/transport-stream/get-seeking-info.js +17 -0
  26. package/dist/containers/transport-stream/handle-aac-packet.d.ts +10 -3
  27. package/dist/containers/transport-stream/handle-aac-packet.js +21 -16
  28. package/dist/containers/transport-stream/handle-avc-packet.d.ts +10 -3
  29. package/dist/containers/transport-stream/handle-avc-packet.js +26 -17
  30. package/dist/containers/transport-stream/parse-packet.d.ts +8 -4
  31. package/dist/containers/transport-stream/parse-packet.js +15 -16
  32. package/dist/containers/transport-stream/parse-pes.d.ts +5 -1
  33. package/dist/containers/transport-stream/parse-pes.js +4 -3
  34. package/dist/containers/transport-stream/parse-stream-packet.d.ts +6 -6
  35. package/dist/containers/transport-stream/parse-stream-packet.js +10 -115
  36. package/dist/containers/transport-stream/parse-transport-stream.js +15 -3
  37. package/dist/containers/transport-stream/process-stream-buffers.d.ts +26 -6
  38. package/dist/containers/transport-stream/process-stream-buffers.js +77 -12
  39. package/dist/containers/transport-stream/traversal.d.ts +3 -1
  40. package/dist/containers/transport-stream/traversal.js +10 -2
  41. package/dist/containers/wav/parse-fmt.js +0 -2
  42. package/dist/containers/wav/parse-media-section.js +0 -2
  43. package/dist/containers/webm/cues/fetch-web-cues.d.ts +12 -0
  44. package/dist/containers/webm/cues/fetch-web-cues.js +32 -0
  45. package/dist/containers/webm/cues/format-cues.d.ts +8 -0
  46. package/dist/containers/webm/cues/format-cues.js +41 -0
  47. package/dist/containers/webm/cues/get-seeking-byte.d.ts +14 -0
  48. package/dist/containers/webm/cues/get-seeking-byte.js +91 -0
  49. package/dist/containers/webm/fetch-web-cues.d.ts +12 -0
  50. package/dist/containers/webm/fetch-web-cues.js +29 -0
  51. package/dist/containers/webm/get-byte-for-cues.d.ts +5 -0
  52. package/dist/containers/webm/get-byte-for-cues.js +33 -0
  53. package/dist/containers/webm/get-ready-tracks.d.ts +9 -4
  54. package/dist/containers/webm/get-ready-tracks.js +6 -6
  55. package/dist/containers/webm/get-sample-from-block.d.ts +3 -2
  56. package/dist/containers/webm/get-sample-from-block.js +9 -8
  57. package/dist/containers/webm/get-seeking-byte.d.ts +14 -0
  58. package/dist/containers/webm/get-seeking-byte.js +91 -0
  59. package/dist/containers/webm/get-seeking-info.d.ts +3 -0
  60. package/dist/containers/webm/get-seeking-info.js +17 -0
  61. package/dist/containers/webm/parse-ebml.d.ts +5 -4
  62. package/dist/containers/webm/parse-ebml.js +29 -34
  63. package/dist/containers/webm/parse-webm-header.js +14 -2
  64. package/dist/containers/webm/seek/fetch-web-cues.d.ts +12 -0
  65. package/dist/containers/webm/seek/fetch-web-cues.js +32 -0
  66. package/dist/containers/webm/seek/format-cues.d.ts +8 -0
  67. package/dist/containers/webm/seek/format-cues.js +42 -0
  68. package/dist/containers/webm/seek/get-seeking-byte.d.ts +14 -0
  69. package/dist/containers/webm/seek/get-seeking-byte.js +100 -0
  70. package/dist/containers/webm/seek/get-seeking-info.d.ts +3 -0
  71. package/dist/containers/webm/seek/get-seeking-info.js +17 -0
  72. package/dist/containers/webm/segments/all-segments.d.ts +1 -0
  73. package/dist/containers/webm/segments.d.ts +10 -4
  74. package/dist/containers/webm/segments.js +30 -12
  75. package/dist/containers/webm/state-for-processing.d.ts +15 -0
  76. package/dist/containers/webm/state-for-processing.js +14 -0
  77. package/dist/controller/seek-signal.d.ts +2 -2
  78. package/dist/download-and-parse-media.js +2 -1
  79. package/dist/emit-audio-sample.d.ts +2 -5
  80. package/dist/emit-audio-sample.js +2 -5
  81. package/dist/esm/index.mjs +5057 -4394
  82. package/dist/esm/universal.mjs +1 -1
  83. package/dist/esm/web.mjs +1 -1
  84. package/dist/esm/worker-server-entry.mjs +2327 -1664
  85. package/dist/esm/worker-web-entry.mjs +2327 -1664
  86. package/dist/file-types/detect-file-type.js +3 -1
  87. package/dist/get-audio-codec.d.ts +2 -1
  88. package/dist/get-audio-codec.js +15 -1
  89. package/dist/get-sample-positions-from-mp4.d.ts +3 -0
  90. package/dist/get-sample-positions-from-mp4.js +46 -0
  91. package/dist/get-seeking-byte.d.ts +19 -0
  92. package/dist/get-seeking-byte.js +50 -0
  93. package/dist/get-seeking-info.d.ts +5 -10
  94. package/dist/get-seeking-info.js +12 -25
  95. package/dist/get-tracks.js +6 -2
  96. package/dist/index.d.ts +44 -19
  97. package/dist/init-video.js +4 -3
  98. package/dist/internal-parse-media.js +3 -2
  99. package/dist/iterator/buffer-iterator.d.ts +3 -3
  100. package/dist/iterator/buffer-manager.d.ts +3 -3
  101. package/dist/log.d.ts +5 -5
  102. package/dist/options.d.ts +1 -0
  103. package/dist/parse-loop.js +0 -3
  104. package/dist/parse-media-on-worker-entry.d.ts +1 -1
  105. package/dist/parse-media.js +2 -1
  106. package/dist/readers/from-web-file.js +1 -1
  107. package/dist/register-track.d.ts +2 -5
  108. package/dist/register-track.js +2 -10
  109. package/dist/seek-backwards.js +2 -3
  110. package/dist/seeking-info.d.ts +14 -1
  111. package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
  112. package/dist/state/keyframes.js +3 -0
  113. package/dist/state/matroska/lazy-cues-fetch.d.ts +19 -0
  114. package/dist/state/matroska/lazy-cues-fetch.js +51 -0
  115. package/dist/state/matroska/lazy-seek-fetch.d.ts +1 -0
  116. package/dist/state/matroska/lazy-seek-fetch.js +5 -0
  117. package/dist/state/matroska/webm.d.ts +46 -0
  118. package/dist/state/matroska/webm.js +121 -0
  119. package/dist/state/matroska.d.ts +0 -0
  120. package/dist/state/matroska.js +1 -0
  121. package/dist/state/parser-state.d.ts +34 -9
  122. package/dist/state/parser-state.js +7 -6
  123. package/dist/state/sample-callbacks.d.ts +1 -1
  124. package/dist/state/sample-callbacks.js +9 -9
  125. package/dist/state/samples-observed/slow-duration-fps.d.ts +11 -0
  126. package/dist/state/samples-observed/slow-duration-fps.js +92 -0
  127. package/dist/state/seek-infinite-loop.js +12 -2
  128. package/dist/state/transport-stream/observed-pes-header.d.ts +13 -0
  129. package/dist/state/transport-stream/observed-pes-header.js +29 -0
  130. package/dist/state/transport-stream/pts-start-offset.d.ts +5 -0
  131. package/dist/state/transport-stream/pts-start-offset.js +13 -0
  132. package/dist/state/transport-stream/start-offset.d.ts +2 -1
  133. package/dist/state/transport-stream/start-offset.js +3 -3
  134. package/dist/state/transport-stream/transport-stream.d.ts +6 -0
  135. package/dist/state/transport-stream/transport-stream.js +4 -2
  136. package/dist/state/video-section.js +14 -2
  137. package/dist/version.d.ts +1 -1
  138. package/dist/version.js +1 -1
  139. package/dist/work-on-seek-request.d.ts +8 -0
  140. package/dist/work-on-seek-request.js +24 -6
  141. package/dist/worker-server.js +1 -0
  142. package/dist/worker.d.ts +0 -1
  143. package/package.json +4 -4
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.samplesObservedState = void 0;
4
+ const samplesObservedState = () => {
5
+ let smallestVideoSample;
6
+ let largestVideoSample;
7
+ let smallestAudioSample;
8
+ let largestAudioSample;
9
+ const videoSamples = new Map();
10
+ const audioSamples = new Map();
11
+ const getSlowVideoDurationInSeconds = () => {
12
+ let videoDuration = null;
13
+ if (smallestVideoSample !== undefined && largestVideoSample !== undefined) {
14
+ const startingTimestampDifference = largestVideoSample - smallestVideoSample;
15
+ const timeBetweenSamples = startingTimestampDifference / (videoSamples.size - 1);
16
+ videoDuration = timeBetweenSamples * videoSamples.size;
17
+ }
18
+ return videoDuration;
19
+ };
20
+ const getSlowDurationInSeconds = () => {
21
+ const videoDuration = getSlowVideoDurationInSeconds();
22
+ let audioDuration = null;
23
+ if (smallestAudioSample !== undefined && largestAudioSample !== undefined) {
24
+ const startingTimestampDifferenceAudio = largestAudioSample - smallestAudioSample;
25
+ const timeBetweenSamplesAudio = startingTimestampDifferenceAudio / (audioSamples.size - 1);
26
+ audioDuration = timeBetweenSamplesAudio * audioSamples.size;
27
+ }
28
+ if (videoDuration === null && audioDuration === null) {
29
+ throw new Error('No samples');
30
+ }
31
+ return Math.max(videoDuration !== null && videoDuration !== void 0 ? videoDuration : 0, audioDuration !== null && audioDuration !== void 0 ? audioDuration : 0);
32
+ };
33
+ const addVideoSample = (videoSample) => {
34
+ videoSamples.set(videoSample.cts, videoSample.data.byteLength);
35
+ const presentationTimeInSeconds = videoSample.cts / videoSample.timescale;
36
+ if (largestVideoSample === undefined ||
37
+ presentationTimeInSeconds > largestVideoSample) {
38
+ largestVideoSample = presentationTimeInSeconds;
39
+ }
40
+ if (smallestVideoSample === undefined ||
41
+ presentationTimeInSeconds < smallestVideoSample) {
42
+ smallestVideoSample = presentationTimeInSeconds;
43
+ }
44
+ };
45
+ const addAudioSample = (audioSample) => {
46
+ audioSamples.set(audioSample.cts, audioSample.data.byteLength);
47
+ const presentationTimeInSeconds = audioSample.cts / audioSample.timescale;
48
+ if (largestAudioSample === undefined ||
49
+ presentationTimeInSeconds > largestAudioSample) {
50
+ largestAudioSample = presentationTimeInSeconds;
51
+ }
52
+ if (smallestAudioSample === undefined ||
53
+ presentationTimeInSeconds < smallestAudioSample) {
54
+ smallestAudioSample = presentationTimeInSeconds;
55
+ }
56
+ };
57
+ const getFps = () => {
58
+ var _a;
59
+ const videoDuration = (_a = getSlowVideoDurationInSeconds()) !== null && _a !== void 0 ? _a : 0;
60
+ if (videoDuration === 0) {
61
+ return 0;
62
+ }
63
+ return videoSamples.size / videoDuration;
64
+ };
65
+ const getSlowNumberOfFrames = () => videoSamples.size;
66
+ const getAudioBitrate = () => {
67
+ const audioDuration = getSlowDurationInSeconds();
68
+ if (audioDuration === 0 || audioSamples.size === 0) {
69
+ return null;
70
+ }
71
+ const audioSizesInBytes = Array.from(audioSamples.values()).reduce((acc, size) => acc + size, 0);
72
+ return (audioSizesInBytes * 8) / audioDuration;
73
+ };
74
+ const getVideoBitrate = () => {
75
+ const videoDuration = getSlowDurationInSeconds();
76
+ if (videoDuration === 0 || videoSamples.size === 0) {
77
+ return null;
78
+ }
79
+ const videoSizesInBytes = Array.from(videoSamples.values()).reduce((acc, size) => acc + size, 0);
80
+ return (videoSizesInBytes * 8) / videoDuration;
81
+ };
82
+ return {
83
+ addVideoSample,
84
+ addAudioSample,
85
+ getSlowDurationInSeconds,
86
+ getFps,
87
+ getSlowNumberOfFrames,
88
+ getAudioBitrate,
89
+ getVideoBitrate,
90
+ };
91
+ };
92
+ exports.samplesObservedState = samplesObservedState;
@@ -3,19 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.seekInfiniteLoopDetectionState = void 0;
4
4
  const seekInfiniteLoopDetectionState = () => {
5
5
  let lastSeek = null;
6
+ let firstSeekTime = null;
6
7
  return {
7
8
  registerSeek: (byte) => {
9
+ const now = Date.now();
8
10
  if (!lastSeek || lastSeek.byte !== byte) {
9
11
  lastSeek = { byte, numberOfTimes: 1 };
12
+ firstSeekTime = now;
10
13
  return;
11
14
  }
12
15
  lastSeek.numberOfTimes++;
13
- if (lastSeek.numberOfTimes >= 10) {
14
- throw new Error(`Seeking infinite loop detected: Seeked to byte 0x${byte.toString(16)} ${lastSeek.numberOfTimes} times in a row with no position change in the file. Check your usage of .seek().`);
16
+ if (lastSeek.numberOfTimes >= 10 &&
17
+ firstSeekTime &&
18
+ now - firstSeekTime <= 2000) {
19
+ throw new Error(`Seeking infinite loop detected: Seeked to byte 0x${byte.toString(16)} ${lastSeek.numberOfTimes} times in a row in the last 2 seconds. Check your usage of .seek().`);
20
+ }
21
+ if (now - firstSeekTime > 2000) {
22
+ lastSeek = { byte, numberOfTimes: 1 };
23
+ firstSeekTime = now;
15
24
  }
16
25
  },
17
26
  reset: () => {
18
27
  lastSeek = null;
28
+ firstSeekTime = null;
19
29
  },
20
30
  };
21
31
  };
@@ -0,0 +1,13 @@
1
+ import type { PacketPes } from '../../containers/transport-stream/parse-pes';
2
+ export declare const makeObservedPesHeader: () => {
3
+ pesHeaders: PacketPes[];
4
+ addPesHeader: (pesHeader: PacketPes) => void;
5
+ markPtsAsKeyframe: (pts: number) => void;
6
+ getPesKeyframeHeaders: () => PacketPes[];
7
+ };
8
+ export type ObservedPesHeaderState = ReturnType<typeof makeObservedPesHeader>;
9
+ export declare const getLastKeyFrameBeforeTimeInSeconds: ({ observedPesHeaders, timeInSeconds, ptsStartOffset, }: {
10
+ observedPesHeaders: ObservedPesHeaderState["pesHeaders"];
11
+ timeInSeconds: number;
12
+ ptsStartOffset: number;
13
+ }) => PacketPes | undefined;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLastKeyFrameBeforeTimeInSeconds = exports.makeObservedPesHeader = void 0;
4
+ const handle_avc_packet_1 = require("../../containers/transport-stream/handle-avc-packet");
5
+ const makeObservedPesHeader = () => {
6
+ const pesHeaders = [];
7
+ const confirmedAsKeyframe = [];
8
+ const state = {
9
+ pesHeaders,
10
+ addPesHeader: (pesHeader) => {
11
+ if (pesHeaders.find((p) => p.offset === pesHeader.offset)) {
12
+ return;
13
+ }
14
+ pesHeaders.push(pesHeader);
15
+ },
16
+ markPtsAsKeyframe: (pts) => {
17
+ confirmedAsKeyframe.push(pts);
18
+ },
19
+ getPesKeyframeHeaders: () => {
20
+ return pesHeaders.filter((p) => confirmedAsKeyframe.includes(p.pts));
21
+ },
22
+ };
23
+ return state;
24
+ };
25
+ exports.makeObservedPesHeader = makeObservedPesHeader;
26
+ const getLastKeyFrameBeforeTimeInSeconds = ({ observedPesHeaders, timeInSeconds, ptsStartOffset, }) => {
27
+ return observedPesHeaders.findLast((k) => (k.pts - ptsStartOffset) / handle_avc_packet_1.MPEG_TIMESCALE <= timeInSeconds);
28
+ };
29
+ exports.getLastKeyFrameBeforeTimeInSeconds = getLastKeyFrameBeforeTimeInSeconds;
@@ -0,0 +1,5 @@
1
+ export declare const ptsStartOffsetStore: () => {
2
+ getOffset: (trackId: number) => number;
3
+ setOffset: (trackId: number, newOffset: number) => void;
4
+ };
5
+ export type PtsStartOffsetState = ReturnType<typeof ptsStartOffsetStore>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ptsStartOffsetStore = void 0;
4
+ const ptsStartOffsetStore = () => {
5
+ const offsets = {};
6
+ return {
7
+ getOffset: (trackId) => offsets[trackId] || 0,
8
+ setOffset: (trackId, newOffset) => {
9
+ offsets[trackId] = newOffset;
10
+ },
11
+ };
12
+ };
13
+ exports.ptsStartOffsetStore = ptsStartOffsetStore;
@@ -1,4 +1,5 @@
1
- export declare const startOffsetStore: () => {
1
+ export declare const ptsStartOffsetStore: () => {
2
2
  getOffset: (trackId: number) => number;
3
3
  setOffset: (trackId: number, newOffset: number) => void;
4
4
  };
5
+ export type StartOffsetState = ReturnType<typeof ptsStartOffsetStore>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startOffsetStore = void 0;
4
- const startOffsetStore = () => {
3
+ exports.ptsStartOffsetStore = void 0;
4
+ const ptsStartOffsetStore = () => {
5
5
  const offsets = {};
6
6
  return {
7
7
  getOffset: (trackId) => offsets[trackId] || 0,
@@ -10,4 +10,4 @@ const startOffsetStore = () => {
10
10
  },
11
11
  };
12
12
  };
13
- exports.startOffsetStore = startOffsetStore;
13
+ exports.ptsStartOffsetStore = ptsStartOffsetStore;
@@ -4,6 +4,12 @@ export declare const transportStreamState: () => {
4
4
  setNextPesHeader: (pesHeader: import("../../containers/transport-stream/parse-pes").PacketPes) => void;
5
5
  getNextPesHeader: () => import("../../containers/transport-stream/parse-pes").PacketPes;
6
6
  };
7
+ observedPesHeaders: {
8
+ pesHeaders: import("../../containers/transport-stream/parse-pes").PacketPes[];
9
+ addPesHeader: (pesHeader: import("../../containers/transport-stream/parse-pes").PacketPes) => void;
10
+ markPtsAsKeyframe: (pts: number) => void;
11
+ getPesKeyframeHeaders: () => import("../../containers/transport-stream/parse-pes").PacketPes[];
12
+ };
7
13
  streamBuffers: Map<number, TransportStreamPacketBuffer>;
8
14
  startOffset: {
9
15
  getOffset: (trackId: number) => number;
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transportStreamState = void 0;
4
4
  const last_emitted_sample_1 = require("./last-emitted-sample");
5
5
  const next_pes_header_store_1 = require("./next-pes-header-store");
6
- const start_offset_1 = require("./start-offset");
6
+ const observed_pes_header_1 = require("./observed-pes-header");
7
+ const pts_start_offset_1 = require("./pts-start-offset");
7
8
  const transportStreamState = () => {
8
9
  const streamBuffers = new Map();
9
- const startOffset = (0, start_offset_1.startOffsetStore)();
10
+ const startOffset = (0, pts_start_offset_1.ptsStartOffsetStore)();
10
11
  const lastEmittedSample = (0, last_emitted_sample_1.lastEmittedSampleState)();
11
12
  const state = {
12
13
  nextPesHeaderStore: (0, next_pes_header_store_1.makeNextPesHeaderStore)(),
14
+ observedPesHeaders: (0, observed_pes_header_1.makeObservedPesHeader)(),
13
15
  streamBuffers,
14
16
  startOffset,
15
17
  resetBeforeSeek: () => {
@@ -33,9 +33,21 @@ const mediaSectionState = () => {
33
33
  // Check if section overlaps with any existing sections
34
34
  const overlaps = mediaSections.some((existingSection) => section.start < existingSection.start + existingSection.size &&
35
35
  section.start + section.size > existingSection.start);
36
- if (!overlaps) {
37
- mediaSections.push(section);
36
+ if (overlaps) {
37
+ return;
38
38
  }
39
+ // Remove any existing sections that are encompassed by the new section
40
+ // Needed by Matroska because we need to define a 1 byte media section
41
+ // when seeking into a Cluster we have not seen yet
42
+ for (let i = mediaSections.length - 1; i >= 0; i--) {
43
+ const existingSection = mediaSections[i];
44
+ if (section.start <= existingSection.start &&
45
+ section.start + section.size >=
46
+ existingSection.start + existingSection.size) {
47
+ mediaSections.splice(i, 1);
48
+ }
49
+ }
50
+ mediaSections.push(section);
39
51
  };
40
52
  const getMediaSections = () => {
41
53
  return mediaSections;
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "4.0.285";
1
+ export declare const VERSION = "4.0.286";
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.285';
5
+ exports.VERSION = '4.0.286';
@@ -6,10 +6,14 @@ import type { ParseMediaMode, ParseMediaSrc } from './options';
6
6
  import type { IsoBaseMediaStructure } from './parse-result';
7
7
  import type { ReaderInterface } from './readers/reader';
8
8
  import type { CurrentReader } from './state/current-reader';
9
+ import type { TracksState } from './state/has-tracks-section';
9
10
  import type { IsoBaseMediaState } from './state/iso-base-media/iso-state';
11
+ import type { KeyframesState } from './state/keyframes';
12
+ import type { WebmState } from './state/matroska/webm';
10
13
  import type { ParserState } from './state/parser-state';
11
14
  import type { SeekInfiniteLoop } from './state/seek-infinite-loop';
12
15
  import type { StructureState } from './state/structure';
16
+ import type { TransportStreamState } from './state/transport-stream/transport-stream';
13
17
  import { type MediaSectionState } from './state/video-section';
14
18
  export type WorkOnSeekRequestOptions = {
15
19
  logLevel: LogLevel;
@@ -22,11 +26,15 @@ export type WorkOnSeekRequestOptions = {
22
26
  readerInterface: ReaderInterface;
23
27
  mediaSection: MediaSectionState;
24
28
  mp4HeaderSegment: IsoBaseMediaStructure | null;
29
+ transportStream: TransportStreamState;
25
30
  mode: ParseMediaMode;
26
31
  seekInfiniteLoop: SeekInfiniteLoop;
27
32
  currentReader: CurrentReader;
28
33
  discardReadBytes: (force: boolean) => Promise<void>;
29
34
  fields: Partial<AllOptions<ParseMediaFields>>;
35
+ tracksState: TracksState;
36
+ webmState: WebmState;
37
+ keyframes: KeyframesState;
30
38
  };
31
39
  export declare const getWorkOnSeekRequestOptions: (state: ParserState) => WorkOnSeekRequestOptions;
32
40
  export declare const workOnSeekRequest: (options: WorkOnSeekRequestOptions) => Promise<void>;
@@ -1,23 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.workOnSeekRequest = exports.getWorkOnSeekRequestOptions = void 0;
4
+ const get_seeking_byte_1 = require("./get-seeking-byte");
4
5
  const get_seeking_info_1 = require("./get-seeking-info");
5
6
  const log_1 = require("./log");
6
7
  const perform_seek_1 = require("./perform-seek");
7
- const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, structureState, mp4HeaderSegment, isoState, }) => {
8
+ const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, structureState, mp4HeaderSegment, isoState, transportStream, tracksState, webmState, keyframes, }) => {
8
9
  const mediaSections = mediaSectionState.getMediaSections();
9
10
  if (mediaSections.length === 0) {
10
- log_1.Log.trace(logLevel, 'No video sections defined, cannot seek yet');
11
+ log_1.Log.trace(logLevel, 'No media sections defined, cannot seek yet');
11
12
  return {
12
13
  type: 'valid-but-must-wait',
13
14
  };
14
15
  }
15
- if (seek.type === 'keyframe-before-time-in-seconds') {
16
+ if (seek.type === 'keyframe-before-time') {
17
+ if (seek.timeInSeconds < 0) {
18
+ throw new Error(`Cannot seek to a negative time: ${JSON.stringify(seek)}`);
19
+ }
16
20
  const seekingInfo = (0, get_seeking_info_1.getSeekingInfo)({
17
21
  structureState,
18
22
  mp4HeaderSegment,
19
23
  mediaSectionState,
20
24
  isoState,
25
+ transportStream,
26
+ tracksState,
21
27
  });
22
28
  if (!seekingInfo) {
23
29
  log_1.Log.trace(logLevel, 'No seeking info, cannot seek yet');
@@ -25,12 +31,16 @@ const turnSeekIntoByte = async ({ seek, mediaSectionState, logLevel, iterator, s
25
31
  type: 'valid-but-must-wait',
26
32
  };
27
33
  }
28
- const seekingByte = await (0, get_seeking_info_1.getSeekingByte)({
34
+ const seekingByte = await (0, get_seeking_byte_1.getSeekingByte)({
29
35
  info: seekingInfo,
30
- time: seek.time,
36
+ time: seek.timeInSeconds,
31
37
  logLevel,
32
38
  currentPosition: iterator.counter.getOffset(),
33
39
  isoState,
40
+ transportStream,
41
+ webmState,
42
+ mediaSection: mediaSectionState,
43
+ keyframes,
34
44
  });
35
45
  return seekingByte;
36
46
  }
@@ -59,11 +69,15 @@ const getWorkOnSeekRequestOptions = (state) => {
59
69
  currentReader: state.currentReader,
60
70
  discardReadBytes: state.discardReadBytes,
61
71
  fields: state.fields,
72
+ transportStream: state.transportStream,
73
+ tracksState: state.callbacks.tracks,
74
+ webmState: state.webm,
75
+ keyframes: state.keyframes,
62
76
  };
63
77
  };
64
78
  exports.getWorkOnSeekRequestOptions = getWorkOnSeekRequestOptions;
65
79
  const workOnSeekRequest = async (options) => {
66
- const { logLevel, controller, mediaSection, mp4HeaderSegment, isoState, iterator, structureState, src, contentLength, readerInterface, mode, seekInfiniteLoop, currentReader, discardReadBytes, fields, } = options;
80
+ const { logLevel, controller, mediaSection, mp4HeaderSegment, isoState, iterator, structureState, src, contentLength, readerInterface, mode, seekInfiniteLoop, currentReader, discardReadBytes, fields, transportStream, tracksState, webmState, keyframes, } = options;
67
81
  const seek = controller._internals.seekSignal.getSeek();
68
82
  if (!seek) {
69
83
  return;
@@ -77,6 +91,10 @@ const workOnSeekRequest = async (options) => {
77
91
  structureState,
78
92
  mp4HeaderSegment,
79
93
  isoState,
94
+ transportStream,
95
+ tracksState,
96
+ webmState,
97
+ keyframes,
80
98
  });
81
99
  log_1.Log.trace(logLevel, `Seek action: ${JSON.stringify(resolution)}`);
82
100
  if (resolution.type === 'intermediary-seek') {
@@ -357,6 +357,7 @@ const startParsing = async (message, reader) => {
357
357
  }
358
358
  : null,
359
359
  onDiscardedData: null,
360
+ makeSamplesStartAtZero: true,
360
361
  });
361
362
  post({
362
363
  type: 'response-done',
package/dist/worker.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  import type { ParseMediaOnWorker } from './options';
2
2
  export type { ParseMediaOnWorker, ParseMediaOnWorkerOptions } from './options';
3
3
  export declare const parseMediaOnWebWorker: ParseMediaOnWorker;
4
- export declare const parseMediaOnServerWorker: ParseMediaOnWorker;
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.285",
6
+ "version": "4.0.286",
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
- "@types/bun": "1.2.5",
13
- "@remotion/example-videos": "4.0.285",
14
- "@remotion/eslint-config-internal": "4.0.285"
12
+ "@types/bun": "1.2.8",
13
+ "@remotion/example-videos": "4.0.286",
14
+ "@remotion/eslint-config-internal": "4.0.286"
15
15
  },
16
16
  "publishConfig": {
17
17
  "access": "public"