const decoder = new TextDecoder(); const toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end)); const toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + ("0" + i.toString(16)).slice(-2), ""); const readInt16LE = (input, offset = 0) => { const val = input[offset] + input[offset + 1] * 2 ** 8; return val | (val & 2 ** 15) * 131070; }; const readUInt16BE = (input, offset = 0) => input[offset] * 2 ** 8 + input[offset + 1]; const readUInt16LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8; const readUInt24LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16; const readInt32LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16 + (input[offset + 3] << 24); const readUInt32BE = (input, offset = 0) => input[offset] * 2 ** 24 + input[offset + 1] * 2 ** 16 + input[offset + 2] * 2 ** 8 + input[offset + 3]; const readUInt32LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16 + input[offset + 3] * 2 ** 24; const methods = { readUInt16BE, readUInt16LE, readUInt32BE, readUInt32LE }; function readUInt(input, bits, offset, isBigEndian) { offset = offset || 0; const endian = isBigEndian ? "BE" : "LE"; const methodName = "readUInt" + bits + endian; return methods[methodName](input, offset); } function readBox(buffer, offset) { if (buffer.length - offset < 4) return; const boxSize = readUInt32BE(buffer, offset); if (buffer.length - offset < boxSize) return; return { name: toUTF8String(buffer, 4 + offset, 8 + offset), offset, size: boxSize }; } function findBox(buffer, boxName, offset) { while (offset < buffer.length) { const box = readBox(buffer, offset); if (!box) break; if (box.name === boxName) return box; offset += box.size; } } export { findBox, readInt16LE, readInt32LE, readUInt, readUInt16BE, readUInt16LE, readUInt24LE, readUInt32BE, readUInt32LE, toHexString, toUTF8String };