@remotion/media-parser 4.0.284 → 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
@@ -4,7 +4,7 @@ export declare const createAacCodecPrivate: ({ audioObjectType, sampleRate, chan
4
4
  sampleRate: number;
5
5
  channelConfiguration: number;
6
6
  codecPrivate: Uint8Array | null;
7
- }) => Uint8Array;
7
+ }) => Uint8Array<ArrayBufferLike>;
8
8
  export declare const parseAacCodecPrivate: (bytes: Uint8Array) => {
9
9
  audioObjectType: number;
10
10
  sampleRate: number;
@@ -1 +1 @@
1
- export declare const combineUint8Arrays: (arrays: Uint8Array[]) => Uint8Array;
1
+ export declare const combineUint8Arrays: (arrays: Uint8Array[]) => Uint8Array<ArrayBufferLike>;
@@ -5,7 +5,6 @@ const aac_codecprivate_1 = require("../../aac-codecprivate");
5
5
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
6
6
  const emit_audio_sample_1 = require("../../emit-audio-sample");
7
7
  const register_track_1 = require("../../register-track");
8
- const work_on_seek_request_1 = require("../../work-on-seek-request");
9
8
  const parseAac = async (state) => {
10
9
  const { iterator } = state;
11
10
  const startOffset = iterator.counter.getOffset();
@@ -49,7 +48,6 @@ const parseAac = async (state) => {
49
48
  const data = iterator.getSlice(frameLength);
50
49
  if (state.callbacks.tracks.getTracks().length === 0) {
51
50
  await (0, register_track_1.registerAudioTrack)({
52
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
53
51
  container: 'aac',
54
52
  track: {
55
53
  codec: (0, aac_codecprivate_1.mapAudioObjectTypeToCodecString)(audioObjectType),
@@ -90,7 +88,6 @@ const parseAac = async (state) => {
90
88
  },
91
89
  timescale: 1,
92
90
  }),
93
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
94
91
  callbacks: state.callbacks,
95
92
  });
96
93
  return Promise.resolve(null);
@@ -1,2 +1,2 @@
1
1
  import type { SpsAndPps } from '../../state/parser-state';
2
- export declare const createSpsPpsData: (avc1Profile: SpsAndPps) => Uint8Array;
2
+ export declare const createSpsPpsData: (avc1Profile: SpsAndPps) => Uint8Array<ArrayBufferLike>;
@@ -1,2 +1,2 @@
1
1
  import type { BufferIterator } from '../../iterator/buffer-iterator';
2
- export declare const getChannelCount: (iterator: BufferIterator) => 5 | 1 | 2 | 3 | 4 | 6 | 7 | 8;
2
+ export declare const getChannelCount: (iterator: BufferIterator) => 1 | 2 | 8 | 5 | 4 | 6 | 3 | 7;
@@ -4,7 +4,6 @@ exports.parseFlacFrame = exports.parseFrameHeader = void 0;
4
4
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
5
5
  const emit_audio_sample_1 = require("../../emit-audio-sample");
6
6
  const buffer_iterator_1 = require("../../iterator/buffer-iterator");
7
- const work_on_seek_request_1 = require("../../work-on-seek-request");
8
7
  const get_block_size_1 = require("./get-block-size");
9
8
  const get_channel_count_1 = require("./get-channel-count");
10
9
  const get_sample_rate_1 = require("./get-sample-rate");
@@ -98,7 +97,6 @@ const emitSample = async ({ state, data, offset, }) => {
98
97
  },
99
98
  timescale: 1,
100
99
  }),
101
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
102
100
  callbacks: state.callbacks,
103
101
  });
104
102
  iterator.destroy();
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseStreamInfo = void 0;
4
4
  const register_track_1 = require("../../register-track");
