@remotion/media-parser 4.0.339 → 4.0.341
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.
- package/dist/containers/iso-base-media/mdat/calculate-jump-marks.d.ts +1 -6
- package/dist/containers/iso-base-media/mdat/calculate-jump-marks.js +45 -36
- package/dist/containers/iso-base-media/mvhd.d.ts +30 -0
- package/dist/containers/iso-base-media/mvhd.js +65 -0
- package/dist/containers/mp3/parse-packet-header.js +6 -3
- package/dist/containers/mp3/seek/wait-until-syncword.js +3 -0
- package/dist/esm/index.mjs +9 -8
- package/dist/esm/worker-server-entry.mjs +8 -7
- package/dist/esm/worker-web-entry.mjs +8 -7
- package/dist/esm/worker.mjs +9 -1
- package/dist/metadata/get-metadata.js +3 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker.d.ts +1 -0
- package/dist/worker.js +7 -1
- package/package.json +3 -3
|
@@ -3,9 +3,4 @@ export type JumpMark = {
|
|
|
3
3
|
afterSampleWithOffset: number;
|
|
4
4
|
jumpToOffset: number;
|
|
5
5
|
};
|
|
6
|
-
export declare const calculateJumpMarks: (
|
|
7
|
-
sampleMap: Map<number, MinimalFlatSampleForTesting>;
|
|
8
|
-
offsetsSorted: number[];
|
|
9
|
-
trackIds: number[];
|
|
10
|
-
endOfMdat: number;
|
|
11
|
-
}) => JumpMark[];
|
|
6
|
+
export declare const calculateJumpMarks: (samplePositionTracks: MinimalFlatSampleForTesting[][], endOfMdat: number) => JumpMark[];
|
|
@@ -13,38 +13,33 @@ exports.calculateJumpMarks = void 0;
|
|
|
13
13
|
// Therefore, we need to emit them to be less than 10 seconds apart
|
|
14
14
|
const MAX_SPREAD_IN_SECONDS = 8;
|
|
15
15
|
const getKey = (samplePositionTrack) => {
|
|
16
|
-
return `${samplePositionTrack.track.trackId}-${samplePositionTrack.samplePosition.decodingTimestamp}
|
|
16
|
+
return `${samplePositionTrack.track.trackId}-${samplePositionTrack.samplePosition.decodingTimestamp}`;
|
|
17
17
|
};
|
|
18
|
-
const findBestJump = ({
|
|
18
|
+
const findBestJump = ({ allSamplesSortedByOffset, visited, progresses, }) => {
|
|
19
19
|
var _a;
|
|
20
20
|
const minProgress = Math.min(...Object.values(progresses));
|
|
21
21
|
const trackNumberWithLowestProgress = (_a = Object.entries(progresses).find(([, progress]) => progress === minProgress)) === null || _a === void 0 ? void 0 : _a[0];
|
|
22
|
-
const firstSampleAboveMinProgress =
|
|
23
|
-
|
|
24
|
-
!visited.has(getKey(sampleMap.get(offset))));
|
|
25
|
-
if (firstSampleAboveMinProgress === -1) {
|
|
26
|
-
// Track might be done, so we don't care about minimum progress
|
|
27
|
-
// then
|
|
28
|
-
const backup = offsetsSorted.findIndex((offset) => !visited.has(getKey(sampleMap.get(offset))));
|
|
29
|
-
if (backup === -1) {
|
|
30
|
-
throw new Error('this should not happen');
|
|
31
|
-
}
|
|
32
|
-
return backup;
|
|
33
|
-
}
|
|
22
|
+
const firstSampleAboveMinProgress = allSamplesSortedByOffset.findIndex((sample) => sample.track.trackId === Number(trackNumberWithLowestProgress) &&
|
|
23
|
+
!visited.has(getKey(sample)));
|
|
34
24
|
return firstSampleAboveMinProgress;
|
|
35
25
|
};
|
|
36
|
-
const calculateJumpMarks = (
|
|
26
|
+
const calculateJumpMarks = (samplePositionTracks, endOfMdat) => {
|
|
37
27
|
const progresses = {};
|
|
38
|
-
for (const
|
|
39
|
-
progresses[trackId] = 0;
|
|
28
|
+
for (const track of samplePositionTracks) {
|
|
29
|
+
progresses[track[0].track.trackId] = 0;
|
|
40
30
|
}
|
|
41
31
|
const jumpMarks = [];
|
|
32
|
+
const allSamplesSortedByOffset = samplePositionTracks
|
|
33
|
+
.flat(1)
|
|
34
|
+
.sort((a, b) => a.samplePosition.offset - b.samplePosition.offset);
|
|
42
35
|
let indexToVisit = 0;
|
|
43
36
|
const visited = new Set();
|
|
37
|
+
let rollOverToProcess = false;
|
|
44
38
|
const increaseIndex = () => {
|
|
45
39
|
indexToVisit++;
|
|
46
|
-
if (indexToVisit >=
|
|
47
|
-
|
|
40
|
+
if (indexToVisit >= allSamplesSortedByOffset.length) {
|
|
41
|
+
rollOverToProcess = true;
|
|
42
|
+
indexToVisit = 0;
|
|
48
43
|
}
|
|
49
44
|
};
|
|
50
45
|
let lastVisitedSample = null;
|
|
@@ -54,44 +49,61 @@ const calculateJumpMarks = ({ sampleMap, offsetsSorted, trackIds, endOfMdat, })
|
|
|
54
49
|
}
|
|
55
50
|
const jumpMark = {
|
|
56
51
|
afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
|
|
57
|
-
jumpToOffset:
|
|
52
|
+
jumpToOffset: allSamplesSortedByOffset[firstSampleAboveMinProgress].samplePosition
|
|
53
|
+
.offset,
|
|
58
54
|
};
|
|
59
|
-
if (firstSampleAboveMinProgress ===
|
|
60
|
-
offsetsSorted.indexOf(lastVisitedSample.samplePosition.offset) + 1) {
|
|
61
|
-
indexToVisit = firstSampleAboveMinProgress;
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
55
|
indexToVisit = firstSampleAboveMinProgress;
|
|
65
56
|
jumpMarks.push(jumpMark);
|
|
66
57
|
};
|
|
67
58
|
const addFinalJumpIfNecessary = () => {
|
|
68
|
-
if (indexToVisit ===
|
|
59
|
+
if (indexToVisit === allSamplesSortedByOffset.length - 1) {
|
|
69
60
|
return;
|
|
70
61
|
}
|
|
71
62
|
jumpMarks.push({
|
|
72
|
-
afterSampleWithOffset:
|
|
63
|
+
afterSampleWithOffset: allSamplesSortedByOffset[indexToVisit].samplePosition.offset,
|
|
73
64
|
jumpToOffset: endOfMdat,
|
|
74
65
|
});
|
|
75
66
|
};
|
|
76
67
|
const considerJump = () => {
|
|
77
68
|
const firstSampleAboveMinProgress = findBestJump({
|
|
78
|
-
|
|
79
|
-
offsetsSorted,
|
|
69
|
+
allSamplesSortedByOffset,
|
|
80
70
|
visited,
|
|
81
71
|
progresses,
|
|
82
72
|
});
|
|
83
|
-
|
|
73
|
+
if (firstSampleAboveMinProgress > -1 &&
|
|
74
|
+
firstSampleAboveMinProgress !== indexToVisit + 1) {
|
|
75
|
+
addJumpMark({ firstSampleAboveMinProgress });
|
|
76
|
+
indexToVisit = firstSampleAboveMinProgress;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
while (true) {
|
|
80
|
+
increaseIndex();
|
|
81
|
+
if (!visited.has(getKey(allSamplesSortedByOffset[indexToVisit]))) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
84
86
|
};
|
|
85
87
|
while (true) {
|
|
86
|
-
const currentSamplePosition =
|
|
88
|
+
const currentSamplePosition = allSamplesSortedByOffset[indexToVisit];
|
|
87
89
|
const sampleKey = getKey(currentSamplePosition);
|
|
88
90
|
if (visited.has(sampleKey)) {
|
|
89
91
|
considerJump();
|
|
90
92
|
continue;
|
|
91
93
|
}
|
|
92
94
|
visited.add(sampleKey);
|
|
95
|
+
if (rollOverToProcess) {
|
|
96
|
+
if (!lastVisitedSample) {
|
|
97
|
+
throw new Error('no last visited sample');
|
|
98
|
+
}
|
|
99
|
+
jumpMarks.push({
|
|
100
|
+
afterSampleWithOffset: lastVisitedSample.samplePosition.offset,
|
|
101
|
+
jumpToOffset: currentSamplePosition.samplePosition.offset,
|
|
102
|
+
});
|
|
103
|
+
rollOverToProcess = false;
|
|
104
|
+
}
|
|
93
105
|
lastVisitedSample = currentSamplePosition;
|
|
94
|
-
if (visited.size ===
|
|
106
|
+
if (visited.size === allSamplesSortedByOffset.length) {
|
|
95
107
|
addFinalJumpIfNecessary();
|
|
96
108
|
break;
|
|
97
109
|
}
|
|
@@ -102,7 +114,7 @@ const calculateJumpMarks = ({ sampleMap, offsetsSorted, trackIds, endOfMdat, })
|
|
|
102
114
|
const maxProgress = Math.max(...progressValues);
|
|
103
115
|
const minProgress = Math.min(...progressValues);
|
|
104
116
|
const spread = maxProgress - minProgress;
|
|
105
|
-
if (visited.size ===
|
|
117
|
+
if (visited.size === allSamplesSortedByOffset.length) {
|
|
106
118
|
addFinalJumpIfNecessary();
|
|
107
119
|
break;
|
|
108
120
|
}
|
|
@@ -110,9 +122,6 @@ const calculateJumpMarks = ({ sampleMap, offsetsSorted, trackIds, endOfMdat, })
|
|
|
110
122
|
if (spread > MAX_SPREAD_IN_SECONDS) {
|
|
111
123
|
considerJump();
|
|
112
124
|
}
|
|
113
|
-
else if (indexToVisit === offsetsSorted.length - 1) {
|
|
114
|
-
considerJump();
|
|
115
|
-
}
|
|
116
125
|
else {
|
|
117
126
|
increaseIndex();
|
|
118
127
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BufferIterator } from '../../iterator/buffer-iterator';
|
|
2
|
+
import type { BaseBox } from './base-type';
|
|
3
|
+
export type ThreeDMatrix = [
|
|
4
|
+
number,
|
|
5
|
+
number,
|
|
6
|
+
number,
|
|
7
|
+
number,
|
|
8
|
+
number,
|
|
9
|
+
number,
|
|
10
|
+
number,
|
|
11
|
+
number,
|
|
12
|
+
number
|
|
13
|
+
];
|
|
14
|
+
export interface MvhdBox extends BaseBox {
|
|
15
|
+
durationInUnits: number;
|
|
16
|
+
durationInSeconds: number;
|
|
17
|
+
creationTime: number | null;
|
|
18
|
+
modificationTime: number | null;
|
|
19
|
+
timeScale: number;
|
|
20
|
+
rate: number;
|
|
21
|
+
volume: number;
|
|
22
|
+
matrix: ThreeDMatrix;
|
|
23
|
+
nextTrackId: number;
|
|
24
|
+
type: 'mvhd-box';
|
|
25
|
+
}
|
|
26
|
+
export declare const parseMvhd: ({ iterator, offset, size, }: {
|
|
27
|
+
iterator: BufferIterator;
|
|
28
|
+
offset: number;
|
|
29
|
+
size: number;
|
|
30
|
+
}) => MvhdBox;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseMvhd = void 0;
|
|
4
|
+
const buffer_iterator_1 = require("../../iterator/buffer-iterator");
|
|
5
|
+
const to_date_1 = require("./to-date");
|
|
6
|
+
const parseMvhd = ({ iterator, offset, size, }) => {
|
|
7
|
+
const version = iterator.getUint8();
|
|
8
|
+
// Flags, we discard them
|
|
9
|
+
iterator.discard(3);
|
|
10
|
+
const creationTime = version === 1 ? iterator.getUint64() : iterator.getUint32();
|
|
11
|
+
const modificationTime = version === 1 ? iterator.getUint64() : iterator.getUint32();
|
|
12
|
+
const timeScale = iterator.getUint32();
|
|
13
|
+
const durationInUnits = version === 1 ? iterator.getUint64() : iterator.getUint32();
|
|
14
|
+
const durationInSeconds = Number(durationInUnits) / timeScale;
|
|
15
|
+
const rateArray = iterator.getSlice(4);
|
|
16
|
+
const rateView = (0, buffer_iterator_1.getArrayBufferIterator)(rateArray, rateArray.length);
|
|
17
|
+
const rate = rateView.getInt8() * 10 +
|
|
18
|
+
rateView.getInt8() +
|
|
19
|
+
rateView.getInt8() * 0.1 +
|
|
20
|
+
rateView.getInt8() * 0.01;
|
|
21
|
+
const volumeArray = iterator.getSlice(2);
|
|
22
|
+
const volumeView = (0, buffer_iterator_1.getArrayBufferIterator)(volumeArray, volumeArray.length);
|
|
23
|
+
const volume = volumeView.getInt8() + volumeView.getInt8() * 0.1;
|
|
24
|
+
// reserved 16bit
|
|
25
|
+
iterator.discard(2);
|
|
26
|
+
// reserved 32bit x2
|
|
27
|
+
iterator.discard(4);
|
|
28
|
+
iterator.discard(4);
|
|
29
|
+
// matrix
|
|
30
|
+
const matrix = [
|
|
31
|
+
iterator.getFixedPointSigned1616Number(),
|
|
32
|
+
iterator.getFixedPointSigned1616Number(),
|
|
33
|
+
iterator.getFixedPointSigned230Number(),
|
|
34
|
+
iterator.getFixedPointSigned1616Number(),
|
|
35
|
+
iterator.getFixedPointSigned1616Number(),
|
|
36
|
+
iterator.getFixedPointSigned230Number(),
|
|
37
|
+
iterator.getFixedPointSigned1616Number(),
|
|
38
|
+
iterator.getFixedPointSigned1616Number(),
|
|
39
|
+
iterator.getFixedPointSigned230Number(),
|
|
40
|
+
];
|
|
41
|
+
// pre-defined
|
|
42
|
+
iterator.discard(4 * 6);
|
|
43
|
+
// next track id
|
|
44
|
+
const nextTrackId = iterator.getUint32();
|
|
45
|
+
volumeView.destroy();
|
|
46
|
+
const bytesRemaining = size - (iterator.counter.getOffset() - offset);
|
|
47
|
+
if (bytesRemaining !== 0) {
|
|
48
|
+
throw new Error('expected 0 bytes ' + bytesRemaining);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
creationTime: (0, to_date_1.toUnixTimestamp)(Number(creationTime)),
|
|
52
|
+
modificationTime: (0, to_date_1.toUnixTimestamp)(Number(modificationTime)),
|
|
53
|
+
timeScale,
|
|
54
|
+
durationInUnits: Number(durationInUnits),
|
|
55
|
+
durationInSeconds,
|
|
56
|
+
rate,
|
|
57
|
+
volume,
|
|
58
|
+
matrix: matrix,
|
|
59
|
+
nextTrackId,
|
|
60
|
+
type: 'mvhd-box',
|
|
61
|
+
boxSize: size,
|
|
62
|
+
offset,
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
exports.parseMvhd = parseMvhd;
|
|
@@ -155,7 +155,9 @@ const innerParseMp3PacketHeader = (iterator) => {
|
|
|
155
155
|
10 - MPEG Version 2 (ISO/IEC 13818-3)
|
|
156
156
|
11 - MPEG Version 1 (ISO/IEC 11172-3)
|
|
157
157
|
*/
|
|
158
|
-
if (audioVersionId !== 0b11 &&
|
|
158
|
+
if (audioVersionId !== 0b11 &&
|
|
159
|
+
audioVersionId !== 0b10 &&
|
|
160
|
+
audioVersionId !== 0b00) {
|
|
159
161
|
throw new Error('Expected MPEG Version 1 or 2');
|
|
160
162
|
}
|
|
161
163
|
const mpegVersion = audioVersionId === 0b11 ? 1 : 2;
|
|
@@ -175,7 +177,7 @@ const innerParseMp3PacketHeader = (iterator) => {
|
|
|
175
177
|
const bitrateInKbit = getBitrateKB({
|
|
176
178
|
bits: bitrateIndex,
|
|
177
179
|
mpegVersion,
|
|
178
|
-
level:
|
|
180
|
+
level: layer,
|
|
179
181
|
});
|
|
180
182
|
if (bitrateInKbit === 'bad') {
|
|
181
183
|
throw new Error('Invalid bitrate');
|
|
@@ -184,10 +186,11 @@ const innerParseMp3PacketHeader = (iterator) => {
|
|
|
184
186
|
throw new Error('Free bitrate not supported');
|
|
185
187
|
}
|
|
186
188
|
const samplingFrequencyIndex = iterator.getBits(2);
|
|
187
|
-
const
|
|
189
|
+
const baseSampleRate = getSamplingFrequency({
|
|
188
190
|
bits: samplingFrequencyIndex,
|
|
189
191
|
mpegVersion,
|
|
190
192
|
});
|
|
193
|
+
const sampleRate = audioVersionId === 0b00 ? baseSampleRate / 2 : baseSampleRate;
|
|
191
194
|
const padding = Boolean(iterator.getBits(1));
|
|
192
195
|
iterator.getBits(1); // private bit
|
|
193
196
|
const channelMode = iterator.getBits(2); // channel mode
|
|
@@ -8,6 +8,9 @@ const discardUntilSyncword = ({ iterator, }) => {
|
|
|
8
8
|
if (next2Bytes !== 0xff) {
|
|
9
9
|
continue;
|
|
10
10
|
}
|
|
11
|
+
if (iterator.bytesRemaining() === 0) {
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
11
14
|
const nextByte = iterator.getUint8();
|
|
12
15
|
const mask = 0xe0; // 1110 0000
|
|
13
16
|
if ((nextByte & mask) !== mask) {
|
package/dist/esm/index.mjs
CHANGED
|
@@ -8247,10 +8247,7 @@ var getMetadata = (state) => {
|
|
|
8247
8247
|
}
|
|
8248
8248
|
if (structure.type === "mp3") {
|
|
8249
8249
|
const tags2 = getMetadataFromMp3(structure);
|
|
8250
|
-
|
|
8251
|
-
throw new Error("Failed to get metadata from mp3");
|
|
8252
|
-
}
|
|
8253
|
-
return tags2;
|
|
8250
|
+
return tags2 ?? [];
|
|
8254
8251
|
}
|
|
8255
8252
|
if (structure.type === "wav") {
|
|
8256
8253
|
return getMetadataFromWav(structure) ?? [];
|
|
@@ -13418,7 +13415,7 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13418
13415
|
}
|
|
13419
13416
|
}
|
|
13420
13417
|
const audioVersionId = iterator.getBits(2);
|
|
13421
|
-
if (audioVersionId !== 3 && audioVersionId !== 2) {
|
|
13418
|
+
if (audioVersionId !== 3 && audioVersionId !== 2 && audioVersionId !== 0) {
|
|
13422
13419
|
throw new Error("Expected MPEG Version 1 or 2");
|
|
13423
13420
|
}
|
|
13424
13421
|
const mpegVersion = audioVersionId === 3 ? 1 : 2;
|
|
@@ -13432,7 +13429,7 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13432
13429
|
const bitrateInKbit = getBitrateKB({
|
|
13433
13430
|
bits: bitrateIndex,
|
|
13434
13431
|
mpegVersion,
|
|
13435
|
-
level:
|
|
13432
|
+
level: layer
|
|
13436
13433
|
});
|
|
13437
13434
|
if (bitrateInKbit === "bad") {
|
|
13438
13435
|
throw new Error("Invalid bitrate");
|
|
@@ -13441,10 +13438,11 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13441
13438
|
throw new Error("Free bitrate not supported");
|
|
13442
13439
|
}
|
|
13443
13440
|
const samplingFrequencyIndex = iterator.getBits(2);
|
|
13444
|
-
const
|
|
13441
|
+
const baseSampleRate = getSamplingFrequency({
|
|
13445
13442
|
bits: samplingFrequencyIndex,
|
|
13446
13443
|
mpegVersion
|
|
13447
13444
|
});
|
|
13445
|
+
const sampleRate = audioVersionId === 0 ? baseSampleRate / 2 : baseSampleRate;
|
|
13448
13446
|
const padding = Boolean(iterator.getBits(1));
|
|
13449
13447
|
iterator.getBits(1);
|
|
13450
13448
|
const channelMode = iterator.getBits(2);
|
|
@@ -13709,6 +13707,9 @@ var discardUntilSyncword = ({
|
|
|
13709
13707
|
if (next2Bytes !== 255) {
|
|
13710
13708
|
continue;
|
|
13711
13709
|
}
|
|
13710
|
+
if (iterator.bytesRemaining() === 0) {
|
|
13711
|
+
break;
|
|
13712
|
+
}
|
|
13712
13713
|
const nextByte = iterator.getUint8();
|
|
13713
13714
|
const mask = 224;
|
|
13714
13715
|
if ((nextByte & mask) !== mask) {
|
|
@@ -18185,7 +18186,7 @@ var downloadAndParseMedia = async (options) => {
|
|
|
18185
18186
|
return returnValue;
|
|
18186
18187
|
};
|
|
18187
18188
|
// src/version.ts
|
|
18188
|
-
var VERSION = "4.0.
|
|
18189
|
+
var VERSION = "4.0.341";
|
|
18189
18190
|
|
|
18190
18191
|
// src/index.ts
|
|
18191
18192
|
var MediaParserInternals = {
|
|
@@ -5871,10 +5871,7 @@ var getMetadata = (state) => {
|
|
|
5871
5871
|
}
|
|
5872
5872
|
if (structure.type === "mp3") {
|
|
5873
5873
|
const tags2 = getMetadataFromMp3(structure);
|
|
5874
|
-
|
|
5875
|
-
throw new Error("Failed to get metadata from mp3");
|
|
5876
|
-
}
|
|
5877
|
-
return tags2;
|
|
5874
|
+
return tags2 ?? [];
|
|
5878
5875
|
}
|
|
5879
5876
|
if (structure.type === "wav") {
|
|
5880
5877
|
return getMetadataFromWav(structure) ?? [];
|
|
@@ -13149,7 +13146,7 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13149
13146
|
}
|
|
13150
13147
|
}
|
|
13151
13148
|
const audioVersionId = iterator.getBits(2);
|
|
13152
|
-
if (audioVersionId !== 3 && audioVersionId !== 2) {
|
|
13149
|
+
if (audioVersionId !== 3 && audioVersionId !== 2 && audioVersionId !== 0) {
|
|
13153
13150
|
throw new Error("Expected MPEG Version 1 or 2");
|
|
13154
13151
|
}
|
|
13155
13152
|
const mpegVersion = audioVersionId === 3 ? 1 : 2;
|
|
@@ -13163,7 +13160,7 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13163
13160
|
const bitrateInKbit = getBitrateKB({
|
|
13164
13161
|
bits: bitrateIndex,
|
|
13165
13162
|
mpegVersion,
|
|
13166
|
-
level:
|
|
13163
|
+
level: layer
|
|
13167
13164
|
});
|
|
13168
13165
|
if (bitrateInKbit === "bad") {
|
|
13169
13166
|
throw new Error("Invalid bitrate");
|
|
@@ -13172,10 +13169,11 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13172
13169
|
throw new Error("Free bitrate not supported");
|
|
13173
13170
|
}
|
|
13174
13171
|
const samplingFrequencyIndex = iterator.getBits(2);
|
|
13175
|
-
const
|
|
13172
|
+
const baseSampleRate = getSamplingFrequency({
|
|
13176
13173
|
bits: samplingFrequencyIndex,
|
|
13177
13174
|
mpegVersion
|
|
13178
13175
|
});
|
|
13176
|
+
const sampleRate = audioVersionId === 0 ? baseSampleRate / 2 : baseSampleRate;
|
|
13179
13177
|
const padding = Boolean(iterator.getBits(1));
|
|
13180
13178
|
iterator.getBits(1);
|
|
13181
13179
|
const channelMode = iterator.getBits(2);
|
|
@@ -13440,6 +13438,9 @@ var discardUntilSyncword = ({
|
|
|
13440
13438
|
if (next2Bytes !== 255) {
|
|
13441
13439
|
continue;
|
|
13442
13440
|
}
|
|
13441
|
+
if (iterator.bytesRemaining() === 0) {
|
|
13442
|
+
break;
|
|
13443
|
+
}
|
|
13443
13444
|
const nextByte = iterator.getUint8();
|
|
13444
13445
|
const mask = 224;
|
|
13445
13446
|
if ((nextByte & mask) !== mask) {
|
|
@@ -5768,10 +5768,7 @@ var getMetadata = (state) => {
|
|
|
5768
5768
|
}
|
|
5769
5769
|
if (structure.type === "mp3") {
|
|
5770
5770
|
const tags2 = getMetadataFromMp3(structure);
|
|
5771
|
-
|
|
5772
|
-
throw new Error("Failed to get metadata from mp3");
|
|
5773
|
-
}
|
|
5774
|
-
return tags2;
|
|
5771
|
+
return tags2 ?? [];
|
|
5775
5772
|
}
|
|
5776
5773
|
if (structure.type === "wav") {
|
|
5777
5774
|
return getMetadataFromWav(structure) ?? [];
|
|
@@ -13018,7 +13015,7 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13018
13015
|
}
|
|
13019
13016
|
}
|
|
13020
13017
|
const audioVersionId = iterator.getBits(2);
|
|
13021
|
-
if (audioVersionId !== 3 && audioVersionId !== 2) {
|
|
13018
|
+
if (audioVersionId !== 3 && audioVersionId !== 2 && audioVersionId !== 0) {
|
|
13022
13019
|
throw new Error("Expected MPEG Version 1 or 2");
|
|
13023
13020
|
}
|
|
13024
13021
|
const mpegVersion = audioVersionId === 3 ? 1 : 2;
|
|
@@ -13032,7 +13029,7 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13032
13029
|
const bitrateInKbit = getBitrateKB({
|
|
13033
13030
|
bits: bitrateIndex,
|
|
13034
13031
|
mpegVersion,
|
|
13035
|
-
level:
|
|
13032
|
+
level: layer
|
|
13036
13033
|
});
|
|
13037
13034
|
if (bitrateInKbit === "bad") {
|
|
13038
13035
|
throw new Error("Invalid bitrate");
|
|
@@ -13041,10 +13038,11 @@ var innerParseMp3PacketHeader = (iterator) => {
|
|
|
13041
13038
|
throw new Error("Free bitrate not supported");
|
|
13042
13039
|
}
|
|
13043
13040
|
const samplingFrequencyIndex = iterator.getBits(2);
|
|
13044
|
-
const
|
|
13041
|
+
const baseSampleRate = getSamplingFrequency({
|
|
13045
13042
|
bits: samplingFrequencyIndex,
|
|
13046
13043
|
mpegVersion
|
|
13047
13044
|
});
|
|
13045
|
+
const sampleRate = audioVersionId === 0 ? baseSampleRate / 2 : baseSampleRate;
|
|
13048
13046
|
const padding = Boolean(iterator.getBits(1));
|
|
13049
13047
|
iterator.getBits(1);
|
|
13050
13048
|
const channelMode = iterator.getBits(2);
|
|
@@ -13309,6 +13307,9 @@ var discardUntilSyncword = ({
|
|
|
13309
13307
|
if (next2Bytes !== 255) {
|
|
13310
13308
|
continue;
|
|
13311
13309
|
}
|
|
13310
|
+
if (iterator.bytesRemaining() === 0) {
|
|
13311
|
+
break;
|
|
13312
|
+
}
|
|
13312
13313
|
const nextByte = iterator.getUint8();
|
|
13313
13314
|
const mask = 224;
|
|
13314
13315
|
if ((nextByte & mask) !== mask) {
|
package/dist/esm/worker.mjs
CHANGED
|
@@ -86,6 +86,9 @@ class MediaParserAbortError extends Error {
|
|
|
86
86
|
this.cause = undefined;
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
+
var hasBeenAborted = (error) => {
|
|
90
|
+
return error instanceof MediaParserAbortError || error.name === "MediaParserAbortError" || error.name === "AbortError";
|
|
91
|
+
};
|
|
89
92
|
|
|
90
93
|
// src/worker/serialize-error.ts
|
|
91
94
|
var deserializeError = (error) => {
|
|
@@ -542,5 +545,10 @@ var parseMediaOnWebWorker = (params) => {
|
|
|
542
545
|
return parseMediaOnWorkerImplementation(params, worker, "parseMediaOnWebWorker");
|
|
543
546
|
};
|
|
544
547
|
export {
|
|
545
|
-
parseMediaOnWebWorker
|
|
548
|
+
parseMediaOnWebWorker,
|
|
549
|
+
hasBeenAborted,
|
|
550
|
+
MediaParserAbortError,
|
|
551
|
+
IsAnUnsupportedFileTypeError,
|
|
552
|
+
IsAnImageError,
|
|
553
|
+
IsAPdfError
|
|
546
554
|
};
|
|
@@ -21,10 +21,9 @@ const getMetadata = (state) => {
|
|
|
21
21
|
}
|
|
22
22
|
if (structure.type === 'mp3') {
|
|
23
23
|
const tags = (0, get_metadata_from_mp3_1.getMetadataFromMp3)(structure);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return tags;
|
|
24
|
+
// Not all MP3s file have this header.
|
|
25
|
+
// Internal link: https://discord.com/channels/809501355504959528/1001500302375125055/1408880907602890752
|
|
26
|
+
return tags !== null && tags !== void 0 ? tags : [];
|
|
28
27
|
}
|
|
29
28
|
if (structure.type === 'wav') {
|
|
30
29
|
return (_a = (0, get_metadata_from_wav_1.getMetadataFromWav)(structure)) !== null && _a !== void 0 ? _a : [];
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "4.0.
|
|
1
|
+
export declare const VERSION = "4.0.341";
|
package/dist/version.js
CHANGED
package/dist/worker.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { hasBeenAborted, ImageType, IsAnImageError, IsAnUnsupportedFileTypeError, IsAPdfError, MediaParserAbortError, } from './errors';
|
|
1
2
|
import type { ParseMediaOnWorker } from './options';
|
|
2
3
|
export type { ParseMediaOnWorker, ParseMediaOnWorkerOptions } from './options';
|
|
3
4
|
export declare const parseMediaOnWebWorker: ParseMediaOnWorker;
|
package/dist/worker.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseMediaOnWebWorker = void 0;
|
|
3
|
+
exports.parseMediaOnWebWorker = exports.MediaParserAbortError = exports.IsAPdfError = exports.IsAnUnsupportedFileTypeError = exports.IsAnImageError = exports.hasBeenAborted = void 0;
|
|
4
|
+
var errors_1 = require("./errors");
|
|
5
|
+
Object.defineProperty(exports, "hasBeenAborted", { enumerable: true, get: function () { return errors_1.hasBeenAborted; } });
|
|
6
|
+
Object.defineProperty(exports, "IsAnImageError", { enumerable: true, get: function () { return errors_1.IsAnImageError; } });
|
|
7
|
+
Object.defineProperty(exports, "IsAnUnsupportedFileTypeError", { enumerable: true, get: function () { return errors_1.IsAnUnsupportedFileTypeError; } });
|
|
8
|
+
Object.defineProperty(exports, "IsAPdfError", { enumerable: true, get: function () { return errors_1.IsAPdfError; } });
|
|
9
|
+
Object.defineProperty(exports, "MediaParserAbortError", { enumerable: true, get: function () { return errors_1.MediaParserAbortError; } });
|
|
4
10
|
const parseMediaOnWebWorker = () => {
|
|
5
11
|
throw new Error('parseMediaOnWebWorker is not available in CJS mode. Load this function using ESM to use it.');
|
|
6
12
|
};
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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.
|
|
6
|
+
"version": "4.0.341",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"devDependencies": {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"eslint": "9.19.0",
|
|
12
12
|
"mediabunny": "1.3.0",
|
|
13
13
|
"@types/bun": "1.2.8",
|
|
14
|
-
"@remotion/
|
|
15
|
-
"@remotion/
|
|
14
|
+
"@remotion/eslint-config-internal": "4.0.341",
|
|
15
|
+
"@remotion/example-videos": "4.0.341"
|
|
16
16
|
},
|
|
17
17
|
"publishConfig": {
|
|
18
18
|
"access": "public"
|