@remotion/media-parser
Version:
A pure JavaScript library for parsing video files
99 lines (98 loc) • 3.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseIlstBox = void 0;
// https://developer.apple.com/documentation/quicktime-file-format/well-known_types
const parseFromWellKnownType = (wellKnownType, iterator, size) => {
if (wellKnownType === 1) {
const value = iterator.getByteString(size, false);
return { type: 'text', value };
}
if (wellKnownType === 21) {
if (size === 1) {
return { type: 'number', value: iterator.getInt8() };
}
if (size === 2) {
return { type: 'number', value: iterator.getInt16() };
}
if (size === 3) {
return { type: 'number', value: iterator.getInt24() };
}
if (size === 4) {
return { type: 'number', value: iterator.getInt32() };
}
if (size === 8) {
return { type: 'number', value: Number(iterator.getInt64()) };
}
throw new Error(`Weird size for number ${size}`);
}
if (wellKnownType === 22) {
if (size === 1) {
return { type: 'number', value: iterator.getUint8() };
}
if (size === 2) {
return { type: 'number', value: iterator.getUint16() };
}
if (size === 3) {
return { type: 'number', value: iterator.getUint24() };
}
if (size === 4) {
return { type: 'number', value: iterator.getUint32() };
}
throw new Error(`Weird size for number ${size}`);
}
if (wellKnownType === 23) {
if (size === 4) {
return { type: 'number', value: iterator.getFloat32() };
}
if (size === 8) {
return { type: 'number', value: iterator.getFloat64() };
}
throw new Error(`Weird size for number ${size}`);
}
iterator.discard(size);
return { type: 'unknown', value: null };
};
const parseIlstBox = ({ iterator, size, offset, }) => {
const box = iterator.startBox(size - 8);
const entries = [];
while (iterator.counter.getOffset() < size + offset) {
// metadata size
const metadataSize = iterator.getUint32();
const index = iterator.getAtom();
// this can be of a different type
if (!index.startsWith('�') && !index.startsWith('\u0000')) {
// "skip" as a number
if (index === 'skip') {
iterator.discard(metadataSize - 8);
continue;
}
// "----" atom in m4a files
// iTunes adds it for .m4a files
// not very interesting data, so we don't parse them
if (index === '----') {
iterator.discard(metadataSize - 8);
continue;
}
iterator.discard(metadataSize - 8);
continue;
}
const innerSize = iterator.getUint32();
const type = iterator.getAtom();
const typeIndicator = iterator.getUint8();
if (typeIndicator !== 0) {
throw new Error('Expected type indicator to be 0');
}
const wellKnownType = iterator.getUint24();
iterator.discard(4);
const value = parseFromWellKnownType(wellKnownType, iterator, innerSize - 16);
entries.push({ index, type, wellKnownType, value });
}
box.discardRest();
return {
type: 'ilst-box',
boxSize: size,
offset,
entries,
};
};
exports.parseIlstBox = parseIlstBox;