5
- const work_on_seek_request_1 = require("../../work-on-seek-request");
6
5
  const parseStreamInfo = async ({ iterator, state, }) => {
7
6
  const counter = iterator.counter.getOffset();
8
7
  const minimumBlockSize = iterator.getUint16();
@@ -34,7 +33,6 @@ const parseStreamInfo = async ({ iterator, state, }) => {
34
33
  state.structure.getFlacStructure().boxes.push(flacStreamInfo);
35
34
  await (0, register_track_1.registerAudioTrack)({
36
35
  container: 'flac',
37
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
38
36
  track: {
39
37
  codec: 'flac',
40
38
  type: 'audio',
@@ -4,13 +4,14 @@ exports.collectSamplePositionsFromTrak = void 0;
4
4
  const get_audio_codec_1 = require("../../get-audio-codec");
5
5
  const get_fps_1 = require("../../get-fps");
6
6
  const get_sample_positions_1 = require("../../get-sample-positions");
7
- const get_sample_positions_from_lpcm_1 = require("../../get-sample-positions-from-lpcm");
7
+ const get_sample_positions_from_mp4_1 = require("../../get-sample-positions-from-mp4");
8
8
  const traversal_1 = require("./traversal");
9
9
  const collectSamplePositionsFromTrak = (trakBox) => {
10
10
  const isLpcm = (0, get_audio_codec_1.isLpcmAudioCodec)(trakBox);
11
11
  const timescaleAndDuration = (0, get_fps_1.getTimescaleAndDuration)(trakBox);
12
- if (isLpcm) {
13
- return (0, get_sample_positions_from_lpcm_1.getSamplePositionsFromLpcm)(trakBox);
12
+ const isIn24 = (0, get_audio_codec_1.isIn24AudioCodec)(trakBox);
13
+ if (isLpcm || isIn24) {
14
+ return (0, get_sample_positions_from_mp4_1.getGroupedSamplesPositionsFromMp4)(trakBox);
14
15
  }
15
16
  const stszBox = (0, traversal_1.getStszBox)(trakBox);
16
17
  const stcoBox = (0, traversal_1.getStcoBox)(trakBox);
@@ -7,7 +7,6 @@ const register_track_1 = require("../../register-track");
7
7
  const can_skip_tracks_1 = require("../../state/can-skip-tracks");
8
8
  const has_tracks_section_1 = require("../../state/has-tracks-section");
9
9
  const structure_1 = require("../../state/structure");
10
- const work_on_seek_request_1 = require("../../work-on-seek-request");
11
10
  const process_box_1 = require("./process-box");
12
11
  const traversal_1 = require("./traversal");
13
12
  const getMoovAtom = async ({ endOfMdat, state, }) => {
@@ -29,7 +28,6 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
29
28
  const onAudioTrack = state.onAudioTrack
30
29
  ? async ({ track, container }) => {
31
30
  await (0, register_track_1.registerAudioTrack)({
32
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
33
31
  track,
34
32
  container,
35
33
  logLevel: state.logLevel,
@@ -43,7 +41,6 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
43
41
  const onVideoTrack = state.onVideoTrack
44
42
  ? async ({ track, container }) => {
45
43
  await (0, register_track_1.registerVideoTrack)({
46
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
47
44
  track,
48
45
  container,
49
46
  logLevel: state.logLevel,
@@ -79,7 +76,6 @@ const getMoovAtom = async ({ endOfMdat, state, }) => {
79
76
  onlyIfMoovAtomExpected: {
80
77
  tracks: tracksState,
81
78
  isoState: null,
82
- workOnSeekRequestOptions: null,
83
79
  onAudioTrack,
84
80
  onVideoTrack,
85
81
  registerVideoSampleCallback: () => Promise.resolve(),
@@ -8,7 +8,6 @@ const skip_1 = require("../../../skip");
8
8
  const cached_sample_positions_1 = require("../../../state/iso-base-media/cached-sample-positions");
9
9
  const may_skip_video_data_1 = require("../../../state/may-skip-video-data");
10
10
  const video_section_1 = require("../../../state/video-section");
11
- const work_on_seek_request_1 = require("../../../work-on-seek-request");
12
11
  const get_moov_atom_1 = require("../get-moov-atom");
13
12
  const parseMdatSection = async (state) => {
14
13
  const mediaSection = (0, video_section_1.getCurrentMediaSection)({
@@ -79,7 +78,6 @@ const parseMdatSection = async (state) => {
79
78
  },
80
79
  timescale: samplesWithIndex.track.timescale,
81
80
  }),
82
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
83
81
  callbacks: state.callbacks,
84
82
  });
85
83
  }
@@ -112,7 +110,6 @@ const parseMdatSection = async (state) => {
112
110
  },
113
111
  timescale: samplesWithIndex.track.timescale,
114
112
  }),
115
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
116
113
  callbacks: state.callbacks,
117
114
  });
118
115
  }
@@ -28,12 +28,12 @@ export declare const getMfraAtom: ({ src, contentLength, readerInterface, contro
28
28
  leb128: () => number;
29
29
  removeBytesRead: (force: boolean, mode: import("../../../options").ParseMediaMode) => {
30
30
  bytesRemoved: number;
31
- removedData: Uint8Array | null;
31
+ removedData: Uint8Array<ArrayBuffer> | null;
32
32
  };
33
33
  discard: (length: number) => void;
34
34
  getEightByteNumber: (littleEndian?: boolean) => number;
35
35
  getFourByteNumber: () => number;
36
- getSlice: (amount: number) => Uint8Array;
36
+ getSlice: (amount: number) => Uint8Array<ArrayBuffer>;
37
37
  getAtom: () => string;
38
38
  detectFileType: () => import("../../../file-types/detect-file-type").FileType;
39
39
  getPaddedFourByteNumber: () => number;
@@ -57,7 +57,7 @@ export declare const getMfraAtom: ({ src, contentLength, readerInterface, contro
57
57
  getUint(length: number): number;
58
58
  getByteString(length: number, trimTrailingZeroes: boolean): string;
59
59
  planBytes: (size: number) => {
60
- discardRest: () => Uint8Array;
60
+ discardRest: () => Uint8Array<ArrayBuffer>;
61
61
  };
62
62
  getFloat64: () => number;
63
63
  readUntilNullTerminator: () => string;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseIsoBaseMedia = void 0;
4
- const work_on_seek_request_1 = require("../../work-on-seek-request");
5
4
  const mdat_1 = require("./mdat/mdat");
6
5
  const process_box_1 = require("./process-box");
7
6
  const parseIsoBaseMedia = async (state) => {
@@ -16,7 +15,6 @@ const parseIsoBaseMedia = async (state) => {
16
15
  onlyIfMoovAtomExpected: {
17
16
  tracks: state.callbacks.tracks,
18
17
  isoState: state.iso,
19
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
20
18
  onAudioTrack: state.onAudioTrack,
21
19
  onVideoTrack: state.onVideoTrack,
22
20
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -5,12 +5,10 @@ import type { IsoBaseMediaState } from '../../state/iso-base-media/iso-state';
5
5
  import type { SampleCallbacks } from '../../state/sample-callbacks';
6
6
  import type { MediaSectionState } from '../../state/video-section';
7
7
  import type { OnAudioTrack, OnVideoTrack } from '../../webcodec-sample-types';
8
- import type { WorkOnSeekRequestOptions } from '../../work-on-seek-request';
9
8
  import type { BoxAndNext } from './base-media-box';
10
9
  export type OnlyIfMoovAtomExpected = {
11
10
  tracks: TracksState;
12
11
  isoState: IsoBaseMediaState | null;
13
- workOnSeekRequestOptions: WorkOnSeekRequestOptions | null;
14
12
  onVideoTrack: OnVideoTrack | null;
15
13
  onAudioTrack: OnAudioTrack | null;
16
14
  registerVideoSampleCallback: SampleCallbacks['registerVideoSampleCallback'];
@@ -198,7 +198,7 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
198
198
  if (!onlyIfMoovAtomExpected) {
199
199
  throw new Error('State is required');
200
200
  }
201
- const { workOnSeekRequestOptions, tracks, onAudioTrack, onVideoTrack } = onlyIfMoovAtomExpected;
201
+ const { tracks, onAudioTrack, onVideoTrack } = onlyIfMoovAtomExpected;
202
202
  const box = await (0, trak_1.parseTrak)({
203
203
  size: boxSize,
204
204
  offsetAtStart: fileOffset,
@@ -208,7 +208,6 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
208
208
  const transformedTrack = (0, make_track_1.makeBaseMediaTrack)(box);
209
209
  if (transformedTrack && transformedTrack.type === 'video') {
210
210
  await (0, register_track_1.registerVideoTrack)({
211
- workOnSeekRequestOptions,
212
211
  track: transformedTrack,
213
212
  container: 'mp4',
214
213
  logLevel,
@@ -219,7 +218,6 @@ const processBox = async ({ iterator, logLevel, onlyIfMoovAtomExpected, onlyIfMd
219
218
  }
220
219
  if (transformedTrack && transformedTrack.type === 'audio') {
221
220
  await (0, register_track_1.registerAudioTrack)({
222
- workOnSeekRequestOptions,
223
221
  track: transformedTrack,
224
222
  container: 'mp4',
225
223
  registerAudioSampleCallback: onlyIfMoovAtomExpected.registerAudioSampleCallback,
@@ -95,6 +95,7 @@ const iteratorOverSegmentFiles = async ({ structure, onVideoTrack, m3uState, onA
95
95
  },
96
96
  reader: readerInterface,
97
97
  mp4HeaderSegment,
98
+ makeSamplesStartAtZero: false,
98
99
  });
99
100
  if (chunk.isHeader) {
100
101
  if (data.structure.type !== 'iso-base-media') {
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runOverM3u = void 0;
4
4
  const log_1 = require("../../log");
5
5
  const register_track_1 = require("../../register-track");
6
- const work_on_seek_request_1 = require("../../work-on-seek-request");
7
6
  const iterate_over_segment_files_1 = require("./iterate-over-segment-files");
8
7
  const runOverM3u = async ({ state, structure, playlistUrl, logLevel, }) => {
9
8
  const tracksDone = state.m3u.getTrackDone(playlistUrl);
@@ -52,7 +51,6 @@ const runOverM3u = async ({ state, structure, playlistUrl, logLevel, }) => {
52
51
  }
53
52
  const onAudioSample = await (0, register_track_1.registerAudioTrack)({
54
53
  container: 'm3u8',
55
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
56
54
  track: {
57
55
  ...track,
58
56
  trackId,
@@ -81,7 +79,6 @@ const runOverM3u = async ({ state, structure, playlistUrl, logLevel, }) => {
81
79
  }
82
80
  const onVideoSample = await (0, register_track_1.registerVideoTrack)({
83
81
  container: 'm3u8',
84
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
85
82
  track: {
86
83
  ...track,
87
84
  trackId,
@@ -5,7 +5,6 @@ exports.parseMpegHeader = void 0;
5
5
  const emit_audio_sample_1 = require("../../emit-audio-sample");
6
6
  const log_1 = require("../../log");
7
7
  const register_track_1 = require("../../register-track");
8
- const work_on_seek_request_1 = require("../../work-on-seek-request");
9
8
  const get_frame_length_1 = require("./get-frame-length");
10
9
  const samples_per_mpeg_file_1 = require("./samples-per-mpeg-file");
11
10
  function getSamplingFrequency({ bits, mpegVersion, }) {
@@ -245,7 +244,6 @@ const parseMpegHeader = async ({ state, }) => {
245
244
  state.mp3Info.setMp3Info(info);
246
245
  await (0, register_track_1.registerAudioTrack)({
247
246
  container: 'mp3',
248
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
249
247
  track: {
250
248
  type: 'audio',
251
249
  codec: 'mp3',
@@ -295,7 +293,6 @@ const parseMpegHeader = async ({ state, }) => {
295
293
  trackId: 0,
296
294
  type: 'key',
297
295
  },
298
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
299
296
  callbacks: state.callbacks,
300
297
  });
301
298
  }
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.expectRiffBox = void 0;
4
4
  const register_track_1 = require("../../register-track");
5
- const work_on_seek_request_1 = require("../../work-on-seek-request");
6
5
  const get_tracks_from_avi_1 = require("./get-tracks-from-avi");
7
6
  const is_movi_1 = require("./is-movi");
8
7
  const parse_riff_box_1 = require("./parse-riff-box");
@@ -39,7 +38,6 @@ const expectRiffBox = async (state) => {
39
38
  strf: box.strf,
40
39
  });
41
40
  await (0, register_track_1.registerAudioTrack)({
42
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
43
41
  track: audioTrack,
44
42
  container: 'avi',
45
43
  registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseMovi = exports.handleChunk = void 0;
4
4
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
5
5
  const emit_audio_sample_1 = require("../../emit-audio-sample");
6
- const work_on_seek_request_1 = require("../../work-on-seek-request");
7
6
  const key_1 = require("../avc/key");
8
7
  const parse_avc_1 = require("../avc/parse-avc");
9
8
  const traversal_1 = require("./traversal");
@@ -58,7 +57,6 @@ const handleChunk = async ({ state, ckId, ckSize, }) => {
58
57
  },
59
58
  timescale: 1,
60
59
  }),
61
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
62
60
  callbacks: state.callbacks,
63
61
  });
64
62
  return;
@@ -93,7 +91,6 @@ const handleChunk = async ({ state, ckId, ckSize, }) => {
93
91
  },
94
92
  timescale: 1,
95
93
  }),
96
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
97
94
  callbacks: state.callbacks,
98
95
  });
99
96
  }
@@ -1,6 +1,6 @@
1
1
  export declare const readAdtsHeader: (buffer: Uint8Array) => {
2
2
  frameLength: number;
3
- codecPrivate: Uint8Array;
3
+ codecPrivate: Uint8Array<ArrayBufferLike>;
4
4
  channelConfiguration: number;
5
5
  sampleRate: number;
6
6
  audioObjectType: number;
@@ -1,3 +1,3 @@
1
1
  import type { BufferIterator } from '../../iterator/buffer-iterator';
2
2
  export declare const discardRestOfPacket: (iterator: BufferIterator) => void;
3
- export declare const getRestOfPacket: (iterator: BufferIterator) => Uint8Array;
3
+ export declare const getRestOfPacket: (iterator: BufferIterator) => Uint8Array<ArrayBuffer>;
@@ -1 +1,17 @@
1
- export declare function findNthSubarrayIndex(array: Uint8Array, subarray: Uint8Array, n: number): number;
1
+ export type FindNthSubarrayIndexNotFound = {
2
+ type: 'not-found';
3
+ index: number;
4
+ count: number;
5
+ };
6
+ type ReturnType = {
7
+ type: 'found';
8
+ index: number;
9
+ } | FindNthSubarrayIndexNotFound;
10
+ export declare function findNthSubarrayIndex({ array, subarray, n, startIndex, startCount, }: {
11
+ array: Uint8Array;
12
+ subarray: Uint8Array;
13
+ n: number;
14
+ startIndex: number;
15
+ startCount: number;
16
+ }): ReturnType;
17
+ export {};
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findNthSubarrayIndex = findNthSubarrayIndex;
4
- function findNthSubarrayIndex(array, subarray, n) {
4
+ function findNthSubarrayIndex({ array, subarray, n, startIndex, startCount, }) {
5
5
  const subarrayLength = subarray.length;
6
6
  const arrayLength = array.length;
7
- let count = 0;
8
- for (let i = 0; i <= arrayLength - subarrayLength; i++) {
7
+ let count = startCount;
8
+ let i = startIndex;
9
+ for (i; i <= arrayLength - subarrayLength; i++) {
9
10
  let match = true;
10
11
  for (let j = 0; j < subarrayLength; j++) {
11
12
  if (array[i + j] !== subarray[j]) {
@@ -16,9 +17,9 @@ function findNthSubarrayIndex(array, subarray, n) {
16
17
  if (match) {
17
18
  count++;
18
19
  if (count === n) {
19
- return i; // Return the starting index of the nth subarray
20
+ return { type: 'found', index: i }; // Return the starting index of the nth subarray
20
21
  }
21
22
  }
22
23
  }
23
- return -1; // Return -1 if nth subarray is not found
24
+ return { type: 'not-found', index: i, count }; // Return -1 if nth subarray is not found
24
25
  }
@@ -0,0 +1,4 @@
1
+ import type { TransportStreamSeekingInfo } from '../../seeking-info';
2
+ import type { TracksState } from '../../state/has-tracks-section';
3
+ import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
4
+ export declare const getSeekingInfoFromTransportStream: (transportStream: TransportStreamState, tracksState: TracksState) => TransportStreamSeekingInfo;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSeekingInfoFromTransportStream = void 0;
4
+ const getSeekingInfoFromTransportStream = (transportStream, tracksState) => {
5
+ const firstVideoTrack = tracksState
6
+ .getTracks()
7
+ .find((t) => t.type === 'video');
8
+ if (!firstVideoTrack) {
9
+ throw new Error('No video track found');
10
+ }
11
+ return {
12
+ type: 'transport-stream-seeking-info',
13
+ observedPesHeaders: transportStream.observedPesHeaders.getPesKeyframeHeaders(),
14
+ ptsStartOffset: transportStream.startOffset.getOffset(firstVideoTrack.trackId),
15
+ };
16
+ };
17
+ exports.getSeekingInfoFromTransportStream = getSeekingInfoFromTransportStream;
@@ -1,8 +1,15 @@
1
- import type { ParserState } from '../../state/parser-state';
1
+ import type { LogLevel } from '../../log';
2
+ import type { SampleCallbacks } from '../../state/sample-callbacks';
3
+ import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
4
+ import type { OnAudioTrack } from '../../webcodec-sample-types';
2
5
  import type { TransportStreamPacketBuffer } from './process-stream-buffers';
3
- export declare const handleAacPacket: ({ streamBuffer, state, programId, offset, }: {
6
+ export declare const handleAacPacket: ({ streamBuffer, programId, offset, sampleCallbacks, logLevel, onAudioTrack, transportStream, makeSamplesStartAtZero, }: {
4
7
  streamBuffer: TransportStreamPacketBuffer;
5
- state: ParserState;
6
8
  programId: number;
7
9
  offset: number;
10
+ sampleCallbacks: SampleCallbacks;
11
+ logLevel: LogLevel;
12
+ onAudioTrack: OnAudioTrack | null;
13
+ transportStream: TransportStreamState;
14
+ makeSamplesStartAtZero: boolean;
8
15
  }) => Promise<void>;
@@ -5,20 +5,23 @@ const aac_codecprivate_1 = require("../../aac-codecprivate");
5
5
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
6
6
  const emit_audio_sample_1 = require("../../emit-audio-sample");
7
7
  const register_track_1 = require("../../register-track");
8
- const work_on_seek_request_1 = require("../../work-on-seek-request");
9
8
  const adts_header_1 = require("./adts-header");
10
9
  const handle_avc_packet_1 = require("./handle-avc-packet");
11
- const handleAacPacket = async ({ streamBuffer, state, programId, offset, }) => {
12
- var _a;
13
- const adtsHeader = (0, adts_header_1.readAdtsHeader)(streamBuffer.buffer);
10
+ const handleAacPacket = async ({ streamBuffer, programId, offset, sampleCallbacks, logLevel, onAudioTrack, transportStream, makeSamplesStartAtZero, }) => {
11
+ var _a, _b;
12
+ const adtsHeader = (0, adts_header_1.readAdtsHeader)(streamBuffer.getBuffer());
14
13
  if (!adtsHeader) {
15
14
  throw new Error('Invalid ADTS header - too short');
16
15
  }
17
16
  const { channelConfiguration, codecPrivate, sampleRate, audioObjectType } = adtsHeader;
18
- const isTrackRegistered = state.callbacks.tracks.getTracks().find((t) => {
17
+ const isTrackRegistered = sampleCallbacks.tracks.getTracks().find((t) => {
19
18
  return t.trackId === programId;
20
19
  });
21
20
  if (!isTrackRegistered) {
21
+ const startOffset = makeSamplesStartAtZero
22
+ ? Math.min(streamBuffer.pesHeader.pts, (_a = streamBuffer.pesHeader.dts) !== null && _a !== void 0 ? _a : Infinity)
23
+ : 0;
24
+ transportStream.startOffset.setOffset(programId, startOffset);
22
25
  const track = {
23
26
  type: 'audio',
24
27
  codecPrivate,
@@ -35,19 +38,21 @@ const handleAacPacket = async ({ streamBuffer, state, programId, offset, }) => {
35
38
  await (0, register_track_1.registerAudioTrack)({
36
39
  track,
37
40
  container: 'transport-stream',
38
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
39
- registerAudioSampleCallback: state.callbacks.registerAudioSampleCallback,
40
- tracks: state.callbacks.tracks,
41
- logLevel: state.logLevel,
42
- onAudioTrack: state.onAudioTrack,
41
+ registerAudioSampleCallback: sampleCallbacks.registerAudioSampleCallback,
42
+ tracks: sampleCallbacks.tracks,
43
+ logLevel,
44
+ onAudioTrack,
43
45
  });
44
46
  }
45
47
  const sample = {
46
- cts: streamBuffer.pesHeader.pts,
47
- dts: (_a = streamBuffer.pesHeader.dts) !== null && _a !== void 0 ? _a : streamBuffer.pesHeader.pts,
48
- timestamp: streamBuffer.pesHeader.pts,
48
+ cts: streamBuffer.pesHeader.pts -
49
+ transportStream.startOffset.getOffset(programId),
50
+ dts: ((_b = streamBuffer.pesHeader.dts) !== null && _b !== void 0 ? _b : streamBuffer.pesHeader.pts) -
51
+ transportStream.startOffset.getOffset(programId),
52
+ timestamp: streamBuffer.pesHeader.pts -
53
+ transportStream.startOffset.getOffset(programId),
49
54
  duration: undefined,
50
- data: new Uint8Array(streamBuffer.buffer),
55
+ data: streamBuffer.getBuffer(),
51
56
  trackId: programId,
52
57
  type: 'key',
53
58
  offset,
@@ -59,8 +64,8 @@ const handleAacPacket = async ({ streamBuffer, state, programId, offset, }) => {
59
64
  sample,
60
65
  timescale: handle_avc_packet_1.MPEG_TIMESCALE,
61
66
  }),
62
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
63
- callbacks: state.callbacks,
67
+ callbacks: sampleCallbacks,
64
68
  });
69
+ transportStream.lastEmittedSample.setLastEmittedSample(sample);
65
70
  };
66
71
  exports.handleAacPacket = handleAacPacket;
@@ -1,9 +1,16 @@
1
- import type { ParserState } from '../../state/parser-state';
1
+ import type { LogLevel } from '../../log';
2
+ import type { SampleCallbacks } from '../../state/sample-callbacks';
3
+ import type { TransportStreamState } from '../../state/transport-stream/transport-stream';
4
+ import type { OnVideoTrack } from '../../webcodec-sample-types';
2
5
  import type { TransportStreamPacketBuffer } from './process-stream-buffers';
3
6
  export declare const MPEG_TIMESCALE = 90000;
4
- export declare const handleAvcPacket: ({ streamBuffer, programId, state, offset, }: {
7
+ export declare const handleAvcPacket: ({ streamBuffer, programId, offset, sampleCallbacks, logLevel, onVideoTrack, transportStream, makeSamplesStartAtZero, }: {
5
8
  streamBuffer: TransportStreamPacketBuffer;
6
9
  programId: number;
7
- state: ParserState;
8
10
  offset: number;
11
+ sampleCallbacks: SampleCallbacks;
12
+ logLevel: LogLevel;
13
+ onVideoTrack: OnVideoTrack | null;
14
+ transportStream: TransportStreamState;
15
+ makeSamplesStartAtZero: boolean;
9
16
  }) => Promise<void>;
@@ -4,7 +4,6 @@ exports.handleAvcPacket = exports.MPEG_TIMESCALE = void 0;
4
4
  const convert_audio_or_video_sample_1 = require("../../convert-audio-or-video-sample");
5
5
  const emit_audio_sample_1 = require("../../emit-audio-sample");
6
6
  const register_track_1 = require("../../register-track");
7
- const work_on_seek_request_1 = require("../../work-on-seek-request");
8
7
  const codec_string_1 = require("../avc/codec-string");
9
8
  const create_sps_pps_data_1 = require("../avc/create-sps-pps-data");
10
9
  const interpret_sps_1 = require("../avc/interpret-sps");
@@ -12,16 +11,20 @@ const key_1 = require("../avc/key");
12
11
  const parse_avc_1 = require("../avc/parse-avc");
13
12
  const sps_and_pps_1 = require("../avc/sps-and-pps");
14
13
  exports.MPEG_TIMESCALE = 90000;
15
- const handleAvcPacket = async ({ streamBuffer, programId, state, offset, }) => {
16
- var _a;
17
- const avc = (0, parse_avc_1.parseAvc)(streamBuffer.buffer);
18
- const isTrackRegistered = state.callbacks.tracks.getTracks().find((t) => {
14
+ const handleAvcPacket = async ({ streamBuffer, programId, offset, sampleCallbacks, logLevel, onVideoTrack, transportStream, makeSamplesStartAtZero, }) => {
15
+ var _a, _b;
16
+ const avc = (0, parse_avc_1.parseAvc)(streamBuffer.getBuffer());
17
+ const isTrackRegistered = sampleCallbacks.tracks.getTracks().find((t) => {
19
18
  return t.trackId === programId;
20
19
  });
21
20
  if (!isTrackRegistered) {
22
21
  const spsAndPps = (0, sps_and_pps_1.getSpsAndPps)(avc);
23
22
  const dimensions = (0, interpret_sps_1.getDimensionsFromSps)(spsAndPps.sps.spsData);
24
23
  const sampleAspectRatio = (0, interpret_sps_1.getSampleAspectRatioFromSps)(spsAndPps.sps.spsData);
24
+ const startOffset = makeSamplesStartAtZero
25
+ ? Math.min(streamBuffer.pesHeader.pts, (_a = streamBuffer.pesHeader.dts) !== null && _a !== void 0 ? _a : Infinity)
26
+ : 0;
27
+ transportStream.startOffset.setOffset(programId, startOffset);
25
28
  const track = {
26
29
  m3uStreamFormat: null,
27
30
  rotation: 0,
@@ -49,33 +52,39 @@ const handleAvcPacket = async ({ streamBuffer, programId, state, offset, }) => {
49
52
  await (0, register_track_1.registerVideoTrack)({
50
53
  track,
51
54
  container: 'transport-stream',
52
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
53
- logLevel: state.logLevel,
54
- onVideoTrack: state.onVideoTrack,
55
- registerVideoSampleCallback: state.callbacks.registerVideoSampleCallback,
56
- tracks: state.callbacks.tracks,
55
+ logLevel,
56
+ onVideoTrack,
57
+ registerVideoSampleCallback: sampleCallbacks.registerVideoSampleCallback,
58
+ tracks: sampleCallbacks.tracks,
57
59
  });
58
60
  }
61
+ const type = (0, key_1.getKeyFrameOrDeltaFromAvcInfo)(avc);
59
62
  // sample for webcodecs needs to be in nano seconds
60
63
  const sample = {
61
- cts: streamBuffer.pesHeader.pts,
62
- dts: (_a = streamBuffer.pesHeader.dts) !== null && _a !== void 0 ? _a : streamBuffer.pesHeader.pts,
63
- timestamp: streamBuffer.pesHeader.pts,
64
+ cts: streamBuffer.pesHeader.pts -
65
+ transportStream.startOffset.getOffset(programId),
66
+ dts: ((_b = streamBuffer.pesHeader.dts) !== null && _b !== void 0 ? _b : streamBuffer.pesHeader.pts) -
67
+ transportStream.startOffset.getOffset(programId),
68
+ timestamp: streamBuffer.pesHeader.pts -
69
+ transportStream.startOffset.getOffset(programId),
64
70
  duration: undefined,
65
- data: new Uint8Array(streamBuffer.buffer),
71
+ data: streamBuffer.getBuffer(),
66
72
  trackId: programId,
67
- type: (0, key_1.getKeyFrameOrDeltaFromAvcInfo)(avc),
73
+ type,
68
74
  offset,
69
75
  timescale: exports.MPEG_TIMESCALE,
70
76
  };
77
+ if (type === 'key') {
78
+ transportStream.observedPesHeaders.markPtsAsKeyframe(streamBuffer.pesHeader.pts);
79
+ }
71
80
  await (0, emit_audio_sample_1.emitVideoSample)({
72
81
  trackId: programId,
73
82
  videoSample: (0, convert_audio_or_video_sample_1.convertAudioOrVideoSampleToWebCodecsTimestamps)({
74
83
  sample,
75
84
  timescale: exports.MPEG_TIMESCALE,
76
85
  }),
77
- workOnSeekRequestOptions: (0, work_on_seek_request_1.getWorkOnSeekRequestOptions)(state),
78
- callbacks: state.callbacks,
86
+ callbacks: sampleCallbacks,
79
87
  });
88
+ transportStream.lastEmittedSample.setLastEmittedSample(sample);
80
89
  };
81
90
  exports.handleAvcPacket = handleAvcPacket;