@remotion/media-parser 4.0.282 → 4.0.284

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 (97) hide show
  1. package/dist/containers/flac/get-channel-count.d.ts +1 -1
  2. package/dist/containers/m3u/iterate-over-segment-files.js +2 -1
  3. package/dist/containers/transport-stream/process-audio.d.ts +21 -0
  4. package/dist/containers/transport-stream/process-audio.js +54 -0
  5. package/dist/containers/transport-stream/process-sample-if-possible.d.ts +2 -0
  6. package/dist/containers/transport-stream/process-sample-if-possible.js +62 -0
  7. package/dist/containers/transport-stream/process-video.d.ts +20 -0
  8. package/dist/containers/transport-stream/process-video.js +39 -0
  9. package/dist/containers/transport-stream/start-offset.d.ts +4 -0
  10. package/dist/containers/transport-stream/start-offset.js +13 -0
  11. package/dist/controller/emitter.js +2 -1
  12. package/dist/esm/index.mjs +16 -4
  13. package/dist/esm/server-worker.mjs +12 -1
  14. package/dist/esm/worker-server-entry.mjs +16 -4
  15. package/dist/esm/worker-web-entry.mjs +16 -4
  16. package/dist/esm/worker.mjs +12 -1
  17. package/dist/index.d.ts +1 -0
  18. package/dist/parse-media-on-worker-entry.js +3 -6
  19. package/dist/readers/state/aac-state.d.ts +13 -0
  20. package/dist/readers/state/aac-state.js +17 -0
  21. package/dist/readers/state/can-skip-tracks.d.ts +16 -0
  22. package/dist/readers/state/can-skip-tracks.js +60 -0
  23. package/dist/readers/state/current-reader.d.ts +6 -0
  24. package/dist/readers/state/current-reader.js +13 -0
  25. package/dist/readers/state/emitted-fields.d.ts +1 -0
  26. package/dist/readers/state/emitted-fields.js +37 -0
  27. package/dist/readers/state/flac-state.d.ts +4 -0
  28. package/dist/readers/state/flac-state.js +13 -0
  29. package/dist/readers/state/has-tracks-section.d.ts +14 -0
  30. package/dist/readers/state/has-tracks-section.js +37 -0
  31. package/dist/readers/state/images.d.ts +9 -0
  32. package/dist/readers/state/images.js +14 -0
  33. package/dist/readers/state/iso-base-media/cached-sample-positions.d.ts +12 -0
  34. package/dist/readers/state/iso-base-media/cached-sample-positions.js +46 -0
  35. package/dist/readers/state/iso-base-media/iso-state.d.ts +24 -0
  36. package/dist/readers/state/iso-base-media/iso-state.js +20 -0
  37. package/dist/readers/state/iso-base-media/lazy-mfra-load.d.ts +13 -0
  38. package/dist/readers/state/iso-base-media/lazy-mfra-load.js +29 -0
  39. package/dist/readers/state/iso-base-media/moov-box.d.ts +5 -0
  40. package/dist/readers/state/iso-base-media/moov-box.js +13 -0
  41. package/dist/readers/state/keyframes.d.ts +6 -0
  42. package/dist/readers/state/keyframes.js +15 -0
  43. package/dist/readers/state/m3u-state.d.ts +44 -0
  44. package/dist/readers/state/m3u-state.js +124 -0
  45. package/dist/readers/state/may-skip-video-data.d.ts +4 -0
  46. package/dist/readers/state/may-skip-video-data.js +18 -0
  47. package/dist/readers/state/mp3.d.ts +15 -0
  48. package/dist/readers/state/mp3.js +19 -0
  49. package/dist/readers/state/need-samples-for-fields.d.ts +6 -0
  50. package/dist/readers/state/need-samples-for-fields.js +39 -0
  51. package/dist/readers/state/parser-state.d.ts +252 -0
  52. package/dist/readers/state/parser-state.js +124 -0
  53. package/dist/readers/state/riff.d.ts +10 -0
  54. package/dist/readers/state/riff.js +32 -0
  55. package/dist/readers/state/sample-callbacks.d.ts +44 -0
  56. package/dist/readers/state/sample-callbacks.js +118 -0
  57. package/dist/readers/state/seek-infinite-loop.d.ts +5 -0
  58. package/dist/readers/state/seek-infinite-loop.js +22 -0
  59. package/dist/readers/state/slow-duration-fps.d.ts +11 -0
  60. package/dist/readers/state/slow-duration-fps.js +86 -0
  61. package/dist/readers/state/structure.d.ts +15 -0
  62. package/dist/readers/state/structure.js +78 -0
  63. package/dist/readers/state/timings.d.ts +8 -0
  64. package/dist/readers/state/timings.js +13 -0
  65. package/dist/readers/state/transport-stream/last-emitted-sample.d.ts +6 -0
  66. package/dist/readers/state/transport-stream/last-emitted-sample.js +16 -0
  67. package/dist/readers/state/transport-stream/next-pes-header-store.d.ts +6 -0
  68. package/dist/readers/state/transport-stream/next-pes-header-store.js +18 -0
  69. package/dist/readers/state/transport-stream/start-offset.d.ts +4 -0
  70. package/dist/readers/state/transport-stream/start-offset.js +13 -0
  71. package/dist/readers/state/transport-stream/transport-stream.d.ts +19 -0
  72. package/dist/readers/state/transport-stream/transport-stream.js +25 -0
  73. package/dist/readers/state/video-section.d.ts +33 -0
  74. package/dist/readers/state/video-section.js +65 -0
  75. package/dist/readers/state/webm.d.ts +28 -0
  76. package/dist/readers/state/webm.js +109 -0
  77. package/dist/state/iso-base-media/cached-sample-positions.d.ts +1 -1
  78. package/dist/state/parser-state.d.ts +1 -0
  79. package/dist/state/transport-stream/last-emitted-sample.d.ts +6 -0
  80. package/dist/state/transport-stream/last-emitted-sample.js +16 -0
  81. package/dist/state/transport-stream/next-pes-header-store.d.ts +6 -0
  82. package/dist/state/transport-stream/next-pes-header-store.js +18 -0
  83. package/dist/state/transport-stream/start-offset.d.ts +4 -0
  84. package/dist/state/transport-stream/start-offset.js +13 -0
  85. package/dist/state/transport-stream/transport-stream.d.ts +19 -0
  86. package/dist/state/transport-stream/transport-stream.js +24 -0
  87. package/dist/state/uml.d.ts +32 -0
  88. package/dist/state/uml.js +52 -0
  89. package/dist/state/video-section.d.ts +1 -0
  90. package/dist/state/video-section.js +1 -0
  91. package/dist/version.d.ts +1 -1
  92. package/dist/version.js +1 -1
  93. package/dist/with-resolvers.d.ts +5 -0
  94. package/dist/with-resolvers.js +13 -0
  95. package/dist/worker-server.js +2 -1
  96. package/dist/worker.js +1 -5
  97. package/package.json +3 -3
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emittedState = void 0;
4
+ const emittedState = () => {
5
+ const emittedFields = {
6
+ audioCodec: false,
7
+ container: false,
8
+ dimensions: false,
9
+ durationInSeconds: false,
10
+ fps: false,
11
+ internalStats: false,
12
+ isHdr: false,
13
+ location: false,
14
+ metadata: false,
15
+ mimeType: false,
16
+ name: false,
17
+ rotation: false,
18
+ size: false,
19
+ structure: false,
20
+ tracks: false,
21
+ videoCodec: false,
22
+ unrotatedDimensions: false,
23
+ slowDurationInSeconds: false,
24
+ slowFps: false,
25
+ slowKeyframes: false,
26
+ slowNumberOfFrames: false,
27
+ keyframes: false,
28
+ images: false,
29
+ numberOfAudioChannels: false,
30
+ sampleRate: false,
31
+ slowAudioBitrate: false,
32
+ slowVideoBitrate: false,
33
+ m3uStreams: false,
34
+ };
35
+ return emittedFields;
36
+ };
37
+ exports.emittedState = emittedState;
@@ -0,0 +1,4 @@
1
+ export declare const flacState: () => {
2
+ setBlockingBitStrategy: (strategy: number) => void;
3
+ getBlockingBitStrategy: () => number | undefined;
4
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.flacState = void 0;
4
+ const flacState = () => {
5
+ let blockingBitStrategy;
6
+ return {
7
+ setBlockingBitStrategy: (strategy) => {
8
+ blockingBitStrategy = strategy;
9
+ },
10
+ getBlockingBitStrategy: () => blockingBitStrategy,
11
+ };
12
+ };
13
+ exports.flacState = flacState;
@@ -0,0 +1,14 @@
1
+ import type { Options, ParseMediaFields } from '../fields';
2
+ import type { Track } from '../get-tracks';
3
+ import type { LogLevel } from '../log';
4
+ import type { ParseMediaSrc } from '../options';
5
+ import type { CanSkipTracksState } from './can-skip-tracks';
6
+ export declare const makeTracksSectionState: (canSkipTracksState: CanSkipTracksState, src: ParseMediaSrc) => {
7
+ hasAllTracks: () => boolean;
8
+ getIsDone: () => boolean;
9
+ setIsDone: (logLevel: LogLevel) => void;
10
+ addTrack: (track: Track) => void;
11
+ getTracks: () => Track[];
12
+ ensureHasTracksAtEnd: (fields: Options<ParseMediaFields>) => void;
13
+ };
14
+ export type TracksState = ReturnType<typeof makeTracksSectionState>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeTracksSectionState = void 0;
4
+ const log_1 = require("../log");
5
+ const makeTracksSectionState = (canSkipTracksState, src) => {
6
+ const tracks = [];
7
+ let doneWithTracks = false;
8
+ return {
9
+ hasAllTracks: () => doneWithTracks,
10
+ getIsDone: () => doneWithTracks,
11
+ setIsDone: (logLevel) => {
12
+ if (doneWithTracks) {
13
+ throw new Error('Error in Media Parser: Tracks have already been parsed');
14
+ }
15
+ log_1.Log.verbose(logLevel, 'All tracks have been parsed');
16
+ doneWithTracks = true;
17
+ },
18
+ addTrack: (track) => {
19
+ tracks.push(track);
20
+ },
21
+ getTracks: () => tracks,
22
+ ensureHasTracksAtEnd: (fields) => {
23
+ if (canSkipTracksState.canSkipTracks()) {
24
+ return;
25
+ }
26
+ if (!fields.tracks) {
27
+ return;
28
+ }
29
+ if (!doneWithTracks) {
30
+ throw new Error('Error in Media Parser: End of parsing of ' +
31
+ src +
32
+ ' has been reached, but no tracks have been found ');
33
+ }
34
+ },
35
+ };
36
+ };
37
+ exports.makeTracksSectionState = makeTracksSectionState;
@@ -0,0 +1,9 @@
1
+ export type MediaParserEmbeddedImage = {
2
+ description: string | null;
3
+ mimeType: string | null;
4
+ data: Uint8Array;
5
+ };
6
+ export declare const imagesState: () => {
7
+ images: MediaParserEmbeddedImage[];
8
+ addImage: (image: MediaParserEmbeddedImage) => void;
9
+ };
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.imagesState = void 0;
4
+ const imagesState = () => {
5
+ const images = [];
6
+ const addImage = (image) => {
7
+ images.push(image);
8
+ };
9
+ return {
10
+ images,
11
+ addImage,
12
+ };
13
+ };
14
+ exports.imagesState = imagesState;
@@ -0,0 +1,12 @@
1
+ import type { SamplePosition } from '../../get-sample-positions';
2
+ import type { AudioTrack, OtherTrack, VideoTrack } from '../../get-tracks';
3
+ import type { ParserState } from '../parser-state';
4
+ export type FlatSample = {
5
+ track: VideoTrack | AudioTrack | OtherTrack;
6
+ samplePosition: SamplePosition;
7
+ };
8
+ export declare const calculateFlatSamples: (state: ParserState) => any[];
9
+ export declare const cachedSamplePositionsState: () => {
10
+ getSamples: (mdatStart: number) => FlatSample[] | null;
11
+ setSamples: (mdatStart: number, samples: FlatSample[]) => void;
12
+ };
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cachedSamplePositionsState = exports.calculateFlatSamples = void 0;
4
+ const get_sample_positions_from_track_1 = require("../../containers/iso-base-media/get-sample-positions-from-track");
5
+ const traversal_1 = require("../../containers/iso-base-media/traversal");
6
+ const get_tracks_1 = require("../../get-tracks");
7
+ const calculateFlatSamples = (state) => {
8
+ const tracks = (0, get_tracks_1.getTracks)(state);
9
+ const allTracks = [
10
+ ...tracks.videoTracks,
11
+ ...tracks.audioTracks,
12
+ ...tracks.otherTracks,
13
+ ];
14
+ const flatSamples = allTracks
15
+ .map((track) => {
16
+ const { samplePositions } = (0, get_sample_positions_from_track_1.getSamplePositionsFromTrack)({
17
+ trakBox: track.trakBox,
18
+ moofBoxes: (0, traversal_1.getMoofBoxes)(state.structure.getIsoStructure().boxes),
19
+ tfraBoxes: (0, traversal_1.getTfraBoxes)(state.structure.getIsoStructure()),
20
+ });
21
+ return samplePositions.map((samplePosition) => {
22
+ return {
23
+ track,
24
+ samplePosition,
25
+ };
26
+ });
27
+ })
28
+ .flat(1);
29
+ return flatSamples;
30
+ };
31
+ exports.calculateFlatSamples = calculateFlatSamples;
32
+ const cachedSamplePositionsState = () => {
33
+ const cachedForMdatStart = {};
34
+ return {
35
+ getSamples: (mdatStart) => {
36
+ if (cachedForMdatStart[mdatStart]) {
37
+ return cachedForMdatStart[mdatStart];
38
+ }
39
+ return null;
40
+ },
41
+ setSamples: (mdatStart, samples) => {
42
+ cachedForMdatStart[mdatStart] = samples;
43
+ },
44
+ };
45
+ };
46
+ exports.cachedSamplePositionsState = cachedSamplePositionsState;
@@ -0,0 +1,24 @@
1
+ import type { MediaParserController } from '../../controller/media-parser-controller';
2
+ import type { LogLevel } from '../../log';
3
+ import type { ParseMediaSrc } from '../../options';
4
+ import type { ReaderInterface } from '../../readers/reader';
5
+ export declare const isoBaseMediaState: ({ contentLength, controller, readerInterface, src, logLevel, }: {
6
+ contentLength: number;
7
+ controller: MediaParserController;
8
+ readerInterface: ReaderInterface;
9
+ src: ParseMediaSrc;
10
+ logLevel: LogLevel;
11
+ }) => {
12
+ flatSamples: {
13
+ getSamples: (mdatStart: number) => import("./cached-sample-positions").FlatSample[] | null;
14
+ setSamples: (mdatStart: number, samples: import("./cached-sample-positions").FlatSample[]) => void;
15
+ };
16
+ moov: {
17
+ setMoovBox: (moov: MediaParserController) => void;
18
+ getMoovBox: () => any;
19
+ };
20
+ mfra: {
21
+ triggerLoad: () => Promise<IsoBaseMediaBox[] | null> | null;
22
+ };
23
+ };
24
+ export type IsoBaseMediaState = ReturnType<typeof isoBaseMediaState>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isoBaseMediaState = void 0;
4
+ const cached_sample_positions_1 = require("./cached-sample-positions");
5
+ const lazy_mfra_load_1 = require("./lazy-mfra-load");
6
+ const moov_box_1 = require("./moov-box");
7
+ const isoBaseMediaState = ({ contentLength, controller, readerInterface, src, logLevel, }) => {
8
+ return {
9
+ flatSamples: (0, cached_sample_positions_1.cachedSamplePositionsState)(),
10
+ moov: (0, moov_box_1.moovState)(),
11
+ mfra: (0, lazy_mfra_load_1.lazyMfraLoad)({
12
+ contentLength,
13
+ controller,
14
+ readerInterface,
15
+ src,
16
+ logLevel,
17
+ }),
18
+ };
19
+ };
20
+ exports.isoBaseMediaState = isoBaseMediaState;
@@ -0,0 +1,13 @@
1
+ import type { MediaParserController } from '../../controller/media-parser-controller';
2
+ import { type LogLevel } from '../../log';
3
+ import type { ParseMediaSrc } from '../../options';
4
+ import type { ReaderInterface } from '../../readers/reader';
5
+ export declare const lazyMfraLoad: ({ contentLength, controller, readerInterface, src, logLevel, }: {
6
+ contentLength: number;
7
+ controller: MediaParserController;
8
+ readerInterface: ReaderInterface;
9
+ src: ParseMediaSrc;
10
+ logLevel: LogLevel;
11
+ }) => {
12
+ triggerLoad: () => Promise<IsoBaseMediaBox[] | null> | null;
13
+ };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.lazyMfraLoad = void 0;
4
+ const get_mfra_seeking_box_1 = require("../../containers/iso-base-media/get-mfra-seeking-box");
5
+ const log_1 = require("../../log");
6
+ const lazyMfraLoad = ({ contentLength, controller, readerInterface, src, logLevel, }) => {
7
+ let prom = null;
8
+ const triggerLoad = () => {
9
+ if (prom) {
10
+ return prom;
11
+ }
12
+ log_1.Log.verbose(logLevel, 'Moof box found, trying to lazy load mfra');
13
+ prom = (0, get_mfra_seeking_box_1.getMfraSeekingBox)({
14
+ contentLength,
15
+ controller,
16
+ readerInterface,
17
+ src,
18
+ logLevel,
19
+ }).then((boxes) => {
20
+ log_1.Log.verbose(logLevel, 'Lazily found mfra atom.');
21
+ return boxes;
22
+ });
23
+ return prom;
24
+ };
25
+ return {
26
+ triggerLoad,
27
+ };
28
+ };
29
+ exports.lazyMfraLoad = lazyMfraLoad;
@@ -0,0 +1,5 @@
1
+ import type { MoovBox } from '../../containers/iso-base-media/moov/moov';
2
+ export declare const moovState: () => {
3
+ setMoovBox: (moov: MoovBox) => void;
4
+ getMoovBox: () => any;
5
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.moovState = void 0;
4
+ const moovState = () => {
5
+ let moovBox = null;
6
+ return {
7
+ setMoovBox: (moov) => {
8
+ moovBox = moov;
9
+ },
10
+ getMoovBox: () => moovBox,
11
+ };
12
+ };
13
+ exports.moovState = moovState;
@@ -0,0 +1,6 @@
1
+ import type { MediaParserKeyframe } from '../options';
2
+ export declare const keyframesState: () => {
3
+ addKeyframe: (keyframe: MediaParserKeyframe) => void;
4
+ getKeyframes: () => MediaParserKeyframe[];
5
+ };
6
+ export type KeyframesState = ReturnType<typeof keyframesState>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keyframesState = void 0;
4
+ const keyframesState = () => {
5
+ const keyframes = [];
6
+ return {
7
+ addKeyframe: (keyframe) => {
8
+ keyframes.push(keyframe);
9
+ },
10
+ getKeyframes: () => {
11
+ return keyframes;
12
+ },
13
+ };
14
+ };
15
+ exports.keyframesState = keyframesState;
@@ -0,0 +1,44 @@
1
+ import type { M3uAssociatedPlaylist, M3uStream } from '../containers/m3u/get-streams';
2
+ import type { LogLevel } from '../log';
3
+ import type { IsoBaseMediaStructure } from '../parse-result';
4
+ import type { OnAudioSample, OnVideoSample } from '../webcodec-sample-types';
5
+ export type M3uStreamOrInitialUrl = {
6
+ type: 'selected-stream';
7
+ stream: M3uStream;
8
+ } | {
9
+ type: 'initial-url';
10
+ url: string;
11
+ };
12
+ export type ExistingM3uRun = {
13
+ continue: () => Promise<ExistingM3uRun | null>;
14
+ abort: () => void;
15
+ };
16
+ export declare const m3uState: (logLevel: LogLevel) => {
17
+ setSelectedMainPlaylist: (stream: M3uStreamOrInitialUrl) => void;
18
+ getSelectedMainPlaylist: () => M3uStreamOrInitialUrl | null;
19
+ setHasEmittedVideoTrack: (src: string, callback: OnVideoSample | null) => void;
20
+ hasEmittedVideoTrack: (src: string) => any;
21
+ setHasEmittedAudioTrack: (src: string, callback: OnAudioSample | null) => void;
22
+ hasEmittedAudioTrack: (src: string) => any;
23
+ setHasEmittedDoneWithTracks: (src: string) => void;
24
+ hasEmittedDoneWithTracks: (src: string) => boolean;
25
+ setReadyToIterateOverM3u: () => void;
26
+ isReadyToIterateOverM3u: () => boolean;
27
+ setAllChunksProcessed: (src: string) => void;
28
+ getAllChunksProcessedForPlaylist: (src: string) => boolean;
29
+ getAllChunksProcessedOverall: () => boolean;
30
+ setHasFinishedManifest: () => void;
31
+ hasFinishedManifest: () => boolean;
32
+ setM3uStreamRun: (playlistUrl: string, run: ExistingM3uRun | null) => void;
33
+ setTracksDone: (playlistUrl: string) => boolean;
34
+ getTrackDone: (playlistUrl: string) => boolean;
35
+ getM3uStreamRun: (playlistUrl: string) => ExistingM3uRun;
36
+ abortM3UStreamRuns: () => void;
37
+ setAssociatedPlaylists: (playlists: M3uAssociatedPlaylist[]) => void;
38
+ getAssociatedPlaylists: () => M3uAssociatedPlaylist[] | null;
39
+ getSelectedPlaylists: () => any[];
40
+ sampleSorter: any;
41
+ setMp4HeaderSegment: (playlistUrl: string, structure: IsoBaseMediaStructure) => void;
42
+ getMp4HeaderSegment: (playlistUrl: string) => IsoBaseMediaStructure;
43
+ };
44
+ export type M3uState = ReturnType<typeof m3uState>;
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.m3uState = void 0;
4
+ const sample_sorter_1 = require("../containers/m3u/sample-sorter");
5
+ const log_1 = require("../log");
6
+ const m3uState = (logLevel) => {
7
+ let selectedMainPlaylist = null;
8
+ let associatedPlaylists = null;
9
+ const hasEmittedVideoTrack = {};
10
+ const hasEmittedAudioTrack = {};
11
+ const hasEmittedDoneWithTracks = {};
12
+ let hasFinishedManifest = false;
13
+ let readyToIterateOverM3u = false;
14
+ const allChunksProcessed = {};
15
+ const m3uStreamRuns = {};
16
+ const tracksDone = {};
17
+ const getMainPlaylistUrl = () => {
18
+ if (!selectedMainPlaylist) {
19
+ throw new Error('No main playlist selected');
20
+ }
21
+ const playlistUrl = selectedMainPlaylist.type === 'initial-url'
22
+ ? selectedMainPlaylist.url
23
+ : selectedMainPlaylist.stream.src;
24
+ return playlistUrl;
25
+ };
26
+ const getSelectedPlaylists = () => {
27
+ return [
28
+ getMainPlaylistUrl(),
29
+ ...(associatedPlaylists !== null && associatedPlaylists !== void 0 ? associatedPlaylists : []).map((p) => p.src),
30
+ ];
31
+ };
32
+ const getAllChunksProcessedForPlaylist = (src) => allChunksProcessed[src];
33
+ const mp4HeaderSegments = {};
34
+ const setMp4HeaderSegment = (playlistUrl, structure) => {
35
+ mp4HeaderSegments[playlistUrl] = structure;
36
+ };
37
+ const getMp4HeaderSegment = (playlistUrl) => {
38
+ return mp4HeaderSegments[playlistUrl];
39
+ };
40
+ return {
41
+ setSelectedMainPlaylist: (stream) => {
42
+ selectedMainPlaylist = stream;
43
+ },
44
+ getSelectedMainPlaylist: () => selectedMainPlaylist,
45
+ setHasEmittedVideoTrack: (src, callback) => {
46
+ hasEmittedVideoTrack[src] = callback;
47
+ },
48
+ hasEmittedVideoTrack: (src) => {
49
+ const value = hasEmittedVideoTrack[src];
50
+ if (value === undefined) {
51
+ return false;
52
+ }
53
+ return value;
54
+ },
55
+ setHasEmittedAudioTrack: (src, callback) => {
56
+ hasEmittedAudioTrack[src] = callback;
57
+ },
58
+ hasEmittedAudioTrack: (src) => {
59
+ const value = hasEmittedAudioTrack[src];
60
+ if (value === undefined) {
61
+ return false;
62
+ }
63
+ return value;
64
+ },
65
+ setHasEmittedDoneWithTracks: (src) => {
66
+ hasEmittedDoneWithTracks[src] = true;
67
+ },
68
+ hasEmittedDoneWithTracks: (src) => hasEmittedDoneWithTracks[src] !== undefined,
69
+ setReadyToIterateOverM3u: () => {
70
+ readyToIterateOverM3u = true;
71
+ },
72
+ isReadyToIterateOverM3u: () => readyToIterateOverM3u,
73
+ setAllChunksProcessed: (src) => {
74
+ allChunksProcessed[src] = true;
75
+ },
76
+ getAllChunksProcessedForPlaylist,
77
+ getAllChunksProcessedOverall: () => {
78
+ if (!selectedMainPlaylist) {
79
+ return false;
80
+ }
81
+ const selectedPlaylists = getSelectedPlaylists();
82
+ return selectedPlaylists.every((url) => allChunksProcessed[url]);
83
+ },
84
+ setHasFinishedManifest: () => {
85
+ hasFinishedManifest = true;
86
+ },
87
+ hasFinishedManifest: () => hasFinishedManifest,
88
+ setM3uStreamRun: (playlistUrl, run) => {
89
+ if (!run) {
90
+ delete m3uStreamRuns[playlistUrl];
91
+ return;
92
+ }
93
+ m3uStreamRuns[playlistUrl] = run;
94
+ },
95
+ setTracksDone: (playlistUrl) => {
96
+ tracksDone[playlistUrl] = true;
97
+ const selectedPlaylists = getSelectedPlaylists();
98
+ return selectedPlaylists.every((url) => tracksDone[url]);
99
+ },
100
+ getTrackDone: (playlistUrl) => {
101
+ return tracksDone[playlistUrl];
102
+ },
103
+ getM3uStreamRun: (playlistUrl) => { var _a; return (_a = m3uStreamRuns[playlistUrl]) !== null && _a !== void 0 ? _a : null; },
104
+ abortM3UStreamRuns: () => {
105
+ const values = Object.values(m3uStreamRuns);
106
+ if (values.length === 0) {
107
+ return;
108
+ }
109
+ log_1.Log.trace(logLevel, `Aborting ${values.length} M3U stream runs`);
110
+ values.forEach((run) => {
111
+ run.abort();
112
+ });
113
+ },
114
+ setAssociatedPlaylists: (playlists) => {
115
+ associatedPlaylists = playlists;
116
+ },
117
+ getAssociatedPlaylists: () => associatedPlaylists,
118
+ getSelectedPlaylists,
119
+ sampleSorter: (0, sample_sorter_1.sampleSorter)({ logLevel, getAllChunksProcessedForPlaylist }),
120
+ setMp4HeaderSegment,
121
+ getMp4HeaderSegment,
122
+ };
123
+ };
124
+ exports.m3uState = m3uState;
@@ -0,0 +1,4 @@
1
+ import type { ParserState } from './parser-state';
2
+ export declare const maySkipVideoData: ({ state }: {
3
+ state: ParserState;
4
+ }) => boolean;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maySkipVideoData = void 0;
4
+ const need_samples_for_fields_1 = require("./need-samples-for-fields");
5
+ const maySkipVideoData = ({ state }) => {
6
+ const hasAllTracksAndNoCallbacks = state.callbacks.tracks.hasAllTracks() &&
7
+ Object.values(state.callbacks.videoSampleCallbacks).length === 0 &&
8
+ Object.values(state.callbacks.audioSampleCallbacks).length === 0;
9
+ const hasNoTrackHandlers = !state.callbacks.hasAudioTrackHandlers &&
10
+ !state.callbacks.hasVideoTrackHandlers;
11
+ const noCallbacksNeeded = hasNoTrackHandlers || hasAllTracksAndNoCallbacks;
12
+ return (noCallbacksNeeded &&
13
+ !(0, need_samples_for_fields_1.needsToIterateOverSamples)({
14
+ emittedFields: state.emittedFields,
15
+ fields: state.fields,
16
+ }));
17
+ };
18
+ exports.maySkipVideoData = maySkipVideoData;
@@ -0,0 +1,15 @@
1
+ export type Mp3Info = {
2
+ sampleRate: number;
3
+ mpegVersion: 1 | 2;
4
+ layer: number;
5
+ startOfMpegStream: number;
6
+ };
7
+ export type Mp3CbrInfo = {
8
+ bitrateKbit: number;
9
+ };
10
+ export declare const makeMp3State: () => {
11
+ getMp3Info: () => Mp3Info | null;
12
+ setMp3Info: (info: Mp3Info) => void;
13
+ getCbrMp3Info: () => Mp3CbrInfo | null;
14
+ setCbrMp3Info: (info: Mp3CbrInfo) => void;
15
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeMp3State = void 0;
4
+ const makeMp3State = () => {
5
+ let mp3Info = null;
6
+ // cbr = constant bit rate
7
+ let cbrMp3Info = null;
8
+ return {
9
+ getMp3Info: () => mp3Info,
10
+ setMp3Info: (info) => {
11
+ mp3Info = info;
12
+ },
13
+ getCbrMp3Info: () => cbrMp3Info,
14
+ setCbrMp3Info: (info) => {
15
+ cbrMp3Info = info;
16
+ },
17
+ };
18
+ };
19
+ exports.makeMp3State = makeMp3State;
@@ -0,0 +1,6 @@
1
+ import type { AllOptions, Options, ParseMediaFields } from '../fields';
2
+ export declare const fieldsNeedSamplesMap: Record<keyof Options<ParseMediaFields>, boolean>;
3
+ export declare const needsToIterateOverSamples: ({ fields, emittedFields, }: {
4
+ fields: Options<ParseMediaFields>;
5
+ emittedFields: AllOptions<ParseMediaFields>;
6
+ }) => boolean;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.needsToIterateOverSamples = exports.fieldsNeedSamplesMap = void 0;
4
+ exports.fieldsNeedSamplesMap = {
5
+ slowDurationInSeconds: true,
6
+ slowFps: true,
7
+ slowKeyframes: true,
8
+ slowNumberOfFrames: true,
9
+ audioCodec: false,
10
+ container: false,
11
+ dimensions: false,
12
+ durationInSeconds: false,
13
+ fps: false,
14
+ internalStats: false,
15
+ isHdr: false,
16
+ name: false,
17
+ rotation: false,
18
+ size: false,
19
+ structure: false,
20
+ tracks: false,
21
+ unrotatedDimensions: false,
22
+ videoCodec: false,
23
+ metadata: false,
24
+ location: false,
25
+ mimeType: false,
26
+ keyframes: false,
27
+ images: false,
28
+ numberOfAudioChannels: false,
29
+ sampleRate: false,
30
+ slowAudioBitrate: true,
31
+ slowVideoBitrate: true,
32
+ m3uStreams: false,
33
+ };
34
+ const needsToIterateOverSamples = ({ fields, emittedFields, }) => {
35
+ const keys = Object.keys(fields !== null && fields !== void 0 ? fields : {});
36
+ const selectedKeys = keys.filter((k) => fields[k]);
37
+ return selectedKeys.some((k) => exports.fieldsNeedSamplesMap[k] && !emittedFields[k]);
38
+ };
39
+ exports.needsToIterateOverSamples = needsToIterateOverSamples;