@remotion/media-parser
Version:
A pure JavaScript library for parsing video files
84 lines (83 loc) • 2.91 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseId3 = void 0;
function combine28Bits(a, b, c, d) {
// Mask each number to ignore first bit (& 0x7F)
const val1 = a & 0x7f; // 7 bits from first byte
const val2 = b & 0x7f; // 7 bits from second byte
const val3 = c & 0x7f; // 7 bits from third byte
const val4 = d & 0x7f; // 7 bits from fourth byte
// Combine all values using bitwise operations
return (val1 << 21) | (val2 << 14) | (val3 << 7) | val4;
}
const parseId3 = ({ state }) => {
const { iterator } = state;
if (iterator.bytesRemaining() < 9) {
return;
}
const { returnToCheckpoint } = iterator.startCheckpoint();
iterator.discard(3);
const versionMajor = iterator.getUint8();
const versionMinor = iterator.getUint8();
const flags = iterator.getUint8();
const sizeArr = iterator.getSlice(4);
const size = combine28Bits(sizeArr[0], sizeArr[1], sizeArr[2], sizeArr[3]);
if (iterator.bytesRemaining() < size) {
returnToCheckpoint();
return;
}
const entries = [];
const initial = iterator.counter.getOffset();
while (iterator.counter.getOffset() < size + initial) {
const name = versionMajor === 3 || versionMajor === 4
? iterator.getByteString(4, true)
: iterator.getByteString(3, true);
if (name === '') {
iterator.discard(size + initial - iterator.counter.getOffset());
break;
}
const s = versionMajor === 4
? iterator.getSyncSafeInt32()
: versionMajor === 3
? iterator.getUint32()
: iterator.getUint24();
if (versionMajor === 3 || versionMajor === 4) {
iterator.getUint16(); // flags
}
let subtract = 0;
if (!name.startsWith('W')) {
iterator.getUint8(); // encoding
subtract += 1;
}
if (name === 'APIC') {
const { discardRest } = iterator.planBytes(s - subtract);
const mimeType = iterator.readUntilNullTerminator();
iterator.getUint16(); // picture type
const description = iterator.readUntilNullTerminator();
iterator.discard(1);
const data = discardRest();
state.images.addImage({
data,
description,
mimeType,
});
}
else {
const information = iterator.getByteString(s - subtract, true);
entries.push({
key: name,
value: information,
trackId: null,
});
}
}
state.structure.getMp3Structure().boxes.push({
type: 'id3-header',
flags,
size,
versionMajor,
versionMinor,
metatags: entries,
});
};
exports.parseId3 = parseId3;