{"version":3,"sources":["../entries/simple.ts","../src/constants.ts","../src/mp4boxbuffer.ts","../src/DataStream.ts","../src/log.ts","../src/buffer.ts","../src/box.ts","../src/box-diff.ts","../src/boxes/displays/parameterSetArray.ts","../src/boxes/avcC.ts","../src/registry.ts","../src/parser.ts","../src/containerBox.ts","../src/boxes/defaults.ts","../src/boxes/dref.ts","../src/boxes/elng.ts","../src/boxes/ftyp.ts","../src/boxes/hdlr.ts","../src/boxes/hvcC.ts","../src/boxes/mdhd.ts","../src/boxes/mehd.ts","../src/boxes/infe.ts","../src/boxes/iinf.ts","../src/boxes/iloc.ts","../src/boxes/iref.ts","../src/boxes/pitm.ts","../src/boxes/meta.ts","../src/boxes/mfhd.ts","../src/boxes/mvhd.ts","../src/boxes/sampleentries/base.ts","../src/boxes/sampleentries/mett.ts","../src/boxes/sampleentries/metx.ts","../src/boxes/av1C.ts","../src/boxes/esds.ts","../src/boxes/vpcC.ts","../src/boxes/vvcC.ts","../src/boxes/colr.ts","../src/boxes/sampleentries/sampleentry.ts","../src/boxes/sampleentries/sbtt.ts","../src/boxes/sampleentries/stpp.ts","../src/boxes/sampleentries/stxt.ts","../src/boxes/sampleentries/tx3g.ts","../src/boxes/sampleentries/wvtt.ts","../src/boxes/sbgp.ts","../src/boxes/sdtp.ts","../src/boxes/sgpd.ts","../src/boxes/sidx.ts","../src/boxes/smhd.ts","../src/boxes/stco.ts","../src/boxes/sthd.ts","../src/boxes/stsc.ts","../src/boxes/stsd.ts","../src/boxes/stsz.ts","../src/boxes/stts.ts","../src/boxes/tfdt.ts","../src/boxes/tfhd.ts","../src/boxes/tkhd.ts","../src/boxes/trex.ts","../src/boxes/trun.ts","../src/boxes/url.ts","../src/boxes/vmhd.ts","../src/isofile.ts","../src/create-file.ts","../entries/simple-boxes.ts","../src/boxes/emsg.ts","../src/boxes/ssix.ts","../src/boxes/styp.ts"],"sourcesContent":["export * from '#/box';\nexport * from '#/buffer';\nexport * from '#/create-file';\nexport * from '#/isofile';\nexport * from '#/log';\nexport * from './types';\nimport { registerBoxes } from '#/registry';\nimport * as SIMPLE_BOXES from './simple-boxes';\n\nexport const BoxParser = registerBoxes(SIMPLE_BOXES);\n","export const MAX_SIZE = Math.pow(2, 32);\nexport const MAX_UINT32 = Math.pow(2, 32) - 1;\n\n// Flags\nexport const TKHD_FLAG_ENABLED = 0x000001;\nexport const TKHD_FLAG_IN_MOVIE = 0x000002;\nexport const TKHD_FLAG_IN_PREVIEW = 0x000004;\n\nexport const TFHD_FLAG_BASE_DATA_OFFSET = 0x01;\nexport const TFHD_FLAG_SAMPLE_DESC = 0x02;\nexport const TFHD_FLAG_SAMPLE_DUR = 0x08;\nexport const TFHD_FLAG_SAMPLE_SIZE = 0x10;\nexport const TFHD_FLAG_SAMPLE_FLAGS = 0x20;\nexport const TFHD_FLAG_DUR_EMPTY = 0x10000;\nexport const TFHD_FLAG_DEFAULT_BASE_IS_MOOF = 0x20000;\n\nexport const TRUN_FLAGS_DATA_OFFSET = 0x01;\nexport const TRUN_FLAGS_FIRST_FLAG = 0x04;\nexport const TRUN_FLAGS_DURATION = 0x100;\nexport const TRUN_FLAGS_SIZE = 0x200;\nexport const TRUN_FLAGS_FLAGS = 0x400;\nexport const TRUN_FLAGS_CTS_OFFSET = 0x800;\n\nexport const ERR_INVALID_DATA = -1;\nexport const ERR_NOT_ENOUGH_DATA = 0;\nexport const OK = 1;\n\n// Constants\nexport const SAMPLE_ENTRY_TYPE_VISUAL = 'Visual';\nexport const SAMPLE_ENTRY_TYPE_AUDIO = 'Audio';\nexport const SAMPLE_ENTRY_TYPE_HINT = 'Hint';\nexport const SAMPLE_ENTRY_TYPE_METADATA = 'Metadata';\nexport const SAMPLE_ENTRY_TYPE_SUBTITLE = 'Subtitle';\nexport const SAMPLE_ENTRY_TYPE_SYSTEM = 'System';\nexport const SAMPLE_ENTRY_TYPE_TEXT = 'Text';\n","export class MP4BoxBuffer extends ArrayBuffer {\n  fileStart: number;\n  usedBytes?: number;\n\n  constructor(byteLength: number) {\n    super(byteLength);\n    this.fileStart = 0;\n    this.usedBytes = 0;\n  }\n\n  static fromArrayBuffer(buffer: ArrayBufferLike, fileStart: number): MP4BoxBuffer {\n    const mp4BoxBuffer = new MP4BoxBuffer(buffer.byteLength);\n    const view = new Uint8Array(mp4BoxBuffer);\n    view.set(new Uint8Array(buffer));\n    mp4BoxBuffer.fileStart = fileStart;\n    return mp4BoxBuffer;\n  }\n}\n","import { MAX_SIZE } from '#/constants';\nimport type {\n  Charset,\n  ParsedType,\n  StructDataFromStructDefinition,\n  StructDefinition,\n  TupleType,\n  Type,\n  TypedArray,\n  ValueFromType,\n} from '@types';\nimport { MP4BoxBuffer } from '#/mp4boxbuffer';\nimport type { ISOFile } from './isofile';\n\ntype ReadTypeReturnValue =\n  | string\n  | number\n  | Uint8Array\n  | Uint16Array\n  | Uint32Array\n  | Int8Array\n  | Int16Array\n  | Int32Array\n  | Float32Array\n  | Float64Array\n  | Array<ReadTypeReturnValue>\n  | {\n      [key: string]: ReadTypeReturnValue;\n    };\n\nexport enum Endianness {\n  BIG_ENDIAN = 1,\n  LITTLE_ENDIAN,\n}\n\n// TODO: fix endianness for 24/64-bit fields\n// TODO: check range/support for 64-bits numbers in JavaScript\n\nexport class DataStream {\n  static ENDIANNESS: Endianness =\n    new Int8Array(new Int16Array([1]).buffer)[0] > 0\n      ? Endianness.LITTLE_ENDIAN\n      : Endianness.BIG_ENDIAN;\n\n  isofile?: ISOFile; // Reference to the ISOFile object if any\n\n  _buffer?: MP4BoxBuffer;\n  _byteOffset?: number;\n  _dataView?: DataView<ArrayBuffer>;\n\n  endianness: Endianness;\n  protected position: number;\n\n  /**\n   * DataStream reads scalars, arrays and structs of data from an ArrayBuffer.\n   * It's like a file-like DataView on steroids.\n   *\n   * @param arrayBuffer ArrayBuffer to read from.\n   * @param byteOffset Offset from arrayBuffer beginning for the DataStream.\n   * @param endianness Endianness of the DataStream (default: BIG_ENDIAN).\n   */\n  constructor(\n    arrayBuffer?: ArrayBuffer | DataView<ArrayBuffer> | number,\n    byteOffset?: number,\n    endianness?: Endianness,\n  ) {\n    this._byteOffset = byteOffset || 0;\n    if (arrayBuffer instanceof ArrayBuffer) {\n      this.buffer = MP4BoxBuffer.fromArrayBuffer(arrayBuffer, 0);\n    } else if (arrayBuffer instanceof DataView) {\n      this.dataView = arrayBuffer;\n      if (byteOffset) this._byteOffset += byteOffset;\n    } else {\n      this.buffer = new MP4BoxBuffer(arrayBuffer || 0);\n    }\n    this.position = 0;\n    this.endianness = endianness ? endianness : Endianness.BIG_ENDIAN;\n  }\n\n  getPosition() {\n    return this.position;\n  }\n\n  /**\n   * Internal function to resize the DataStream buffer when required.\n   * @param extra Number of bytes to add to the buffer allocation.\n   */\n  _realloc(extra: number) {\n    if (!this._dynamicSize) {\n      return;\n    }\n    const req = this._byteOffset + this.position + extra;\n    let blen = this._buffer.byteLength;\n    if (req <= blen) {\n      if (req > this._byteLength) {\n        this._byteLength = req;\n      }\n      return;\n    }\n    if (blen < 1) {\n      blen = 1;\n    }\n    while (req > blen) {\n      blen *= 2;\n    }\n    const buf = new MP4BoxBuffer(blen);\n    const src = new Uint8Array(this._buffer);\n    const dst = new Uint8Array(buf, 0, src.length);\n    dst.set(src);\n    this.buffer = buf;\n    this._byteLength = req;\n  }\n\n  /**\n   * Internal function to trim the DataStream buffer when required.\n   * Used for stripping out the extra bytes from the backing buffer when\n   * the virtual byteLength is smaller than the buffer byteLength (happens after\n   * growing the buffer with writes and not filling the extra space completely).\n   */\n  _trimAlloc() {\n    if (this._byteLength === this._buffer.byteLength) {\n      return;\n    }\n    const buf = new MP4BoxBuffer(this._byteLength);\n    const dst = new Uint8Array(buf);\n    const src = new Uint8Array(this._buffer, 0, dst.length);\n    dst.set(src);\n    this.buffer = buf;\n  }\n\n  /**\n   * Virtual byte length of the DataStream backing buffer.\n   * Updated to be max of original buffer size and last written size.\n   * If dynamicSize is false is set to buffer size.\n   */\n  _byteLength = 0;\n\n  /**\n   * Returns the byte length of the DataStream object.\n   * @type {number}\n   */\n  get byteLength() {\n    return this._byteLength - this._byteOffset;\n  }\n\n  /**\n   * Set/get the backing ArrayBuffer of the DataStream object.\n   * The setter updates the DataView to point to the new buffer.\n   * @type {Object}\n   */\n\n  get buffer() {\n    this._trimAlloc();\n    return this._buffer;\n  }\n  set buffer(value: MP4BoxBuffer) {\n    this._buffer = value;\n    this._dataView = new DataView(value, this._byteOffset);\n    this._byteLength = value.byteLength;\n  }\n\n  /**\n   * Set/get the byteOffset of the DataStream object.\n   * The setter updates the DataView to point to the new byteOffset.\n   * @type {number}\n   */\n  get byteOffset() {\n    return this._byteOffset;\n  }\n  set byteOffset(value) {\n    this._byteOffset = value;\n    this._dataView = new DataView(this._buffer, this._byteOffset);\n    this._byteLength = this._buffer.byteLength;\n  }\n\n  /**\n   * Set/get the byteOffset of the DataStream object.\n   * The setter updates the DataView to point to the new byteOffset.\n   * @type {number}\n   */\n  get dataView() {\n    return this._dataView;\n  }\n  set dataView(value: DataView<ArrayBuffer>) {\n    this._byteOffset = value.byteOffset;\n    this._buffer = MP4BoxBuffer.fromArrayBuffer(value.buffer, 0);\n    this._dataView = new DataView(this._buffer, this._byteOffset);\n    this._byteLength = this._byteOffset + value.byteLength;\n  }\n\n  /**\n   *   Sets the DataStream read/write position to given position.\n   *   Clamps between 0 and DataStream length.\n   *\n   *   @param pos Position to seek to.\n   *   @return\n   */\n  seek(pos: number) {\n    const npos = Math.max(0, Math.min(this.byteLength, pos));\n    this.position = isNaN(npos) || !isFinite(npos) ? 0 : npos;\n  }\n\n  /**\n   * Returns true if the DataStream seek pointer is at the end of buffer and\n   * there's no more data to read.\n   *\n   * @return True if the seek pointer is at the end of the buffer.\n   */\n  isEof() {\n    return this.position >= this._byteLength;\n  }\n\n  #isTupleType(type: unknown): type is TupleType {\n    return Array.isArray(type) && type.length === 3 && type[0] === '[]';\n  }\n\n  /**\n   * Maps a Uint8Array into the DataStream buffer.\n   *\n   * Nice for quickly reading in data.\n   *\n   * @param length Number of elements to map.\n   * @param e Endianness of the data to read.\n   * @return Uint8Array to the DataStream backing buffer.\n   */\n  mapUint8Array(length: number) {\n    this._realloc(length * 1);\n    const arr = new Uint8Array(this._buffer, this.byteOffset + this.position, length);\n    this.position += length * 1;\n    return arr;\n  }\n\n  /**\n   * Reads an Int32Array of desired length and endianness from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return The read Int32Array.\n   */\n  readInt32Array(length?: number, endianness?: Endianness) {\n    length = length === undefined ? this.byteLength - this.position / 4 : length;\n    const arr = new Int32Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads an Int16Array of desired length and endianness from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return The read Int16Array.\n   */\n  readInt16Array(length?: number, endianness?: Endianness) {\n    length = length === undefined ? this.byteLength - this.position / 2 : length;\n    const arr = new Int16Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads an Int8Array of desired length from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param e Endianness of the data to read.\n   * @return The read Int8Array.\n   */\n  readInt8Array(length?: number) {\n    length = length === undefined ? this.byteLength - this.position : length;\n    const arr = new Int8Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads a Uint32Array of desired length and endianness from the DataStream.\n   *\n   *  @param length Number of elements to map.\n   *  @param endianness Endianness of the data to read.\n   *  @return The read Uint32Array.\n   */\n  readUint32Array(length?: number, endianness?: Endianness) {\n    length = length === undefined ? this.byteLength - this.position / 4 : length;\n    const arr = new Uint32Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads a Uint16Array of desired length and endianness from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return The read Uint16Array.\n   */\n  readUint16Array(length?: number, endianness?: Endianness) {\n    length = length === undefined ? this.byteLength - this.position / 2 : length;\n    const arr = new Uint16Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads a Uint8Array of desired length from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param e Endianness of the data to read.\n   * @return The read Uint8Array.\n   */\n  readUint8Array(length?: number) {\n    length = length === undefined ? this.byteLength - this.position : length;\n    const arr = new Uint8Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads a Float64Array of desired length and endianness from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return The read Float64Array.\n   */\n  readFloat64Array(length?: number, endianness?: Endianness) {\n    length = length === undefined ? this.byteLength - this.position / 8 : length;\n    const arr = new Float64Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads a Float32Array of desired length and endianness from the DataStream.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return The read Float32Array.\n   */\n  readFloat32Array(length?: number, endianness?: Endianness) {\n    length = length === undefined ? this.byteLength - this.position / 4 : length;\n    const arr = new Float32Array(length);\n    DataStream.memcpy(\n      arr.buffer,\n      0,\n      this.buffer,\n      this.byteOffset + this.position,\n      length * arr.BYTES_PER_ELEMENT,\n    );\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += arr.byteLength;\n    return arr;\n  }\n\n  /**\n   * Reads a 32-bit int from the DataStream with the desired endianness.\n   *\n   * @param endianness Endianness of the number.\n   * @return The read number.\n   */\n  readInt32(endianness?: Endianness) {\n    const v = this._dataView.getInt32(\n      this.position,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 4;\n    return v;\n  }\n\n  /**\n   * Reads a 16-bit int from the DataStream with the desired endianness.\n   *\n   * @param endianness Endianness of the number.\n   * @return The read number.\n   */\n  readInt16(endianness?: Endianness) {\n    const v = this._dataView.getInt16(\n      this.position,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 2;\n    return v;\n  }\n\n  /**\n   * Reads an 8-bit int from the DataStream.\n   *\n   * @return The read number.\n   */\n  readInt8() {\n    const v = this._dataView.getInt8(this.position);\n    this.position += 1;\n    return v;\n  }\n\n  /**\n   * Reads a 32-bit unsigned int from the DataStream with the desired endianness.\n   *\n   * @param endianness Endianness of the number.\n   * @return The read number.\n   */\n  readUint32(endianness?: Endianness) {\n    const v = this._dataView.getUint32(\n      this.position,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 4;\n    return v;\n  }\n\n  /**\n   * Reads a 16-bit unsigned int from the DataStream with the desired endianness.\n   *\n   * @param endianness Endianness of the number.\n   * @return The read number.\n   */\n  readUint16(endianness?: Endianness) {\n    const v = this._dataView.getUint16(\n      this.position,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 2;\n    return v;\n  }\n\n  /**\n   * Reads an 8-bit unsigned int from the DataStream.\n   *\n   * @return The read number.\n   */\n  readUint8() {\n    const v = this._dataView.getUint8(this.position);\n    this.position += 1;\n    return v;\n  }\n\n  /**\n   * Reads a 32-bit float from the DataStream with the desired endianness.\n   *\n   * @param endianness Endianness of the number.\n   * @return The read number.\n   */\n  readFloat32(endianness?: Endianness) {\n    const value = this._dataView.getFloat32(\n      this.position,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 4;\n    return value;\n  }\n\n  /**\n   * Reads a 64-bit float from the DataStream with the desired endianness.\n   *\n   * @param endianness Endianness of the number.\n   * @return The read number.\n   */\n  readFloat64(endianness?: Endianness) {\n    const value = this._dataView.getFloat64(\n      this.position,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 8;\n    return value;\n  }\n\n  /**\n   * Copies byteLength bytes from the src buffer at srcOffset to the\n   * dst buffer at dstOffset.\n   *\n   * @param dst Destination ArrayBuffer to write to.\n   * @param dstOffset Offset to the destination ArrayBuffer.\n   * @param src Source ArrayBuffer to read from.\n   * @param srcOffset Offset to the source ArrayBuffer.\n   * @param byteLength Number of bytes to copy.\n   */\n  static memcpy(\n    dst: ArrayBufferLike,\n    dstOffset?: number,\n    src?: ArrayBufferLike,\n    srcOffset?: number,\n    byteLength?: number,\n  ) {\n    const dstU8 = new Uint8Array(dst, dstOffset, byteLength);\n    const srcU8 = new Uint8Array(src, srcOffset, byteLength);\n    dstU8.set(srcU8);\n  }\n\n  /**\n   * Converts array to native endianness in-place.\n   *\n   * @param typedArray Typed array to convert.\n   * @param endianness True if the data in the array is\n   *                                      little-endian. Set false for big-endian.\n   * @return The converted typed array.\n   */\n  static arrayToNative(typedArray: TypedArray, endianness?: Endianness) {\n    if (endianness === DataStream.ENDIANNESS) {\n      return typedArray;\n    } else {\n      return this.flipArrayEndianness(typedArray);\n    }\n  }\n\n  /**\n   * Converts native endianness array to desired endianness in-place.\n   *\n   * @param typedArray Typed array to convert.\n   * @param littleEndian True if the converted array should be\n   *                               little-endian. Set false for big-endian.\n   * @return The converted typed array.\n   */\n  static nativeToEndian(typedArray: TypedArray, littleEndian: boolean) {\n    if (littleEndian && DataStream.ENDIANNESS === Endianness.LITTLE_ENDIAN) {\n      return typedArray;\n    } else {\n      return this.flipArrayEndianness(typedArray);\n    }\n  }\n\n  /**\n   * Flips typed array endianness in-place.\n   *\n   * @param typedArray Typed array to flip.\n   * @return The converted typed array.\n   */\n  static flipArrayEndianness(typedArray: TypedArray) {\n    const u8 = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n    for (let i = 0; i < typedArray.byteLength; i += typedArray.BYTES_PER_ELEMENT) {\n      for (let j = i + typedArray.BYTES_PER_ELEMENT - 1, k = i; j > k; j--, k++) {\n        const tmp = u8[k];\n        u8[k] = u8[j];\n        u8[j] = tmp;\n      }\n    }\n    return typedArray;\n  }\n\n  /**\n   * Seek position where DataStream#readStruct ran into a problem.\n   * Useful for debugging struct parsing.\n   *\n   * @type {number}\n   */\n  failurePosition = 0;\n\n  /**\n   * Read a string of desired length and encoding from the DataStream.\n   *\n   * @param length The length of the string to read in bytes.\n   * @param encoding The encoding of the string data in the DataStream.\n   *                           Defaults to ASCII.\n   * @return The read string.\n   */\n  readString(length: number, encoding?: Charset): string {\n    if (encoding === undefined || encoding === 'ASCII') {\n      return fromCharCodeUint8(\n        this.mapUint8Array(length === undefined ? this.byteLength - this.position : length),\n      );\n    } else {\n      return new TextDecoder(encoding).decode(this.mapUint8Array(length));\n    }\n  }\n\n  /**\n   * Read null-terminated string of desired length from the DataStream. Truncates\n   * the returned string so that the null byte is not a part of it.\n   *\n   * @param length The length of the string to read.\n   * @return The read string.\n   */\n  readCString(length?: number): string {\n    let i = 0;\n    const blen = this.byteLength - this.position;\n    const u8 = new Uint8Array(this._buffer, this._byteOffset + this.position);\n    const len = length !== undefined ? Math.min(length, blen) : blen;\n    for (; i < len && u8[i] !== 0; i++); // find first zero byte\n    const s = fromCharCodeUint8(this.mapUint8Array(i));\n    if (length !== undefined) {\n      this.position += len - i;\n    } else if (i !== blen) {\n      this.position += 1; // trailing zero if not at end of buffer\n    }\n    return s;\n  }\n\n  readInt64() {\n    return this.readInt32() * MAX_SIZE + this.readUint32();\n  }\n  readUint64() {\n    return this.readUint32() * MAX_SIZE + this.readUint32();\n  }\n\n  readUint24() {\n    return (this.readUint8() << 16) + (this.readUint8() << 8) + this.readUint8();\n  }\n\n  /**\n   * Saves the DataStream contents to the given filename.\n   * Uses Chrome's anchor download property to initiate download.\n   *\n   * @param filename Filename to save as.\n   * @return\n   * @bundle DataStream-write.js\n   */\n  save(filename: string) {\n    const blob = new Blob([this.buffer]);\n    // Modernized: Works in browser, and is a no-op (or throws) in Vitest/node\n    if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n      if (window.URL && URL.createObjectURL) {\n        const url = window.URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        document.body.appendChild(a);\n        a.setAttribute('href', url);\n        a.setAttribute('download', filename);\n        a.setAttribute('target', '_self');\n        a.click();\n        window.URL.revokeObjectURL(url);\n        document.body.removeChild(a);\n      } else {\n        throw new Error(\"DataStream.save: Can't create object URL.\");\n      }\n    }\n    return blob;\n  }\n\n  /**\n   * Whether to extend DataStream buffer when trying to write beyond its size.\n   * If set, the buffer is reallocated to twice its current size until the\n   * requested write fits the buffer.\n   *\n   * @type {boolean}\n   * @bundle DataStream-write.js\n   */\n  _dynamicSize = 1;\n\n  /** @bundle DataStream-write.js */\n  get dynamicSize() {\n    return this._dynamicSize;\n  }\n\n  /** @bundle DataStream-write.js */\n  set dynamicSize(v) {\n    if (!v) {\n      this._trimAlloc();\n    }\n    this._dynamicSize = v;\n  }\n\n  /**\n   * Internal function to trim the DataStream buffer when required.\n   * Used for stripping out the first bytes when not needed anymore.\n   *\n   * @return\n   * @bundle DataStream-write.js\n   */\n  shift(offset: number) {\n    const buf = new MP4BoxBuffer(this._byteLength - offset);\n    const dst = new Uint8Array(buf);\n    const src = new Uint8Array(this._buffer, offset, dst.length);\n    dst.set(src);\n    this.buffer = buf;\n    this.position -= offset;\n  }\n\n  /**\n   * Writes an Int32Array of specified endianness to the DataStream.\n   *\n   * @param array The array to write.\n   * @param endianness Endianness of the data to write.\n   * @bundle DataStream-write.js\n   */\n  writeInt32Array(array: ArrayLike<number>, endianness?: Endianness) {\n    this._realloc(array.length * 4);\n    if (\n      array instanceof Int32Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapInt32Array(array.length, endianness);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeInt32(array[i], endianness);\n      }\n    }\n  }\n\n  /**\n   * Writes an Int16Array of specified endianness to the DataStream.\n   *\n   * @param array The array to write.\n   * @param endianness Endianness of the data to write.\n   * @bundle DataStream-write.js\n   */\n  writeInt16Array(array: ArrayLike<number>, endianness?: Endianness) {\n    this._realloc(array.length * 2);\n    if (\n      array instanceof Int16Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapInt16Array(array.length, endianness);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeInt16(array[i], endianness);\n      }\n    }\n  }\n\n  /**\n   * Writes an Int8Array to the DataStream.\n   *\n   * @param array The array to write.\n   * @bundle DataStream-write.js\n   */\n  writeInt8Array(array: ArrayLike<number>) {\n    this._realloc(array.length * 1);\n    if (\n      array instanceof Int8Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapInt8Array(array.length);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeInt8(array[i]);\n      }\n    }\n  }\n\n  /**\n   * Writes a Uint32Array of specified endianness to the DataStream.\n   *\n   * @param array The array to write.\n   * @param endianness Endianness of the data to write.\n   * @bundle DataStream-write.js\n   */\n  writeUint32Array(array: ArrayLike<number>, endianness?: Endianness) {\n    this._realloc(array.length * 4);\n    if (\n      array instanceof Uint32Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapUint32Array(array.length, endianness);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeUint32(array[i], endianness);\n      }\n    }\n  }\n\n  /**\n   * Writes a Uint16Array of specified endianness to the DataStream.\n   *\n   * @param array The array to write.\n   * @param endianness Endianness of the data to write.\n   * @bundle DataStream-write.js\n   */\n  writeUint16Array(array: ArrayLike<number>, endianness?: Endianness) {\n    this._realloc(array.length * 2);\n    if (\n      array instanceof Uint16Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapUint16Array(array.length, endianness);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeUint16(array[i], endianness);\n      }\n    }\n  }\n\n  /**\n   * Writes a Uint8Array to the DataStream.\n   *\n   * @param array The array to write.\n   * @bundle DataStream-write.js\n   */\n  writeUint8Array(array: ArrayLike<number>) {\n    this._realloc(array.length * 1);\n    if (\n      array instanceof Uint8Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapUint8Array(array.length);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeUint8(array[i]);\n      }\n    }\n  }\n\n  /**\n   * Writes a Float64Array of specified endianness to the DataStream.\n   *\n   * @param array The array to write.\n   * @param endianness Endianness of the data to write.\n   * @bundle DataStream-write.js\n   */\n  writeFloat64Array(array: ArrayLike<number>, endianness?: Endianness) {\n    this._realloc(array.length * 8);\n    if (\n      array instanceof Float64Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapFloat64Array(array.length, endianness);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeFloat64(array[i], endianness);\n      }\n    }\n  }\n\n  /**\n   * Writes a Float32Array of specified endianness to the DataStream.\n   *\n   * @param array The array to write.\n   * @param endianness Endianness of the data to write.\n   * @bundle DataStream-write.js\n   */\n  writeFloat32Array(array: ArrayLike<number>, endianness?: Endianness) {\n    this._realloc(array.length * 4);\n    if (\n      array instanceof Float32Array &&\n      this.byteOffset + (this.position % array.BYTES_PER_ELEMENT) === 0\n    ) {\n      DataStream.memcpy(\n        this._buffer,\n        this.byteOffset + this.position,\n        array.buffer,\n        0,\n        array.byteLength,\n      );\n      this.mapFloat32Array(array.length, endianness);\n    } else {\n      for (let i = 0; i < array.length; i++) {\n        this.writeFloat32(array[i], endianness);\n      }\n    }\n  }\n\n  /**\n   * Writes a 64-bit int to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeInt64(value: number, endianness?: Endianness) {\n    this._realloc(8);\n    this._dataView.setBigInt64(\n      this.position,\n      BigInt(value),\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 8;\n  }\n\n  /**\n   * Writes a 32-bit int to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeInt32(value: number, endianness?: Endianness) {\n    this._realloc(4);\n    this._dataView.setInt32(\n      this.position,\n      value,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 4;\n  }\n\n  /**\n   * Writes a 16-bit int to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeInt16(value: number, endianness?: Endianness) {\n    this._realloc(2);\n    this._dataView.setInt16(\n      this.position,\n      value,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 2;\n  }\n\n  /**\n   * Writes an 8-bit int to the DataStream.\n   *\n   * @param value Number to write.\n   * @bundle DataStream-write.js\n   */\n  writeInt8(value: number) {\n    this._realloc(1);\n    this._dataView.setInt8(this.position, value);\n    this.position += 1;\n  }\n\n  /**\n   * Writes a 32-bit unsigned int to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeUint32(value: number, endianness?: Endianness) {\n    this._realloc(4);\n    this._dataView.setUint32(\n      this.position,\n      value,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 4;\n  }\n\n  /**\n   * Writes a 16-bit unsigned int to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeUint16(value: number, endianness?: Endianness) {\n    this._realloc(2);\n    this._dataView.setUint16(\n      this.position,\n      value,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 2;\n  }\n\n  /**\n   * Writes an 8-bit unsigned  int to the DataStream.\n   *\n   * @param value Number to write.\n   * @bundle DataStream-write.js\n   */\n  writeUint8(value: number) {\n    this._realloc(1);\n    this._dataView.setUint8(this.position, value);\n    this.position += 1;\n  }\n\n  /**\n   * Writes a 32-bit float to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeFloat32(value: number, endianness?: Endianness) {\n    this._realloc(4);\n    this._dataView.setFloat32(\n      this.position,\n      value,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 4;\n  }\n\n  /**\n   * Writes a 64-bit float to the DataStream with the desired endianness.\n   *\n   * @param value Number to write.\n   * @param endianness Endianness of the number.\n   * @bundle DataStream-write.js\n   */\n  writeFloat64(value: number, endianness?: Endianness) {\n    this._realloc(8);\n    this._dataView.setFloat64(\n      this.position,\n      value,\n      (endianness ?? this.endianness) === Endianness.LITTLE_ENDIAN,\n    );\n    this.position += 8;\n  }\n\n  /**\n   * Write a UCS-2 string of desired endianness to the DataStream. The\n   * lengthOverride argument lets you define the number of characters to write.\n   * If the string is shorter than lengthOverride, the extra space is padded with\n   * zeroes.\n   *\n   * @param value The string to write.\n   * @param endianness The endianness to use for the written string data.\n   * @param lengthOverride The number of characters to write.\n   * @bundle DataStream-write.js\n   */\n  writeUCS2String(value: string, endianness: Endianness, lengthOverride?: number) {\n    if (lengthOverride === undefined) {\n      lengthOverride = value.length;\n    }\n    let i: number;\n    for (i = 0; i < value.length && i < lengthOverride; i++) {\n      this.writeUint16(value.charCodeAt(i), endianness);\n    }\n    for (; i < lengthOverride; i++) {\n      this.writeUint16(0);\n    }\n  }\n\n  /**\n   * Writes a string of desired length and encoding to the DataStream.\n   *\n   * @param value The string to write.\n   * @param encoding The encoding for the written string data.\n   *                           Defaults to ASCII.\n   * @param length The number of characters to write.\n   * @bundle DataStream-write.js\n   */\n  writeString(value: string, encoding?: string, length?: number) {\n    let i = 0;\n    if (encoding === undefined || encoding === 'ASCII') {\n      if (length !== undefined) {\n        const len = Math.min(value.length, length);\n        for (i = 0; i < len; i++) {\n          this.writeUint8(value.charCodeAt(i));\n        }\n        for (; i < length; i++) {\n          this.writeUint8(0);\n        }\n      } else {\n        for (i = 0; i < value.length; i++) {\n          this.writeUint8(value.charCodeAt(i));\n        }\n      }\n    } else {\n      // @ts-expect-error FIXME: TextEncoder does not expect an encoding-parameter\n      this.writeUint8Array(new TextEncoder(encoding).encode(value.substring(0, length)));\n    }\n  }\n\n  /**\n   * Writes a null-terminated string to DataStream and zero-pads it to length\n   * bytes. If length is not given, writes the string followed by a zero.\n   * If string is longer than length, the written part of the string does not have\n   * a trailing zero.\n   *\n   * @param value The string to write.\n   * @param length The number of characters to write.\n   * @bundle DataStream-write.js\n   */\n  writeCString(value: string, length?: number) {\n    let i = 0;\n    if (length !== undefined) {\n      const len = Math.min(value.length, length);\n      for (i = 0; i < len; i++) {\n        this.writeUint8(value.charCodeAt(i));\n      }\n      for (; i < length; i++) {\n        this.writeUint8(0);\n      }\n    } else {\n      for (i = 0; i < value.length; i++) {\n        this.writeUint8(value.charCodeAt(i));\n      }\n      this.writeUint8(0);\n    }\n  }\n\n  /**\n   * Writes a struct to the DataStream. Takes a structDefinition that gives the\n   * types and a struct object that gives the values. Refer to readStruct for the\n   * structure of structDefinition.\n   *\n   * @param structDefinition Type definition of the struct.\n   * @param struct The struct data object.\n   * @bundle DataStream-write.js\n   */\n  writeStruct<const T extends StructDefinition>(\n    structDefinition: T,\n    struct: StructDataFromStructDefinition<T>,\n  ) {\n    for (let i = 0; i < structDefinition.length; i++) {\n      const [structName, structType] = structDefinition[i];\n      const structValue = struct[structName];\n      this.writeType(structType, structValue, struct);\n    }\n  }\n\n  /**\n   * Writes object v of type t to the DataStream.\n   *\n   * @param type Type of data to write.\n   * @param value Value of data to write.\n   * @param struct Struct to pass to write callback functions.\n   * @bundle DataStream-write.js\n   */\n  writeType<const T extends Type>(type: T, value: ValueFromType<T>, struct?: Record<string, Type>) {\n    if (typeof type === 'function') {\n      return type(this, value);\n    } else if (typeof type === 'object' && !(type instanceof Array)) {\n      return type.set(this, value, struct);\n    }\n\n    let lengthOverride: number;\n    let charset: Charset = 'ASCII';\n    const pos = this.position;\n\n    let parsedType = type as ParsedType;\n\n    if (typeof type === 'string' && /:/.test(type)) {\n      const tp = type.split(':');\n      parsedType = tp[0] as `cstring` | `string`;\n      lengthOverride = parseInt(tp[1]);\n    }\n    if (typeof parsedType === 'string' && /,/.test(parsedType)) {\n      const tp = parsedType.split(',');\n      parsedType = tp[0] as `cstring` | `string`;\n      // NOTE: this said `charset = parseInt(tp[1])` before;\n      charset = tp[1] as Charset;\n    }\n\n    switch (parsedType) {\n      case 'uint8':\n        this.writeUint8(value);\n        break;\n      case 'int8':\n        this.writeInt8(value);\n        break;\n      case 'uint16':\n        this.writeUint16(value, this.endianness);\n        break;\n      case 'int16':\n        this.writeInt16(value, this.endianness);\n        break;\n      case 'uint32':\n        this.writeUint32(value, this.endianness);\n        break;\n      case 'int32':\n        this.writeInt32(value, this.endianness);\n        break;\n      case 'float32':\n        this.writeFloat32(value, this.endianness);\n        break;\n      case 'float64':\n        this.writeFloat64(value, this.endianness);\n        break;\n      case 'uint16be':\n        this.writeUint16(value, Endianness.BIG_ENDIAN);\n        break;\n      case 'int16be':\n        this.writeInt16(value, Endianness.BIG_ENDIAN);\n        break;\n      case 'uint32be':\n        this.writeUint32(value, Endianness.BIG_ENDIAN);\n        break;\n      case 'int32be':\n        this.writeInt32(value, Endianness.BIG_ENDIAN);\n        break;\n      case 'float32be':\n        this.writeFloat32(value, Endianness.BIG_ENDIAN);\n        break;\n      case 'float64be':\n        this.writeFloat64(value, Endianness.BIG_ENDIAN);\n        break;\n      case 'uint16le':\n        this.writeUint16(value, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'int16le':\n        this.writeInt16(value, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'uint32le':\n        this.writeUint32(value, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'int32le':\n        this.writeInt32(value, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'float32le':\n        this.writeFloat32(value, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'float64le':\n        this.writeFloat64(value, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'cstring':\n        this.writeCString(value, lengthOverride);\n        break;\n      case 'string':\n        this.writeString(value, charset, lengthOverride);\n        break;\n      case 'u16string':\n        this.writeUCS2String(value, this.endianness, lengthOverride);\n        break;\n      case 'u16stringle':\n        this.writeUCS2String(value, Endianness.LITTLE_ENDIAN, lengthOverride);\n        break;\n      case 'u16stringbe':\n        this.writeUCS2String(value, Endianness.BIG_ENDIAN, lengthOverride);\n        break;\n      default:\n        if (this.#isTupleType(parsedType)) {\n          const [, ta] = parsedType;\n          for (let i = 0; i < value.length; i++) {\n            this.writeType(ta, value[i]);\n          }\n          break;\n        } else {\n          this.writeStruct(parsedType, value);\n          break;\n        }\n    }\n    if (lengthOverride) {\n      this.position = pos;\n      this._realloc(lengthOverride);\n      this.position = pos + lengthOverride;\n    }\n  }\n\n  /** @bundle DataStream-write.js */\n  writeUint64(value: number) {\n    const h = Math.floor(value / MAX_SIZE);\n    this.writeUint32(h);\n    this.writeUint32(value & 0xffffffff);\n  }\n\n  /** @bundle DataStream-write.js */\n  writeUint24(value: number) {\n    this.writeUint8((value & 0x00ff0000) >> 16);\n    this.writeUint8((value & 0x0000ff00) >> 8);\n    this.writeUint8(value & 0x000000ff);\n  }\n\n  /** @bundle DataStream-write.js */\n  adjustUint32(position: number, value: number) {\n    const pos = this.position;\n    this.seek(position);\n    this.writeUint32(value);\n    this.seek(pos);\n  }\n\n  /**\n   * Reads a struct of data from the DataStream. The struct is defined as\n   * an array of [name, type]-pairs. See the example below:\n   *\n   * ```ts\n   * ds.readStruct([\n   *   ['headerTag', 'uint32'], // Uint32 in DataStream endianness.\n   *   ['headerTag2', 'uint32be'], // Big-endian Uint32.\n   *   ['headerTag3', 'uint32le'], // Little-endian Uint32.\n   *   ['array', ['[]', 'uint32', 16]], // Uint32Array of length 16.\n   *   ['array2', ['[]', 'uint32', 'array2Length']] // Uint32Array of length array2Length\n   * ]);\n   * ```\n   *\n   * The possible values for the type are as follows:\n   *\n   * ## Number types\n   *\n   * Unsuffixed number types use DataStream endianness.\n   * To explicitly specify endianness, suffix the type with\n   * 'le' for little-endian or 'be' for big-endian,\n   * e.g. 'int32be' for big-endian int32.\n   *\n   * - `uint8` -- 8-bit unsigned int\n   * - `uint16` -- 16-bit unsigned int\n   * - `uint32` -- 32-bit unsigned int\n   * - `int8` -- 8-bit int\n   * - `int16` -- 16-bit int\n   * - `int32` -- 32-bit int\n   * - `float32` -- 32-bit float\n   * - `float64` -- 64-bit float\n   *\n   * ## String types\n   *\n   * - `cstring` -- ASCII string terminated by a zero byte.\n   * - `string:N` -- ASCII string of length N.\n   * - `string,CHARSET:N` -- String of byteLength N encoded with given CHARSET.\n   * - `u16string:N` -- UCS-2 string of length N in DataStream endianness.\n   * - `u16stringle:N` -- UCS-2 string of length N in little-endian.\n   * - `u16stringbe:N` -- UCS-2 string of length N in big-endian.\n   *\n   * ## Complex types\n   *\n   * ### Struct\n   * ```ts\n   * [[name, type], [name_2, type_2], ..., [name_N, type_N]]\n   * ```\n   *\n   * ### Callback function to read and return data\n   * ```ts\n   * function(dataStream, struct) {}\n   * ```\n   *\n   * ###  Getter/setter functions\n   * to read and return data, handy for using the same struct definition\n   * for reading and writing structs.\n   * ```ts\n   * {\n   *    get: function(dataStream, struct) {},\n   *    set: function(dataStream, struct) {}\n   * }\n   * ```\n   *\n   * ### Array\n   * Array of given type and length. The length can be either\n   * - a number\n   * - a string that references a previously-read field\n   * - `*`\n   * - a callback: `function(struct, dataStream, type){}`\n   *\n   * If length is `*`, reads in as many elements as it can.\n   * ```ts\n   * ['[]', type, length]\n   * ```\n   *\n   * @param structDefinition Struct definition object.\n   * @return The read struct. Null if failed to read struct.\n   * @bundle DataStream-read-struct.js\n   */\n  readStruct<T extends StructDefinition>(structDefinition: T) {\n    const struct = {} as StructDataFromStructDefinition<T>;\n    const p = this.position;\n    for (let i = 0; i < structDefinition.length; i += 1) {\n      const t = structDefinition[i][1];\n      const v = this.readType(t, struct);\n      if (!v) {\n        if (this.failurePosition === 0) {\n          this.failurePosition = this.position;\n        }\n        this.position = p;\n        return;\n      }\n      struct[structDefinition[i][0]] = v;\n    }\n    return struct;\n  }\n\n  /**\n   * Read UCS-2 string of desired length and endianness from the DataStream.\n   *\n   * @param length The length of the string to read.\n   * @param endianness The endianness of the string data in the DataStream.\n   * @return The read string.\n   * @bundle DataStream-read-struct.js\n   */\n  readUCS2String(length?: number, endianness?: Endianness): string {\n    return String.fromCharCode.apply(undefined, this.readUint16Array(length, endianness));\n  }\n\n  /**\n   * Reads an object of type t from the DataStream, passing struct as the thus-far\n   * read struct to possible callbacks that refer to it. Used by readStruct for\n   * reading in the values, so the type is one of the readStruct types.\n   *\n   * @param type Type of the object to read.\n   * @param struct Struct to refer to when resolving length references\n   *                         and for calling callbacks.\n   * @return  Returns the object on successful read, null on unsuccessful.\n   * @bundle DataStream-read-struct.js\n   */\n  readType<const T extends Type>(type: T, struct: Record<string, Type>): ReadTypeReturnValue {\n    if (typeof type === 'function') {\n      return type(this, struct);\n    }\n    if (typeof type === 'object' && !(type instanceof Array)) {\n      return type.get(this, struct);\n    }\n    if (type instanceof Array && type.length !== 3) {\n      // NOTE: this said `return this.readStruct(type, struct);` before\n      return this.readStruct(type);\n    }\n\n    let value: ReadTypeReturnValue;\n    let lengthOverride: number;\n    let charset: Charset = 'ASCII';\n    const pos = this.position;\n\n    let parsedType = type as ParsedType;\n    if (typeof parsedType === 'string' && /:/.test(parsedType)) {\n      const tp = parsedType.split(':');\n      parsedType = tp[0] as ParsedType;\n      lengthOverride = parseInt(tp[1]);\n    }\n    if (typeof parsedType === 'string' && /,/.test(parsedType)) {\n      const tp = parsedType.split(',');\n      parsedType = tp[0] as ParsedType;\n      // NOTE: this was `charset = parseInt(tp[1]);` before\n      charset = tp[1] as Charset;\n    }\n\n    switch (parsedType) {\n      case 'uint8':\n        value = this.readUint8();\n        break;\n      case 'int8':\n        value = this.readInt8();\n        break;\n      case 'uint16':\n        value = this.readUint16(this.endianness);\n        break;\n      case 'int16':\n        value = this.readInt16(this.endianness);\n        break;\n      case 'uint32':\n        value = this.readUint32(this.endianness);\n        break;\n      case 'int32':\n        value = this.readInt32(this.endianness);\n        break;\n      case 'float32':\n        value = this.readFloat32(this.endianness);\n        break;\n      case 'float64':\n        value = this.readFloat64(this.endianness);\n        break;\n      case 'uint16be':\n        value = this.readUint16(Endianness.BIG_ENDIAN);\n        break;\n      case 'int16be':\n        value = this.readInt16(Endianness.BIG_ENDIAN);\n        break;\n      case 'uint32be':\n        value = this.readUint32(Endianness.BIG_ENDIAN);\n        break;\n      case 'int32be':\n        value = this.readInt32(Endianness.BIG_ENDIAN);\n        break;\n      case 'float32be':\n        value = this.readFloat32(Endianness.BIG_ENDIAN);\n        break;\n      case 'float64be':\n        value = this.readFloat64(Endianness.BIG_ENDIAN);\n        break;\n      case 'uint16le':\n        value = this.readUint16(Endianness.LITTLE_ENDIAN);\n        break;\n      case 'int16le':\n        value = this.readInt16(Endianness.LITTLE_ENDIAN);\n        break;\n      case 'uint32le':\n        value = this.readUint32(Endianness.LITTLE_ENDIAN);\n        break;\n      case 'int32le':\n        value = this.readInt32(Endianness.LITTLE_ENDIAN);\n        break;\n      case 'float32le':\n        value = this.readFloat32(Endianness.LITTLE_ENDIAN);\n        break;\n      case 'float64le':\n        value = this.readFloat64(Endianness.LITTLE_ENDIAN);\n        break;\n      case 'cstring':\n        value = this.readCString(lengthOverride);\n        break;\n      case 'string':\n        value = this.readString(lengthOverride, charset);\n        break;\n      case 'u16string':\n        value = this.readUCS2String(lengthOverride, this.endianness);\n        break;\n      case 'u16stringle':\n        value = this.readUCS2String(lengthOverride, Endianness.LITTLE_ENDIAN);\n        break;\n      case 'u16stringbe':\n        value = this.readUCS2String(lengthOverride, Endianness.BIG_ENDIAN);\n        break;\n      default:\n        if (this.#isTupleType(parsedType)) {\n          const [, ta, len] = parsedType;\n          const length =\n            typeof len === 'function'\n              ? len(struct, this, parsedType)\n              : typeof len === 'string' && struct[len] !== undefined\n                ? // @ts-expect-error   FIXME: Struct[string] is currently of type Type\n                  parseInt(struct[len])\n                : typeof len === 'number'\n                  ? len\n                  : len === '*'\n                    ? undefined\n                    : parseInt(len);\n          if (typeof ta === 'string') {\n            const tap = ta.replace(/(le|be)$/, '');\n            let endianness: Endianness;\n            if (/le$/.test(ta)) {\n              endianness = Endianness.LITTLE_ENDIAN;\n            } else if (/be$/.test(ta)) {\n              endianness = Endianness.BIG_ENDIAN;\n            }\n            switch (tap) {\n              case 'uint8':\n                value = this.readUint8Array(length);\n                break;\n              case 'uint16':\n                value = this.readUint16Array(length, endianness);\n                break;\n              case 'uint32':\n                value = this.readUint32Array(length, endianness);\n                break;\n              case 'int8':\n                value = this.readInt8Array(length);\n                break;\n              case 'int16':\n                value = this.readInt16Array(length, endianness);\n                break;\n              case 'int32':\n                value = this.readInt32Array(length, endianness);\n                break;\n              case 'float32':\n                value = this.readFloat32Array(length, endianness);\n                break;\n              case 'float64':\n                value = this.readFloat64Array(length, endianness);\n                break;\n              case 'cstring':\n              case 'utf16string':\n              case 'string':\n                if (!length) {\n                  value = [];\n                  while (!this.isEof()) {\n                    const u = this.readType(ta, struct);\n                    if (!u) break;\n                    value.push(u);\n                  }\n                } else {\n                  value = new Array(length);\n                  for (let i = 0; i < length; i++) {\n                    value[i] = this.readType(ta, struct);\n                  }\n                }\n                break;\n            }\n          } else {\n            if (!length) {\n              value = [];\n              while (true) {\n                const pos = this.position;\n                try {\n                  const type = this.readType(ta, struct);\n                  if (!type) {\n                    this.position = pos;\n                    break;\n                  }\n                  value.push(type);\n                } catch {\n                  this.position = pos;\n                  break;\n                }\n              }\n            } else {\n              value = new Array(length);\n              for (let i = 0; i < length; i++) {\n                const type = this.readType(ta, struct);\n                if (!type) return;\n                value[i] = type;\n              }\n            }\n          }\n          break;\n        }\n    }\n    if (lengthOverride) {\n      this.position = pos + lengthOverride;\n    }\n\n    return value;\n  }\n\n  /**\n   * Maps an Int32Array into the DataStream buffer, swizzling it to native\n   * endianness in-place. The current offset from the start of the buffer needs to\n   * be a multiple of element size, just like with typed array views.\n   *\n   * Nice for quickly reading in data. Warning: potentially modifies the buffer\n   * contents.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Int32Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapInt32Array(length: number, endianness?: Endianness) {\n    this._realloc(length * 4);\n    const arr = new Int32Array(this._buffer, this.byteOffset + this.position, length);\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += length * 4;\n    return arr;\n  }\n\n  /**\n   * Maps an Int16Array into the DataStream buffer, swizzling it to native\n   * endianness in-place. The current offset from the start of the buffer needs to\n   * be a multiple of element size, just like with typed array views.\n   *\n   * Nice for quickly reading in data. Warning: potentially modifies the buffer\n   * contents.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Int16Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapInt16Array(length: number, endianness: Endianness) {\n    this._realloc(length * 2);\n    const arr = new Int16Array(this._buffer, this.byteOffset + this.position, length);\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += length * 2;\n    return arr;\n  }\n\n  /**\n   * Maps an Int8Array into the DataStream buffer.\n   *\n   * Nice for quickly reading in data.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Int8Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapInt8Array(length: number, _endianness?: Endianness) {\n    this._realloc(length * 1);\n    const arr = new Int8Array(this._buffer, this.byteOffset + this.position, length);\n    this.position += length * 1;\n    return arr;\n  }\n\n  /**\n   * Maps a Uint32Array into the DataStream buffer, swizzling it to native\n   * endianness in-place. The current offset from the start of the buffer needs to\n   * be a multiple of element size, just like with typed array views.\n   *\n   * Nice for quickly reading in data. Warning: potentially modifies the buffer\n   * contents.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Uint32Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapUint32Array(length: number, endianness?: Endianness) {\n    this._realloc(length * 4);\n    const arr = new Uint32Array(this._buffer, this.byteOffset + this.position, length);\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += length * 4;\n    return arr;\n  }\n\n  /**\n   * Maps a Uint16Array into the DataStream buffer, swizzling it to native\n   * endianness in-place. The current offset from the start of the buffer needs to\n   * be a multiple of element size, just like with typed array views.\n   *\n   * Nice for quickly reading in data. Warning: potentially modifies the buffer\n   * contents.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Uint16Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapUint16Array(length: number, endianness?: Endianness) {\n    this._realloc(length * 2);\n    const arr = new Uint16Array(this._buffer, this.byteOffset + this.position, length);\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += length * 2;\n    return arr;\n  }\n\n  /**\n   * Maps a Float64Array into the DataStream buffer, swizzling it to native\n   * endianness in-place. The current offset from the start of the buffer needs to\n   * be a multiple of element size, just like with typed array views.\n   *\n   * Nice for quickly reading in data. Warning: potentially modifies the buffer\n   * contents.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Float64Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapFloat64Array(length: number, endianness?: Endianness) {\n    this._realloc(length * 8);\n    const arr = new Float64Array(this._buffer, this.byteOffset + this.position, length);\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += length * 8;\n    return arr;\n  }\n\n  /**\n   * Maps a Float32Array into the DataStream buffer, swizzling it to native\n   * endianness in-place. The current offset from the start of the buffer needs to\n   * be a multiple of element size, just like with typed array views.\n   *\n   * Nice for quickly reading in data. Warning: potentially modifies the buffer\n   * contents.\n   *\n   * @param length Number of elements to map.\n   * @param endianness Endianness of the data to read.\n   * @return Float32Array to the DataStream backing buffer.\n   * @bundle DataStream-map.js\n   */\n  mapFloat32Array(length: number, endianness?: Endianness) {\n    this._realloc(length * 4);\n    const arr = new Float32Array(this._buffer, this.byteOffset + this.position, length);\n    DataStream.arrayToNative(arr, endianness ?? this.endianness);\n    this.position += length * 4;\n    return arr;\n  }\n}\n\nfunction fromCharCodeUint8(uint8arr: Uint8Array) {\n  const arr: Array<number> = [];\n  for (let i = 0; i < uint8arr.length; i++) {\n    arr[i] = uint8arr[i];\n  }\n  return String.fromCharCode.apply(undefined, arr);\n}\n","import type { ISOFile } from './isofile';\n\n/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\nconst start = new Date();\n\nconst LOG_LEVEL_ERROR = 4;\nconst LOG_LEVEL_WARNING = 3;\nconst LOG_LEVEL_INFO = 2;\nconst LOG_LEVEL_DEBUG = 1;\n\nlet log_level = LOG_LEVEL_ERROR;\n\nexport const Log = {\n  setLogLevel(level: (module: string, msg?: string) => void) {\n    if (level === this.debug) log_level = LOG_LEVEL_DEBUG;\n    else if (level === this.info) log_level = LOG_LEVEL_INFO;\n    else if (level === this.warn) log_level = LOG_LEVEL_WARNING;\n    else if (level === this.error) log_level = LOG_LEVEL_ERROR;\n    else log_level = LOG_LEVEL_ERROR;\n  },\n  debug(module: string, msg?: string) {\n    if (console.debug === undefined) {\n      console.debug = console.log;\n    }\n    if (LOG_LEVEL_DEBUG >= log_level) {\n      console.debug(\n        '[' + Log.getDurationString(new Date().getTime() - start.getTime(), 1000) + ']',\n        '[' + module + ']',\n        msg,\n      );\n    }\n  },\n  log(module: { msg: string }, _msg?: string) {\n    this.debug(module.msg);\n  },\n  info(module: string, msg?: string) {\n    if (LOG_LEVEL_INFO >= log_level) {\n      console.info(\n        '[' + Log.getDurationString(new Date().getTime() - start.getTime(), 1000) + ']',\n        '[' + module + ']',\n        msg,\n      );\n    }\n  },\n  warn(module: string, msg?: string) {\n    if (LOG_LEVEL_WARNING >= log_level) {\n      console.warn(\n        '[' + Log.getDurationString(new Date().getTime() - start.getTime(), 1000) + ']',\n        '[' + module + ']',\n        msg,\n      );\n    }\n  },\n  error(module: string, msg?: string, isofile?: ISOFile) {\n    if (isofile?.onError) {\n      isofile.onError(module, msg);\n    } else if (LOG_LEVEL_ERROR >= log_level) {\n      console.error(\n        '[' + Log.getDurationString(new Date().getTime() - start.getTime(), 1000) + ']',\n        '[' + module + ']',\n        msg,\n      );\n    }\n  },\n  /* Helper function to print a duration value in the form H:MM:SS.MS */\n  getDurationString(duration: number, _timescale?: number) {\n    let neg: boolean;\n    /* Helper function to print a number on a fixed number of digits */\n    function pad(number: string | number, length: number) {\n      const str = '' + number;\n      const a = str.split('.');\n      while (a[0].length < length) {\n        a[0] = '0' + a[0];\n      }\n      return a.join('.');\n    }\n    if (duration < 0) {\n      neg = true;\n      duration = -duration;\n    } else {\n      neg = false;\n    }\n    const timescale = _timescale || 1;\n    let duration_sec = duration / timescale;\n    const hours = Math.floor(duration_sec / 3600);\n    duration_sec -= hours * 3600;\n    const minutes = Math.floor(duration_sec / 60);\n    duration_sec -= minutes * 60;\n    let msec = duration_sec * 1000;\n    duration_sec = Math.floor(duration_sec);\n    msec -= duration_sec * 1000;\n    msec = Math.floor(msec);\n    return (\n      (neg ? '-' : '') +\n      hours +\n      ':' +\n      pad(minutes, 2) +\n      ':' +\n      pad(duration_sec, 2) +\n      '.' +\n      pad(msec, 3)\n    );\n  },\n  /* Helper function to stringify HTML5 TimeRanges objects */\n  printRanges(ranges: {\n    length: number;\n    start: (index: number) => number;\n    end: (index: number) => number;\n  }) {\n    const length = ranges.length;\n    if (length > 0) {\n      let str = '';\n      for (let i = 0; i < length; i++) {\n        if (i > 0) str += ',';\n        str +=\n          '[' +\n          Log.getDurationString(ranges.start(i)) +\n          ',' +\n          Log.getDurationString(ranges.end(i)) +\n          ']';\n      }\n      return str;\n    } else {\n      return '(empty)';\n    }\n  },\n};\n","import { DataStream } from '#/DataStream';\nimport { Log } from '#/log';\nimport { MP4BoxBuffer } from '#/mp4boxbuffer';\n\n/**\n * helper functions to concatenate two ArrayBuffer objects\n * @param buffer1\n * @param buffer2\n * @return the concatenation of buffer1 and buffer2 in that order\n */\nfunction concatBuffers(buffer1: ArrayBuffer, buffer2: ArrayBuffer) {\n  Log.debug(\n    'ArrayBuffer',\n    'Trying to create a new buffer of size: ' + (buffer1.byteLength + buffer2.byteLength),\n  );\n  const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n  tmp.set(new Uint8Array(buffer1), 0);\n  tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n  return tmp.buffer as MP4BoxBuffer;\n}\n\n/**\n * MultiBufferStream is a class that acts as a SimpleStream for parsing\n * It holds several, possibly non-contiguous ArrayBuffer objects, each with a fileStart property\n * containing the offset for the buffer data in an original/virtual file\n *\n * It inherits also from DataStream for all read/write/alloc operations\n */\nexport class MultiBufferStream extends DataStream {\n  buffers: Array<MP4BoxBuffer>;\n  bufferIndex: number;\n\n  constructor(buffer?: MP4BoxBuffer) {\n    super(new ArrayBuffer(), 0);\n    // List of ArrayBuffers, with a fileStart property, sorted in fileStart order and non-overlapping\n    this.buffers = [];\n    this.bufferIndex = -1;\n    if (buffer) {\n      this.insertBuffer(buffer);\n      this.bufferIndex = 0;\n    }\n  }\n\n  /***********************************************************************************\n   *                     Methods for the managnement of the buffers                  *\n   *                     (insertion, removal, concatenation, ...)                    *\n   ***********************************************************************************/\n\n  initialized() {\n    if (this.bufferIndex > -1) {\n      return true;\n    } else if (this.buffers.length > 0) {\n      const firstBuffer = this.buffers[0];\n      if (firstBuffer.fileStart === 0) {\n        this.buffer = firstBuffer;\n        this.bufferIndex = 0;\n        Log.debug('MultiBufferStream', 'Stream ready for parsing');\n        return true;\n      } else {\n        Log.warn('MultiBufferStream', 'The first buffer should have a fileStart of 0');\n        this.logBufferLevel();\n        return false;\n      }\n    } else {\n      Log.warn('MultiBufferStream', 'No buffer to start parsing from');\n      this.logBufferLevel();\n      return false;\n    }\n  }\n\n  /**\n   * Reduces the size of a given buffer, but taking the part between offset and offset+newlength\n   * @param  {ArrayBuffer} buffer\n   * @param  {Number}      offset    the start of new buffer\n   * @param  {Number}      newLength the length of the new buffer\n   * @return {ArrayBuffer}           the new buffer\n   */\n  reduceBuffer(buffer: MP4BoxBuffer, offset: number, newLength: number) {\n    const smallB = new Uint8Array(newLength);\n    smallB.set(new Uint8Array(buffer, offset, newLength));\n    (smallB.buffer as MP4BoxBuffer).fileStart = buffer.fileStart + offset;\n    (smallB.buffer as MP4BoxBuffer).usedBytes = 0;\n    return smallB.buffer as MP4BoxBuffer;\n  }\n\n  /**\n   * Inserts the new buffer in the sorted list of buffers,\n   *  making sure, it is not overlapping with existing ones (possibly reducing its size).\n   *  if the new buffer overrides/replaces the 0-th buffer (for instance because it is bigger),\n   *  updates the DataStream buffer for parsing\n   */\n  insertBuffer(ab: MP4BoxBuffer) {\n    let to_add = true;\n    let i = 0;\n    /* TODO: improve insertion if many buffers */\n    for (; i < this.buffers.length; i++) {\n      const b = this.buffers[i];\n      if (ab.fileStart <= b.fileStart) {\n        /* the insertion position is found */\n        if (ab.fileStart === b.fileStart) {\n          /* The new buffer overlaps with an existing buffer */\n          if (ab.byteLength > b.byteLength) {\n            /* the new buffer is bigger than the existing one\n\t\t\t\t\t   remove the existing buffer and try again to insert\n\t\t\t\t\t   the new buffer to check overlap with the next ones */\n            this.buffers.splice(i, 1);\n            i--;\n            continue;\n          } else {\n            /* the new buffer is smaller than the existing one, just drop it */\n            Log.warn(\n              'MultiBufferStream',\n              'Buffer (fileStart: ' +\n                ab.fileStart +\n                ' - Length: ' +\n                ab.byteLength +\n                ') already appended, ignoring',\n            );\n          }\n        } else {\n          /* The beginning of the new buffer is not overlapping with an existing buffer\n\t\t\t\t   let's check the end of it */\n          if (ab.fileStart + ab.byteLength <= b.fileStart) {\n            /* no overlap, we can add it as is */\n          } else {\n            /* There is some overlap, cut the new buffer short, and add it*/\n            ab = this.reduceBuffer(ab, 0, b.fileStart - ab.fileStart);\n          }\n          Log.debug(\n            'MultiBufferStream',\n            'Appending new buffer (fileStart: ' +\n              ab.fileStart +\n              ' - Length: ' +\n              ab.byteLength +\n              ')',\n          );\n          this.buffers.splice(i, 0, ab);\n          /* if this new buffer is inserted in the first place in the list of the buffer,\n\t\t\t\t   and the DataStream is initialized, make it the buffer used for parsing */\n          if (i === 0) {\n            this.buffer = ab;\n          }\n        }\n        to_add = false;\n        break;\n      } else if (ab.fileStart < b.fileStart + b.byteLength) {\n        /* the new buffer overlaps its beginning with the end of the current buffer */\n        const offset = b.fileStart + b.byteLength - ab.fileStart;\n        const newLength = ab.byteLength - offset;\n        if (newLength > 0) {\n          /* the new buffer is bigger than the current overlap, drop the overlapping part and try again inserting the remaining buffer */\n          ab = this.reduceBuffer(ab, offset, newLength);\n        } else {\n          /* the content of the new buffer is entirely contained in the existing buffer, drop it entirely */\n          to_add = false;\n          break;\n        }\n      }\n    }\n    /* if the buffer has not been added, we can add it at the end */\n    if (to_add) {\n      Log.debug(\n        'MultiBufferStream',\n        'Appending new buffer (fileStart: ' + ab.fileStart + ' - Length: ' + ab.byteLength + ')',\n      );\n      this.buffers.push(ab);\n      /* if this new buffer is inserted in the first place in the list of the buffer,\n\t\t   and the DataStream is initialized, make it the buffer used for parsing */\n      if (i === 0) {\n        this.buffer = ab;\n      }\n    }\n  }\n\n  /**\n   * Displays the status of the buffers (number and used bytes)\n   * @param  {Object} info callback method for display\n   */\n  logBufferLevel(info?: boolean) {\n    const ranges = [];\n    let bufferedString = '';\n    let range: { start?: number; end?: number };\n    let used = 0;\n    let total = 0;\n\n    for (let i = 0; i < this.buffers.length; i++) {\n      const buffer = this.buffers[i];\n      if (i === 0) {\n        range = {\n          start: buffer.fileStart,\n          end: buffer.fileStart + buffer.byteLength,\n        };\n        ranges.push(range);\n        bufferedString += '[' + range.start + '-';\n      } else if (range.end === buffer.fileStart) {\n        range.end = buffer.fileStart + buffer.byteLength;\n      } else {\n        range = {\n          start: buffer.fileStart,\n          end: buffer.fileStart + buffer.byteLength,\n        };\n        bufferedString += ranges[ranges.length - 1].end - 1 + '], [' + range.start + '-';\n        ranges.push(range);\n      }\n      used += buffer.usedBytes;\n      total += buffer.byteLength;\n    }\n\n    if (ranges.length > 0) {\n      bufferedString += range.end - 1 + ']';\n    }\n\n    const log = info ? Log.info : Log.debug;\n    if (this.buffers.length === 0) {\n      log('MultiBufferStream', 'No more buffer in memory');\n    } else {\n      log(\n        'MultiBufferStream',\n        '' +\n          this.buffers.length +\n          ' stored buffer(s) (' +\n          used +\n          '/' +\n          total +\n          ' bytes), continuous ranges: ' +\n          bufferedString,\n      );\n    }\n  }\n\n  cleanBuffers() {\n    for (let i = 0; i < this.buffers.length; i++) {\n      const buffer = this.buffers[i];\n      if (buffer.usedBytes === buffer.byteLength) {\n        Log.debug('MultiBufferStream', 'Removing buffer #' + i);\n        this.buffers.splice(i, 1);\n        i--;\n      }\n    }\n  }\n\n  mergeNextBuffer() {\n    if (this.bufferIndex + 1 < this.buffers.length) {\n      const next_buffer = this.buffers[this.bufferIndex + 1];\n      if (next_buffer.fileStart === this.buffer.fileStart + this.buffer.byteLength) {\n        const oldLength = this.buffer.byteLength;\n        const oldUsedBytes = this.buffer.usedBytes;\n        const oldFileStart = this.buffer.fileStart;\n        this.buffers[this.bufferIndex] = concatBuffers(this.buffer, next_buffer);\n        this.buffer = this.buffers[this.bufferIndex];\n        this.buffers.splice(this.bufferIndex + 1, 1);\n        this.buffer.usedBytes = oldUsedBytes; /* TODO: should it be += ? */\n        this.buffer.fileStart = oldFileStart;\n        Log.debug(\n          'ISOFile',\n          'Concatenating buffer for box parsing (length: ' +\n            oldLength +\n            '->' +\n            this.buffer.byteLength +\n            ')',\n        );\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  /*************************************************************************\n   *                        Seek-related functions                         *\n   *************************************************************************/\n\n  /**\n   * Finds the buffer that holds the given file position\n   * @param  {Boolean} fromStart    indicates if the search should start from the current buffer (false)\n   *                                or from the first buffer (true)\n   * @param  {Number}  filePosition position in the file to seek to\n   * @param  {Boolean} markAsUsed   indicates if the bytes in between the current position and the seek position\n   *                                should be marked as used for garbage collection\n   * @return {Number}               the index of the buffer holding the seeked file position, -1 if not found.\n   */\n  findPosition(fromStart: boolean, filePosition: number, markAsUsed: boolean) {\n    let index = -1;\n    let i = fromStart === true ? 0 : this.bufferIndex;\n\n    while (i < this.buffers.length) {\n      const abuffer = this.buffers[i];\n      if (abuffer && abuffer.fileStart <= filePosition) {\n        index = i;\n        if (markAsUsed) {\n          if (abuffer.fileStart + abuffer.byteLength <= filePosition) {\n            abuffer.usedBytes = abuffer.byteLength;\n          } else {\n            abuffer.usedBytes = filePosition - abuffer.fileStart;\n          }\n          this.logBufferLevel();\n        }\n      } else {\n        break;\n      }\n      i++;\n    }\n\n    if (index === -1) {\n      return -1;\n    }\n\n    const abuffer = this.buffers[index];\n    if (abuffer.fileStart + abuffer.byteLength >= filePosition) {\n      Log.debug('MultiBufferStream', 'Found position in existing buffer #' + index);\n      return index;\n    } else {\n      return -1;\n    }\n  }\n\n  /**\n   * Finds the largest file position contained in a buffer or in the next buffers if they are contiguous (no gap)\n   * starting from the given buffer index or from the current buffer if the index is not given\n   *\n   * @param  {Number} inputindex Index of the buffer to start from\n   * @return {Number}            The largest file position found in the buffers\n   */\n  findEndContiguousBuf(inputindex?: number) {\n    const index = inputindex !== undefined ? inputindex : this.bufferIndex;\n    let currentBuf = this.buffers[index];\n    /* find the end of the contiguous range of data */\n    if (this.buffers.length > index + 1) {\n      for (let i = index + 1; i < this.buffers.length; i++) {\n        const nextBuf = this.buffers[i];\n        if (nextBuf.fileStart === currentBuf.fileStart + currentBuf.byteLength) {\n          currentBuf = nextBuf;\n        } else {\n          break;\n        }\n      }\n    }\n    /* return the position of last byte in the file that we have */\n    return currentBuf.fileStart + currentBuf.byteLength;\n  }\n\n  /**\n   * Returns the largest file position contained in the buffers, larger than the given position\n   * @param  {Number} pos the file position to start from\n   * @return {Number}     the largest position in the current buffer or in the buffer and the next contiguous\n   *                      buffer that holds the given position\n   */\n  getEndFilePositionAfter(pos: number) {\n    const index = this.findPosition(true, pos, false);\n    if (index !== -1) {\n      return this.findEndContiguousBuf(index);\n    } else {\n      return pos;\n    }\n  }\n\n  /*************************************************************************\n   *                  Garbage collection related functions                 *\n   *************************************************************************/\n\n  /**\n   * Marks a given number of bytes as used in the current buffer for garbage collection\n   * @param {Number} nbBytes\n   */\n  addUsedBytes(nbBytes: number) {\n    this.buffer.usedBytes += nbBytes;\n    this.logBufferLevel();\n  }\n\n  /**\n   * Marks the entire current buffer as used, ready for garbage collection\n   */\n  setAllUsedBytes() {\n    this.buffer.usedBytes = this.buffer.byteLength;\n    this.logBufferLevel();\n  }\n\n  /*************************************************************************\n   *          Common API between MultiBufferStream and SimpleStream        *\n   *************************************************************************/\n\n  /**\n   * Tries to seek to a given file position\n   * if possible, repositions the parsing from there and returns true\n   * if not possible, does not change anything and returns false\n   * @param  {Number}  filePosition position in the file to seek to\n   * @param  {Boolean} fromStart    indicates if the search should start from the current buffer (false)\n   *                                or from the first buffer (true)\n   * @param  {Boolean} markAsUsed   indicates if the bytes in between the current position and the seek position\n   *                                should be marked as used for garbage collection\n   * @return {Boolean}              true if the seek succeeded, false otherwise\n   */\n  override seek(filePosition: number, fromStart?: boolean, markAsUsed?: boolean) {\n    const index = this.findPosition(fromStart, filePosition, markAsUsed);\n    if (index !== -1) {\n      this.buffer = this.buffers[index];\n      this.bufferIndex = index;\n      this.position = filePosition - this.buffer.fileStart;\n      Log.debug('MultiBufferStream', 'Repositioning parser at buffer position: ' + this.position);\n      return true;\n    } else {\n      Log.debug('MultiBufferStream', 'Position ' + filePosition + ' not found in buffered data');\n      return false;\n    }\n  }\n\n  /**\n   * Returns the current position in the file\n   * @return {Number} the position in the file\n   */\n  getPosition() {\n    if (this.bufferIndex === -1 || this.buffers[this.bufferIndex] === undefined) return 0;\n    return this.buffers[this.bufferIndex].fileStart + this.position;\n  }\n\n  /**\n   * Returns the length of the current buffer\n   * @return {Number} the length of the current buffer\n   */\n  getLength() {\n    return this.byteLength;\n  }\n\n  getEndPosition() {\n    if (this.bufferIndex === -1 || this.buffers[this.bufferIndex] === undefined) return 0;\n    return this.buffers[this.bufferIndex].fileStart + this.byteLength;\n  }\n\n  getAbsoluteEndPosition() {\n    if (this.buffers.length === 0) return 0;\n    const lastBuffer = this.buffers[this.buffers.length - 1];\n    return lastBuffer.fileStart + lastBuffer.byteLength;\n  }\n}\n","/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\n\nimport { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\nimport { DataStream } from '#/DataStream';\nimport { Log } from '#/log';\nimport type { BoxFourCC, Output, Reference } from '@types';\nimport type { mdatBox } from 'entries/all-boxes';\n\nexport class Box {\n  static registryId = Symbol.for('BoxIdentifier');\n\n  boxes?: Array<Box>;\n  data: Array<number> | Uint8Array;\n  has_unparsed_data?: boolean;\n  hdr_size?: number;\n  language: number;\n  languageString?: string;\n  original_size?: number;\n  sizePosition?: number;\n  start?: number;\n  track_ids?: Uint32Array;\n  box_name?: string;\n  uuid?: string;\n\n  // Handle box designation (4CC)\n  // Instance-defined type (used for dynamic box types)\n  #type?: string;\n  static readonly fourcc?: string;\n\n  get type(): string {\n    return (this.constructor as typeof Box).fourcc ?? this.#type;\n  }\n  set type(value: string) {\n    this.#type = value;\n  }\n\n  constructor(public size = 0) {}\n\n  addBox<T extends Box>(box: T): T {\n    if (!this.boxes) {\n      this.boxes = [];\n    }\n    this.boxes.push(box);\n    if (this[box.type + 's']) {\n      this[box.type + 's'].push(box);\n    } else {\n      this[box.type] = box;\n    }\n    return box;\n  }\n\n  set<TProp extends keyof this>(prop: TProp, value: this[TProp]) {\n    this[prop] = value;\n    return this;\n  }\n\n  addEntry(value: Box, _prop?: string) {\n    const prop = _prop || 'entries';\n    if (!this[prop]) {\n      this[prop] = [];\n    }\n    this[prop].push(value);\n    return this;\n  }\n\n  /** @bundle box-write.js */\n  writeHeader(stream: DataStream, msg?: string) {\n    this.size += 8;\n    if (this.size > MAX_UINT32 || this.original_size === 1) {\n      this.size += 8;\n    }\n    if (this.type === 'uuid') {\n      this.size += 16;\n    }\n    Log.debug(\n      'BoxWriter',\n      'Writing box ' +\n        this.type +\n        ' of size: ' +\n        this.size +\n        ' at position ' +\n        stream.getPosition() +\n        (msg || ''),\n    );\n    if (this.original_size === 0) {\n      stream.writeUint32(0);\n    } else if (this.size > MAX_UINT32 || this.original_size === 1) {\n      stream.writeUint32(1);\n    } else {\n      this.sizePosition = stream.getPosition();\n      stream.writeUint32(this.size);\n    }\n    stream.writeString(this.type, undefined, 4);\n    if (this.type === 'uuid') {\n      const uuidBytes = new Uint8Array(16);\n      for (let i = 0; i < 16; i++) {\n        uuidBytes[i] = parseInt(this.uuid.substring(i * 2, i * 2 + 2), 16);\n      }\n      stream.writeUint8Array(uuidBytes);\n    }\n    if (this.size > MAX_UINT32 || this.original_size === 1) {\n      this.sizePosition = stream.getPosition();\n      stream.writeUint64(this.size);\n    }\n  }\n\n  /** @bundle box-write.js */\n  write(stream: DataStream) {\n    if (this.type === 'mdat') {\n      const box = this as mdatBox;\n      if (box.stream) {\n        this.size = box.stream.getAbsoluteEndPosition();\n        this.writeHeader(stream);\n        for (const buffer of box.stream.buffers) {\n          const u8 = new Uint8Array(buffer);\n          stream.writeUint8Array(u8);\n        }\n      } else if (box.data) {\n        this.size = box.data.length;\n        this.writeHeader(stream);\n        stream.writeUint8Array(box.data);\n      }\n    } else {\n      this.size = this.data ? this.data.length : 0;\n      this.writeHeader(stream);\n      if (this.data) {\n        stream.writeUint8Array(this.data);\n      }\n    }\n  }\n\n  /** @bundle box-print.js */\n  printHeader(output: Output) {\n    this.size += 8;\n    if (this.size > MAX_UINT32) {\n      this.size += 8;\n    }\n    if (this.type === 'uuid') {\n      this.size += 16;\n    }\n    output.log(output.indent + 'size:' + this.size);\n    output.log(output.indent + 'type:' + this.type);\n  }\n\n  /** @bundle box-print.js */\n  print(output: Output) {\n    this.printHeader(output);\n  }\n\n  /** @bundle box-parse.js */\n  parse(stream: MultiBufferStream) {\n    if (this.type !== 'mdat') {\n      this.data = stream.readUint8Array(this.size - this.hdr_size);\n    } else {\n      if (this.size === 0) {\n        stream.seek(stream.getEndPosition());\n      } else {\n        stream.seek(this.start + this.size);\n      }\n    }\n  }\n\n  /** @bundle box-parse.js */\n  parseDataAndRewind(stream: MultiBufferStream) {\n    this.data = stream.readUint8Array(this.size - this.hdr_size);\n    // rewinding\n    stream.seek(this.start + this.hdr_size);\n  }\n\n  /** @bundle box-parse.js */\n  parseLanguage(stream: MultiBufferStream) {\n    this.language = stream.readUint16();\n    const chars = [];\n    chars[0] = (this.language >> 10) & 0x1f;\n    chars[1] = (this.language >> 5) & 0x1f;\n    chars[2] = this.language & 0x1f;\n    this.languageString = String.fromCharCode(chars[0] + 0x60, chars[1] + 0x60, chars[2] + 0x60);\n  }\n\n  /** @bundle isofile-advanced-creation.js */\n  computeSize(stream_?: MultiBufferStream) {\n    const stream = stream_ || new MultiBufferStream();\n    this.write(stream);\n  }\n\n  isEndOfBox(stream: MultiBufferStream): boolean {\n    const pos = stream.getPosition();\n    const end = this.start + this.size;\n    return pos === end;\n  }\n}\n\nexport class FullBox extends Box {\n  flags = 0;\n  version = 0;\n\n  /** @bundle box-write.js */\n  writeHeader(stream: MultiBufferStream) {\n    this.size += 4;\n    super.writeHeader(stream, ' v=' + this.version + ' f=' + this.flags);\n    stream.writeUint8(this.version);\n    stream.writeUint24(this.flags);\n  }\n\n  /** @bundle box-print.js */\n  printHeader(output: Output) {\n    this.size += 4;\n    super.printHeader(output);\n    output.log(output.indent + 'version:' + this.version);\n    output.log(output.indent + 'flags:' + this.flags);\n  }\n\n  /** @bundle box-parse.js */\n  parseDataAndRewind(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.data = stream.readUint8Array(this.size - this.hdr_size);\n    // restore the header size as if the full header had not been parsed\n    this.hdr_size -= 4;\n    // rewinding\n    stream.seek(this.start + this.hdr_size);\n  }\n\n  /** @bundle box-parse.js */\n  parseFullHeader(stream: MultiBufferStream) {\n    this.version = stream.readUint8();\n    this.flags = stream.readUint24();\n    this.hdr_size += 4;\n  }\n\n  /** @bundle box-parse.js */\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.data = stream.readUint8Array(this.size - this.hdr_size);\n  }\n}\n\nexport class SampleGroupEntry {\n  static registryId = Symbol.for('SampleGroupEntryIdentifier');\n\n  data: ArrayLike<number>;\n  description_length: number;\n\n  constructor(public grouping_type: string) {}\n\n  /** @bundle writing/samplegroups/samplegroup.js */\n  write(stream: MultiBufferStream) {\n    stream.writeUint8Array(this.data);\n  }\n\n  /** @bundle parsing/samplegroups/samplegroup.js */\n  parse(stream: MultiBufferStream) {\n    Log.warn('BoxParser', `Unknown sample group type: '${this.grouping_type}'`);\n    this.data = stream.readUint8Array(this.description_length);\n  }\n}\n\nexport class TrackGroupTypeBox extends FullBox {\n  track_group_id: number;\n\n  /** @bundle parsing/TrackGroup.js */\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.track_group_id = stream.readUint32();\n  }\n}\n\n/** @bundle parsing/singleitemtypereference.js */\nexport class SingleItemTypeReferenceBox extends Box {\n  from_item_ID: number;\n  references: Array<Reference>;\n\n  constructor(\n    fourcc: string,\n    size: number,\n    public box_name: string,\n    public hdr_size: number,\n    public start: number,\n  ) {\n    super(size);\n    this.type = fourcc as BoxFourCC;\n  }\n  parse(stream: MultiBufferStream): void {\n    this.from_item_ID = stream.readUint16();\n    const count = stream.readUint16();\n    this.references = [];\n    for (let i = 0; i < count; i++) {\n      this.references[i] = {\n        to_item_ID: stream.readUint16(),\n      };\n    }\n  }\n}\n\n/** @bundle parsing/singleitemtypereferencelarge.js */\nexport class SingleItemTypeReferenceBoxLarge extends Box {\n  from_item_ID: number;\n  references: Array<Reference>;\n\n  constructor(\n    fourcc: string,\n    size: number,\n    public box_name: string,\n    public hdr_size: number,\n    public start: number,\n  ) {\n    super(size);\n    this.type = fourcc as BoxFourCC;\n  }\n  parse(stream: MultiBufferStream): void {\n    this.from_item_ID = stream.readUint32();\n    const count = stream.readUint16();\n    this.references = [];\n    for (let i = 0; i < count; i++) {\n      this.references[i] = {\n        to_item_ID: stream.readUint32(),\n      };\n    }\n  }\n}\n\n/** @bundle parsing/TrakReference.js */\nexport class TrackReferenceTypeBox extends Box {\n  constructor(\n    fourcc: string,\n    size: number,\n    public hdr_size: number,\n    public start: number,\n  ) {\n    super(size);\n    this.type = fourcc as BoxFourCC;\n  }\n\n  parse(stream: MultiBufferStream | DataStream) {\n    this.track_ids = stream.readUint32Array((this.size - this.hdr_size) / 4);\n  }\n\n  /** @bundle box-write.js */\n  write(stream: DataStream) {\n    this.size = this.track_ids.length * 4;\n    this.writeHeader(stream);\n    stream.writeUint32Array(this.track_ids);\n  }\n}\n","import { Box } from '#/box';\n\nexport const DIFF_BOXES_PROP_NAMES = [\n  'boxes',\n  'entries',\n  'references',\n  'subsamples',\n  'items',\n  'item_infos',\n  'extents',\n  'associations',\n  'subsegments',\n  'ranges',\n  'seekLists',\n  'seekPoints',\n  'esd',\n  'levels',\n] as const;\n\nexport const DIFF_PRIMITIVE_ARRAY_PROP_NAMES = [\n  'compatible_brands',\n  'matrix',\n  'opcolor',\n  'sample_counts',\n  'sample_deltas',\n  'first_chunk',\n  'samples_per_chunk',\n  'sample_sizes',\n  'chunk_offsets',\n  'sample_offsets',\n  'sample_description_index',\n  'sample_duration',\n] as const;\n\n/** @bundle box-diff.js */\nexport function boxEqualFields(box_a: Box, box_b: Box) {\n  if (box_a && !box_b) return false;\n  let prop: string;\n  for (prop in box_a) {\n    if (DIFF_BOXES_PROP_NAMES.find(name => name === prop)) {\n      continue;\n    } else if (box_a[prop] instanceof Box || box_b[prop] instanceof Box) {\n      continue;\n    } else if (typeof box_a[prop] === 'undefined' || typeof box_b[prop] === 'undefined') {\n      continue;\n    } else if (typeof box_a[prop] === 'function' || typeof box_b[prop] === 'function') {\n      continue;\n    } else if (\n      ('subBoxNames' in box_a &&\n        (box_a.subBoxNames as Array<string>).indexOf(prop.slice(0, 4)) > -1) ||\n      ('subBoxNames' in box_b &&\n        (box_b.subBoxNames as Array<string>).indexOf(prop.slice(0, 4)) > -1)\n    ) {\n      continue;\n    } else {\n      if (\n        prop === 'data' ||\n        prop === 'start' ||\n        prop === 'size' ||\n        prop === 'creation_time' ||\n        prop === 'modification_time'\n      ) {\n        continue;\n      } else if (DIFF_PRIMITIVE_ARRAY_PROP_NAMES.find(name => name === prop)) {\n        continue;\n      } else {\n        if (box_a[prop] !== box_b[prop]) {\n          return false;\n        }\n      }\n    }\n  }\n  return true;\n}\n\nexport function boxEqual(box_a: Box, box_b: Box) {\n  if (!boxEqualFields(box_a, box_b)) {\n    return false;\n  }\n  for (let j = 0; j < DIFF_BOXES_PROP_NAMES.length; j++) {\n    const name = DIFF_BOXES_PROP_NAMES[j];\n    if (box_a[name] && box_b[name]) {\n      if (!boxEqual(box_a[name], box_b[name])) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n","import type { Nalu } from '@types';\n\nexport class ParameterSetArray extends Array<Nalu> {\n  toString() {\n    let str = \"<table class='inner-table'>\";\n    str += '<thead><tr><th>length</th><th>nalu_data</th></tr></thead>';\n    str += '<tbody>';\n\n    for (let i = 0; i < this.length; i++) {\n      const nalu = this[i];\n      str += '<tr>';\n      str += '<td>' + nalu.length + '</td>';\n      str += '<td>';\n      str += nalu.data.reduce(function (str, byte) {\n        return str + byte.toString(16).padStart(2, '0');\n      }, '0x');\n      str += '</td></tr>';\n    }\n    str += '</tbody></table>';\n    return str;\n  }\n}\n","import { Box } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { DataStream } from '#/DataStream';\nimport { ParameterSetArray } from './displays/parameterSetArray';\n\nexport class avcCBox extends Box {\n  static override readonly fourcc = 'avcC' as const;\n  box_name = 'AVCConfigurationBox' as const;\n\n  configurationVersion: number;\n  AVCProfileIndication: number;\n  profile_compatibility: number;\n  AVCLevelIndication: number;\n  lengthSizeMinusOne: number;\n  nb_SPS_nalus: number;\n  SPS: ParameterSetArray;\n  nb_PPS_nalus: number;\n  PPS: ParameterSetArray;\n  ext: Uint8Array;\n\n  parse(stream: MultiBufferStream | DataStream) {\n    this.configurationVersion = stream.readUint8();\n    this.AVCProfileIndication = stream.readUint8();\n    this.profile_compatibility = stream.readUint8();\n    this.AVCLevelIndication = stream.readUint8();\n    this.lengthSizeMinusOne = stream.readUint8() & 0x3;\n    this.nb_SPS_nalus = stream.readUint8() & 0x1f;\n    let toparse = this.size - this.hdr_size - 6;\n    this.SPS = new ParameterSetArray();\n    for (let i = 0; i < this.nb_SPS_nalus; i++) {\n      const length = stream.readUint16();\n      this.SPS.push({ length, data: stream.readUint8Array(length) });\n      toparse -= 2 + length;\n    }\n    this.nb_PPS_nalus = stream.readUint8();\n    toparse--;\n    this.PPS = new ParameterSetArray();\n    for (let i = 0; i < this.nb_PPS_nalus; i++) {\n      const length = stream.readUint16();\n      this.PPS.push({ length, data: stream.readUint8Array(length) });\n      toparse -= 2 + length;\n    }\n    if (toparse > 0) {\n      this.ext = stream.readUint8Array(toparse);\n    }\n  }\n\n  /** @bundle writing/avcC.js */\n  write(stream: MultiBufferStream) {\n    this.size = 7;\n    for (let i = 0; i < this.SPS.length; i++) {\n      this.size += 2 + this.SPS[i].length;\n    }\n    for (let i = 0; i < this.PPS.length; i++) {\n      this.size += 2 + this.PPS[i].length;\n    }\n    if (this.ext) {\n      this.size += this.ext.length;\n    }\n    this.writeHeader(stream);\n    stream.writeUint8(this.configurationVersion);\n    stream.writeUint8(this.AVCProfileIndication);\n    stream.writeUint8(this.profile_compatibility);\n    stream.writeUint8(this.AVCLevelIndication);\n    stream.writeUint8(this.lengthSizeMinusOne + (63 << 2));\n    stream.writeUint8(this.SPS.length + (7 << 5));\n    for (let i = 0; i < this.SPS.length; i++) {\n      stream.writeUint16(this.SPS[i].length);\n      stream.writeUint8Array(this.SPS[i].data);\n    }\n    stream.writeUint8(this.PPS.length);\n    for (let i = 0; i < this.PPS.length; i++) {\n      stream.writeUint16(this.PPS[i].length);\n      stream.writeUint8Array(this.PPS[i].data);\n    }\n    if (this.ext) {\n      stream.writeUint8Array(this.ext);\n    }\n  }\n}\n","import type * as MP4Box from '@types';\nimport type { Box, SampleGroupEntry } from '#/box';\nimport type { SampleEntry } from '#/boxes/sampleentries/base';\n\nfunction getRegistryId(boxClass: object): symbol {\n  let current = boxClass;\n  while (current) {\n    if ('registryId' in current) {\n      return (current as unknown)['registryId'] as symbol;\n    }\n    current = Object.getPrototypeOf(current);\n  }\n}\n\nconst isSampleGroupEntry = (value: object): value is SampleGroupEntry => {\n  const symbol = Symbol.for('SampleGroupEntryIdentifier');\n  return getRegistryId(value) === symbol;\n};\n\nconst isSampleEntry = (value: object): value is SampleEntry => {\n  const symbol = Symbol.for('SampleEntryIdentifier');\n  return getRegistryId(value) === symbol;\n};\n\nconst isBox = (value: object): value is Box => {\n  const symbol = Symbol.for('BoxIdentifier');\n  return getRegistryId(value) === symbol;\n};\n\nexport const BoxRegistry: MP4Box.BoxRegistry = {\n  uuid: {},\n  sampleEntry: {},\n  sampleGroupEntry: {},\n  box: {},\n};\nexport function registerBoxes<T>(registry: T): MP4Box.BoxRegistry<T> {\n  const localRegistry = {\n    uuid: {},\n    sampleEntry: {},\n    sampleGroupEntry: {},\n    box: {},\n  } as MP4Box.BoxRegistry<T>;\n\n  for (const [key, value] of Object.entries(registry)) {\n    // Check if SampleGroupEntry class\n    if (isSampleGroupEntry(value)) {\n      const groupingType = 'grouping_type' in value ? (value.grouping_type as string) : undefined;\n\n      if (!groupingType) {\n        throw new Error(\n          `SampleGroupEntry class ${key} does not have a valid static grouping_type. Please ensure it is defined correctly.`,\n        );\n      }\n\n      if (groupingType in localRegistry.sampleGroupEntry) {\n        throw new Error(\n          `SampleGroupEntry class ${key} has a grouping_type that is already registered. Please ensure it is unique.`,\n        );\n      }\n\n      localRegistry.sampleGroupEntry[groupingType] = value;\n      continue;\n    }\n\n    // Check if SampleEntry class\n    if (isSampleEntry(value)) {\n      const fourcc = 'fourcc' in value ? (value.fourcc as string) : undefined;\n\n      if (!fourcc) {\n        throw new Error(\n          `SampleEntry class ${key} does not have a valid static fourcc. Please ensure it is defined correctly.`,\n        );\n      }\n\n      if (fourcc in localRegistry.sampleEntry) {\n        throw new Error(\n          `SampleEntry class ${key} has a fourcc that is already registered. Please ensure it is unique.`,\n        );\n      }\n\n      localRegistry.sampleEntry[fourcc] = value;\n      continue;\n    }\n\n    // Check if Box class\n    if (isBox(value)) {\n      const fourcc = 'fourcc' in value ? (value.fourcc as string) : undefined;\n      const uuid = 'uuid' in value ? (value.uuid as string) : undefined;\n\n      // Check for UUID first\n      if (fourcc === 'uuid') {\n        if (!uuid) {\n          throw new Error(\n            `Box class ${key} has a fourcc of 'uuid' but does not have a valid uuid. Please ensure it is defined correctly.`,\n          );\n        }\n\n        if (uuid in localRegistry.uuid) {\n          throw new Error(\n            `Box class ${key} has a uuid that is already registered. Please ensure it is unique.`,\n          );\n        }\n\n        localRegistry.uuid[uuid] = value;\n        continue;\n      }\n\n      // This is a regular box with a fourcc\n      localRegistry.box[fourcc] = value;\n      continue;\n    }\n\n    throw new Error(\n      `Box class ${key} does not have a valid static fourcc, uuid, or grouping_type. Please ensure it is defined correctly.`,\n    );\n  }\n\n  // Assign the local registry to the global BoxRegistry\n  BoxRegistry.uuid = { ...localRegistry.uuid };\n  BoxRegistry.sampleEntry = { ...localRegistry.sampleEntry };\n  BoxRegistry.sampleGroupEntry = { ...localRegistry.sampleGroupEntry };\n  BoxRegistry.box = { ...localRegistry.box };\n\n  return BoxRegistry as MP4Box.BoxRegistry<T>;\n}\n\nexport const DescriptorRegistry = {} as MP4Box.DescriptorRegistry;\nexport function registerDescriptors<T>(registry: T) {\n  Object.entries(registry).forEach(([key, value]) => (DescriptorRegistry[key] = value));\n  return DescriptorRegistry;\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport type { BoxFourCC, IncompleteBox } from '@types';\nimport { Log } from '#/log';\nimport { ERR_INVALID_DATA, ERR_NOT_ENOUGH_DATA, OK } from '#/constants';\nimport { Box } from '#/box';\nimport { BoxRegistry } from '#/registry';\n\nexport function parseUUID(stream: MultiBufferStream) {\n  return parseHex16(stream);\n}\n\nexport function parseHex16(stream: MultiBufferStream) {\n  let hex16 = '';\n  for (let i = 0; i < 16; i++) {\n    const hex = stream.readUint8().toString(16);\n    hex16 += hex.length === 1 ? '0' + hex : hex;\n  }\n  return hex16;\n}\n\nexport function parseOneBox(\n  stream: MultiBufferStream,\n  headerOnly: boolean,\n  parentSize?: number,\n): IncompleteBox {\n  let box: Box;\n  let originalSize: number;\n  const start = stream.getPosition();\n  let hdr_size = 0;\n  let uuid: string;\n  if (stream.getEndPosition() - start < 8) {\n    Log.debug('BoxParser', 'Not enough data in stream to parse the type and size of the box');\n    return { code: ERR_NOT_ENOUGH_DATA };\n  }\n  if (parentSize && parentSize < 8) {\n    Log.debug('BoxParser', 'Not enough bytes left in the parent box to parse a new box');\n    return { code: ERR_NOT_ENOUGH_DATA };\n  }\n  let size = stream.readUint32();\n  const type = stream.readString(4);\n\n  // Check if type is a valid fourcc\n  if (type.length !== 4 || !/^[\\x20-\\x7E]{4}$/.test(type)) {\n    Log.error('BoxParser', `Invalid box type: '${type}'`);\n    return { code: ERR_INVALID_DATA, start, type };\n  }\n\n  let box_type = type;\n  Log.debug(\n    'BoxParser',\n    \"Found box of type '\" + type + \"' and size \" + size + ' at position ' + start,\n  );\n  hdr_size = 8;\n  if (type === 'uuid') {\n    if (stream.getEndPosition() - stream.getPosition() < 16 || parentSize - hdr_size < 16) {\n      stream.seek(start);\n      Log.debug('BoxParser', 'Not enough bytes left in the parent box to parse a UUID box');\n      return { code: ERR_NOT_ENOUGH_DATA };\n    }\n    uuid = parseUUID(stream);\n    hdr_size += 16;\n    box_type = uuid;\n  }\n  if (size === 1) {\n    if (\n      stream.getEndPosition() - stream.getPosition() < 8 ||\n      (parentSize && parentSize - hdr_size < 8)\n    ) {\n      stream.seek(start);\n      Log.warn(\n        'BoxParser',\n        'Not enough data in stream to parse the extended size of the \"' + type + '\" box',\n      );\n      return { code: ERR_NOT_ENOUGH_DATA };\n    }\n    originalSize = size;\n    size = stream.readUint64();\n    hdr_size += 8;\n  } else if (size === 0) {\n    /* box extends till the end of file or invalid file */\n    if (parentSize) {\n      size = parentSize;\n    } else {\n      /* box extends till the end of file */\n      if (type !== 'mdat') {\n        Log.error('BoxParser', \"Unlimited box size not supported for type: '\" + type + \"'\");\n        box = new Box(size);\n        box.type = type as BoxFourCC;\n        return { code: OK, box, size: box.size };\n      }\n    }\n  }\n  if (size !== 0 && size < hdr_size) {\n    Log.error(\n      'BoxParser',\n      'Box of type ' + type + ' has an invalid size ' + size + ' (too small to be a box)',\n    );\n    return {\n      code: ERR_NOT_ENOUGH_DATA,\n      type: type,\n      size: size,\n      hdr_size: hdr_size,\n      start: start,\n    };\n  }\n  if (size !== 0 && parentSize && size > parentSize) {\n    Log.error(\n      'BoxParser',\n      \"Box of type '\" +\n        type +\n        \"' has a size \" +\n        size +\n        ' greater than its container size ' +\n        parentSize,\n    );\n    return {\n      code: ERR_NOT_ENOUGH_DATA,\n      type: type,\n      size: size,\n      hdr_size: hdr_size,\n      start: start,\n    };\n  }\n  if (size !== 0 && start + size > stream.getEndPosition()) {\n    stream.seek(start);\n    Log.info('BoxParser', \"Not enough data in stream to parse the entire '\" + type + \"' box\");\n    return {\n      code: ERR_NOT_ENOUGH_DATA,\n      type: type,\n      size: size,\n      hdr_size: hdr_size,\n      start: start,\n      original_size: originalSize,\n    };\n  }\n  if (headerOnly) {\n    return { code: OK, type: type, size: size, hdr_size: hdr_size, start: start };\n  } else {\n    if (type in BoxRegistry.box) {\n      box = new BoxRegistry.box[type](size);\n    } else {\n      if (type !== 'uuid') {\n        Log.warn('BoxParser', `Unknown box type: '${type}'`);\n        box = new Box(size);\n        box.type = type as BoxFourCC;\n        box.has_unparsed_data = true;\n      } else {\n        if (uuid in BoxRegistry.uuid) {\n          box = new BoxRegistry.uuid[uuid](size);\n        } else {\n          Log.warn('BoxParser', `Unknown UUID box type: '${uuid}'`);\n          box = new Box(size);\n          box.type = type as BoxFourCC;\n          box.uuid = uuid;\n          box.has_unparsed_data = true;\n        }\n      }\n    }\n  }\n  box.original_size = originalSize;\n  box.hdr_size = hdr_size;\n  /* recording the position of the box in the input stream */\n  box.start = start;\n  if (box.write === Box.prototype.write && box.type !== 'mdat') {\n    Log.info(\n      'BoxParser',\n      \"'\" +\n        box_type +\n        \"' box writing not yet implemented, keeping unparsed data in memory for later write\",\n    );\n    box.parseDataAndRewind(stream);\n  }\n  box.parse(stream);\n  const diff = stream.getPosition() - (box.start + box.size);\n  if (diff < 0) {\n    Log.warn(\n      'BoxParser',\n      \"Parsing of box '\" +\n        box_type +\n        \"' did not read the entire indicated box data size (missing \" +\n        -diff +\n        ' bytes), seeking forward',\n    );\n    stream.seek(box.start + box.size);\n  } else if (diff > 0 && box.size !== 0) {\n    Log.error(\n      'BoxParser',\n      \"Parsing of box '\" +\n        box_type +\n        \"' read \" +\n        diff +\n        ' more bytes than the indicated box data size, seeking backwards',\n    );\n    stream.seek(box.start + box.size);\n  }\n  return { code: OK, box, size: box.size };\n}\n","import type { BoxKind, Output } from '@types';\nimport type { MultiBufferStream } from '#/buffer';\nimport type { DataStream } from '#/DataStream';\nimport { Box } from '#/box';\nimport { Log } from '#/log';\nimport { OK } from '#/constants';\nimport { parseOneBox } from '#/parser';\n\nexport class ContainerBox extends Box {\n  subBoxNames?: ReadonlyArray<string>;\n\n  /** @bundle box-write.js */\n  write(stream: MultiBufferStream | DataStream) {\n    this.size = 0;\n    this.writeHeader(stream);\n    if (this.boxes) {\n      for (let i = 0; i < this.boxes.length; i++) {\n        if (this.boxes[i]) {\n          this.boxes[i].write(stream);\n          this.size += this.boxes[i].size;\n        }\n      }\n    }\n    /* adjusting the size, now that all sub-boxes are known */\n    Log.debug('BoxWriter', 'Adjusting box ' + this.type + ' with new size ' + this.size);\n    stream.adjustUint32(this.sizePosition, this.size);\n  }\n\n  /** @bundle box-print.js */\n  print(output: Output) {\n    this.printHeader(output);\n    for (let i = 0; i < this.boxes.length; i++) {\n      if (this.boxes[i]) {\n        const prev_indent = output.indent;\n        output.indent += ' ';\n        this.boxes[i].print(output);\n        output.indent = prev_indent;\n      }\n    }\n  }\n\n  /** @bundle box-parse.js */\n  parse(stream: MultiBufferStream) {\n    let ret: ReturnType<typeof parseOneBox>;\n    while (stream.getPosition() < this.start + this.size) {\n      ret = parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n      if (ret.code === OK) {\n        const box = ret.box as BoxKind;\n        if (!this.boxes) {\n          this.boxes = [];\n        }\n        /* store the box in the 'boxes' array to preserve box order (for offset) but also store box in a property for more direct access */\n        this.boxes.push(box);\n        if (this.subBoxNames && this.subBoxNames.indexOf(box.type) !== -1) {\n          const fourcc = this.subBoxNames[this.subBoxNames.indexOf(box.type)] + 's';\n          if (!this[fourcc]) this[fourcc] = [];\n          this[fourcc].push(box);\n        } else {\n          const box_type = box.type !== 'uuid' ? box.type : box.uuid;\n          if (this[box_type]) {\n            Log.warn(\n              'ContainerBox',\n              `Box of type ${box_type} already exists in container box ${this.type}.`,\n            );\n          } else {\n            this[box_type] = box;\n          }\n        }\n      } else {\n        return;\n      }\n    }\n  }\n}\n","import { Box, FullBox } from '#/box';\nimport { ContainerBox } from '#/containerBox';\nimport type { co64Box } from '#/boxes/co64';\nimport type { cslgBox } from '#/boxes/cslg';\nimport type { cttsBox } from '#/boxes/ctts';\nimport type { elngBox } from '#/boxes/elng';\nimport type { elstBox } from '#/boxes/elst';\nimport type { hdlrBox } from '#/boxes/hdlr';\nimport type { ipmaBox } from '#/boxes/ipma';\nimport type { kindBox } from '#/boxes/kind';\nimport type { mdhdBox } from '#/boxes/mdhd';\nimport type { mehdBox } from '#/boxes/mehd';\nimport type { mvhdBox } from '#/boxes/mvhd';\nimport type { psshBox } from '#/boxes/pssh';\nimport type { sbgpBox } from '#/boxes/sbgp';\nimport type { sdtpBox } from '#/boxes/sdtp';\nimport type { sgpdBox } from '#/boxes/sgpd';\nimport type { stcoBox } from '#/boxes/stco';\nimport type { stdpBox } from '#/boxes/stdp';\nimport type { stscBox } from '#/boxes/stsc';\nimport type { stsdBox } from '#/boxes/stsd';\nimport type { stssBox } from '#/boxes/stss';\nimport type { stszBox } from '#/boxes/stsz';\nimport type { sttsBox } from '#/boxes/stts';\nimport type { stz2Box } from '#/boxes/stz2';\nimport type { subsBox } from '#/boxes/subs';\nimport type { tfdtBox } from '#/boxes/tfdt';\nimport type { tfhdBox } from '#/boxes/tfhd';\nimport type { tfraBox } from '#/boxes/tfra';\nimport type { tkhdBox } from '#/boxes/tkhd';\nimport type { trefBox } from '#/boxes/tref';\nimport type { trexBox } from '#/boxes/trex';\nimport type { trunBox } from '#/boxes/trun';\nimport type { tycoBox } from '#/boxes/tyco';\nimport type { SampleGroupInfo } from '#/isofile';\nimport type { Sample } from '@types';\nimport type { drefBox } from './dref';\nimport type { EntityToGroup } from './EntityToGroup/base';\nimport type { mfhdBox } from './mfhd';\nimport type { smhdBox } from './smhd';\nimport type { sthdBox } from './sthd';\nimport type { vmhdBox } from './vmhd';\nimport type { hvcCBox } from './hvcC';\nimport type { ispeBox } from './ispe';\nimport type { clapBox } from './clap';\nimport type { irotBox } from './irot';\nimport type { maxrBox } from './maxr';\nimport type { MultiBufferStream } from '#/buffer';\n\n/**********************************************************************************/\n/*                                                                                */\n/*                                   Basic Boxes                                  */\n/*                                                                                */\n/**********************************************************************************/\n\nexport class mdatBox extends Box {\n  static override readonly fourcc = 'mdat' as const;\n  box_name = 'MediaDataBox' as const;\n  stream?: MultiBufferStream;\n}\n\nexport class idatBox extends Box {\n  static override readonly fourcc = 'idat' as const;\n  box_name = 'ItemDataBox' as const;\n}\nexport class freeBox extends Box {\n  static override readonly fourcc = 'free' as const;\n  box_name = 'FreeSpaceBox' as const;\n}\nexport class skipBox extends Box {\n  static override readonly fourcc = 'skip' as const;\n  box_name = 'FreeSpaceBox' as const;\n}\n\n/**********************************************************************************/\n/*                                                                                */\n/*                                   Full Boxes                                   */\n/*                                                                                */\n/**********************************************************************************/\n\nexport class hmhdBox extends FullBox {\n  static override readonly fourcc = 'hmhd' as const;\n  box_name = 'HintMediaHeaderBox' as const;\n}\nexport class nmhdBox extends FullBox {\n  static override readonly fourcc = 'nmhd' as const;\n  box_name = 'NullMediaHeaderBox' as const;\n}\nexport class iodsBox extends FullBox {\n  static override readonly fourcc = 'iods' as const;\n  box_name = 'ObjectDescriptorBox' as const;\n}\nexport class xmlBox extends FullBox {\n  static override readonly fourcc = 'xml ' as const;\n  box_name = 'XMLBox' as const;\n}\nexport class bxmlBox extends FullBox {\n  static override readonly fourcc = 'bxml' as const;\n  box_name = 'BinaryXMLBox' as const;\n}\nexport class iproBox extends FullBox {\n  static override readonly fourcc = 'ipro' as const;\n  box_name = 'ItemProtectionBox' as const;\n\n  sinfs: Array<sinfBox> = [];\n  get protections() {\n    return this.sinfs;\n  }\n}\n\n/**********************************************************************************/\n/*                                                                                */\n/*                                Container Boxes                                 */\n/*                                                                                */\n/**********************************************************************************/\n\nexport class moovBox extends ContainerBox {\n  static override readonly fourcc = 'moov' as const;\n  box_name = 'MovieBox' as const;\n  timescale: number;\n  mvhd: mvhdBox;\n  mvhds: Array<mvhdBox>;\n  mvex?: mvexBox;\n  mvexs: Array<mvexBox>;\n  iods: iodsBox;\n  iodss: Array<iodsBox>;\n  trak: trakBox;\n\n  traks: Array<trakBox> = [];\n  psshs: Array<psshBox> = [];\n  subBoxNames = ['trak', 'pssh'] as const;\n}\nexport class trakBox extends ContainerBox {\n  static override readonly fourcc = 'trak' as const;\n  box_name = 'TrackBox' as const;\n  mdia: mdiaBox;\n  mdias: Array<mdiaBox>;\n  tkhd: tkhdBox;\n  tkhds: Array<tkhdBox>;\n  tref: trefBox;\n  trefs: Array<trefBox>;\n  edts?: edtsBox;\n  edtss: Array<edtsBox>;\n  udta: udtaBox;\n  udtas: Array<udtaBox>;\n  samples_duration: number;\n  samples: Array<Sample> = [];\n  samples_size: number;\n  nextSample: number;\n  lastValidSample: number;\n  sample_groups_info: Array<SampleGroupInfo>;\n  first_dts: number;\n  first_traf_merged: boolean;\n  has_fragment_subsamples: boolean;\n}\nexport class edtsBox extends ContainerBox {\n  static override readonly fourcc = 'edts' as const;\n  box_name = 'EditBox' as const;\n  elst?: elstBox;\n  elsts: Array<elstBox>;\n}\nexport class mdiaBox extends ContainerBox {\n  static override readonly fourcc = 'mdia' as const;\n  box_name = 'MediaBox' as const;\n  elng: elngBox;\n  elngs: Array<elngBox>;\n  hdlr: hdlrBox;\n  hdlrs: Array<hdlrBox>;\n  mdhd: mdhdBox;\n  mdhds: Array<mdhdBox>;\n  minf: minfBox;\n  minfs: Array<minfBox>;\n}\nexport class minfBox extends ContainerBox {\n  static override readonly fourcc = 'minf' as const;\n  box_name = 'MediaInformationBox' as const;\n  stbl: stblBox;\n  stbls: Array<stblBox>;\n  hmhd: hmhdBox;\n  hmhds: Array<hmhdBox>;\n  vmhd?: vmhdBox;\n  vmhds?: Array<vmhdBox>;\n  smhd?: smhdBox;\n  smhds?: Array<smhdBox>;\n  sthd?: sthdBox;\n  sthds?: Array<sthdBox>;\n  nmhd?: nmhdBox;\n  nmhds?: Array<nmhdBox>;\n  dinf: dinfBox;\n  dinfs: Array<dinfBox>;\n  dref: drefBox;\n  drefs: Array<drefBox>;\n}\nexport class dinfBox extends ContainerBox {\n  static override readonly fourcc = 'dinf' as const;\n  box_name = 'DataInformationBox' as const;\n}\nexport class stblBox extends ContainerBox {\n  static override readonly fourcc = 'stbl' as const;\n  box_name = 'SampleTableBox' as const;\n  cslg: cslgBox;\n  cslgs: Array<cslgBox>;\n  stsd: stsdBox;\n  stsds: Array<stsdBox>;\n  stsc: stscBox;\n  stscs: Array<stscBox>;\n  stco: stcoBox;\n  stcos: Array<stcoBox>;\n  co64: co64Box;\n  co64s: Array<co64Box>;\n  stsz: stszBox;\n  stszs: Array<stszBox>;\n  stz2: stz2Box;\n  stz2s: Array<stz2Box>;\n  stts: sttsBox;\n  sttss: Array<sttsBox>;\n  ctts: cttsBox;\n  cttss: Array<cttsBox>;\n  stss: stssBox;\n  stsss: Array<stssBox>;\n  subs: subsBox;\n  subss: Array<subsBox>;\n  stdp: stdpBox;\n  stdps: Array<stdpBox>;\n  sdtp: sdtpBox;\n  sdtps: Array<sdtpBox>;\n\n  sgpds: Array<sgpdBox> = [];\n  sbgps: Array<sbgpBox> = [];\n  subBoxNames = ['sgpd', 'sbgp'];\n}\nexport class mvexBox extends ContainerBox {\n  static override readonly fourcc = 'mvex' as const;\n  box_name = 'MovieExtendsBox' as const;\n  trex: trexBox;\n  mehd: mehdBox;\n  mehds: Array<mehdBox>;\n\n  trexs: Array<trexBox> = [];\n  subBoxNames = ['trex'];\n}\nexport class moofBox extends ContainerBox {\n  static override readonly fourcc = 'moof' as const;\n  box_name = 'MovieFragmentBox' as const;\n  mfhd: mfhdBox;\n  mfhds: Array<mfhdBox>;\n  traf: trafBox;\n\n  trafs: Array<trafBox> = [];\n  subBoxNames = ['traf'];\n}\nexport class trafBox extends ContainerBox {\n  static override readonly fourcc = 'traf' as const;\n  box_name = 'TrackFragmentBox' as const;\n  subs: subsBox;\n  subss: Array<subsBox>;\n  tfdt: tfdtBox;\n  tfdts: Array<tfdtBox>;\n  tfhd: tfhdBox;\n  tfhds: Array<tfhdBox>;\n  trun: trunBox;\n\n  first_sample_index: number;\n  sample_number: number;\n  sample_groups_info: Array<SampleGroupInfo>;\n\n  truns: Array<trunBox> = [];\n  sgpds: Array<sgpdBox> = [];\n  sbgps: Array<sbgpBox> = [];\n  subBoxNames = ['trun', 'sgpd', 'sbgp'];\n}\nexport class vttcBox extends ContainerBox {\n  static override readonly fourcc = 'vttc' as const;\n  box_name = 'VTTCueBox' as const;\n}\n\nexport class mfraBox extends ContainerBox {\n  static override readonly fourcc = 'mfra' as const;\n  box_name = 'MovieFragmentRandomAccessBox' as const;\n  tfras: Array<tfraBox> = [];\n  subBoxNames = ['tfra'] as const;\n}\nexport class mecoBox extends ContainerBox {\n  static override readonly fourcc = 'meco' as const;\n  box_name = 'AdditionalMetadataContainerBox' as const;\n}\n\nexport class hntiBox extends ContainerBox {\n  static override readonly fourcc = 'hnti' as const;\n  box_name = 'trackhintinformation' as const;\n  subBoxNames = ['sdp ', 'rtp '] as const;\n}\nexport class hinfBox extends ContainerBox {\n  static override readonly fourcc = 'hinf' as const;\n  box_name = 'hintstatisticsbox' as const;\n  maxrs: Array<maxrBox> = [];\n  subBoxNames = ['maxr'] as const;\n}\nexport class strkBox extends ContainerBox {\n  static override readonly fourcc = 'strk' as const;\n  box_name = 'SubTrackBox' as const;\n}\nexport class strdBox extends ContainerBox {\n  static override readonly fourcc = 'strd' as const;\n  box_name = 'SubTrackDefinitionBox' as const;\n}\nexport class sinfBox extends ContainerBox {\n  static override readonly fourcc = 'sinf' as const;\n  box_name = 'ProtectionSchemeInfoBox' as const;\n}\nexport class rinfBox extends ContainerBox {\n  static override readonly fourcc = 'rinf' as const;\n  box_name = 'RestrictedSchemeInfoBox' as const;\n}\nexport class schiBox extends ContainerBox {\n  static override readonly fourcc = 'schi' as const;\n  box_name = 'SchemeInformationBox' as const;\n}\nexport class trgrBox extends ContainerBox {\n  static override readonly fourcc = 'trgr' as const;\n  box_name = 'TrackGroupBox' as const;\n}\nexport class udtaBox extends ContainerBox {\n  static override readonly fourcc = 'udta' as const;\n  box_name = 'UserDataBox' as const;\n  kinds: Array<kindBox> = [];\n  strks: Array<strkBox> = [];\n  subBoxNames = ['kind', 'strk'] as const;\n}\nexport class iprpBox extends ContainerBox {\n  static override readonly fourcc = 'iprp' as const;\n  box_name = 'ItemPropertiesBox' as const;\n  ipco: ipcoBox;\n\n  ipmas: Array<ipmaBox> = [];\n  subBoxNames = ['ipma'] as const;\n}\nexport class ipcoBox extends ContainerBox {\n  static override readonly fourcc = 'ipco' as const;\n  box_name = 'ItemPropertyContainerBox' as const;\n  hvcCs: Array<hvcCBox> = [];\n  ispes: Array<ispeBox> = [];\n  claps: Array<clapBox> = [];\n  irots: Array<irotBox> = [];\n  subBoxNames = ['hvcC', 'ispe', 'clap', 'irot'] as const;\n}\nexport class grplBox extends ContainerBox {\n  static override readonly fourcc = 'grpl' as const;\n  box_name = 'GroupsListBox' as const;\n  boxes: Array<EntityToGroup>;\n}\nexport class j2kHBox extends ContainerBox {\n  static override readonly fourcc = 'j2kH' as const;\n  box_name = 'J2KHeaderInfoBox' as const;\n}\nexport class etypBox extends ContainerBox {\n  static override readonly fourcc = 'etyp' as const;\n  box_name = 'ExtendedTypeBox' as const;\n  tycos: Array<tycoBox> = [];\n  subBoxNames = ['tyco'] as const;\n}\nexport class povdBox extends ContainerBox {\n  static override readonly fourcc = 'povd' as const;\n  box_name = 'ProjectedOmniVideoBox' as const;\n  subBoxNames = ['prfr'] as const;\n}\n","import { Box, FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { OK } from '#/constants';\nimport { Log } from '#/log';\nimport { parseOneBox } from '#/parser';\n\nexport class drefBox extends FullBox {\n  static override readonly fourcc = 'dref' as const;\n  box_name = 'DataReferenceBox' as const;\n\n  entries: Array<Box>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.entries = [];\n    const entry_count = stream.readUint32();\n    for (let i = 0; i < entry_count; i++) {\n      const ret = parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n      if (ret.code === OK) {\n        const box = ret.box;\n        this.entries.push(box);\n      } else {\n        return;\n      }\n    }\n  }\n\n  /** @bundle writing/dref.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 4; //\n    this.writeHeader(stream);\n    stream.writeUint32(this.entries.length);\n    for (let i = 0; i < this.entries.length; i++) {\n      this.entries[i].write(stream);\n      this.size += this.entries[i].size;\n    }\n    /* adjusting the size, now that all sub-boxes are known */\n    Log.debug('BoxWriter', 'Adjusting box ' + this.type + ' with new size ' + this.size);\n    stream.adjustUint32(this.sizePosition, this.size);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class elngBox extends FullBox {\n  static override readonly fourcc = 'elng' as const;\n  box_name = 'ExtendedLanguageBox' as const;\n\n  extended_language: string;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.extended_language = stream.readString(this.size - this.hdr_size);\n  }\n\n  /** @bundle writing/elng.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = this.extended_language.length;\n    this.writeHeader(stream);\n    stream.writeString(this.extended_language);\n  }\n}\n","import { Box } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport type { DataStream } from '#/DataStream';\n\nexport class ftypBox extends Box {\n  static override readonly fourcc = 'ftyp' as const;\n  box_name = 'FileTypeBox' as const;\n\n  major_brand: string;\n  minor_version: number;\n  compatible_brands: Array<string>;\n\n  parse(stream: MultiBufferStream) {\n    let toparse = this.size - this.hdr_size;\n    this.major_brand = stream.readString(4);\n    this.minor_version = stream.readUint32();\n    toparse -= 8;\n    this.compatible_brands = [];\n    let i = 0;\n    while (toparse >= 4) {\n      this.compatible_brands[i] = stream.readString(4);\n      toparse -= 4;\n      i++;\n    }\n  }\n\n  /** @bundle writing/ftyp.js */\n  write(stream: MultiBufferStream | DataStream) {\n    this.size = 8 + 4 * this.compatible_brands.length;\n    this.writeHeader(stream);\n    stream.writeString(this.major_brand, undefined, 4);\n    stream.writeUint32(this.minor_version);\n    for (let i = 0; i < this.compatible_brands.length; i++) {\n      stream.writeString(this.compatible_brands[i], undefined, 4);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { Log } from '#/log';\n\nexport class hdlrBox extends FullBox {\n  static override readonly fourcc = 'hdlr' as const;\n  box_name = 'HandlerBox' as const;\n\n  version: number;\n  handler: string;\n  name: string;\n  flags: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 0) {\n      stream.readUint32();\n      this.handler = stream.readString(4);\n      stream.readUint32Array(3);\n      if (!this.isEndOfBox(stream)) {\n        const name_size = this.start + this.size - stream.getPosition();\n        this.name = stream.readCString();\n\n        // Check if last byte was null-terminator indeed\n        const end = this.start + this.size - 1;\n        stream.seek(end);\n        const lastByte = stream.readUint8();\n        if (lastByte !== 0 && name_size > 1) {\n          Log.info(\n            'BoxParser',\n            'Warning: hdlr name is not null-terminated, possibly length-prefixed string. Trimming first byte.',\n          );\n          this.name = this.name.slice(1);\n        }\n      }\n    }\n  }\n\n  /** @bundle writing/hldr.js */\n  write(stream: MultiBufferStream) {\n    this.size = 5 * 4 + this.name.length + 1;\n    this.version = 0;\n    this.flags = 0;\n    this.writeHeader(stream);\n    stream.writeUint32(0);\n    stream.writeString(this.handler, undefined, 4);\n    stream.writeUint32Array([0, 0, 0]); // reserved\n    stream.writeCString(this.name);\n  }\n}\n","import { Box } from '#/box';\nimport { DataStream } from '#/DataStream';\nimport type { NaluArray } from '@types';\nimport type { NALUArrays } from './displays/naluArrays';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class hvcCBox extends Box {\n  static override readonly fourcc = 'hvcC' as const;\n  box_name = 'HEVCConfigurationBox' as const;\n\n  configurationVersion: number;\n  general_profile_space: number;\n  general_tier_flag: number;\n  general_profile_idc: number;\n  general_profile_compatibility: number;\n  general_constraint_indicator: Uint8Array;\n  general_level_idc: number;\n  min_spatial_segmentation_idc: number;\n  parallelismType: number;\n  chroma_format_idc: number;\n  bit_depth_luma_minus8: number;\n  bit_depth_chroma_minus8: number;\n  avgFrameRate: number;\n  constantFrameRate: number;\n  numTemporalLayers: number;\n  temporalIdNested: number;\n  lengthSizeMinusOne: number;\n  nalu_arrays: NALUArrays;\n\n  parse(stream: MultiBufferStream | DataStream) {\n    this.configurationVersion = stream.readUint8();\n    let tmp_byte = stream.readUint8();\n    this.general_profile_space = tmp_byte >> 6;\n    this.general_tier_flag = (tmp_byte & 0x20) >> 5;\n    this.general_profile_idc = tmp_byte & 0x1f;\n    this.general_profile_compatibility = stream.readUint32();\n    this.general_constraint_indicator = stream.readUint8Array(6);\n    this.general_level_idc = stream.readUint8();\n    this.min_spatial_segmentation_idc = stream.readUint16() & 0xfff;\n    this.parallelismType = stream.readUint8() & 0x3;\n    this.chroma_format_idc = stream.readUint8() & 0x3;\n    this.bit_depth_luma_minus8 = stream.readUint8() & 0x7;\n    this.bit_depth_chroma_minus8 = stream.readUint8() & 0x7;\n    this.avgFrameRate = stream.readUint16();\n    tmp_byte = stream.readUint8();\n    this.constantFrameRate = tmp_byte >> 6;\n    this.numTemporalLayers = (tmp_byte & 0xd) >> 3;\n    this.temporalIdNested = (tmp_byte & 0x4) >> 2;\n    this.lengthSizeMinusOne = tmp_byte & 0x3;\n\n    this.nalu_arrays = [];\n    const numOfArrays = stream.readUint8();\n    for (let i = 0; i < numOfArrays; i++) {\n      const nalu_array = [] as NaluArray;\n      this.nalu_arrays.push(nalu_array);\n      tmp_byte = stream.readUint8();\n      nalu_array.completeness = (tmp_byte & 0x80) >> 7;\n      nalu_array.nalu_type = tmp_byte & 0x3f;\n      const numNalus = stream.readUint16();\n      for (let j = 0; j < numNalus; j++) {\n        const length = stream.readUint16();\n        nalu_array.push({\n          data: stream.readUint8Array(length),\n        });\n      }\n    }\n  }\n\n  /** @bundle writing/write.js */\n  write(stream: DataStream) {\n    this.size = 23;\n\n    for (let i = 0; i < this.nalu_arrays.length; i++) {\n      this.size += 3;\n      for (let j = 0; j < this.nalu_arrays[i].length; j++) {\n        this.size += 2 + this.nalu_arrays[i][j].data.length;\n      }\n    }\n\n    this.writeHeader(stream);\n\n    stream.writeUint8(this.configurationVersion);\n    stream.writeUint8(\n      (this.general_profile_space << 6) + (this.general_tier_flag << 5) + this.general_profile_idc,\n    );\n    stream.writeUint32(this.general_profile_compatibility);\n    stream.writeUint8Array(this.general_constraint_indicator);\n    stream.writeUint8(this.general_level_idc);\n    stream.writeUint16(this.min_spatial_segmentation_idc + (15 << 24));\n    stream.writeUint8(this.parallelismType + (63 << 2));\n    stream.writeUint8(this.chroma_format_idc + (63 << 2));\n    stream.writeUint8(this.bit_depth_luma_minus8 + (31 << 3));\n    stream.writeUint8(this.bit_depth_chroma_minus8 + (31 << 3));\n    stream.writeUint16(this.avgFrameRate);\n    stream.writeUint8(\n      (this.constantFrameRate << 6) +\n        (this.numTemporalLayers << 3) +\n        (this.temporalIdNested << 2) +\n        this.lengthSizeMinusOne,\n    );\n    stream.writeUint8(this.nalu_arrays.length);\n    for (let i = 0; i < this.nalu_arrays.length; i++) {\n      // bit(1) array_completeness + bit(1) reserved = 0 + bit(6) nal_unit_type\n      stream.writeUint8((this.nalu_arrays[i].completeness << 7) + this.nalu_arrays[i].nalu_type);\n      stream.writeUint16(this.nalu_arrays[i].length);\n      for (let j = 0; j < this.nalu_arrays[i].length; j++) {\n        stream.writeUint16(this.nalu_arrays[i][j].data.length);\n        stream.writeUint8Array(this.nalu_arrays[i][j].data);\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\n\nexport class mdhdBox extends FullBox {\n  static override readonly fourcc = 'mdhd' as const;\n  box_name = 'MediaHeaderBox' as const;\n\n  creation_time: number;\n  modification_time: number;\n  timescale: number;\n  duration: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 1) {\n      this.creation_time = stream.readUint64();\n      this.modification_time = stream.readUint64();\n      this.timescale = stream.readUint32();\n      this.duration = stream.readUint64();\n    } else {\n      this.creation_time = stream.readUint32();\n      this.modification_time = stream.readUint32();\n      this.timescale = stream.readUint32();\n      this.duration = stream.readUint32();\n    }\n    this.parseLanguage(stream);\n    stream.readUint16();\n  }\n\n  /** @bundle writing/mdhd.js */\n  write(stream: MultiBufferStream) {\n    const useVersion1 =\n      this.modification_time > MAX_UINT32 ||\n      this.creation_time > MAX_UINT32 ||\n      this.duration > MAX_UINT32 ||\n      this.version === 1;\n    this.version = useVersion1 ? 1 : 0;\n\n    this.size = 4 * 4 + 2 * 2;\n    this.size += useVersion1 ? 3 * 4 : 0; // creation_time, modification_time, duration\n\n    this.flags = 0;\n    this.writeHeader(stream);\n\n    if (useVersion1) {\n      stream.writeUint64(this.creation_time);\n      stream.writeUint64(this.modification_time);\n      stream.writeUint32(this.timescale);\n      stream.writeUint64(this.duration);\n    } else {\n      stream.writeUint32(this.creation_time);\n      stream.writeUint32(this.modification_time);\n      stream.writeUint32(this.timescale);\n      stream.writeUint32(this.duration);\n    }\n\n    stream.writeUint16(this.language);\n    stream.writeUint16(0);\n  }\n}\n","import { Log } from '#//log';\nimport { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\n\nexport class mehdBox extends FullBox {\n  static override readonly fourcc = 'mehd' as const;\n  box_name = 'MovieExtendsHeaderBox' as const;\n\n  fragment_duration: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.flags & 0x1) {\n      Log.warn('BoxParser', 'mehd box incorrectly uses flags set to 1, converting version to 1');\n      this.version = 1;\n    }\n    if (this.version === 1) {\n      this.fragment_duration = stream.readUint64();\n    } else {\n      this.fragment_duration = stream.readUint32();\n    }\n  }\n\n  /** @bundle writing/mehd.js */\n  write(stream: MultiBufferStream) {\n    const useVersion1 = this.fragment_duration > MAX_UINT32 || this.version === 1;\n    this.version = useVersion1 ? 1 : 0;\n\n    this.size = 4;\n    this.size += useVersion1 ? 4 : 0; // fragment_duration\n\n    this.flags = 0;\n    this.writeHeader(stream);\n\n    if (useVersion1) {\n      stream.writeUint64(this.fragment_duration);\n    } else {\n      stream.writeUint32(this.fragment_duration);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { Log } from '#/log';\n\nexport class infeBox extends FullBox {\n  static override readonly fourcc = 'infe' as const;\n  box_name = 'ItemInfoEntry' as const;\n\n  item_ID: number;\n  item_protection_index: number;\n  item_name: string;\n  content_type: string;\n  content_encoding: string;\n  extension_type: string;\n  item_type: string;\n  item_uri_type: string;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 0 || this.version === 1) {\n      this.item_ID = stream.readUint16();\n      this.item_protection_index = stream.readUint16();\n      this.item_name = stream.readCString();\n      this.content_type = stream.readCString();\n      if (!this.isEndOfBox(stream)) {\n        this.content_encoding = stream.readCString();\n      }\n    }\n    if (this.version === 1) {\n      this.extension_type = stream.readString(4);\n      Log.warn('BoxParser', 'Cannot parse extension type');\n      stream.seek(this.start + this.size);\n      return;\n    }\n    if (this.version >= 2) {\n      if (this.version === 2) {\n        this.item_ID = stream.readUint16();\n      } else if (this.version === 3) {\n        this.item_ID = stream.readUint32();\n      }\n      this.item_protection_index = stream.readUint16();\n      this.item_type = stream.readString(4);\n      this.item_name = stream.readCString();\n      if (this.item_type === 'mime') {\n        this.content_type = stream.readCString();\n        this.content_encoding = stream.readCString();\n      } else if (this.item_type === 'uri ') {\n        this.item_uri_type = stream.readCString();\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport { infeBox } from '#/boxes/infe';\nimport type { MultiBufferStream } from '#/buffer';\nimport { OK } from '#/constants';\nimport { Log } from '#/log';\nimport { parseOneBox } from '#/parser';\nimport type { BoxKind } from '@types';\n\nexport class iinfBox extends FullBox {\n  static override readonly fourcc = 'iinf' as const;\n  box_name = 'ItemInfoBox' as const;\n\n  version: number;\n  entry_count: number;\n  item_infos: Array<infeBox>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 0) {\n      this.entry_count = stream.readUint16();\n    } else {\n      this.entry_count = stream.readUint32();\n    }\n\n    this.item_infos = [];\n\n    for (let i = 0; i < this.entry_count; i++) {\n      const ret = parseOneBox(stream, false, this.size - (stream.getPosition() - this.start));\n      if (ret.code === OK) {\n        const box = ret.box as BoxKind;\n        if (box.type === 'infe') {\n          this.item_infos[i] = box as infeBox;\n        } else {\n          Log.error('BoxParser', \"Expected 'infe' box, got \" + ret.box.type, stream.isofile);\n        }\n      } else {\n        return;\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport interface Extent {\n  extent_index: number;\n  extent_offset: number;\n  extent_length: number;\n}\n\nexport class ilocBox extends FullBox {\n  static override readonly fourcc = 'iloc' as const;\n  box_name = 'ItemLocationBox' as const;\n\n  offset_size: number;\n  length_size: number;\n  base_offset_size: number;\n  index_size: number;\n  items: Array<{\n    base_offset: number;\n    construction_method: number;\n    item_ID: number;\n    data_reference_index: number;\n    extents: Array<Extent>;\n  }>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    let byte: number;\n    byte = stream.readUint8();\n    this.offset_size = (byte >> 4) & 0xf;\n    this.length_size = byte & 0xf;\n    byte = stream.readUint8();\n    this.base_offset_size = (byte >> 4) & 0xf;\n    if (this.version === 1 || this.version === 2) {\n      this.index_size = byte & 0xf;\n    } else {\n      this.index_size = 0;\n      // reserved = byte & 0xF;\n    }\n    this.items = [];\n    let item_count = 0;\n    if (this.version < 2) {\n      item_count = stream.readUint16();\n    } else if (this.version === 2) {\n      item_count = stream.readUint32();\n    } else {\n      throw new Error('version of iloc box not supported');\n    }\n    for (let i = 0; i < item_count; i++) {\n      let item_ID = 0;\n      let construction_method = 0;\n      let base_offset = 0;\n\n      if (this.version < 2) {\n        item_ID = stream.readUint16();\n      } else if (this.version === 2) {\n        item_ID = stream.readUint32();\n      } else {\n        throw new Error('version of iloc box not supported');\n      }\n      if (this.version === 1 || this.version === 2) {\n        construction_method = stream.readUint16() & 0xf;\n      } else {\n        construction_method = 0;\n      }\n\n      const data_reference_index = stream.readUint16();\n      switch (this.base_offset_size) {\n        case 0:\n          base_offset = 0;\n          break;\n        case 4:\n          base_offset = stream.readUint32();\n          break;\n        case 8:\n          base_offset = stream.readUint64();\n          break;\n        default:\n          throw new Error('Error reading base offset size');\n      }\n\n      const extents: Array<Extent> = [];\n      const extent_count = stream.readUint16();\n\n      for (let j = 0; j < extent_count; j++) {\n        let extent_index = 0;\n        let extent_offset = 0;\n        let extent_length = 0;\n\n        if (this.version === 1 || this.version === 2) {\n          switch (this.index_size) {\n            case 0:\n              extent_index = 0;\n              break;\n            case 4:\n              extent_index = stream.readUint32();\n              break;\n            case 8:\n              extent_index = stream.readUint64();\n              break;\n            default:\n              throw new Error('Error reading extent index');\n          }\n        }\n\n        switch (this.offset_size) {\n          case 0:\n            extent_offset = 0;\n            break;\n          case 4:\n            extent_offset = stream.readUint32();\n            break;\n          case 8:\n            extent_offset = stream.readUint64();\n            break;\n          default:\n            throw new Error('Error reading extent index');\n        }\n\n        switch (this.length_size) {\n          case 0:\n            extent_length = 0;\n            break;\n          case 4:\n            extent_length = stream.readUint32();\n            break;\n          case 8:\n            extent_length = stream.readUint64();\n            break;\n          default:\n            throw new Error('Error reading extent index');\n        }\n\n        extents.push({ extent_index, extent_length, extent_offset });\n      }\n\n      this.items.push({\n        base_offset,\n        construction_method,\n        item_ID,\n        data_reference_index,\n        extents,\n      });\n    }\n  }\n}\n","import { Box, FullBox, SingleItemTypeReferenceBox, SingleItemTypeReferenceBoxLarge } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { OK } from '#/constants';\nimport { Log } from '#/log';\nimport { parseOneBox } from '#/parser';\n\nconst REFERENCE_TYPE_NAMES = {\n  auxl: 'Auxiliary image item',\n  base: 'Pre-derived image item base',\n  cdsc: 'Item describes referenced item',\n  dimg: 'Derived image item',\n  dpnd: 'Item coding dependency',\n  eroi: 'Region',\n  evir: 'EVC slice',\n  exbl: 'Scalable image item',\n  'fdl ': 'File delivery',\n  font: 'Font item',\n  iloc: 'Item data location',\n  mask: 'Region mask',\n  mint: 'Data integrity',\n  pred: 'Predictively coded item',\n  prem: 'Pre-multiplied item',\n  tbas: 'HEVC tile track base item',\n  text: 'Text item',\n  thmb: 'Thumbnail image item',\n};\n\nexport class irefBox extends FullBox {\n  static override readonly fourcc = 'iref' as const;\n  box_name = 'ItemReferenceBox' as const;\n\n  static allowed_types = [\n    'auxl',\n    'base',\n    'cdsc',\n    'dimg',\n    'dpnd',\n    'eroi',\n    'evir',\n    'exbl',\n    'fdl ',\n    'font',\n    'iloc',\n    'mask',\n    'mint',\n    'pred',\n    'prem',\n    'tbas',\n    'text',\n    'thmb',\n  ] as const;\n\n  references: Array<SingleItemTypeReferenceBox | SingleItemTypeReferenceBoxLarge> = [];\n  version: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.references = [];\n\n    while (stream.getPosition() < this.start + this.size) {\n      const ret = parseOneBox(stream, true, this.size - (stream.getPosition() - this.start));\n      if (ret.code === OK) {\n        let name = 'Unknown item reference';\n        if (!irefBox.allowed_types.includes(ret.type as (typeof irefBox.allowed_types)[number])) {\n          Log.warn('BoxParser', `Unknown item reference type: '${ret.type}'`);\n        } else name = REFERENCE_TYPE_NAMES[ret.type];\n\n        const box =\n          this.version === 0\n            ? new SingleItemTypeReferenceBox(ret.type, ret.size, name, ret.hdr_size, ret.start)\n            : new SingleItemTypeReferenceBoxLarge(\n                ret.type,\n                ret.size,\n                name,\n                ret.hdr_size,\n                ret.start,\n              );\n\n        if (box.write === Box.prototype.write && box.type !== 'mdat') {\n          Log.warn(\n            'BoxParser',\n            box.type +\n              ' box writing not yet implemented, keeping unparsed data in memory for later write',\n          );\n          box.parseDataAndRewind(stream);\n        }\n        box.parse(stream);\n        this.references.push(box);\n      } else {\n        return;\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class pitmBox extends FullBox {\n  static override readonly fourcc = 'pitm' as const;\n  box_name = 'PrimaryItemBox' as const;\n\n  item_id: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 0) {\n      this.item_id = stream.readUint16();\n    } else {\n      this.item_id = stream.readUint32();\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport { dinfBox, grplBox, idatBox, iproBox, iprpBox } from '#/boxes/defaults';\nimport { hdlrBox } from '#/boxes/hdlr';\nimport { iinfBox } from '#/boxes/iinf';\nimport { ilocBox } from '#/boxes/iloc';\nimport { irefBox } from '#/boxes/iref';\nimport { pitmBox } from '#/boxes/pitm';\nimport type { MultiBufferStream } from '#/buffer';\nimport { ContainerBox } from '#/containerBox';\n\nexport class metaBox extends FullBox {\n  static override readonly fourcc = 'meta' as const;\n  box_name = 'MetaBox' as const;\n\n  isQT = false; // Flag to indicate if this is a QT meta box\n\n  hdlr: hdlrBox;\n  hdlrs: Array<hdlrBox>;\n  iinf: iinfBox;\n  iinfs: Array<iinfBox>;\n  idat: idatBox;\n  idats: Array<idatBox>;\n  ipro: iproBox;\n  ipros: Array<iproBox>;\n  grpl: grplBox;\n  grpls: Array<grplBox>;\n  iloc: ilocBox;\n  ilocs: Array<ilocBox>;\n  iprp: iprpBox;\n  iprps: Array<iprpBox>;\n  pitm: pitmBox;\n  pitms: Array<pitmBox>;\n  iref: irefBox;\n  irefs: Array<irefBox>;\n  dinf: dinfBox;\n  dinfs: Array<dinfBox>;\n\n  parse(stream: MultiBufferStream) {\n    const pos = stream.getPosition();\n\n    // Try to check if this is a QT meta box\n    if (this.size > 8) {\n      stream.readUint32(); // Skip size\n      const qtType = stream.readString(4);\n      switch (qtType) {\n        case 'hdlr':\n        case 'mhdr':\n        case 'keys':\n        case 'ilst':\n        case 'ctry':\n        case 'lang':\n          this.isQT = true;\n          break;\n        default:\n          break;\n      }\n      stream.seek(pos);\n    }\n\n    // meta is a FullBox in MPEG-4 and a ContainerBox in QTFF\n    if (!this.isQT) this.parseFullHeader(stream);\n    ContainerBox.prototype.parse.call(this, stream);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class mfhdBox extends FullBox {\n  static override readonly fourcc = 'mfhd' as const;\n  box_name = 'MovieFragmentHeaderBox' as const;\n\n  sequence_number: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.sequence_number = stream.readUint32();\n  }\n\n  /** @bundle writing/mfhd.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 4;\n    this.writeHeader(stream);\n    stream.writeUint32(this.sequence_number);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\nimport type { Matrix, Output } from '@types';\n\nexport class mvhdBox extends FullBox {\n  static override readonly fourcc = 'mvhd' as const;\n  box_name = 'MovieHeaderBox' as const;\n\n  creation_time: number;\n  modification_time: number;\n  timescale: number;\n  duration: number;\n  rate: number;\n  volume: number;\n  next_track_id: number;\n  matrix: Matrix;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 1) {\n      this.creation_time = stream.readUint64();\n      this.modification_time = stream.readUint64();\n      this.timescale = stream.readUint32();\n      this.duration = stream.readUint64();\n    } else {\n      this.creation_time = stream.readUint32();\n      this.modification_time = stream.readUint32();\n      this.timescale = stream.readUint32();\n      this.duration = stream.readUint32();\n    }\n    this.rate = stream.readUint32();\n    this.volume = stream.readUint16() >> 8;\n    stream.readUint16();\n    stream.readUint32Array(2);\n    this.matrix = stream.readInt32Array(9);\n    stream.readUint32Array(6);\n    this.next_track_id = stream.readUint32();\n  }\n\n  /** @bundle writing/mvhd.js */\n  write(stream: MultiBufferStream) {\n    const useVersion1 =\n      this.modification_time > MAX_UINT32 ||\n      this.creation_time > MAX_UINT32 ||\n      this.duration > MAX_UINT32 ||\n      this.version === 1;\n    this.version = useVersion1 ? 1 : 0;\n\n    this.size = 4 * 4 + 20 * 4;\n    this.size += useVersion1 ? 3 * 4 : 0; // creation_time, modification_time, duration\n\n    this.flags = 0;\n    this.writeHeader(stream);\n\n    if (useVersion1) {\n      stream.writeUint64(this.creation_time);\n      stream.writeUint64(this.modification_time);\n      stream.writeUint32(this.timescale);\n      stream.writeUint64(this.duration);\n    } else {\n      stream.writeUint32(this.creation_time);\n      stream.writeUint32(this.modification_time);\n      stream.writeUint32(this.timescale);\n      stream.writeUint32(this.duration);\n    }\n    stream.writeUint32(this.rate);\n    stream.writeUint16(this.volume << 8);\n    stream.writeUint16(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeInt32Array(this.matrix);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint32(this.next_track_id);\n  }\n\n  /** @bundle box-print.js */\n  print(output: Output) {\n    super.printHeader(output);\n    output.log(output.indent + 'creation_time: ' + this.creation_time);\n    output.log(output.indent + 'modification_time: ' + this.modification_time);\n    output.log(output.indent + 'timescale: ' + this.timescale);\n    output.log(output.indent + 'duration: ' + this.duration);\n    output.log(output.indent + 'rate: ' + this.rate);\n    output.log(output.indent + 'volume: ' + (this.volume >> 8));\n    output.log(output.indent + 'matrix: ' + this.matrix.join(', '));\n    output.log(output.indent + 'next_track_id: ' + this.next_track_id);\n  }\n}\n","import { ContainerBox } from '#/containerBox';\nimport type { MultiBufferStream } from '#/buffer';\nimport { Log } from '#/log';\nimport type { av1CBox } from '../av1C';\nimport type { avcCBox } from '../avcC';\nimport type { hvcCBox } from '../hvcC';\nimport type { vpcCBox } from '../vpcC';\nimport type { vvcCBox } from '../vvcC';\n\nexport class SampleEntry extends ContainerBox {\n  static override readonly registryId = Symbol.for('SampleEntryIdentifier');\n\n  data_reference_index?: number;\n\n  constructor(\n    size?: number,\n    public hdr_size?: number,\n    public start?: number,\n  ) {\n    super(size);\n  }\n\n  /** @bundle box-codecs.js */\n  isVideo() {\n    return false;\n  }\n\n  /** @bundle box-codecs.js */\n  isAudio() {\n    return false;\n  }\n\n  /** @bundle box-codecs.js */\n  isSubtitle() {\n    return false;\n  }\n\n  /** @bundle box-codecs.js */\n  isMetadata() {\n    return false;\n  }\n\n  /** @bundle box-codecs.js */\n  isHint() {\n    return false;\n  }\n\n  /** @bundle box-codecs.js */\n  getCodec() {\n    return this.type.replace('.', '');\n  }\n\n  /** @bundle box-codecs.js */\n  getWidth(): number {\n    // @ts-expect-error FIXME: Only stubbed? Expects a number returned.\n    return '';\n  }\n\n  /** @bundle box-codecs.js */\n  getHeight(): number {\n    // @ts-expect-error FIXME: Only stubbed? Expects a number returned.\n    return '';\n  }\n\n  /** @bundle box-codecs.js */\n  getChannelCount(): number {\n    // @ts-expect-error FIXME: Only stubbed? Expects a number returned.\n    return '';\n  }\n\n  /** @bundle box-codecs.js */\n  getSampleRate(): number {\n    // @ts-expect-error FIXME: Only stubbed? Expects a number returned.\n    return '';\n  }\n\n  /** @bundle box-codecs.js */\n  getSampleSize(): number {\n    // @ts-expect-error FIXME: Only stubbed? Expects a number returned.\n    return '';\n  }\n\n  /** @bundle parsing/sampleentries/sampleentry.js */\n  parseHeader(stream: MultiBufferStream) {\n    stream.readUint8Array(6);\n    this.data_reference_index = stream.readUint16();\n    this.hdr_size += 8;\n  }\n\n  /** @bundle parsing/sampleentries/sampleentry.js */\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.data = stream.readUint8Array(this.size - this.hdr_size);\n  }\n\n  /** @bundle parsing/sampleentries/sampleentry.js */\n  parseDataAndRewind(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.data = stream.readUint8Array(this.size - this.hdr_size);\n    // restore the header size as if the sample entry header had not been parsed\n    this.hdr_size -= 8;\n    // rewinding\n    stream.seek(this.start + this.hdr_size);\n  }\n\n  /** @bundle parsing/sampleentries/sampleentry.js */\n  parseFooter(stream: MultiBufferStream) {\n    super.parse(stream);\n  }\n\n  /** @bundle writing/sampleentry.js */\n  writeHeader(stream: MultiBufferStream) {\n    this.size = 8;\n    super.writeHeader(stream);\n    stream.writeUint8(0);\n    stream.writeUint8(0);\n    stream.writeUint8(0);\n    stream.writeUint8(0);\n    stream.writeUint8(0);\n    stream.writeUint8(0);\n    stream.writeUint16(this.data_reference_index);\n  }\n\n  /** @bundle writing/sampleentry.js */\n  writeFooter(stream: MultiBufferStream) {\n    if (this.boxes) {\n      for (let i = 0; i < this.boxes.length; i++) {\n        this.boxes[i].write(stream);\n        this.size += this.boxes[i].size;\n      }\n    }\n    Log.debug('BoxWriter', 'Adjusting box ' + this.type + ' with new size ' + this.size);\n    stream.adjustUint32(this.sizePosition, this.size);\n  }\n\n  /** @bundle writing/sampleentry.js */\n  write(stream: MultiBufferStream) {\n    this.writeHeader(stream);\n    stream.writeUint8Array(this.data);\n    this.size += this.data.length;\n    Log.debug('BoxWriter', 'Adjusting box ' + this.type + ' with new size ' + this.size);\n    stream.adjustUint32(this.sizePosition, this.size);\n  }\n}\n\n// Base SampleEntry types with default parsing\nexport class HintSampleEntry extends SampleEntry {}\nexport class MetadataSampleEntry extends SampleEntry {\n  /** @bundle box-codecs.js */\n  isMetadata() {\n    return true;\n  }\n}\nexport class SubtitleSampleEntry extends SampleEntry {\n  /** @bundle box-codecs.js */\n  isSubtitle() {\n    return true;\n  }\n}\nexport class TextSampleEntry extends SampleEntry {}\n\n//Base SampleEntry types for Audio and Video with specific parsing\nexport class VisualSampleEntry extends SampleEntry {\n  av1C?: av1CBox;\n  avcC?: avcCBox;\n  hvcC?: hvcCBox;\n  vpcC?: vpcCBox;\n  vvcC?: vvcCBox;\n\n  width: number;\n  height: number;\n  horizresolution: number;\n  vertresolution: number;\n  frame_count: number;\n  compressorname: string;\n  depth: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    stream.readUint16();\n    stream.readUint16();\n    stream.readUint32Array(3);\n    this.width = stream.readUint16();\n    this.height = stream.readUint16();\n    this.horizresolution = stream.readUint32();\n    this.vertresolution = stream.readUint32();\n    stream.readUint32();\n    this.frame_count = stream.readUint16();\n    const compressorname_length = Math.min(31, stream.readUint8());\n    this.compressorname = stream.readString(compressorname_length);\n    if (compressorname_length < 31) {\n      stream.readString(31 - compressorname_length);\n    }\n    this.depth = stream.readUint16();\n    stream.readUint16();\n    this.parseFooter(stream);\n  }\n\n  /** @bundle box-codecs.js */\n  isVideo() {\n    return true;\n  }\n\n  /** @bundle box-codecs.js */\n  getWidth() {\n    return this.width;\n  }\n\n  /** @bundle box-codecs.js */\n  getHeight() {\n    return this.height;\n  }\n\n  /** @bundle writing/sampleentries/sampleentry.js */\n  write(stream: MultiBufferStream) {\n    this.writeHeader(stream);\n    this.size += 2 * 7 + 6 * 4 + 32;\n    stream.writeUint16(0);\n    stream.writeUint16(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint16(this.width);\n    stream.writeUint16(this.height);\n    stream.writeUint32(this.horizresolution);\n    stream.writeUint32(this.vertresolution);\n    stream.writeUint32(0);\n    stream.writeUint16(this.frame_count);\n    stream.writeUint8(Math.min(31, this.compressorname.length));\n    stream.writeString(this.compressorname, undefined, 31);\n    stream.writeUint16(this.depth);\n    stream.writeInt16(-1);\n    this.writeFooter(stream);\n  }\n}\n\nexport class AudioSampleEntry extends SampleEntry {\n  version: number;\n  channel_count: number;\n  samplesize: number;\n  samplerate: number;\n\n  // Quicktime only\n  extensions: Uint8Array;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.version = stream.readUint16();\n    stream.readUint16(); // revision\n    stream.readUint32(); // vendor\n    this.channel_count = stream.readUint16();\n    this.samplesize = stream.readUint16();\n    stream.readUint16();\n    stream.readUint16();\n    this.samplerate = stream.readUint32() / (1 << 16);\n\n    const isQT = stream.isofile?.ftyp?.major_brand.includes('qt');\n    if (isQT) {\n      if (this.version === 1) {\n        this.extensions = stream.readUint8Array(16);\n      } else if (this.version === 2) {\n        this.extensions = stream.readUint8Array(36);\n      }\n    }\n\n    this.parseFooter(stream);\n  }\n\n  /** @bundle box-codecs.js */\n  isAudio() {\n    return true;\n  }\n\n  /** @bundle box-codecs.js */\n  getChannelCount() {\n    return this.channel_count;\n  }\n\n  /** @bundle box-codecs.js */\n  getSampleRate() {\n    return this.samplerate;\n  }\n\n  /** @bundle box-codecs.js */\n  getSampleSize() {\n    return this.samplesize;\n  }\n\n  /** @bundle writing/sampleentry.js */\n  write(stream: MultiBufferStream) {\n    this.writeHeader(stream);\n    this.size += 2 * 4 + 3 * 4;\n    stream.writeUint32(0);\n    stream.writeUint32(0);\n    stream.writeUint16(this.channel_count);\n    stream.writeUint16(this.samplesize);\n    stream.writeUint16(0);\n    stream.writeUint16(0);\n    stream.writeUint32(this.samplerate << 16);\n    this.writeFooter(stream);\n  }\n}\n\nexport class SystemSampleEntry extends SampleEntry {\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.parseFooter(stream);\n  }\n\n  /** @bundle writing/sampleentry.js */\n  write(stream: MultiBufferStream) {\n    this.writeHeader(stream);\n    this.writeFooter(stream);\n  }\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { MetadataSampleEntry } from './base';\n\nexport class mettSampleEntry extends MetadataSampleEntry {\n  content_encoding: string;\n  mime_format: string;\n  static override readonly fourcc = 'mett' as const;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.content_encoding = stream.readCString();\n    this.mime_format = stream.readCString();\n    this.parseFooter(stream);\n  }\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { MetadataSampleEntry } from './base';\n\nexport class metxSampleEntry extends MetadataSampleEntry {\n  content_encoding: string;\n  namespace: string;\n  schema_location: string;\n\n  static override readonly fourcc = 'metx' as const;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.content_encoding = stream.readCString();\n    this.namespace = stream.readCString();\n    this.schema_location = stream.readCString();\n    this.parseFooter(stream);\n  }\n}\n","import { Box } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { Log } from '#/log';\n\nexport class av1CBox extends Box {\n  static override readonly fourcc = 'av1C' as const;\n  box_name = 'AV1CodecConfigurationBox' as const;\n\n  version: number;\n  seq_profile: number;\n  seq_level_idx_0: number;\n  seq_tier_0: number;\n  high_bitdepth: number;\n  twelve_bit: number;\n  monochrome: number;\n  chroma_subsampling_x: number;\n  chroma_subsampling_y: number;\n  chroma_sample_position: number;\n  reserved_1: number;\n  initial_presentation_delay_present: number;\n  initial_presentation_delay_minus_one: number;\n  reserved_2: number;\n  configOBUs: Uint8Array;\n\n  parse(stream: MultiBufferStream) {\n    let tmp = stream.readUint8();\n    if (((tmp >> 7) & 0x1) !== 1) {\n      Log.error('BoxParser', 'av1C marker problem', stream.isofile);\n      return;\n    }\n    this.version = tmp & 0x7f;\n    if (this.version !== 1) {\n      Log.error('BoxParser', 'av1C version ' + this.version + ' not supported', stream.isofile);\n      return;\n    }\n    tmp = stream.readUint8();\n    this.seq_profile = (tmp >> 5) & 0x7;\n    this.seq_level_idx_0 = tmp & 0x1f;\n    tmp = stream.readUint8();\n    this.seq_tier_0 = (tmp >> 7) & 0x1;\n    this.high_bitdepth = (tmp >> 6) & 0x1;\n    this.twelve_bit = (tmp >> 5) & 0x1;\n    this.monochrome = (tmp >> 4) & 0x1;\n    this.chroma_subsampling_x = (tmp >> 3) & 0x1;\n    this.chroma_subsampling_y = (tmp >> 2) & 0x1;\n    this.chroma_sample_position = tmp & 0x3;\n    tmp = stream.readUint8();\n    this.reserved_1 = (tmp >> 5) & 0x7;\n    if (this.reserved_1 !== 0) {\n      Log.error('BoxParser', 'av1C reserved_1 parsing problem', stream.isofile);\n      return;\n    }\n    this.initial_presentation_delay_present = (tmp >> 4) & 0x1;\n    if (this.initial_presentation_delay_present === 1) {\n      this.initial_presentation_delay_minus_one = tmp & 0xf;\n    } else {\n      this.reserved_2 = tmp & 0xf;\n      if (this.reserved_2 !== 0) {\n        Log.error('BoxParser', 'av1C reserved_2 parsing problem', stream.isofile);\n        return;\n      }\n    }\n\n    const configOBUs_length = this.size - this.hdr_size - 4;\n    this.configOBUs = stream.readUint8Array(configOBUs_length);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { DataStream } from '#/DataStream';\nimport type { ES_Descriptor } from '#/descriptor';\nimport { DescriptorRegistry } from '#/registry';\n\nexport class esdsBox extends FullBox {\n  static override readonly fourcc = 'esds' as const;\n  box_name = 'ElementaryStreamDescriptorBox' as const;\n\n  esd: ES_Descriptor;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    const esd_data = stream.readUint8Array(this.size - this.hdr_size);\n    // NOTE:    This used to be `typeof MPEG4DescriptorParser !== 'undefined'`\n    if ('MPEG4DescriptorParser' in DescriptorRegistry) {\n      const esd_parser = new DescriptorRegistry.MPEG4DescriptorParser();\n      this.esd = esd_parser.parseOneDescriptor(new DataStream(esd_data.buffer, 0)) as ES_Descriptor;\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class vpcCBox extends FullBox {\n  static override readonly fourcc = 'vpcC' as const;\n  box_name = 'VPCodecConfigurationRecord' as const;\n\n  profile: number;\n  level: number;\n  bitDepth: number;\n  chromaSubsampling: number;\n  videoFullRangeFlag: number;\n  colourPrimaries: number;\n  transferCharacteristics: number;\n  matrixCoefficients: number;\n  codecIntializationDataSize: number;\n  codecIntializationData: Uint8Array;\n  colorSpace: number;\n  transferFunction: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 1) {\n      this.profile = stream.readUint8();\n      this.level = stream.readUint8();\n      const tmp = stream.readUint8();\n      this.bitDepth = tmp >> 4;\n      this.chromaSubsampling = (tmp >> 1) & 0x7;\n      this.videoFullRangeFlag = tmp & 0x1;\n      this.colourPrimaries = stream.readUint8();\n      this.transferCharacteristics = stream.readUint8();\n      this.matrixCoefficients = stream.readUint8();\n      this.codecIntializationDataSize = stream.readUint16();\n      this.codecIntializationData = stream.readUint8Array(this.codecIntializationDataSize);\n    } else {\n      this.profile = stream.readUint8();\n      this.level = stream.readUint8();\n      let tmp = stream.readUint8();\n      this.bitDepth = (tmp >> 4) & 0xf;\n      this.colorSpace = tmp & 0xf;\n      tmp = stream.readUint8();\n      this.chromaSubsampling = (tmp >> 4) & 0xf;\n      this.transferFunction = (tmp >> 1) & 0x7;\n      this.videoFullRangeFlag = tmp & 0x1;\n      this.codecIntializationDataSize = stream.readUint16();\n      this.codecIntializationData = stream.readUint8Array(this.codecIntializationDataSize);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport type { NaluArray } from '@types';\n\nexport class vvcCBox extends FullBox {\n  static override readonly fourcc = 'vvcC' as const;\n  box_name = 'VvcConfigurationBox' as const;\n\n  lengthSizeMinusOne: number;\n  ptl_present_flag: number;\n  ols_idx: number;\n  num_sublayers: number;\n  constant_frame_rate: number;\n  chroma_format_idc: number;\n  bit_depth_minus8: number;\n  num_bytes_constraint_info: number;\n  general_profile_idc: number;\n  general_tier_flag: number;\n  general_level_idc: number;\n  ptl_frame_only_constraint_flag: number;\n  ptl_multilayer_enabled_flag: number;\n  general_constraint_info: Uint8Array;\n  ptl_sublayer_present_mask: number;\n  sublayer_level_idc: Array<number>;\n  ptl_num_sub_profiles: number;\n  general_sub_profile_idc: Array<number>;\n  max_picture_width: number;\n  max_picture_height: number;\n  avg_frame_rate: number;\n  nalu_arrays: Array<NaluArray>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    // helper object to simplify extracting individual bits\n    const bitReader = {\n      held_bits: undefined,\n      num_held_bits: 0,\n\n      stream_read_1_bytes: function (strm) {\n        this.held_bits = strm.readUint8();\n        this.num_held_bits = 1 * 8;\n      },\n      stream_read_2_bytes: function (strm) {\n        this.held_bits = strm.readUint16();\n        this.num_held_bits = 2 * 8;\n      },\n\n      extract_bits: function (num_bits) {\n        const ret = (this.held_bits >> (this.num_held_bits - num_bits)) & ((1 << num_bits) - 1);\n        this.num_held_bits -= num_bits;\n        return ret;\n      },\n    };\n\n    // VvcDecoderConfigurationRecord\n    bitReader.stream_read_1_bytes(stream);\n    bitReader.extract_bits(5); // reserved\n    this.lengthSizeMinusOne = bitReader.extract_bits(2);\n    this.ptl_present_flag = bitReader.extract_bits(1);\n\n    if (this.ptl_present_flag) {\n      bitReader.stream_read_2_bytes(stream);\n      this.ols_idx = bitReader.extract_bits(9);\n      this.num_sublayers = bitReader.extract_bits(3);\n      this.constant_frame_rate = bitReader.extract_bits(2);\n      this.chroma_format_idc = bitReader.extract_bits(2);\n\n      bitReader.stream_read_1_bytes(stream);\n      this.bit_depth_minus8 = bitReader.extract_bits(3);\n      bitReader.extract_bits(5); // reserved\n\n      // VvcPTLRecord\n      {\n        bitReader.stream_read_2_bytes(stream);\n        bitReader.extract_bits(2); // reserved\n        this.num_bytes_constraint_info = bitReader.extract_bits(6);\n        this.general_profile_idc = bitReader.extract_bits(7);\n        this.general_tier_flag = bitReader.extract_bits(1);\n\n        this.general_level_idc = stream.readUint8();\n\n        bitReader.stream_read_1_bytes(stream);\n        this.ptl_frame_only_constraint_flag = bitReader.extract_bits(1);\n        this.ptl_multilayer_enabled_flag = bitReader.extract_bits(1);\n\n        this.general_constraint_info = new Uint8Array(this.num_bytes_constraint_info);\n        if (this.num_bytes_constraint_info) {\n          for (let i = 0; i < this.num_bytes_constraint_info - 1; i++) {\n            const cnstr1 = bitReader.extract_bits(6);\n            bitReader.stream_read_1_bytes(stream);\n            const cnstr2 = bitReader.extract_bits(2);\n\n            this.general_constraint_info[i] = (cnstr1 << 2) | cnstr2;\n          }\n          this.general_constraint_info[this.num_bytes_constraint_info - 1] =\n            bitReader.extract_bits(6);\n        } else {\n          //forbidden in spec!\n          bitReader.extract_bits(6);\n        }\n\n        if (this.num_sublayers > 1) {\n          bitReader.stream_read_1_bytes(stream);\n          this.ptl_sublayer_present_mask = 0;\n          for (let j = this.num_sublayers - 2; j >= 0; --j) {\n            const val = bitReader.extract_bits(1);\n            this.ptl_sublayer_present_mask |= val << j;\n          }\n          for (let j = this.num_sublayers; j <= 8 && this.num_sublayers > 1; ++j) {\n            bitReader.extract_bits(1); // ptl_reserved_zero_bit\n          }\n\n          this.sublayer_level_idc = [];\n          for (let j = this.num_sublayers - 2; j >= 0; --j) {\n            if (this.ptl_sublayer_present_mask & (1 << j)) {\n              this.sublayer_level_idc[j] = stream.readUint8();\n            }\n          }\n        }\n\n        this.ptl_num_sub_profiles = stream.readUint8();\n        this.general_sub_profile_idc = [];\n        if (this.ptl_num_sub_profiles) {\n          for (let i = 0; i < this.ptl_num_sub_profiles; i++) {\n            this.general_sub_profile_idc.push(stream.readUint32());\n          }\n        }\n      } // end VvcPTLRecord\n\n      this.max_picture_width = stream.readUint16();\n      this.max_picture_height = stream.readUint16();\n      this.avg_frame_rate = stream.readUint16();\n    }\n\n    const VVC_NALU_OPI = 12;\n    const VVC_NALU_DEC_PARAM = 13;\n\n    this.nalu_arrays = [];\n    const num_of_arrays = stream.readUint8();\n    for (let i = 0; i < num_of_arrays; i++) {\n      const nalu_array = [] as NaluArray;\n      this.nalu_arrays.push(nalu_array);\n\n      bitReader.stream_read_1_bytes(stream);\n      nalu_array.completeness = bitReader.extract_bits(1);\n      bitReader.extract_bits(2); // reserved\n      nalu_array.nalu_type = bitReader.extract_bits(5);\n\n      let numNalus = 1;\n      if (nalu_array.nalu_type !== VVC_NALU_DEC_PARAM && nalu_array.nalu_type !== VVC_NALU_OPI) {\n        numNalus = stream.readUint16();\n      }\n\n      for (let j = 0; j < numNalus; j++) {\n        const len = stream.readUint16();\n        nalu_array.push({\n          data: stream.readUint8Array(len),\n          length: len,\n        });\n      }\n    }\n  }\n}\n","import { Box } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class colrBox extends Box {\n  static override readonly fourcc = 'colr' as const;\n  box_name = 'ColourInformationBox' as const;\n\n  colour_type: string;\n  colour_primaries: number;\n  transfer_characteristics: number;\n  matrix_coefficients: number;\n  full_range_flag: number;\n  ICC_profile: Uint8Array;\n\n  parse(stream: MultiBufferStream) {\n    this.colour_type = stream.readString(4);\n    if (this.colour_type === 'nclx') {\n      this.colour_primaries = stream.readUint16();\n      this.transfer_characteristics = stream.readUint16();\n      this.matrix_coefficients = stream.readUint16();\n      const tmp = stream.readUint8();\n      this.full_range_flag = tmp >> 7;\n    } else if (this.colour_type === 'rICC') {\n      this.ICC_profile = stream.readUint8Array(this.size - 4);\n    } else if (this.colour_type === 'prof') {\n      this.ICC_profile = stream.readUint8Array(this.size - 4);\n    }\n  }\n}\n","import { av1CBox } from '#/boxes/av1C';\nimport { avcCBox } from '#/boxes/avcC';\nimport { sinfBox } from '#/boxes/defaults';\nimport { esdsBox } from '#/boxes/esds';\nimport { hvcCBox } from '#/boxes/hvcC';\nimport { vpcCBox } from '#/boxes/vpcC';\nimport { vvcCBox } from '#/boxes/vvcC';\nimport { colrBox } from '#/boxes/colr';\nimport {\n  AudioSampleEntry,\n  MetadataSampleEntry,\n  SubtitleSampleEntry,\n  SystemSampleEntry,\n  TextSampleEntry,\n  VisualSampleEntry,\n} from './base';\n\n/** @bundle box-codecs.js */\nfunction decimalToHex(d: number | string, padding?: number) {\n  let hex = Number(d).toString(16);\n  padding = typeof padding === 'undefined' ? 2 : padding;\n  while (hex.length < padding) {\n    hex = '0' + hex;\n  }\n  return hex;\n}\n\nclass avcCSampleEntryBase extends VisualSampleEntry {\n  avcC: avcCBox;\n  avcCs: Array<avcCBox>;\n\n  /** @bundle box-codecs.js */\n  getCodec() {\n    const baseCodec = super.getCodec();\n    if (this.avcC) {\n      return `${baseCodec}.${decimalToHex(this.avcC.AVCProfileIndication)}${decimalToHex(\n        this.avcC.profile_compatibility,\n      )}${decimalToHex(this.avcC.AVCLevelIndication)}`;\n    } else {\n      return baseCodec;\n    }\n  }\n}\n\n// Sample entries inheriting from Audio and Video\nexport class avc1SampleEntry extends avcCSampleEntryBase {\n  static override readonly fourcc = 'avc1' as const;\n  // ISO/IEC 14496-15:2024 5.4.2.1.2\n  box_name = 'AVCSampleEntry' as const;\n}\n\nexport class avc2SampleEntry extends avcCSampleEntryBase {\n  static override readonly fourcc = 'avc2' as const;\n  // ISO/IEC 14496-15:2024 5.4.2.1.2\n  box_name = 'AVC2SampleEntry' as const;\n}\n\nexport class avc3SampleEntry extends avcCSampleEntryBase {\n  static override readonly fourcc = 'avc3' as const;\n  // ISO/IEC 14496-15:2024 5.4.2.1.2\n  box_name = 'AVCSampleEntry' as const;\n}\n\nexport class avc4SampleEntry extends avcCSampleEntryBase {\n  static override readonly fourcc = 'avc4' as const;\n  // ISO/IEC 14496-15:2024 5.4.2.1.2\n  box_name = 'AVC2SampleEntry' as const;\n}\n\nexport class av01SampleEntry extends VisualSampleEntry {\n  av1C: av1CBox;\n  av1Cs: Array<av1CBox>;\n\n  static override readonly fourcc = 'av01' as const;\n\n  // AV1 Codec ISO Media File Format Binding v1.2.0 Section 2.2.3\n  box_name = 'AV1SampleEntry' as const;\n\n  /** @bundle box-codecs.js */\n  getCodec(): string {\n    // NOTE:    was before `const baseCodec = SampleEntry.prototype.getCodec.call(this);`\n    const baseCodec = super.getCodec();\n\n    const level_idx_0 = this.av1C.seq_level_idx_0;\n    const level = level_idx_0 < 10 ? '0' + level_idx_0 : level_idx_0;\n    let bitdepth: string;\n    if (this.av1C.seq_profile === 2 && this.av1C.high_bitdepth === 1) {\n      bitdepth = this.av1C.twelve_bit === 1 ? '12' : '10';\n    } else if (this.av1C.seq_profile <= 2) {\n      bitdepth = this.av1C.high_bitdepth === 1 ? '10' : '08';\n    }\n    // TODO need to parse the SH to find color config\n    return (\n      baseCodec +\n      '.' +\n      this.av1C.seq_profile +\n      '.' +\n      level +\n      (this.av1C.seq_tier_0 ? 'H' : 'M') +\n      '.' +\n      bitdepth\n    ); //+\".\"+this.av1C.monochrome+\".\"+this.av1C.chroma_subsampling_x+\"\"+this.av1C.chroma_subsampling_y+\"\"+this.av1C.chroma_sample_position;\n  }\n}\n\nexport class dav1SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'dav1' as const;\n}\n\nclass hvcCSampleEntryBase extends VisualSampleEntry {\n  hvcC: hvcCBox;\n  hvcCs: Array<hvcCBox>;\n\n  /** @bundle box-codecs.js */\n  getCodec(): string {\n    let baseCodec = super.getCodec();\n    if (this.hvcC) {\n      baseCodec += '.';\n      switch (this.hvcC.general_profile_space) {\n        case 0:\n          baseCodec += '';\n          break;\n        case 1:\n          baseCodec += 'A';\n          break;\n        case 2:\n          baseCodec += 'B';\n          break;\n        case 3:\n          baseCodec += 'C';\n          break;\n      }\n      baseCodec += this.hvcC.general_profile_idc;\n      baseCodec += '.';\n      let val = this.hvcC.general_profile_compatibility;\n      let reversed = 0;\n      for (let i = 0; i < 32; i++) {\n        reversed |= val & 1;\n        if (i === 31) break;\n        reversed <<= 1;\n        val >>= 1;\n      }\n      baseCodec += decimalToHex(reversed, 0);\n      baseCodec += '.';\n      if (this.hvcC.general_tier_flag === 0) {\n        baseCodec += 'L';\n      } else {\n        baseCodec += 'H';\n      }\n      baseCodec += this.hvcC.general_level_idc;\n      let hasByte = false;\n      let constraint_string = '';\n      for (let i = 5; i >= 0; i--) {\n        if (this.hvcC.general_constraint_indicator[i] || hasByte) {\n          constraint_string =\n            '.' + decimalToHex(this.hvcC.general_constraint_indicator[i], 0) + constraint_string;\n          hasByte = true;\n        }\n      }\n      baseCodec += constraint_string;\n    }\n    return baseCodec;\n  }\n}\n\nexport class hvc1SampleEntry extends hvcCSampleEntryBase {\n  static override readonly fourcc = 'hvc1' as const;\n  // ISO/IEC 14496-15:2024 8.4.1.1.2\n  box_name = 'HEVCSampleEntry' as const;\n}\n\nexport class hvc2SampleEntry extends hvcCSampleEntryBase {\n  static override readonly fourcc = 'hvc2' as const;\n}\n\nexport class hev1SampleEntry extends hvcCSampleEntryBase {\n  static override readonly fourcc = 'hev1' as const;\n  // ISO/IEC 14496-15:2024 8.4.1.1.2\n  box_name = 'HEVCSampleEntry' as const;\n  colrs: Array<colrBox> = [];\n  subBoxNames = ['colr'] as const;\n}\n\nexport class hev2SampleEntry extends hvcCSampleEntryBase {\n  static override readonly fourcc = 'hev2' as const;\n}\n\nexport class hvt1SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'hvt1' as const;\n  // ISO/IEC 14496-15:2024 10.5.2.2\n  box_name = 'HEVCTileSampleSampleEntry' as const;\n}\n\nexport class lhe1SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'lhe1' as const;\n  // ISO/IEC 14496-15:2024 9.5.3.1.2\n  box_name = 'LHEVCSampleEntry' as const;\n}\n\nexport class lhv1SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'lhv1' as const;\n  // ISO/IEC 14496-15:2024 9.5.3.1.2\n  box_name = 'LHEVCSampleEntry' as const;\n}\n\nexport class dvh1SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'dvh1' as const;\n}\n\nexport class dvheSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'dvhe' as const;\n}\n\n/** @babel box-codecs.js */\nclass vvcCSampleEntryBase extends VisualSampleEntry {\n  vvcC: vvcCBox;\n  vvcCs: Array<vvcCBox>;\n  getCodec() {\n    let baseCodec = super.getCodec();\n    if (this.vvcC) {\n      baseCodec += '.' + this.vvcC.general_profile_idc;\n      if (this.vvcC.general_tier_flag) {\n        baseCodec += '.H';\n      } else {\n        baseCodec += '.L';\n      }\n      baseCodec += this.vvcC.general_level_idc;\n\n      let constraint_string = '';\n      if (this.vvcC.general_constraint_info) {\n        const bytes = [];\n        let byte = 0;\n        byte |= this.vvcC.ptl_frame_only_constraint_flag << 7;\n        byte |= this.vvcC.ptl_multilayer_enabled_flag << 6;\n        let last_nonzero: number;\n        for (let i = 0; i < this.vvcC.general_constraint_info.length; ++i) {\n          byte |= (this.vvcC.general_constraint_info[i] >> 2) & 0x3f;\n          bytes.push(byte);\n          if (byte) {\n            last_nonzero = i;\n          }\n\n          byte = (this.vvcC.general_constraint_info[i] >> 2) & 0x03;\n        }\n\n        if (last_nonzero === undefined) {\n          constraint_string = '.CA';\n        } else {\n          constraint_string = '.C';\n          const base32_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n          let held_bits = 0;\n          let num_held_bits = 0;\n          for (let i = 0; i <= last_nonzero; ++i) {\n            held_bits = (held_bits << 8) | bytes[i];\n            num_held_bits += 8;\n\n            while (num_held_bits >= 5) {\n              const val = (held_bits >> (num_held_bits - 5)) & 0x1f;\n              constraint_string += base32_chars[val];\n\n              num_held_bits -= 5;\n              held_bits &= (1 << num_held_bits) - 1;\n            }\n          }\n          if (num_held_bits) {\n            held_bits <<= 5 - num_held_bits; // right-pad with zeros to 5 bits (is this correct?)\n            constraint_string += base32_chars[held_bits & 0x1f];\n          }\n        }\n      }\n      baseCodec += constraint_string;\n    }\n    return baseCodec;\n  }\n}\n\nexport class vvc1SampleEntry extends vvcCSampleEntryBase {\n  static override readonly fourcc = 'vvc1' as const;\n  // ISO/IEC 14496-15:2024 11.3.1.2\n  box_name = 'VvcSampleEntry' as const;\n}\n\nexport class vvi1SampleEntry extends vvcCSampleEntryBase {\n  static override readonly fourcc = 'vvi1' as const;\n  // ISO/IEC 14496-15:2024 11.3.1.2\n  box_name = 'VvcSampleEntry' as const;\n}\n\nexport class vvs1SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'vvs1' as const;\n  // ISO/IEC 14496-15:2024 11.3.1.2\n  box_name = 'VvcSampleEntry' as const;\n}\n\nexport class vvcNSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'vvcN' as const;\n  // ISO/IEC 14496-15:2024 11.3.3.1.2\n  box_name = 'VvcNonVCLSampleEntry' as const;\n}\n\nclass vpcCSampleEntryBase extends VisualSampleEntry {\n  vpcC: vpcCBox;\n  vpcCs: Array<vpcCBox>;\n  getCodec() {\n    const baseCodec = super.getCodec();\n    let level: number | string = this.vpcC.level;\n    if (level === 0) {\n      level = '00';\n    }\n    let bitDepth: number | string = this.vpcC.bitDepth;\n    if (bitDepth === 8) {\n      bitDepth = '08';\n    }\n    return `${baseCodec}.0${this.vpcC.profile}.${level}.${bitDepth}`;\n  }\n}\n\nexport class vp08SampleEntry extends vpcCSampleEntryBase {\n  static override readonly fourcc = 'vp08' as const;\n}\n\nexport class vp09SampleEntry extends vpcCSampleEntryBase {\n  static override readonly fourcc = 'vp09' as const;\n}\n\nexport class avs3SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'avs3' as const;\n}\n\nexport class j2kiSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'j2ki' as const;\n  // ISO/IEC 15444-16:2021 Section 7.3\n  box_name = 'J2KSampleEntry' as const;\n}\n\nexport class mjp2SampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'mjp2' as const;\n}\n\nexport class mjpgSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'mjpg' as const;\n}\n\nexport class uncvSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'uncv' as const;\n  // ISO/IEC 23001-17:2024 4.2\n  box_name = 'UncompressedVideoSampleEntry' as const;\n}\n\nexport class mp4vSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'mp4v' as const;\n  // ISO/IEC 14496-14:2020 Section 6.7.3\n  box_name = 'MP4VisualSampleEntry' as const;\n}\n\nexport class mp4aSampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'mp4a' as const;\n  // ISO/IEC 14496-14:2020 Section 6.7.3\n  box_name = 'MP4AudioSampleEntry' as const;\n\n  esds: esdsBox;\n  esdss: Array<esdsBox>;\n\n  getCodec() {\n    const baseCodec = super.getCodec();\n    if (this.esds && this.esds.esd) {\n      const oti = this.esds.esd.getOTI();\n      const dsi = this.esds.esd.getAudioConfig();\n      return baseCodec + '.' + decimalToHex(oti) + (dsi ? '.' + dsi : '');\n    } else {\n      return baseCodec;\n    }\n  }\n}\n\nexport class m4aeSampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'm4ae' as const;\n}\n\nexport class ac_3SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'ac-3' as const;\n}\n\nexport class ac_4SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'ac-4' as const;\n}\n\nexport class ec_3SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'ec-3' as const;\n}\n\nexport class OpusSampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'Opus' as const;\n}\n\nexport class mha1SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'mha1' as const;\n}\n\nexport class mha2SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'mha2' as const;\n}\n\nexport class mhm1SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'mhm1' as const;\n}\n\nexport class mhm2SampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'mhm2' as const;\n}\n\nexport class fLaCSampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'fLaC' as const;\n}\n\n// Encrypted sample entries\nexport class encvSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'encv' as const;\n}\n\nexport class encaSampleEntry extends AudioSampleEntry {\n  static override readonly fourcc = 'enca' as const;\n}\n\nexport class encuSampleEntry extends SubtitleSampleEntry {\n  static override readonly fourcc = 'encu' as const;\n  subBoxNames = ['sinf'] as const;\n\n  sinfs: Array<sinfBox> = [];\n}\n\nexport class encsSampleEntry extends SystemSampleEntry {\n  static override readonly fourcc = 'encs' as const;\n  subBoxNames = ['sinf'] as const;\n\n  sinfs: Array<sinfBox> = [];\n}\n\nexport class mp4sSampleEntry extends SystemSampleEntry {\n  static override readonly fourcc = 'mp4s' as const;\n\n  esds: esdsBox;\n}\n\nexport class enctSampleEntry extends TextSampleEntry {\n  static override readonly fourcc = 'enct' as const;\n  subBoxNames = ['sinf'] as const;\n\n  sinfs: Array<sinfBox> = [];\n}\n\nexport class encmSampleEntry extends MetadataSampleEntry {\n  static override readonly fourcc = 'encm' as const;\n  subBoxNames = ['sinf'] as const;\n\n  sinfs: Array<sinfBox> = [];\n}\n\n// Restricted sample entries\nexport class resvSampleEntry extends VisualSampleEntry {\n  static override readonly fourcc = 'resv' as const;\n  // ISO/IEC 14496-12:2022 Section 8.15\n  box_name = 'RestrictedVideoSampleEntry' as const;\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { SubtitleSampleEntry } from './base';\n\nexport class sbttSampleEntry extends SubtitleSampleEntry {\n  content_encoding: string;\n  mime_format: string;\n\n  static override readonly fourcc = 'sbtt' as const;\n\n  parse(stream: MultiBufferStream): void {\n    this.parseHeader(stream);\n    this.content_encoding = stream.readCString();\n    this.mime_format = stream.readCString();\n    this.parseFooter(stream);\n  }\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { SubtitleSampleEntry } from './base';\n\nexport class stppSampleEntry extends SubtitleSampleEntry {\n  namespace: string;\n  schema_location: string;\n  auxiliary_mime_types: string;\n\n  static override readonly fourcc = 'stpp' as const;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.namespace = stream.readCString();\n    this.schema_location = stream.readCString();\n    this.auxiliary_mime_types = stream.readCString();\n    this.parseFooter(stream);\n  }\n\n  /** @bundle writing/sampleentry.js */\n  write(stream: MultiBufferStream) {\n    this.writeHeader(stream);\n    this.size +=\n      this.namespace.length +\n      1 +\n      this.schema_location.length +\n      1 +\n      this.auxiliary_mime_types.length +\n      1;\n    stream.writeCString(this.namespace);\n    stream.writeCString(this.schema_location);\n    stream.writeCString(this.auxiliary_mime_types);\n    this.writeFooter(stream);\n  }\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { SubtitleSampleEntry } from './base';\n\nexport class stxtSampleEntry extends SubtitleSampleEntry {\n  content_encoding: string;\n  mime_format: string;\n\n  static override readonly fourcc = 'stxt' as const;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.content_encoding = stream.readCString();\n    this.mime_format = stream.readCString();\n    this.parseFooter(stream);\n  }\n\n  getCodec() {\n    const baseCodec = super.getCodec();\n    if (this.mime_format) {\n      return baseCodec + '.' + this.mime_format;\n    } else {\n      return baseCodec;\n    }\n  }\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { SubtitleSampleEntry } from './base';\n\nexport class tx3gSampleEntry extends SubtitleSampleEntry {\n  displayFlags: number;\n  horizontal_justification: number;\n  vertical_justification: number;\n  bg_color_rgba: Uint8Array;\n  box_record: Int16Array;\n  style_record: Uint8Array;\n\n  static override readonly fourcc = 'tx3g' as const;\n\n  parse(stream: MultiBufferStream) {\n    this.parseHeader(stream);\n    this.displayFlags = stream.readUint32();\n    this.horizontal_justification = stream.readInt8();\n    this.vertical_justification = stream.readInt8();\n    this.bg_color_rgba = stream.readUint8Array(4);\n    this.box_record = stream.readInt16Array(4);\n    this.style_record = stream.readUint8Array(12);\n    this.parseFooter(stream);\n  }\n}\n","import type { MultiBufferStream } from '#/buffer';\nimport { MetadataSampleEntry } from './base';\n\nexport class wvttSampleEntry extends MetadataSampleEntry {\n  static override readonly fourcc = 'wvtt' as const;\n\n  parse(stream: MultiBufferStream): void {\n    this.parseHeader(stream);\n    this.parseFooter(stream);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\ninterface Entry {\n  sample_count: number;\n  group_description_index: number;\n}\n\nexport class sbgpBox extends FullBox {\n  static override readonly fourcc = 'sbgp' as const;\n  box_name = 'SampleToGroupBox' as const;\n\n  grouping_type: string;\n  grouping_type_parameter: number;\n  entries: Array<Entry>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.grouping_type = stream.readString(4);\n    if (this.version === 1) {\n      this.grouping_type_parameter = stream.readUint32();\n    } else {\n      this.grouping_type_parameter = 0;\n    }\n    this.entries = [];\n    const entry_count = stream.readUint32();\n    for (let i = 0; i < entry_count; i++) {\n      this.entries.push({\n        sample_count: stream.readInt32(),\n        group_description_index: stream.readInt32(),\n      });\n    }\n  }\n\n  /** @bundle writing/sbgp.js */\n  write(stream: MultiBufferStream) {\n    if (this.grouping_type_parameter) this.version = 1;\n    else this.version = 0;\n    this.flags = 0;\n    this.size = 8 + 8 * this.entries.length + (this.version === 1 ? 4 : 0);\n    this.writeHeader(stream);\n    stream.writeString(this.grouping_type, undefined, 4);\n    if (this.version === 1) {\n      stream.writeUint32(this.grouping_type_parameter);\n    }\n    stream.writeUint32(this.entries.length);\n    for (let i = 0; i < this.entries.length; i++) {\n      const entry = this.entries[i];\n      stream.writeInt32(entry.sample_count);\n      stream.writeInt32(entry.group_description_index);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class sdtpBox extends FullBox {\n  static override readonly fourcc = 'sdtp' as const;\n  box_name = 'SampleDependencyTypeBox' as const;\n\n  is_leading: Array<number>;\n  sample_depends_on: Array<number>;\n  sample_is_depended_on: Array<number>;\n  sample_has_redundancy: Array<number>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    const count = this.size - this.hdr_size;\n    this.is_leading = [];\n    this.sample_depends_on = [];\n    this.sample_is_depended_on = [];\n    this.sample_has_redundancy = [];\n    for (let i = 0; i < count; i++) {\n      const tmp_byte = stream.readUint8();\n      this.is_leading[i] = tmp_byte >> 6;\n      this.sample_depends_on[i] = (tmp_byte >> 4) & 0x3;\n      this.sample_is_depended_on[i] = (tmp_byte >> 2) & 0x3;\n      this.sample_has_redundancy[i] = tmp_byte & 0x3;\n    }\n  }\n}\n","import { FullBox, SampleGroupEntry } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n// import * as BOXES from '#/codecs-all';\nimport { Log } from '#/log';\nimport { BoxRegistry } from '#/registry';\n\nexport class sgpdBox extends FullBox {\n  static override readonly fourcc = 'sgpd' as const;\n  box_name = 'SampleGroupDescriptionBox' as const;\n\n  grouping_type:\n    | 'alst'\n    | 'avll'\n    | 'avss'\n    | 'dtrt'\n    | 'mvif'\n    | 'prol'\n    | 'rap'\n    | 'rash'\n    | 'roll'\n    | 'scif'\n    | 'scnm'\n    | 'seig'\n    | 'stsa'\n    | 'sync'\n    | 'tele'\n    | 'tsas'\n    | 'tscl'\n    | 'vipr'\n    | (string & {});\n  default_length: number;\n  default_group_description_index: number;\n  default_sample_description_index: number;\n  entries: Array<SampleGroupEntry>;\n  used: boolean;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.grouping_type = stream.readString(4);\n    Log.debug('BoxParser', 'Found Sample Groups of type ' + this.grouping_type);\n    if (this.version === 1) {\n      this.default_length = stream.readUint32();\n    } else {\n      this.default_length = 0;\n    }\n    if (this.version >= 2) {\n      this.default_group_description_index = stream.readUint32();\n    }\n    this.entries = [];\n    const entry_count = stream.readUint32();\n    for (let i = 0; i < entry_count; i++) {\n      let entry: SampleGroupEntry;\n      if (this.grouping_type in BoxRegistry.sampleGroupEntry) {\n        entry = new BoxRegistry.sampleGroupEntry[this.grouping_type](this.grouping_type);\n      } else {\n        entry = new SampleGroupEntry(this.grouping_type);\n      }\n      this.entries.push(entry);\n      if (this.version === 1) {\n        if (this.default_length === 0) {\n          entry.description_length = stream.readUint32();\n        } else {\n          entry.description_length = this.default_length;\n        }\n      } else {\n        entry.description_length = this.default_length;\n      }\n      if (entry.write === SampleGroupEntry.prototype.write) {\n        Log.info(\n          'BoxParser',\n          'SampleGroup for type ' +\n            this.grouping_type +\n            ' writing not yet implemented, keeping unparsed data in memory for later write',\n        );\n        // storing data\n        entry.data = stream.readUint8Array(entry.description_length);\n        // rewinding\n        stream.seek(stream.getPosition() - entry.description_length);\n      }\n      entry.parse(stream);\n    }\n  }\n\n  /** @bundle writing/sgpd.js */\n  write(stream: MultiBufferStream) {\n    // leave version as read\n    // this.version;\n    this.flags = 0;\n    this.size = 12;\n    for (let i = 0; i < this.entries.length; i++) {\n      const entry = this.entries[i];\n      if (this.version === 1) {\n        if (this.default_length === 0) {\n          this.size += 4;\n        }\n        this.size += entry.data.length;\n      }\n    }\n    this.writeHeader(stream);\n    stream.writeString(this.grouping_type, undefined, 4);\n    if (this.version === 1) {\n      stream.writeUint32(this.default_length);\n    }\n    if (this.version >= 2) {\n      stream.writeUint32(this.default_sample_description_index);\n    }\n    stream.writeUint32(this.entries.length);\n    for (let i = 0; i < this.entries.length; i++) {\n      const entry = this.entries[i];\n      if (this.version === 1) {\n        if (this.default_length === 0) {\n          stream.writeUint32(entry.description_length);\n        }\n      }\n      entry.write(stream);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\n\ninterface Reference {\n  reference_type: number;\n  referenced_size: number;\n  subsegment_duration: number;\n  starts_with_SAP: number;\n  SAP_type: number;\n  SAP_delta_time: number;\n}\n\nexport class sidxBox extends FullBox {\n  static override readonly fourcc = 'sidx' as const;\n  box_name = 'CompressedSegmentIndexBox' as const;\n\n  reference_ID: number;\n  timescale: number;\n  earliest_presentation_time: number;\n  first_offset: number;\n  references: Array<Reference>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.reference_ID = stream.readUint32();\n    this.timescale = stream.readUint32();\n\n    if (this.version === 0) {\n      this.earliest_presentation_time = stream.readUint32();\n      this.first_offset = stream.readUint32();\n    } else {\n      this.earliest_presentation_time = stream.readUint64();\n      this.first_offset = stream.readUint64();\n    }\n\n    stream.readUint16();\n\n    this.references = [];\n\n    const count = stream.readUint16();\n\n    for (let i = 0; i < count; i++) {\n      const type = stream.readUint32();\n      const subsegment_duration = stream.readUint32();\n      const sap = stream.readUint32();\n\n      this.references.push({\n        reference_type: (type >> 31) & 0x1,\n        referenced_size: type & 0x7fffffff,\n        subsegment_duration,\n        starts_with_SAP: (sap >> 31) & 0x1,\n        SAP_type: (sap >> 28) & 0x7,\n        SAP_delta_time: sap & 0xfffffff,\n      });\n    }\n  }\n\n  /** @bundle writing/sidx.js */\n  write(stream: MultiBufferStream) {\n    const useVersion1 =\n      this.earliest_presentation_time > MAX_UINT32 ||\n      this.first_offset > MAX_UINT32 ||\n      this.version === 1;\n    this.version = useVersion1 ? 1 : 0;\n\n    this.size = 4 * 2 + 2 + 2 + 12 * this.references.length;\n    this.size += useVersion1 ? 16 : 8; // earliest_presentation_time and first_offset\n\n    this.flags = 0;\n    this.writeHeader(stream);\n\n    stream.writeUint32(this.reference_ID);\n    stream.writeUint32(this.timescale);\n    if (useVersion1) {\n      stream.writeUint64(this.earliest_presentation_time);\n      stream.writeUint64(this.first_offset);\n    } else {\n      stream.writeUint32(this.earliest_presentation_time);\n      stream.writeUint32(this.first_offset);\n    }\n    stream.writeUint16(0);\n    stream.writeUint16(this.references.length);\n    for (let i = 0; i < this.references.length; i++) {\n      const ref = this.references[i];\n      stream.writeUint32((ref.reference_type << 31) | ref.referenced_size);\n      stream.writeUint32(ref.subsegment_duration);\n      stream.writeUint32((ref.starts_with_SAP << 31) | (ref.SAP_type << 28) | ref.SAP_delta_time);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class smhdBox extends FullBox {\n  static override readonly fourcc = 'smhd' as const;\n  box_name = 'SoundMediaHeaderBox' as const;\n\n  balance: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.balance = stream.readUint16();\n    stream.readUint16();\n  }\n\n  /** @bundle writing/smhd.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.size = 4;\n    this.writeHeader(stream);\n    stream.writeUint16(this.balance);\n    stream.writeUint16(0);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport type { Sample } from '@types';\n\nexport class stcoBox extends FullBox {\n  static override readonly fourcc = 'stco' as const;\n  box_name = 'ChunkOffsetBox' as const;\n\n  chunk_offsets: Array<number>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    const entry_count = stream.readUint32();\n    this.chunk_offsets = [];\n    if (this.version === 0) {\n      for (let i = 0; i < entry_count; i++) {\n        this.chunk_offsets.push(stream.readUint32());\n      }\n    }\n  }\n\n  /** @bundle writings/stco.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 4 + 4 * this.chunk_offsets.length;\n    this.writeHeader(stream);\n    stream.writeUint32(this.chunk_offsets.length);\n    stream.writeUint32Array(this.chunk_offsets);\n  }\n\n  /** @bundle box-unpack.js */\n  unpack(samples: Array<Sample>) {\n    for (let i = 0; i < this.chunk_offsets.length; i++) {\n      samples[i].offset = this.chunk_offsets[i];\n    }\n  }\n}\n","import { FullBox } from '#/box';\n\nexport class sthdBox extends FullBox {\n  static override readonly fourcc = 'sthd' as const;\n  box_name = 'SubtitleMediaHeaderBox' as const;\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport type { Sample } from '@types';\n\nexport class stscBox extends FullBox {\n  static override readonly fourcc = 'stsc' as const;\n  box_name = 'SampleToChunkBox' as const;\n\n  first_chunk: Array<number>;\n  samples_per_chunk: Array<number>;\n  sample_description_index: Array<number>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    const entry_count = stream.readUint32();\n    this.first_chunk = [];\n    this.samples_per_chunk = [];\n    this.sample_description_index = [];\n    if (this.version === 0) {\n      for (let i = 0; i < entry_count; i++) {\n        this.first_chunk.push(stream.readUint32());\n        this.samples_per_chunk.push(stream.readUint32());\n        this.sample_description_index.push(stream.readUint32());\n      }\n    }\n  }\n\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 4 + 12 * this.first_chunk.length;\n    this.writeHeader(stream);\n    stream.writeUint32(this.first_chunk.length);\n    for (let i = 0; i < this.first_chunk.length; i++) {\n      stream.writeUint32(this.first_chunk[i]);\n      stream.writeUint32(this.samples_per_chunk[i]);\n      stream.writeUint32(this.sample_description_index[i]);\n    }\n  }\n\n  unpack(samples: Array<Sample>) {\n    let l = 0;\n    let m = 0;\n    for (let i = 0; i < this.first_chunk.length; i++) {\n      for (\n        let j = 0;\n        j < (i + 1 < this.first_chunk.length ? this.first_chunk[i + 1] : Infinity);\n        j++\n      ) {\n        m++;\n        for (let k = 0; k < this.samples_per_chunk[i]; k++) {\n          if (samples[l]) {\n            samples[l].description_index = this.sample_description_index[i];\n            samples[l].chunk_index = m;\n          } else {\n            return;\n          }\n          l++;\n        }\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { OK } from '#/constants';\nimport { Log } from '#/log';\nimport { BoxRegistry } from '#/registry';\nimport type { BoxFourCC } from '@types';\nimport { SampleEntry } from './sampleentries/base';\nimport { parseOneBox } from '#/parser';\n\nexport class stsdBox extends FullBox {\n  static override readonly fourcc = 'stsd' as const;\n  box_name = 'SampleDescriptionBox' as const;\n\n  entries: Array<SampleEntry>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.entries = [];\n\n    const entryCount = stream.readUint32();\n\n    for (let i = 1; i <= entryCount; i++) {\n      const ret = parseOneBox(stream, true, this.size - (stream.getPosition() - this.start));\n\n      if (ret.code === OK) {\n        let box: SampleEntry;\n        if (ret.type in BoxRegistry.sampleEntry) {\n          box = new BoxRegistry.sampleEntry[ret.type](ret.size);\n          box.hdr_size = ret.hdr_size;\n          box.start = ret.start;\n        } else {\n          Log.warn('BoxParser', `Unknown sample entry type: '${ret.type}'`);\n          box = new SampleEntry(ret.size, ret.hdr_size, ret.start);\n          box.type = ret.type as BoxFourCC;\n        }\n\n        if (box.write === SampleEntry.prototype.write) {\n          Log.info(\n            'BoxParser',\n            'SampleEntry ' +\n              box.type +\n              ' box writing not yet implemented, keeping unparsed data in memory for later write',\n          );\n          box.parseDataAndRewind(stream);\n        }\n\n        box.parse(stream);\n        this.entries.push(box);\n      } else {\n        return;\n      }\n    }\n  }\n\n  /** @bundle writing/stsd.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 0;\n    this.writeHeader(stream);\n    stream.writeUint32(this.entries.length);\n    this.size += 4;\n    for (let i = 0; i < this.entries.length; i++) {\n      this.entries[i].write(stream);\n      this.size += this.entries[i].size;\n    }\n    /* adjusting the size, now that all sub-boxes are known */\n    Log.debug('BoxWriter', 'Adjusting box ' + this.type + ' with new size ' + this.size);\n    stream.adjustUint32(this.sizePosition, this.size);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class stszBox extends FullBox {\n  static override readonly fourcc = 'stsz' as const;\n  box_name = 'SampleSizeBox' as const;\n\n  sample_sizes: Array<number>;\n  sample_size: number;\n  sample_count: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.sample_sizes = [];\n    if (this.version === 0) {\n      this.sample_size = stream.readUint32();\n      this.sample_count = stream.readUint32();\n      for (let i = 0; i < this.sample_count; i++) {\n        if (this.sample_size === 0) {\n          this.sample_sizes.push(stream.readUint32());\n        } else {\n          this.sample_sizes[i] = this.sample_size;\n        }\n      }\n    }\n  }\n\n  /** @bundle writing/stsz.js */\n  write(stream: MultiBufferStream) {\n    let constant = true;\n    this.version = 0;\n    this.flags = 0;\n    if (this.sample_sizes.length > 0) {\n      let i = 0;\n      while (i + 1 < this.sample_sizes.length) {\n        if (this.sample_sizes[i + 1] !== this.sample_sizes[0]) {\n          constant = false;\n          break;\n        } else {\n          i++;\n        }\n      }\n    } else {\n      constant = false;\n    }\n    this.size = 8;\n    if (!constant) {\n      this.size += 4 * this.sample_sizes.length;\n    }\n    this.writeHeader(stream);\n    if (!constant) {\n      stream.writeUint32(0);\n    } else {\n      stream.writeUint32(this.sample_sizes[0]);\n    }\n    stream.writeUint32(this.sample_sizes.length);\n    if (!constant) {\n      stream.writeUint32Array(this.sample_sizes);\n    }\n  }\n\n  /** @bundle box-unpack.js */\n  unpack(samples) {\n    for (let i = 0; i < this.sample_sizes.length; i++) {\n      samples[i].size = this.sample_sizes[i];\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { Log } from '#/log';\nimport type { Sample } from '@types';\n\nexport class sttsBox extends FullBox {\n  static override readonly fourcc = 'stts' as const;\n  box_name = 'TimeToSampleBox' as const;\n\n  sample_counts: Array<number> = [];\n  sample_deltas: Array<number> = [];\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    const entry_count = stream.readUint32();\n    this.sample_counts.length = 0;\n    this.sample_deltas.length = 0;\n    if (this.version === 0) {\n      for (let i = 0; i < entry_count; i++) {\n        this.sample_counts.push(stream.readUint32());\n        let delta = stream.readInt32();\n        if (delta < 0) {\n          Log.warn(\n            'BoxParser',\n            'File uses negative stts sample delta, using value 1 instead, sync may be lost!',\n          );\n          delta = 1;\n        }\n        this.sample_deltas.push(delta);\n      }\n    }\n  }\n\n  /** @bundle writing/stts.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 4 + 8 * this.sample_counts.length;\n    this.writeHeader(stream);\n    stream.writeUint32(this.sample_counts.length);\n    for (let i = 0; i < this.sample_counts.length; i++) {\n      stream.writeUint32(this.sample_counts[i]);\n      stream.writeUint32(this.sample_deltas[i]);\n    }\n  }\n\n  /** @bundle box-unpack.js */\n  unpack(samples: Array<Sample>) {\n    let k = 0;\n    for (let i = 0; i < this.sample_counts.length; i++) {\n      for (let j = 0; j < this.sample_counts[i]; j++) {\n        if (k === 0) {\n          samples[k].dts = 0;\n        } else {\n          samples[k].dts = samples[k - 1].dts + this.sample_deltas[i];\n        }\n        k++;\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\n\nexport class tfdtBox extends FullBox {\n  static override readonly fourcc = 'tfdt' as const;\n  box_name = 'TrackFragmentBaseMediaDecodeTimeBox' as const;\n\n  baseMediaDecodeTime: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 1) {\n      this.baseMediaDecodeTime = stream.readUint64();\n    } else {\n      this.baseMediaDecodeTime = stream.readUint32();\n    }\n  }\n\n  /** @bundle writing/tdft.js */\n  write(stream: MultiBufferStream) {\n    // use version 1 if baseMediaDecodeTime does not fit 32 bits\n    const useVersion1 = this.baseMediaDecodeTime > MAX_UINT32 || this.version === 1;\n    this.version = useVersion1 ? 1 : 0;\n\n    this.size = 4;\n    this.size += useVersion1 ? 4 : 0;\n\n    this.flags = 0;\n    this.writeHeader(stream);\n    if (useVersion1) {\n      stream.writeUint64(this.baseMediaDecodeTime);\n    } else {\n      stream.writeUint32(this.baseMediaDecodeTime);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport {\n  TFHD_FLAG_BASE_DATA_OFFSET,\n  TFHD_FLAG_SAMPLE_DESC,\n  TFHD_FLAG_SAMPLE_DUR,\n  TFHD_FLAG_SAMPLE_FLAGS,\n  TFHD_FLAG_SAMPLE_SIZE,\n} from '#/constants';\n\nexport class tfhdBox extends FullBox {\n  static override readonly fourcc = 'tfhd' as const;\n  box_name = 'TrackFragmentHeaderBox' as const;\n\n  track_id: number;\n  base_data_offset: number;\n  default_sample_description_index: number;\n  default_sample_duration: number;\n  default_sample_size: number;\n  default_sample_flags: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    let readBytes = 0;\n    this.track_id = stream.readUint32();\n    if (this.size - this.hdr_size > readBytes && this.flags & TFHD_FLAG_BASE_DATA_OFFSET) {\n      this.base_data_offset = stream.readUint64();\n      readBytes += 8;\n    } else {\n      this.base_data_offset = 0;\n    }\n    if (this.size - this.hdr_size > readBytes && this.flags & TFHD_FLAG_SAMPLE_DESC) {\n      this.default_sample_description_index = stream.readUint32();\n      readBytes += 4;\n    } else {\n      this.default_sample_description_index = 0;\n    }\n    if (this.size - this.hdr_size > readBytes && this.flags & TFHD_FLAG_SAMPLE_DUR) {\n      this.default_sample_duration = stream.readUint32();\n      readBytes += 4;\n    } else {\n      this.default_sample_duration = 0;\n    }\n    if (this.size - this.hdr_size > readBytes && this.flags & TFHD_FLAG_SAMPLE_SIZE) {\n      this.default_sample_size = stream.readUint32();\n      readBytes += 4;\n    } else {\n      this.default_sample_size = 0;\n    }\n    if (this.size - this.hdr_size > readBytes && this.flags & TFHD_FLAG_SAMPLE_FLAGS) {\n      this.default_sample_flags = stream.readUint32();\n      readBytes += 4;\n    } else {\n      this.default_sample_flags = 0;\n    }\n  }\n\n  /** @bundle writing/tfhd.js */\n  write(stream) {\n    this.version = 0;\n    this.size = 4;\n    if (this.flags & TFHD_FLAG_BASE_DATA_OFFSET) {\n      this.size += 8;\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_DESC) {\n      this.size += 4;\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_DUR) {\n      this.size += 4;\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_SIZE) {\n      this.size += 4;\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_FLAGS) {\n      this.size += 4;\n    }\n    this.writeHeader(stream);\n    stream.writeUint32(this.track_id);\n    if (this.flags & TFHD_FLAG_BASE_DATA_OFFSET) {\n      stream.writeUint64(this.base_data_offset);\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_DESC) {\n      stream.writeUint32(this.default_sample_description_index);\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_DUR) {\n      stream.writeUint32(this.default_sample_duration);\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_SIZE) {\n      stream.writeUint32(this.default_sample_size);\n    }\n    if (this.flags & TFHD_FLAG_SAMPLE_FLAGS) {\n      stream.writeUint32(this.default_sample_flags);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport { MAX_UINT32 } from '#/constants';\nimport type { Matrix } from '@types';\n\nexport class tkhdBox extends FullBox {\n  static override readonly fourcc = 'tkhd' as const;\n  box_name = 'TrackHeaderBox' as const;\n\n  creation_time: number;\n  modification_time: number;\n  track_id: number;\n  duration: number;\n  layer = 0;\n  alternate_group = 0;\n  volume: number;\n  matrix: Matrix;\n  width: number;\n  height: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 1) {\n      this.creation_time = stream.readUint64();\n      this.modification_time = stream.readUint64();\n      this.track_id = stream.readUint32();\n      stream.readUint32();\n      this.duration = stream.readUint64();\n    } else {\n      this.creation_time = stream.readUint32();\n      this.modification_time = stream.readUint32();\n      this.track_id = stream.readUint32();\n      stream.readUint32();\n      this.duration = stream.readUint32();\n    }\n    stream.readUint32Array(2);\n    this.layer = stream.readInt16();\n    this.alternate_group = stream.readInt16();\n    this.volume = stream.readInt16() >> 8;\n    stream.readUint16();\n    this.matrix = stream.readInt32Array(9);\n    this.width = stream.readUint32();\n    this.height = stream.readUint32();\n  }\n\n  write(stream: MultiBufferStream) {\n    const useVersion1 =\n      this.modification_time > MAX_UINT32 ||\n      this.creation_time > MAX_UINT32 ||\n      this.duration > MAX_UINT32 ||\n      this.version === 1;\n    this.version = useVersion1 ? 1 : 0;\n\n    this.size = 5 * 4 + 15 * 4; // 5x4 for header, 15x4 for fields\n    this.size += useVersion1 ? 3 * 4 : 0; // creation_time, modification_time, duration\n\n    this.flags = this.flags ?? 0x1 | 0x2; // track_enabled | track_in_movie\n    this.writeHeader(stream);\n\n    if (useVersion1) {\n      stream.writeUint64(this.creation_time);\n      stream.writeUint64(this.modification_time);\n      stream.writeUint32(this.track_id);\n      stream.writeUint32(0); // reserved\n      stream.writeUint64(this.duration);\n    } else {\n      stream.writeUint32(this.creation_time);\n      stream.writeUint32(this.modification_time);\n      stream.writeUint32(this.track_id);\n      stream.writeUint32(0); // reserved\n      stream.writeUint32(this.duration);\n    }\n    stream.writeUint32Array([0, 0]); // reserved\n    stream.writeInt16(this.layer);\n    stream.writeInt16(this.alternate_group);\n    stream.writeInt16(this.volume << 8); // volume in 0.256 units\n    stream.writeInt16(0); // reserved\n    stream.writeInt32Array(this.matrix); // 3x3 matrix\n    stream.writeUint32(this.width);\n    stream.writeUint32(this.height);\n  }\n\n  /** @bundle box-print.js */\n  print(output: { log: (arg: string) => void; indent: string }) {\n    super.printHeader(output);\n    output.log(output.indent + 'creation_time: ' + this.creation_time);\n    output.log(output.indent + 'modification_time: ' + this.modification_time);\n    output.log(output.indent + 'track_id: ' + this.track_id);\n    output.log(output.indent + 'duration: ' + this.duration);\n    output.log(output.indent + 'volume: ' + (this.volume >> 8));\n    output.log(output.indent + 'matrix: ' + this.matrix.join(', '));\n    output.log(output.indent + 'layer: ' + this.layer);\n    output.log(output.indent + 'alternate_group: ' + this.alternate_group);\n    output.log(output.indent + 'width: ' + this.width);\n    output.log(output.indent + 'height: ' + this.height);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class trexBox extends FullBox {\n  static override readonly fourcc = 'trex' as const;\n  box_name = 'TrackExtendsBox' as const;\n\n  track_id: number;\n  default_sample_description_index: number;\n  default_sample_duration: number;\n  default_sample_size: number;\n  default_sample_flags: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.track_id = stream.readUint32();\n    this.default_sample_description_index = stream.readUint32();\n    this.default_sample_duration = stream.readUint32();\n    this.default_sample_size = stream.readUint32();\n    this.default_sample_flags = stream.readUint32();\n  }\n\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size = 4 * 5;\n    this.writeHeader(stream);\n    stream.writeUint32(this.track_id);\n    stream.writeUint32(this.default_sample_description_index);\n    stream.writeUint32(this.default_sample_duration);\n    stream.writeUint32(this.default_sample_size);\n    stream.writeUint32(this.default_sample_flags);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\nimport {\n  TRUN_FLAGS_CTS_OFFSET,\n  TRUN_FLAGS_DATA_OFFSET,\n  TRUN_FLAGS_DURATION,\n  TRUN_FLAGS_FIRST_FLAG,\n  TRUN_FLAGS_FLAGS,\n  TRUN_FLAGS_SIZE,\n} from '#/constants';\n\nexport class trunBox extends FullBox {\n  static override readonly fourcc = 'trun' as const;\n  box_name = 'TrackRunBox' as const;\n\n  sample_count: number;\n  data_offset: number;\n  first_sample_flags: number;\n  sample_duration: Array<number> = [];\n  sample_size: Array<number> = [];\n  sample_flags: Array<number> = [];\n  sample_composition_time_offset: Array<number> = [];\n  data_offset_position: number;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    let readBytes = 0;\n    this.sample_count = stream.readUint32();\n    readBytes += 4;\n    if (this.size - this.hdr_size > readBytes && this.flags & TRUN_FLAGS_DATA_OFFSET) {\n      this.data_offset = stream.readInt32(); //signed\n      readBytes += 4;\n    } else {\n      this.data_offset = 0;\n    }\n    if (this.size - this.hdr_size > readBytes && this.flags & TRUN_FLAGS_FIRST_FLAG) {\n      this.first_sample_flags = stream.readUint32();\n      readBytes += 4;\n    } else {\n      this.first_sample_flags = 0;\n    }\n    this.sample_duration = [];\n    this.sample_size = [];\n    this.sample_flags = [];\n    this.sample_composition_time_offset = [];\n    if (this.size - this.hdr_size > readBytes) {\n      for (let i = 0; i < this.sample_count; i++) {\n        if (this.flags & TRUN_FLAGS_DURATION) {\n          this.sample_duration[i] = stream.readUint32();\n        }\n        if (this.flags & TRUN_FLAGS_SIZE) {\n          this.sample_size[i] = stream.readUint32();\n        }\n        if (this.flags & TRUN_FLAGS_FLAGS) {\n          this.sample_flags[i] = stream.readUint32();\n        }\n        if (this.flags & TRUN_FLAGS_CTS_OFFSET) {\n          if (this.version === 0) {\n            this.sample_composition_time_offset[i] = stream.readUint32();\n          } else {\n            this.sample_composition_time_offset[i] = stream.readInt32(); //signed\n          }\n        }\n      }\n    }\n  }\n\n  /** @bundle writing/trun.js */\n  write(stream: MultiBufferStream) {\n    this.size = 4;\n    if (this.flags & TRUN_FLAGS_DATA_OFFSET) {\n      this.size += 4;\n    }\n    if (this.flags & TRUN_FLAGS_FIRST_FLAG) {\n      this.size += 4;\n    }\n    if (this.flags & TRUN_FLAGS_DURATION) {\n      this.size += 4 * this.sample_duration.length;\n    }\n    if (this.flags & TRUN_FLAGS_SIZE) {\n      this.size += 4 * this.sample_size.length;\n    }\n    if (this.flags & TRUN_FLAGS_FLAGS) {\n      this.size += 4 * this.sample_flags.length;\n    }\n    if (this.flags & TRUN_FLAGS_CTS_OFFSET) {\n      this.size += 4 * this.sample_composition_time_offset.length;\n    }\n    this.writeHeader(stream);\n    stream.writeUint32(this.sample_count);\n    if (this.flags & TRUN_FLAGS_DATA_OFFSET) {\n      this.data_offset_position = stream.getPosition();\n      stream.writeInt32(this.data_offset); //signed\n    }\n    if (this.flags & TRUN_FLAGS_FIRST_FLAG) {\n      stream.writeUint32(this.first_sample_flags);\n    }\n    for (let i = 0; i < this.sample_count; i++) {\n      if (this.flags & TRUN_FLAGS_DURATION) {\n        stream.writeUint32(this.sample_duration[i]);\n      }\n      if (this.flags & TRUN_FLAGS_SIZE) {\n        stream.writeUint32(this.sample_size[i]);\n      }\n      if (this.flags & TRUN_FLAGS_FLAGS) {\n        stream.writeUint32(this.sample_flags[i]);\n      }\n      if (this.flags & TRUN_FLAGS_CTS_OFFSET) {\n        if (this.version === 0) {\n          stream.writeUint32(this.sample_composition_time_offset[i]);\n        } else {\n          stream.writeInt32(this.sample_composition_time_offset[i]); //signed\n        }\n      }\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class urlBox extends FullBox {\n  static override readonly fourcc = 'url ' as const;\n  box_name = 'DataEntryUrlBox' as const;\n\n  location?: string;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.flags !== 0x000001) {\n      this.location = stream.readCString();\n    }\n  }\n\n  /** @bundle writing/url.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    if (this.location) {\n      this.flags = 0;\n      this.size = this.location.length + 1;\n    } else {\n      this.flags = 0x000001;\n      this.size = 0;\n    }\n    this.writeHeader(stream);\n    if (this.location) {\n      stream.writeCString(this.location);\n    }\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class vmhdBox extends FullBox {\n  static override readonly fourcc = 'vmhd' as const;\n  box_name = 'VideoMediaHeaderBox' as const;\n\n  graphicsmode: number;\n  opcolor: Uint16Array | [number, number, number];\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.graphicsmode = stream.readUint16();\n    this.opcolor = stream.readUint16Array(3);\n  }\n\n  /** @bundle writing/vmhd.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.size = 8;\n    this.writeHeader(stream);\n    stream.writeUint16(this.graphicsmode);\n    stream.writeUint16Array(this.opcolor);\n  }\n}\n","/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\n\nimport { Box } from '#/box';\nimport { boxEqual } from '#/box-diff';\nimport { avcCBox } from '#/boxes/avcC';\nimport {\n  dinfBox,\n  hmhdBox,\n  mdatBox,\n  mdiaBox,\n  minfBox,\n  moofBox,\n  moovBox,\n  mvexBox,\n  nmhdBox,\n  stblBox,\n  trafBox,\n  trakBox,\n} from '#/boxes/defaults';\nimport { drefBox } from '#/boxes/dref';\nimport { elngBox } from '#/boxes/elng';\nimport { ftypBox } from '#/boxes/ftyp';\nimport { hdlrBox } from '#/boxes/hdlr';\nimport { hvcCBox } from '#/boxes/hvcC';\nimport { mdhdBox } from '#/boxes/mdhd';\nimport { mehdBox } from '#/boxes/mehd';\nimport { metaBox } from '#/boxes/meta';\nimport { mfhdBox } from '#/boxes/mfhd';\nimport { mvhdBox } from '#/boxes/mvhd';\nimport { stppSampleEntry } from '#/boxes/sampleentries';\nimport {\n  AudioSampleEntry,\n  HintSampleEntry,\n  MetadataSampleEntry,\n  SubtitleSampleEntry,\n  SystemSampleEntry,\n  VisualSampleEntry,\n} from '#/boxes/sampleentries/base';\nimport { sbgpBox } from '#/boxes/sbgp';\nimport { sdtpBox } from '#/boxes/sdtp';\nimport { sgpdBox } from '#/boxes/sgpd';\nimport { sidxBox } from '#/boxes/sidx';\nimport { smhdBox } from '#/boxes/smhd';\nimport { stcoBox } from '#/boxes/stco';\nimport { sthdBox } from '#/boxes/sthd';\nimport { stscBox } from '#/boxes/stsc';\nimport { stsdBox } from '#/boxes/stsd';\nimport { stszBox } from '#/boxes/stsz';\nimport { sttsBox } from '#/boxes/stts';\nimport { tfdtBox } from '#/boxes/tfdt';\nimport { tfhdBox } from '#/boxes/tfhd';\nimport { tkhdBox } from '#/boxes/tkhd';\nimport { trexBox } from '#/boxes/trex';\nimport { trunBox } from '#/boxes/trun';\nimport { urlBox } from '#/boxes/url';\nimport { vmhdBox } from '#/boxes/vmhd';\nimport { MultiBufferStream } from '#/buffer';\nimport {\n  ERR_INVALID_DATA,\n  ERR_NOT_ENOUGH_DATA,\n  OK,\n  TFHD_FLAG_BASE_DATA_OFFSET,\n  TFHD_FLAG_DEFAULT_BASE_IS_MOOF,\n  TFHD_FLAG_SAMPLE_DESC,\n  TFHD_FLAG_SAMPLE_DUR,\n  TFHD_FLAG_SAMPLE_FLAGS,\n  TFHD_FLAG_SAMPLE_SIZE,\n  TKHD_FLAG_ENABLED,\n  TKHD_FLAG_IN_MOVIE,\n  TKHD_FLAG_IN_PREVIEW,\n  TRUN_FLAGS_CTS_OFFSET,\n  TRUN_FLAGS_DATA_OFFSET,\n  TRUN_FLAGS_DURATION,\n  TRUN_FLAGS_FIRST_FLAG,\n  TRUN_FLAGS_FLAGS,\n  TRUN_FLAGS_SIZE,\n} from '#/constants';\nimport { DataStream } from '#/DataStream';\nimport { Log } from '#/log';\nimport { BoxRegistry } from '#/registry';\nimport type {\n  AllIdentifiers,\n  AllRegisteredBoxes,\n  BoxKind,\n  Description,\n  EntityGroup,\n  ExtractedTrack,\n  FragmentedTrack,\n  IncompleteBox,\n  Item,\n  Movie,\n  Output,\n  Sample,\n  SampleEntryFourCC,\n  SubSample,\n  Track,\n} from '@types';\nimport { MP4BoxBuffer } from '#/mp4boxbuffer';\nimport { parseOneBox } from '#/parser';\n\nexport class SampleGroupInfo {\n  last_sample_in_run = -1;\n  entry_index = -1;\n\n  description: Description;\n  fragment_description: Description;\n  is_fragment: boolean;\n\n  constructor(\n    public grouping_type: string,\n    public grouping_type_parameter: number,\n    public sbgp?: sbgpBox,\n  ) {}\n}\n\nexport interface IsoFileOptions {\n  brands?: Array<string>;\n  description_boxes?: Array<BoxKind>;\n  duration?: number;\n  height?: number;\n  id?: number;\n  language?: string;\n  layer?: number;\n  media_duration?: number;\n  rate?: number;\n  timescale?: number;\n  type?: SampleEntryFourCC;\n  width?: number;\n  hdlr?: string;\n  name?: string;\n  hevcDecoderConfigRecord?: ArrayBuffer;\n  avcDecoderConfigRecord?: ArrayBuffer;\n  balance?: number;\n  channel_count?: number;\n  samplesize?: number;\n  samplerate?: number;\n  namespace?: string;\n  schema_location?: string;\n  auxiliary_mime_types?: string;\n  description?: Box;\n  default_sample_description_index?: number;\n  default_sample_duration?: number;\n  default_sample_size?: number;\n  default_sample_flags?: number;\n}\n\nexport class ISOFile<TSegmentUser = unknown, TSampleUser = unknown> {\n  /** MutiBufferStream object used to parse boxes */\n  stream: MultiBufferStream;\n  /** Array of all boxes (in order) found in the file */\n  boxes: Array<Box> = [];\n  /** Array of all mdats */\n  mdats: Array<mdatBox> = [];\n  /** Array of all moofs */\n  moofs: Array<moofBox> = [];\n  /** Boolean indicating if the file is compatible with progressive parsing (moov first) */\n  isProgressive = false;\n  /** Boolean used to fire moov start event only once */\n  moovStartFound = false;\n  /** Callback called when the moov parsing starts */\n  onMoovStart?: () => void;\n  /** Boolean keeping track of the call to onMoovStart, to avoid double calls */\n  moovStartSent = false;\n  /** Callback called when the moov is entirely parsed */\n  onReady?: (info: Movie) => void;\n  /** Boolean keeping track of the call to onReady, to avoid double calls */\n  readySent = false;\n  /** Callback to call when segments are ready */\n  onSegment?: (\n    id: number,\n    user: TSegmentUser,\n    buffer: ArrayBuffer,\n    nextSample: number,\n    last: boolean,\n  ) => void;\n  /** Callback to call when samples are ready */\n  onSamples?: (id: number, user: TSampleUser, samples: Array<Sample>) => void;\n  /** Callback to call when there is an error in the parsing or processing of samples */\n  onError?: (module: string, message: string) => void;\n  /** Callback to call when an item is processed */\n  onItem?: () => void;\n  /** Boolean indicating if the moov box run-length encoded tables of sample information have been processed */\n  sampleListBuilt = false;\n  /** Array of Track objects for which fragmentation of samples is requested */\n  fragmentedTracks: Array<FragmentedTrack<TSegmentUser>> = [];\n  /** Array of Track objects for which extraction of samples is requested */\n  extractedTracks: Array<ExtractedTrack<TSampleUser>> = [];\n  /** Boolean indicating that fragmention is ready */\n  isFragmentationInitialized = false;\n  /** Boolean indicating that fragmented has started */\n  sampleProcessingStarted = false;\n  /** Number of the next 'moof' to generate when fragmenting */\n  nextMoofNumber = 0;\n  /** Boolean indicating if the initial list of items has been produced */\n  itemListBuilt = false;\n  /** Callback called when the sidx box is entirely parsed */\n  onSidx?: (sidx: sidxBox) => void;\n  /** Boolean keeping track of the call to onSidx, to avoid double calls */\n  sidxSent = false;\n\n  /** @bundle isofile-item-processing.js */\n  items: Array<Item> = [];\n\n  /** @bundle isofile-item-processing.js */\n  entity_groups: Array<EntityGroup> = [];\n\n  /**\n   * size of the buffers allocated for samples\n   * @bundle isofile-item-processing.js\n   */\n  itemsDataSize = 0;\n\n  moov: moovBox;\n  moovs: Array<moovBox>;\n  sidx: sidxBox;\n  sidxs: Array<sidxBox>;\n  meta: metaBox;\n  metas: Array<metaBox>;\n  ftyp: ftypBox;\n  ftyps: Array<ftypBox>;\n  nextSeekPosition: number;\n  initial_duration: number;\n\n  constructor(stream?: MultiBufferStream, discardMdatData = true) {\n    this.discardMdatData = discardMdatData;\n    if (stream) {\n      this.stream = stream;\n      this.parse();\n    } else {\n      this.stream = new MultiBufferStream();\n    }\n    this.stream.isofile = this;\n  }\n\n  setSegmentOptions(\n    id: number,\n    user: TSegmentUser,\n    opts: Partial<{\n      nbSamples: number;\n      nbSamplesPerFragment: number;\n      sizePerSegment: number;\n      rapAlignement: boolean;\n    }>,\n  ) {\n    // Destructure and provide defaults for optional properties\n    const { sizePerSegment = Number.MAX_SAFE_INTEGER, rapAlignement = true } = opts;\n\n    // Set defaults for sample counts\n    let nbSamples = opts.nbSamples ?? opts.nbSamplesPerFragment ?? 1000;\n    const nbSamplesPerFragment = opts.nbSamplesPerFragment ?? nbSamples;\n\n    // Validate number of samples\n    if (nbSamples <= 0 || nbSamplesPerFragment <= 0 || sizePerSegment <= 0) {\n      Log.error(\n        'ISOFile',\n        `Invalid segment options: nbSamples=${nbSamples}, nbSamplesPerFragment=${nbSamplesPerFragment}, sizePerSegment=${sizePerSegment}`,\n      );\n      return;\n    }\n\n    // Check if the number of samples is valid\n    if (nbSamples < nbSamplesPerFragment) {\n      Log.warn(\n        'ISOFile',\n        `nbSamples (${nbSamples}) is less than nbSamplesPerFragment (${nbSamplesPerFragment}), setting nbSamples to nbSamplesPerFragment`,\n      );\n      nbSamples = nbSamplesPerFragment;\n    }\n\n    // Number of samples per segment must be same across all tracks\n    if (this.fragmentedTracks.some(track => track.nb_samples !== nbSamples)) {\n      Log.error(\n        'ISOFile',\n        `Cannot set segment options for track ${id}: nbSamples (${nbSamples}) does not match existing tracks`,\n      );\n      return;\n    }\n\n    const trak = this.getTrackById(id);\n    if (trak) {\n      const fragTrack: FragmentedTrack<TSegmentUser> = {\n        id,\n        user,\n        trak,\n        segmentStream: undefined,\n        nb_samples: nbSamples,\n        nb_samples_per_fragment: nbSamplesPerFragment,\n        size_per_segment: sizePerSegment,\n        rapAlignement,\n        state: {\n          lastFragmentSampleNumber: 0,\n          lastSegmentSampleNumber: 0,\n          accumulatedSize: 0,\n        },\n      };\n      this.fragmentedTracks.push(fragTrack);\n      trak.nextSample = 0;\n    }\n\n    if (this.discardMdatData) {\n      Log.warn(\n        'ISOFile',\n        'Segmentation options set but discardMdatData is true, samples will not be segmented',\n      );\n    }\n  }\n\n  unsetSegmentOptions(id: number) {\n    let index = -1;\n    for (let i = 0; i < this.fragmentedTracks.length; i++) {\n      const fragTrack = this.fragmentedTracks[i];\n      if (fragTrack.id === id) {\n        index = i;\n      }\n    }\n    if (index > -1) {\n      this.fragmentedTracks.splice(index, 1);\n    }\n  }\n\n  setExtractionOptions(\n    id: number,\n    user?: TSampleUser,\n    { nbSamples: nb_samples = 1000 }: { nbSamples?: number } = {},\n  ) {\n    const trak = this.getTrackById(id);\n    if (trak) {\n      this.extractedTracks.push({\n        id,\n        user,\n        trak,\n        nb_samples,\n        samples: [],\n      });\n      trak.nextSample = 0;\n    }\n\n    if (this.discardMdatData) {\n      Log.warn(\n        'ISOFile',\n        'Extraction options set but discardMdatData is true, samples will not be extracted',\n      );\n    }\n  }\n\n  unsetExtractionOptions(id: number) {\n    let index = -1;\n    for (let i = 0; i < this.extractedTracks.length; i++) {\n      const extractTrack = this.extractedTracks[i];\n      if (extractTrack.id === id) {\n        index = i;\n      }\n    }\n    if (index > -1) {\n      this.extractedTracks.splice(index, 1);\n    }\n  }\n\n  parse() {\n    const parseBoxHeadersOnly = false;\n\n    if (this.restoreParsePosition) {\n      if (!this.restoreParsePosition()) {\n        return;\n      }\n    }\n\n    while (true) {\n      if (this.hasIncompleteMdat && this.hasIncompleteMdat()) {\n        if (this.processIncompleteMdat()) {\n          continue;\n        } else {\n          return;\n        }\n      } else {\n        if (this.saveParsePosition) {\n          this.saveParsePosition();\n        }\n        const ret = parseOneBox(this.stream, parseBoxHeadersOnly);\n        if (ret.code === ERR_NOT_ENOUGH_DATA) {\n          if (this.processIncompleteBox) {\n            if (this.processIncompleteBox(ret)) {\n              continue;\n            } else {\n              return;\n            }\n          } else {\n            return;\n          }\n        } else if (ret.code === OK) {\n          /* the box is entirely parsed */\n          const box = ret.box as BoxKind;\n          /* store the box in the 'boxes' array to preserve box order (for file rewrite if needed)  */\n          this.boxes.push(box);\n          if (box.type === 'uuid') {\n            if (this[box.uuid] !== undefined) {\n              Log.warn(\n                'ISOFile',\n                'Duplicate Box of uuid: ' + box.uuid + ', overriding previous occurrence',\n              );\n            }\n            this[box.uuid] = box;\n          } else {\n            /* but also store box in a property for more direct access */\n            switch (box.type) {\n              case 'mdat':\n                this.mdats.push(box as mdatBox);\n                this.transferMdatData(box as mdatBox);\n                break;\n              case 'moof':\n                this.moofs.push(box as moofBox);\n                break;\n              case 'free':\n              case 'skip':\n                break;\n              case 'moov':\n                this.moovStartFound = true;\n                if (this.mdats.length === 0) {\n                  this.isProgressive = true;\n                }\n              /* no break */\n              /* falls through */\n              default:\n                if (this[box.type] !== undefined) {\n                  if (Array.isArray(this[box.type + 's'])) {\n                    Log.info(\n                      'ISOFile',\n                      `Found multiple boxes of type ${box.type} in ISOFile, adding to array`,\n                    );\n                    this[box.type + 's'].push(box);\n                  } else {\n                    Log.warn(\n                      'ISOFile',\n                      `Found multiple boxes of type ${box.type} but no array exists. Creating array dynamically.`,\n                    );\n                    this[box.type + 's'] = [this[box.type], box];\n                  }\n                } else {\n                  this[box.type] = box;\n                  if (Array.isArray(this[box.type + 's'])) {\n                    this[box.type + 's'].push(box);\n                  }\n                }\n                break;\n            }\n          }\n          if (this.updateUsedBytes) {\n            this.updateUsedBytes(box, ret);\n          }\n        } else if (ret.code === ERR_INVALID_DATA) {\n          Log.error(\n            'ISOFile',\n            `Invalid data found while parsing box of type '${ret.type}' at position ${ret.start}. Aborting parsing.`,\n            this,\n          );\n          break;\n        }\n      }\n    }\n  }\n\n  checkBuffer(ab?: MP4BoxBuffer) {\n    if (!ab) throw new Error('Buffer must be defined and non empty');\n    if (ab.byteLength === 0) {\n      Log.warn('ISOFile', 'Ignoring empty buffer (fileStart: ' + ab.fileStart + ')');\n      this.stream.logBufferLevel();\n      return false;\n    }\n    Log.info('ISOFile', 'Processing buffer (fileStart: ' + ab.fileStart + ')');\n\n    /* mark the bytes in the buffer as not being used yet */\n    ab.usedBytes = 0;\n    this.stream.insertBuffer(ab);\n    this.stream.logBufferLevel();\n\n    if (!this.stream.initialized()) {\n      Log.warn('ISOFile', 'Not ready to start parsing');\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Processes a new ArrayBuffer (with a fileStart property)\n   * Returns the next expected file position, or undefined if not ready to parse\n   */\n  appendBuffer(ab: MP4BoxBuffer, last?: boolean) {\n    let nextFileStart: number;\n    if (!this.checkBuffer(ab)) {\n      return;\n    }\n\n    /* Parse whatever is in the existing buffers */\n    this.parse();\n\n    /* Check if the moovStart callback needs to be called */\n    if (this.moovStartFound && !this.moovStartSent) {\n      this.moovStartSent = true;\n      if (this.onMoovStart) this.onMoovStart();\n    }\n\n    if (this.moov) {\n      /* A moov box has been entirely parsed */\n\n      /* if this is the first call after the moov is found we initialize the list of samples (may be empty in fragmented files) */\n      if (!this.sampleListBuilt) {\n        this.buildSampleLists();\n        this.sampleListBuilt = true;\n      }\n\n      /* We update the sample information if there are any new moof boxes */\n      this.updateSampleLists();\n\n      /* If the application needs to be informed that the 'moov' has been found,\n         we create the information object and callback the application */\n      if (this.onReady && !this.readySent) {\n        this.readySent = true;\n        this.onReady(this.getInfo());\n      }\n\n      /* See if any sample extraction or segment creation needs to be done with the available samples */\n      this.processSamples(last);\n\n      /* Inform about the best range to fetch next */\n      if (this.nextSeekPosition) {\n        nextFileStart = this.nextSeekPosition;\n        this.nextSeekPosition = undefined;\n      } else {\n        nextFileStart = this.nextParsePosition;\n      }\n      if (this.stream.getEndFilePositionAfter) {\n        nextFileStart = this.stream.getEndFilePositionAfter(nextFileStart);\n      }\n    } else {\n      if (this.nextParsePosition) {\n        /* moov has not been parsed but the first buffer was received,\n           the next fetch should probably be the next box start */\n        nextFileStart = this.nextParsePosition;\n      } else {\n        /* No valid buffer has been parsed yet, we cannot know what to parse next */\n        nextFileStart = 0;\n      }\n    }\n    if (this.sidx) {\n      if (this.onSidx && !this.sidxSent) {\n        this.onSidx(this.sidx);\n        this.sidxSent = true;\n      }\n    }\n    if (this.meta) {\n      if (this.flattenItemInfo && !this.itemListBuilt) {\n        this.flattenItemInfo();\n        this.itemListBuilt = true;\n      }\n      if (this.processItems) {\n        this.processItems(this.onItem);\n      }\n    }\n\n    if (this.stream.cleanBuffers) {\n      Log.info(\n        'ISOFile',\n        'Done processing buffer (fileStart: ' +\n          ab.fileStart +\n          ') - next buffer to fetch should have a fileStart position of ' +\n          nextFileStart,\n      );\n      this.stream.logBufferLevel();\n      this.stream.cleanBuffers();\n      this.stream.logBufferLevel(true);\n      Log.info('ISOFile', 'Sample data size in memory: ' + this.getAllocatedSampleDataSize());\n    }\n    return nextFileStart;\n  }\n\n  getFragmentDuration() {\n    const mvex = this.getBox('mvex');\n    if (!mvex) return;\n\n    // Use mehd if available\n    if (mvex.mehd) {\n      return {\n        num: mvex.mehd.fragment_duration,\n        den: this.moov.mvhd.timescale,\n      };\n    }\n\n    // Find the longest track\n    const traks = this.getBoxes('trak', false);\n    let maximum = { num: 0, den: 1 };\n\n    for (const trak of traks) {\n      const duration = trak.samples_duration;\n      const timescale = trak.mdia.mdhd.timescale;\n      if (duration && timescale) {\n        const ratio = duration / timescale;\n        if (ratio > maximum.num / maximum.den) {\n          maximum = { num: duration, den: timescale };\n        }\n      }\n    }\n\n    return maximum;\n  }\n\n  getInfo(): Movie {\n    if (!this.moov) {\n      return {\n        hasMoov: false,\n        mime: '',\n      } as Movie;\n    }\n\n    const _1904 = new Date('1904-01-01T00:00:00Z').getTime();\n    const isFragmented = this.getBox('mvex') !== undefined;\n\n    const movie: Movie = {\n      hasMoov: true,\n      duration: this.moov.mvhd.duration,\n      timescale: this.moov.mvhd.timescale,\n      isFragmented,\n      fragment_duration: this.getFragmentDuration(),\n      isProgressive: this.isProgressive,\n      hasIOD: this.moov.iods !== undefined,\n      brands: [this.ftyp.major_brand].concat(this.ftyp.compatible_brands),\n      created: new Date(_1904 + this.moov.mvhd.creation_time * 1000),\n      modified: new Date(_1904 + this.moov.mvhd.modification_time * 1000),\n      tracks: [] as Array<Track>,\n      audioTracks: [] as Array<Track>,\n      videoTracks: [] as Array<Track>,\n      subtitleTracks: [] as Array<Track>,\n      metadataTracks: [] as Array<Track>,\n      hintTracks: [] as Array<Track>,\n      otherTracks: [] as Array<Track>,\n      mime: '',\n    };\n\n    for (let i = 0; i < this.moov.traks.length; i++) {\n      const trak = this.moov.traks[i];\n\n      const sample_desc = trak.mdia.minf.stbl.stsd.entries[0];\n\n      const size = trak.samples_size;\n      const track_timescale = trak.mdia.mdhd.timescale;\n      const samples_duration = trak.samples_duration;\n      const bitrate = (size * 8 * track_timescale) / samples_duration;\n\n      const track: Track = {\n        samples_duration,\n        bitrate,\n        size,\n        timescale: track_timescale,\n        alternate_group: trak.tkhd.alternate_group,\n        codec: sample_desc.getCodec(),\n        created: new Date(_1904 + trak.tkhd.creation_time * 1000),\n        cts_shift: trak.mdia.minf.stbl.cslg,\n        duration: trak.mdia.mdhd.duration,\n        id: trak.tkhd.track_id,\n        kind:\n          trak.udta && trak.udta.kinds.length ? trak.udta.kinds[0] : { schemeURI: '', value: '' },\n        // NOTE:   trak.mdia.elng used to be trak.mdia.eln\n        language: trak.mdia.elng ? trak.mdia.elng.extended_language : trak.mdia.mdhd.languageString,\n        layer: trak.tkhd.layer,\n        matrix: trak.tkhd.matrix,\n        modified: new Date(_1904 + trak.tkhd.modification_time * 1000),\n        movie_duration: trak.tkhd.duration,\n        movie_timescale: movie.timescale,\n        name: trak.mdia.hdlr.name,\n        nb_samples: trak.samples.length,\n        references: [],\n        track_height: trak.tkhd.height / (1 << 16),\n        track_width: trak.tkhd.width / (1 << 16),\n        volume: trak.tkhd.volume,\n      };\n\n      movie.tracks.push(track);\n\n      if (trak.tref) {\n        for (let j = 0; j < trak.tref.references.length; j++) {\n          track.references.push({\n            type: trak.tref.references[j].type,\n            track_ids: trak.tref.references[j].track_ids,\n          });\n        }\n      }\n\n      if (trak.edts !== undefined && trak.edts.elst !== undefined) {\n        track.edits = trak.edts.elst.entries;\n      }\n\n      if (sample_desc instanceof AudioSampleEntry) {\n        track.type = 'audio';\n        movie.audioTracks.push(track);\n        track.audio = {\n          sample_rate: sample_desc.getSampleRate(),\n          channel_count: sample_desc.getChannelCount(),\n          sample_size: sample_desc.getSampleSize(),\n        };\n      } else if (sample_desc instanceof VisualSampleEntry) {\n        track.type = 'video';\n        movie.videoTracks.push(track);\n        track.video = {\n          width: sample_desc.getWidth(),\n          height: sample_desc.getHeight(),\n        };\n      } else if (sample_desc instanceof SubtitleSampleEntry) {\n        track.type = 'subtitles';\n        movie.subtitleTracks.push(track);\n      } else if (sample_desc instanceof HintSampleEntry) {\n        track.type = 'metadata';\n        movie.hintTracks.push(track);\n      } else if (sample_desc instanceof MetadataSampleEntry) {\n        track.type = 'metadata';\n        movie.metadataTracks.push(track);\n      } else {\n        track.type = 'metadata';\n        movie.otherTracks.push(track);\n      }\n    }\n\n    if (movie.videoTracks && movie.videoTracks.length > 0) {\n      movie.mime += 'video/mp4; codecs=\"';\n    } else if (movie.audioTracks && movie.audioTracks.length > 0) {\n      movie.mime += 'audio/mp4; codecs=\"';\n    } else {\n      movie.mime += 'application/mp4; codecs=\"';\n    }\n    for (let i = 0; i < movie.tracks.length; i++) {\n      if (i !== 0) movie.mime += ',';\n      movie.mime += movie.tracks[i].codec;\n    }\n    movie.mime += '\"; profiles=\"';\n    movie.mime += this.ftyp.compatible_brands.join();\n    movie.mime += '\"';\n\n    return movie;\n  }\n\n  setNextSeekPositionFromSample(sample: Sample) {\n    if (!sample) {\n      return;\n    }\n    if (this.nextSeekPosition) {\n      this.nextSeekPosition = Math.min(sample.offset + sample.alreadyRead, this.nextSeekPosition);\n    } else {\n      this.nextSeekPosition = sample.offset + sample.alreadyRead;\n    }\n  }\n\n  processSamples(last?: boolean) {\n    if (!this.sampleProcessingStarted) return;\n\n    /* For each track marked for fragmentation,\n       check if the next sample is there (i.e. if the sample information is known (i.e. moof has arrived) and if it has been downloaded)\n       and create a fragment with it */\n    if (this.isFragmentationInitialized && this.onSegment !== undefined) {\n      const consumedTracks = new Set<number>();\n      while (\n        consumedTracks.size < this.fragmentedTracks.length &&\n        this.fragmentedTracks.some(track => track.trak.nextSample < track.trak.samples.length) &&\n        this.sampleProcessingStarted\n      ) {\n        for (const fragTrak of this.fragmentedTracks) {\n          const trak = fragTrak.trak;\n          if (!consumedTracks.has(fragTrak.id)) {\n            // Check if the sample is available\n            const sample =\n              trak.nextSample < trak.samples.length\n                ? this.getSample(trak, trak.nextSample)\n                : undefined;\n            if (!sample) {\n              this.setNextSeekPositionFromSample(trak.samples[trak.nextSample]);\n              /* The fragment cannot not be created because the media data is not there (not downloaded), wait for it */\n              consumedTracks.add(fragTrak.id);\n              continue;\n            }\n\n            // Accumulate the size of the sample in the fragment state\n            fragTrak.state.accumulatedSize += sample.size;\n\n            // Check if fragment or segment are overdue or if we are at a boundary\n            const sampleNum = trak.nextSample + 1;\n            const isFragmentOverdue =\n              sampleNum - fragTrak.state.lastFragmentSampleNumber >\n              fragTrak.nb_samples_per_fragment;\n            const isSegmentOverdue =\n              sampleNum - fragTrak.state.lastSegmentSampleNumber > fragTrak.nb_samples;\n            let isFragmentBoundary =\n              isFragmentOverdue || sampleNum % fragTrak.nb_samples_per_fragment === 0;\n            let isSegmentBoundary = isSegmentOverdue || sampleNum % fragTrak.nb_samples === 0;\n\n            // Check if the segment size is reached\n            let isSizeBoundary = fragTrak.state.accumulatedSize >= fragTrak.size_per_segment;\n\n            // Check if the sample is a RAP (Random Access Point)\n            const isRAP = !fragTrak.rapAlignement || sample.is_sync;\n\n            // During flush, we create a fragment even if we are not at a boundary\n            const isFlush = last || trak.nextSample + 1 >= trak.samples.length;\n            if (isFlush && !isRAP) {\n              Log.warn(\n                'ISOFile',\n                'Flushing track #' +\n                  fragTrak.id +\n                  ' at sample #' +\n                  trak.nextSample +\n                  ' which is not a RAP, this may lead to playback issues',\n              );\n            }\n\n            // Align fragment/segment boundaries with RAPs if requested\n            isFragmentBoundary = isFragmentBoundary && isRAP;\n            isSegmentBoundary = isSegmentBoundary && isRAP;\n            isSizeBoundary = isSizeBoundary && isRAP;\n\n            // Create a fragment if needed\n            if (isFragmentBoundary || isSizeBoundary || isFlush) {\n              if (isFragmentOverdue) {\n                Log.warn(\n                  'ISOFile',\n                  'Fragment on track #' +\n                    fragTrak.id +\n                    ' is overdue, creating it with samples [' +\n                    fragTrak.state.lastFragmentSampleNumber +\n                    ', ' +\n                    trak.nextSample +\n                    ']',\n                );\n              } else {\n                Log.debug(\n                  'ISOFile',\n                  'Creating media fragment on track #' +\n                    fragTrak.id +\n                    ' for samples [' +\n                    fragTrak.state.lastFragmentSampleNumber +\n                    ', ' +\n                    trak.nextSample +\n                    ']',\n                );\n              }\n\n              const result = this.createFragment(\n                fragTrak.id,\n                fragTrak.state.lastFragmentSampleNumber,\n                trak.nextSample,\n                fragTrak.segmentStream,\n              );\n              if (result) {\n                fragTrak.segmentStream = result;\n                fragTrak.state.lastFragmentSampleNumber = trak.nextSample + 1;\n              } else {\n                /* The fragment could not be created because the media data is not there (not downloaded), wait for it */\n                consumedTracks.add(fragTrak.id);\n                continue;\n              }\n            }\n\n            /* A fragment is created by a collection of samples, but the segment is the accumulation in the\n            buffer of these fragments. It is flushed only as requested by the application (nb_samples)\n            to avoid too many callbacks */\n            if (isSegmentBoundary || isSizeBoundary || isFlush) {\n              if (isSegmentOverdue) {\n                Log.warn(\n                  'ISOFile',\n                  'Segment on track #' +\n                    fragTrak.id +\n                    ' is overdue, sending it with samples [' +\n                    Math.max(0, trak.nextSample - fragTrak.nb_samples) +\n                    ', ' +\n                    (trak.nextSample - 1) +\n                    ']',\n                );\n              } else {\n                Log.info(\n                  'ISOFile',\n                  'Sending fragmented data on track #' +\n                    fragTrak.id +\n                    ' for samples [' +\n                    Math.max(0, trak.nextSample - fragTrak.nb_samples) +\n                    ', ' +\n                    (trak.nextSample - 1) +\n                    ']',\n                );\n              }\n              Log.info(\n                'ISOFile',\n                'Sample data size in memory: ' + this.getAllocatedSampleDataSize(),\n              );\n              if (this.onSegment) {\n                this.onSegment(\n                  fragTrak.id,\n                  fragTrak.user,\n                  fragTrak.segmentStream.buffer,\n                  trak.nextSample + 1,\n                  last || trak.nextSample + 1 >= trak.samples.length,\n                );\n              }\n              /* force the creation of a new buffer */\n              fragTrak.segmentStream = undefined;\n              // Reset the accumulated size and sample number\n              fragTrak.state.accumulatedSize = 0;\n              fragTrak.state.lastSegmentSampleNumber = trak.nextSample + 1;\n            }\n\n            // Advance to the next sample\n            trak.nextSample++;\n          }\n        }\n      }\n    }\n\n    if (this.onSamples !== undefined) {\n      /* For each track marked for data export,\n         check if the next sample is there (i.e. has been downloaded) and send it */\n      for (let i = 0; i < this.extractedTracks.length; i++) {\n        const extractTrak = this.extractedTracks[i];\n        const trak = extractTrak.trak;\n        while (trak.nextSample < trak.samples.length && this.sampleProcessingStarted) {\n          Log.debug(\n            'ISOFile',\n            'Exporting on track #' + extractTrak.id + ' sample #' + trak.nextSample,\n          );\n          const sample = this.getSample(trak, trak.nextSample);\n          if (sample) {\n            trak.nextSample++;\n            extractTrak.samples.push(sample);\n          } else {\n            this.setNextSeekPositionFromSample(trak.samples[trak.nextSample]);\n            break;\n          }\n          if (\n            trak.nextSample % extractTrak.nb_samples === 0 ||\n            trak.nextSample >= trak.samples.length\n          ) {\n            Log.debug(\n              'ISOFile',\n              'Sending samples on track #' + extractTrak.id + ' for sample ' + trak.nextSample,\n            );\n            if (this.onSamples) {\n              this.onSamples(extractTrak.id, extractTrak.user, extractTrak.samples);\n            }\n            extractTrak.samples = [];\n            if (extractTrak !== this.extractedTracks[i]) {\n              /* check if the extraction needs to be stopped */\n              break;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /* Find and return specific boxes using recursion and early return */\n  getBox<T extends AllIdentifiers>(type: T): AllRegisteredBoxes[T] | undefined {\n    const result = this.getBoxes(type, true);\n    return result.length ? result[0] : undefined;\n  }\n\n  getBoxes<T extends AllIdentifiers>(type: T, returnEarly: boolean) {\n    const result: Array<AllRegisteredBoxes[T]> = [];\n\n    const sweep = (root: Box | ISOFile) => {\n      if (root instanceof Box && root.type && root.type === type) {\n        result.push(root as unknown as AllRegisteredBoxes[T]);\n      }\n\n      const inner: Array<Box> = [];\n      if (root['boxes']) inner.push(...root.boxes);\n      if (root['entries']) inner.push(...(root['entries'] as Array<Box>));\n      if (root['item_infos']) inner.push(...(root['item_infos'] as Array<Box>));\n      if (root['references']) inner.push(...(root['references'] as Array<Box>));\n\n      for (const box of inner) {\n        if (result.length && returnEarly) return;\n        sweep(box);\n      }\n    };\n\n    sweep(this);\n    return result;\n  }\n\n  getTrackSamplesInfo(track_id: number) {\n    const track = this.getTrackById(track_id);\n    if (track) {\n      return track.samples;\n    }\n  }\n\n  getTrackSample(track_id: number, number: number) {\n    const track = this.getTrackById(track_id);\n    const sample = this.getSample(track, number);\n    return sample;\n  }\n\n  /* Called by the application to release the resources associated to samples already forwarded to the application */\n  releaseUsedSamples(id: number, sampleNum: number) {\n    let size = 0;\n    const trak = this.getTrackById(id);\n    if (!trak.lastValidSample) trak.lastValidSample = 0;\n    for (let i = trak.lastValidSample; i < sampleNum; i++) {\n      size += this.releaseSample(trak, i);\n    }\n    Log.info(\n      'ISOFile',\n      'Track #' +\n        id +\n        ' released samples up to ' +\n        sampleNum +\n        ' (released size: ' +\n        size +\n        ', remaining: ' +\n        this.samplesDataSize +\n        ')',\n    );\n    trak.lastValidSample = sampleNum;\n  }\n\n  start() {\n    this.sampleProcessingStarted = true;\n    this.processSamples(false);\n  }\n\n  stop() {\n    this.sampleProcessingStarted = false;\n  }\n\n  /* Called by the application to flush the remaining samples (e.g. once the download is finished or when no more samples will be added) */\n  flush() {\n    Log.info('ISOFile', 'Flushing remaining samples');\n    this.updateSampleLists();\n    this.processSamples(true);\n    this.stream.cleanBuffers();\n    this.stream.logBufferLevel(true);\n  }\n\n  /* Finds the byte offset for a given time on a given track\n     also returns the time of the previous rap */\n  seekTrack(time: number, useRap: boolean, trak: trakBox) {\n    let rap_seek_sample_num = 0;\n    let seek_sample_num = 0;\n    let timescale: number;\n\n    if (trak.samples.length === 0) {\n      Log.info(\n        'ISOFile',\n        'No sample in track, cannot seek! Using time ' +\n          Log.getDurationString(0, 1) +\n          ' and offset: ' +\n          0,\n      );\n      return { offset: 0, time: 0 };\n    }\n\n    for (let j = 0; j < trak.samples.length; j++) {\n      const sample = trak.samples[j];\n      if (j === 0) {\n        seek_sample_num = 0;\n        timescale = sample.timescale;\n      } else if (sample.cts > time * sample.timescale) {\n        seek_sample_num = j - 1;\n        break;\n      }\n      if (useRap && sample.is_sync) {\n        rap_seek_sample_num = j;\n      }\n    }\n    if (useRap) {\n      seek_sample_num = rap_seek_sample_num;\n    }\n    time = trak.samples[seek_sample_num].cts;\n    trak.nextSample = seek_sample_num;\n    while (trak.samples[seek_sample_num].alreadyRead === trak.samples[seek_sample_num].size) {\n      // No remaining samples to look for, all are downloaded.\n      if (!trak.samples[seek_sample_num + 1]) {\n        break;\n      }\n      seek_sample_num++;\n    }\n    const seek_offset =\n      trak.samples[seek_sample_num].offset + trak.samples[seek_sample_num].alreadyRead;\n    Log.info(\n      'ISOFile',\n      'Seeking to ' +\n        (useRap ? 'RAP' : '') +\n        ' sample #' +\n        trak.nextSample +\n        ' on track ' +\n        trak.tkhd.track_id +\n        ', time ' +\n        Log.getDurationString(time, timescale) +\n        ' and offset: ' +\n        seek_offset,\n    );\n    return { offset: seek_offset, time: time / timescale };\n  }\n\n  getTrackDuration(trak: trakBox) {\n    if (!trak.samples) {\n      return Infinity;\n    }\n\n    const sample = trak.samples[trak.samples.length - 1];\n    return (sample.cts + sample.duration) / sample.timescale;\n  }\n\n  /* Finds the byte offset in the file corresponding to the given time or to the time of the previous RAP */\n  seek(time: number, useRap: boolean) {\n    const moov = this.moov;\n    let seek_info = { offset: Infinity, time: Infinity };\n    if (!this.moov) {\n      throw new Error('Cannot seek: moov not received!');\n    } else {\n      for (let i = 0; i < moov.traks.length; i++) {\n        const trak = moov.traks[i];\n        if (time > this.getTrackDuration(trak)) {\n          // skip tracks that already ended\n          continue;\n        }\n        const trak_seek_info = this.seekTrack(time, useRap, trak);\n        if (trak_seek_info.offset < seek_info.offset) {\n          seek_info.offset = trak_seek_info.offset;\n        }\n        if (trak_seek_info.time < seek_info.time) {\n          seek_info.time = trak_seek_info.time;\n        }\n      }\n      Log.info(\n        'ISOFile',\n        'Seeking at time ' +\n          Log.getDurationString(seek_info.time, 1) +\n          ' needs a buffer with a fileStart position of ' +\n          seek_info.offset,\n      );\n      if (seek_info.offset === Infinity) {\n        /* No sample info, in all tracks, cannot seek */\n        seek_info = { offset: this.nextParsePosition, time: 0 };\n      } else {\n        /* check if the seek position is already in some buffer and\n         in that case return the end of that buffer (or of the last contiguous buffer) */\n        /* TODO: Should wait until append operations are done */\n        seek_info.offset = this.stream.getEndFilePositionAfter(seek_info.offset);\n      }\n      Log.info(\n        'ISOFile',\n        'Adjusted seek position (after checking data already in buffer): ' + seek_info.offset,\n      );\n      return seek_info;\n    }\n  }\n\n  equal(b: { boxes: Array<Box> }) {\n    let box_index = 0;\n    while (box_index < this.boxes.length && box_index < b.boxes.length) {\n      const a_box = this.boxes[box_index];\n      const b_box = b.boxes[box_index];\n      if (!boxEqual(a_box, b_box)) {\n        return false;\n      }\n      box_index++;\n    }\n    return true;\n  }\n\n  /**\n   * Rewrite the entire file\n   * @bundle isofile-write.js\n   */\n  write(outstream: DataStream) {\n    for (let i = 0; i < this.boxes.length; i++) {\n      this.boxes[i].write(outstream);\n    }\n  }\n\n  /** @bundle isofile-write.js */\n  createFragment(\n    track_id: number,\n    sampleStart: number,\n    sampleEnd: number,\n    existingStream: DataStream,\n  ) {\n    // Check existence of all samples\n    const samples: Array<Sample> = [];\n    for (let i = sampleStart; i <= sampleEnd; i++) {\n      const trak = this.getTrackById(track_id);\n      const sample = this.getSample(trak, i);\n      if (!sample) {\n        this.setNextSeekPositionFromSample(trak.samples[i]);\n        return;\n      }\n      samples.push(sample);\n    }\n\n    const stream = existingStream || new DataStream();\n\n    const moof = this.createMoof(samples);\n    moof.write(stream);\n\n    /* adjusting the data_offset now that the moof size is known*/\n    moof.trafs[0].truns[0].data_offset = moof.size + 8; //8 is mdat header\n    Log.debug(\n      'MP4Box',\n      'Adjusting data_offset with new value ' + moof.trafs[0].truns[0].data_offset,\n    );\n    stream.adjustUint32(\n      moof.trafs[0].truns[0].data_offset_position,\n      moof.trafs[0].truns[0].data_offset,\n    );\n\n    const mdat = new mdatBox();\n    mdat.stream = new MultiBufferStream();\n    let offset = 0;\n    for (const sample of samples) {\n      if (sample.data) {\n        const mp4Buffer = MP4BoxBuffer.fromArrayBuffer(sample.data.buffer, offset);\n        mdat.stream.insertBuffer(mp4Buffer);\n        offset += sample.data.byteLength;\n      }\n    }\n    mdat.write(stream);\n    return stream;\n  }\n\n  /**\n   * Modify the file and create the initialization segment\n   * @bundle isofile-write.js\n   */\n  static writeInitializationSegment(ftyp: ftypBox, moov: moovBox, total_duration: number) {\n    Log.debug('ISOFile', 'Generating initialization segment');\n\n    const stream = new DataStream();\n    ftyp.write(stream);\n\n    /* we can now create the new mvex box */\n    const mvex = moov.addBox(new mvexBox());\n    if (total_duration) {\n      const mehd = mvex.addBox(new mehdBox());\n      mehd.fragment_duration = total_duration;\n    }\n\n    // Add trex boxes for each track\n    for (let i = 0; i < moov.traks.length; i++) {\n      const trex = mvex.addBox(new trexBox());\n      trex.track_id = moov.traks[i].tkhd.track_id;\n      trex.default_sample_description_index = 1;\n      trex.default_sample_duration = moov.traks[i].samples[0]?.duration ?? 0;\n      trex.default_sample_size = 0;\n      trex.default_sample_flags = 1 << 16;\n    }\n    moov.write(stream);\n\n    return stream.buffer;\n  }\n\n  /** @bundle isofile-write.js */\n  save(name: string) {\n    const stream = new DataStream();\n    stream.isofile = this;\n    this.write(stream);\n    return stream.save(name);\n  }\n\n  /** @bundle isofile-write.js */\n  getBuffer() {\n    const stream = new DataStream();\n    stream.isofile = this;\n    this.write(stream);\n    return stream;\n  }\n\n  /** @bundle isofile-write.js */\n  initializeSegmentation() {\n    if (!this.onSegment) {\n      Log.warn('MP4Box', 'No segmentation callback set!');\n    }\n    if (!this.isFragmentationInitialized) {\n      this.isFragmentationInitialized = true;\n      this.resetTables();\n    }\n\n    // Create the moov that will hold all the tracks\n    const moov = new moovBox();\n    moov.addBox(this.moov.mvhd);\n\n    // Add the tracks we want to fragment\n    for (let i = 0; i < this.fragmentedTracks.length; i++) {\n      const trak = this.getTrackById(this.fragmentedTracks[i].id);\n      if (!trak) {\n        Log.warn(\n          'ISOFile',\n          `Track with id ${this.fragmentedTracks[i].id} not found, skipping fragmentation initialization`,\n        );\n        continue;\n      }\n      moov.addBox(trak);\n    }\n\n    return {\n      tracks: moov.traks.map((trak, i) => ({\n        id: trak.tkhd.track_id,\n        user: this.fragmentedTracks[i].user,\n      })),\n      buffer: ISOFile.writeInitializationSegment(\n        this.ftyp,\n        moov,\n        this.moov?.mvex?.mehd.fragment_duration,\n      ),\n    };\n  }\n\n  /**\n   * Index of the last moof box received\n   * @bundle isofile-sample-processing.js\n   */\n  lastMoofIndex = 0;\n\n  /**\n   * size of the buffers allocated for samples\n   * @bundle isofile-sample-processing.js\n   */\n  samplesDataSize = 0;\n\n  /**\n   * Resets all sample tables\n   * @bundle isofile-sample-processing.js\n   */\n  resetTables() {\n    this.initial_duration = this.moov.mvhd.duration;\n    this.moov.mvhd.duration = 0;\n    for (let i = 0; i < this.moov.traks.length; i++) {\n      const trak = this.moov.traks[i];\n      trak.tkhd.duration = 0;\n      trak.mdia.mdhd.duration = 0;\n      const stco = trak.mdia.minf.stbl.stco || trak.mdia.minf.stbl.co64;\n      stco.chunk_offsets = [];\n      const stsc = trak.mdia.minf.stbl.stsc;\n      stsc.first_chunk = [];\n      stsc.samples_per_chunk = [];\n      stsc.sample_description_index = [];\n      const stsz = trak.mdia.minf.stbl.stsz || trak.mdia.minf.stbl.stz2;\n      stsz.sample_sizes = [];\n      const stts = trak.mdia.minf.stbl.stts;\n      stts.sample_counts = [];\n      stts.sample_deltas = [];\n      const ctts = trak.mdia.minf.stbl.ctts;\n      if (ctts) {\n        ctts.sample_counts = [];\n        ctts.sample_offsets = [];\n      }\n      const stss = trak.mdia.minf.stbl.stss;\n      const k = trak.mdia.minf.stbl.boxes.indexOf(stss);\n      if (k !== -1) trak.mdia.minf.stbl.boxes[k] = undefined;\n    }\n  }\n\n  /** @bundle isofile-sample-processing.js */\n  static initSampleGroups(\n    trak: trakBox,\n    traf: trafBox | undefined,\n    sbgps: Array<sbgpBox>,\n    trak_sgpds: Array<sgpdBox>,\n    traf_sgpds?: Array<sgpdBox>,\n  ) {\n    if (traf) {\n      traf.sample_groups_info = [];\n    }\n    if (!trak.sample_groups_info) {\n      trak.sample_groups_info = [];\n    }\n    for (let k = 0; k < sbgps.length; k++) {\n      const sample_group_key = sbgps[k].grouping_type + '/' + sbgps[k].grouping_type_parameter;\n      const sample_group_info = new SampleGroupInfo(\n        sbgps[k].grouping_type,\n        sbgps[k].grouping_type_parameter,\n        sbgps[k],\n      );\n      if (traf) {\n        traf.sample_groups_info[sample_group_key] = sample_group_info;\n      }\n      if (!trak.sample_groups_info[sample_group_key]) {\n        trak.sample_groups_info[sample_group_key] = sample_group_info;\n      }\n      for (let l = 0; l < trak_sgpds.length; l++) {\n        if (trak_sgpds[l].grouping_type === sbgps[k].grouping_type) {\n          sample_group_info.description = trak_sgpds[l] as Description;\n          sample_group_info.description.used = true;\n        }\n      }\n      if (traf_sgpds) {\n        for (let l = 0; l < traf_sgpds.length; l++) {\n          if (traf_sgpds[l].grouping_type === sbgps[k].grouping_type) {\n            sample_group_info.fragment_description = traf_sgpds[l] as Description;\n            sample_group_info.fragment_description.used = true;\n            sample_group_info.is_fragment = true;\n          }\n        }\n      }\n    }\n    if (!traf) {\n      for (let k = 0; k < trak_sgpds.length; k++) {\n        if (!trak_sgpds[k].used && trak_sgpds[k].version >= 2) {\n          const sample_group_key = trak_sgpds[k].grouping_type + '/0';\n          const sample_group_info = new SampleGroupInfo(trak_sgpds[k].grouping_type, 0);\n          if (!trak.sample_groups_info[sample_group_key]) {\n            trak.sample_groups_info[sample_group_key] = sample_group_info;\n          }\n        }\n      }\n    } else {\n      if (traf_sgpds) {\n        for (let k = 0; k < traf_sgpds.length; k++) {\n          if (!traf_sgpds[k].used && traf_sgpds[k].version >= 2) {\n            const sample_group_key = traf_sgpds[k].grouping_type + '/0';\n            const sample_group_info = new SampleGroupInfo(traf_sgpds[k].grouping_type, 0);\n            sample_group_info.is_fragment = true;\n            if (!traf.sample_groups_info[sample_group_key]) {\n              traf.sample_groups_info[sample_group_key] = sample_group_info;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /** @bundle isofile-sample-processing.js */\n  static setSampleGroupProperties(\n    trak: trakBox,\n    sample: Sample,\n    sample_number: number,\n    sample_groups_info: Array<SampleGroupInfo>,\n  ) {\n    sample.sample_groups = [];\n    for (const k in sample_groups_info) {\n      sample.sample_groups[k] = {\n        grouping_type: sample_groups_info[k].grouping_type,\n        grouping_type_parameter: sample_groups_info[k].grouping_type_parameter,\n      };\n      if (sample_number >= sample_groups_info[k].last_sample_in_run) {\n        if (sample_groups_info[k].last_sample_in_run < 0) {\n          sample_groups_info[k].last_sample_in_run = 0;\n        }\n        sample_groups_info[k].entry_index++;\n        if (sample_groups_info[k].entry_index <= sample_groups_info[k].sbgp.entries.length - 1) {\n          sample_groups_info[k].last_sample_in_run +=\n            sample_groups_info[k].sbgp.entries[sample_groups_info[k].entry_index].sample_count;\n        }\n      }\n      if (sample_groups_info[k].entry_index <= sample_groups_info[k].sbgp.entries.length - 1) {\n        sample.sample_groups[k].group_description_index =\n          sample_groups_info[k].sbgp.entries[\n            sample_groups_info[k].entry_index\n          ].group_description_index;\n      } else {\n        sample.sample_groups[k].group_description_index = -1; // special value for not defined\n      }\n      if (sample.sample_groups[k].group_description_index !== 0) {\n        let description: Description;\n        if (sample_groups_info[k].fragment_description) {\n          description = sample_groups_info[k].fragment_description;\n        } else {\n          description = sample_groups_info[k].description;\n        }\n        if (sample.sample_groups[k].group_description_index > 0) {\n          let index: number;\n          if (sample.sample_groups[k].group_description_index > 65535) {\n            index = (sample.sample_groups[k].group_description_index >> 16) - 1;\n          } else {\n            index = sample.sample_groups[k].group_description_index - 1;\n          }\n          if (description && index >= 0) {\n            sample.sample_groups[k].description = description.entries[index];\n          }\n        } else {\n          if (description && description.version >= 2) {\n            if (description.default_group_description_index > 0) {\n              sample.sample_groups[k].description =\n                description.entries[description.default_group_description_index - 1];\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /** @bundle isofile-sample-processing.js */\n  static process_sdtp(sdtp: sdtpBox, sample: Sample, number: number) {\n    if (!sample) {\n      return;\n    }\n    if (sdtp) {\n      sample.is_leading = sdtp.is_leading[number];\n      sample.depends_on = sdtp.sample_depends_on[number];\n      sample.is_depended_on = sdtp.sample_is_depended_on[number];\n      sample.has_redundancy = sdtp.sample_has_redundancy[number];\n    } else {\n      sample.is_leading = 0;\n      sample.depends_on = 0;\n      sample.is_depended_on = 0;\n      sample.has_redundancy = 0;\n    }\n  }\n\n  /* Build initial sample list from  sample tables */\n  buildSampleLists() {\n    for (let i = 0; i < this.moov.traks.length; i++) {\n      this.buildTrakSampleLists(this.moov.traks[i]);\n    }\n  }\n\n  buildTrakSampleLists(trak: trakBox) {\n    let j: number;\n    let chunk_run_index: number;\n    let chunk_index: number;\n    let last_chunk_in_run: number;\n    let offset_in_chunk: number;\n    let last_sample_in_chunk: number;\n\n    trak.samples = [];\n    trak.samples_duration = 0;\n    trak.samples_size = 0;\n\n    const stco = trak.mdia.minf.stbl.stco || trak.mdia.minf.stbl.co64;\n    const stsc = trak.mdia.minf.stbl.stsc;\n    const stsz = trak.mdia.minf.stbl.stsz || trak.mdia.minf.stbl.stz2;\n    const stts = trak.mdia.minf.stbl.stts;\n    const ctts = trak.mdia.minf.stbl.ctts;\n    const stss = trak.mdia.minf.stbl.stss;\n    const stsd = trak.mdia.minf.stbl.stsd;\n    const subs = trak.mdia.minf.stbl.subs;\n    const stdp = trak.mdia.minf.stbl.stdp;\n    const sbgps = trak.mdia.minf.stbl.sbgps;\n    const sgpds = trak.mdia.minf.stbl.sgpds;\n\n    let last_sample_in_stts_run = -1;\n    let stts_run_index = -1;\n    let last_sample_in_ctts_run = -1;\n    let ctts_run_index = -1;\n    let last_stss_index = 0;\n    let subs_entry_index = 0;\n    let last_subs_sample_index = 0;\n\n    ISOFile.initSampleGroups(trak, undefined, sbgps, sgpds);\n\n    if (typeof stsz === 'undefined') {\n      return;\n    }\n\n    /* we build the samples one by one and compute their properties */\n    for (j = 0; j < stsz.sample_sizes.length; j++) {\n      const sample = {\n        number: j,\n        track_id: trak.tkhd.track_id,\n        timescale: trak.mdia.mdhd.timescale,\n        alreadyRead: 0,\n        size: stsz.sample_sizes[j],\n      } as Sample;\n\n      trak.samples[j] = sample;\n      /* size can be known directly */\n      trak.samples_size += sample.size;\n      /* computing chunk-based properties (offset, sample description index)*/\n      if (j === 0) {\n        chunk_index = 1; /* the first sample is in the first chunk (chunk indexes are 1-based) */\n        chunk_run_index = 0; /* the first chunk is the first entry in the first_chunk table */\n        sample.chunk_index = chunk_index;\n        sample.chunk_run_index = chunk_run_index;\n        last_sample_in_chunk = stsc.samples_per_chunk[chunk_run_index];\n        offset_in_chunk = 0;\n\n        /* Is there another entry in the first_chunk table ? */\n        if (chunk_run_index + 1 < stsc.first_chunk.length) {\n          /* The last chunk in the run is the chunk before the next first chunk */\n          last_chunk_in_run = stsc.first_chunk[chunk_run_index + 1] - 1;\n        } else {\n          /* There is only one entry in the table, it is valid for all future chunks*/\n          last_chunk_in_run = Infinity;\n        }\n      } else {\n        if (j < last_sample_in_chunk) {\n          /* the sample is still in the current chunk */\n          sample.chunk_index = chunk_index;\n          sample.chunk_run_index = chunk_run_index;\n        } else {\n          /* the sample is in the next chunk */\n          chunk_index++;\n          sample.chunk_index = chunk_index;\n          /* reset the accumulated offset in the chunk */\n          offset_in_chunk = 0;\n          if (chunk_index <= last_chunk_in_run) {\n            /* stay in the same entry of the first_chunk table */\n            /* chunk_run_index unmodified */\n          } else {\n            chunk_run_index++;\n            /* Is there another entry in the first_chunk table ? */\n            if (chunk_run_index + 1 < stsc.first_chunk.length) {\n              /* The last chunk in the run is the chunk before the next first chunk */\n              last_chunk_in_run = stsc.first_chunk[chunk_run_index + 1] - 1;\n            } else {\n              /* There is only one entry in the table, it is valid for all future chunks*/\n              last_chunk_in_run = Infinity;\n            }\n          }\n          sample.chunk_run_index = chunk_run_index;\n          last_sample_in_chunk += stsc.samples_per_chunk[chunk_run_index];\n        }\n      }\n\n      sample.description_index = stsc.sample_description_index[sample.chunk_run_index] - 1;\n      sample.description = stsd.entries[sample.description_index];\n      sample.offset =\n        stco.chunk_offsets[sample.chunk_index - 1] +\n        offset_in_chunk; /* chunk indexes are 1-based */\n      offset_in_chunk += sample.size;\n\n      /* setting dts, cts, duration and rap flags */\n      if (j > last_sample_in_stts_run) {\n        stts_run_index++;\n        if (last_sample_in_stts_run < 0) {\n          last_sample_in_stts_run = 0;\n        }\n        last_sample_in_stts_run += stts.sample_counts[stts_run_index];\n      }\n      if (j > 0) {\n        trak.samples[j - 1].duration = stts.sample_deltas[stts_run_index];\n        trak.samples_duration += trak.samples[j - 1].duration;\n        sample.dts = trak.samples[j - 1].dts + trak.samples[j - 1].duration;\n      } else {\n        sample.dts = 0;\n      }\n      if (ctts) {\n        if (j >= last_sample_in_ctts_run) {\n          ctts_run_index++;\n          if (last_sample_in_ctts_run < 0) {\n            last_sample_in_ctts_run = 0;\n          }\n          last_sample_in_ctts_run += ctts.sample_counts[ctts_run_index];\n        }\n        sample.cts = trak.samples[j].dts + ctts.sample_offsets[ctts_run_index];\n      } else {\n        sample.cts = sample.dts;\n      }\n      if (stss) {\n        if (j === stss.sample_numbers[last_stss_index] - 1) {\n          // sample numbers are 1-based\n          sample.is_sync = true;\n          last_stss_index++;\n        } else {\n          sample.is_sync = false;\n          sample.degradation_priority = 0;\n        }\n        if (subs) {\n          if (subs.entries[subs_entry_index].sample_delta + last_subs_sample_index === j + 1) {\n            sample.subsamples = subs.entries[subs_entry_index].subsamples;\n            last_subs_sample_index += subs.entries[subs_entry_index].sample_delta;\n            subs_entry_index++;\n          }\n        }\n      } else {\n        sample.is_sync = true;\n      }\n      ISOFile.process_sdtp(trak.mdia.minf.stbl.sdtp, sample, sample.number);\n      if (stdp) {\n        sample.degradation_priority = stdp.priority[j];\n      } else {\n        sample.degradation_priority = 0;\n      }\n      if (subs) {\n        if (subs.entries[subs_entry_index].sample_delta + last_subs_sample_index === j) {\n          sample.subsamples = subs.entries[subs_entry_index].subsamples;\n          last_subs_sample_index += subs.entries[subs_entry_index].sample_delta;\n        }\n      }\n      if (sbgps.length > 0 || sgpds.length > 0) {\n        ISOFile.setSampleGroupProperties(trak, sample, j, trak.sample_groups_info);\n      }\n    }\n    if (j > 0) {\n      trak.samples[j - 1].duration = Math.max(trak.mdia.mdhd.duration - trak.samples[j - 1].dts, 0);\n      trak.samples_duration += trak.samples[j - 1].duration;\n    }\n  }\n\n  /**\n   * Update sample list when new 'moof' boxes are received\n   * @bundle isofile-sample-processing.js\n   */\n  updateSampleLists() {\n    let default_sample_description_index: number;\n    let default_sample_duration: number;\n    let default_sample_size: number;\n    let default_sample_flags: number;\n    let last_run_position: number;\n\n    if (this.moov === undefined) {\n      return;\n    }\n\n    /* if the input file is fragmented and fetched in multiple downloads, we need to update the list of samples */\n    while (this.lastMoofIndex < this.moofs.length) {\n      const box = this.moofs[this.lastMoofIndex];\n      this.lastMoofIndex++;\n      if (box.type === 'moof') {\n        const moof = box;\n        for (let i = 0; i < moof.trafs.length; i++) {\n          const traf = moof.trafs[i];\n          const trak = this.getTrackById(traf.tfhd.track_id);\n          const trex = this.getTrexById(traf.tfhd.track_id);\n          if (traf.tfhd.flags & TFHD_FLAG_SAMPLE_DESC) {\n            default_sample_description_index = traf.tfhd.default_sample_description_index;\n          } else {\n            default_sample_description_index = trex ? trex.default_sample_description_index : 1;\n          }\n          if (traf.tfhd.flags & TFHD_FLAG_SAMPLE_DUR) {\n            default_sample_duration = traf.tfhd.default_sample_duration;\n          } else {\n            default_sample_duration = trex ? trex.default_sample_duration : 0;\n          }\n          if (traf.tfhd.flags & TFHD_FLAG_SAMPLE_SIZE) {\n            default_sample_size = traf.tfhd.default_sample_size;\n          } else {\n            default_sample_size = trex ? trex.default_sample_size : 0;\n          }\n          if (traf.tfhd.flags & TFHD_FLAG_SAMPLE_FLAGS) {\n            default_sample_flags = traf.tfhd.default_sample_flags;\n          } else {\n            default_sample_flags = trex ? trex.default_sample_flags : 0;\n          }\n          traf.sample_number = 0;\n          /* process sample groups */\n          if (traf.sbgps.length > 0) {\n            ISOFile.initSampleGroups(trak, traf, traf.sbgps, trak.mdia.minf.stbl.sgpds, traf.sgpds);\n          }\n          for (let j = 0; j < traf.truns.length; j++) {\n            const trun = traf.truns[j];\n            for (let k = 0; k < trun.sample_count; k++) {\n              const description_index = default_sample_description_index - 1;\n\n              let sample_flags = default_sample_flags;\n              if (trun.flags & TRUN_FLAGS_FLAGS) {\n                sample_flags = trun.sample_flags[k];\n              } else if (k === 0 && trun.flags & TRUN_FLAGS_FIRST_FLAG) {\n                sample_flags = trun.first_sample_flags;\n              }\n\n              let size = default_sample_size;\n              if (trun.flags & TRUN_FLAGS_SIZE) {\n                size = trun.sample_size[k];\n              }\n              trak.samples_size += size;\n\n              let duration = default_sample_duration;\n              if (trun.flags & TRUN_FLAGS_DURATION) {\n                duration = trun.sample_duration[k];\n              }\n              trak.samples_duration += duration;\n\n              let dts: number;\n              if (trak.first_traf_merged || k > 0) {\n                dts =\n                  trak.samples[trak.samples.length - 1].dts +\n                  trak.samples[trak.samples.length - 1].duration;\n              } else {\n                if (traf.tfdt) {\n                  dts = traf.tfdt.baseMediaDecodeTime;\n                } else {\n                  dts = 0;\n                }\n                trak.first_traf_merged = true;\n              }\n\n              let cts = dts;\n              if (trun.flags & TRUN_FLAGS_CTS_OFFSET) {\n                cts = dts + trun.sample_composition_time_offset[k];\n              }\n\n              //ISOFile.process_sdtp(traf.sdtp, sample, sample.number_in_traf);\n              const bdop = traf.tfhd.flags & TFHD_FLAG_BASE_DATA_OFFSET ? true : false;\n              const dbim = traf.tfhd.flags & TFHD_FLAG_DEFAULT_BASE_IS_MOOF ? true : false;\n              const dop = trun.flags & TRUN_FLAGS_DATA_OFFSET ? true : false;\n              let bdo = 0;\n              if (!bdop) {\n                if (!dbim) {\n                  if (j === 0) {\n                    // the first track in the movie fragment\n                    bdo = moof.start; // the position of the first byte of the enclosing Movie Fragment Box\n                  } else {\n                    bdo = last_run_position; // end of the data defined by the preceding *track* (irrespective of the track id) fragment in the moof\n                  }\n                } else {\n                  bdo = moof.start;\n                }\n              } else {\n                bdo = traf.tfhd.base_data_offset;\n              }\n\n              let offset: number;\n              if (j === 0 && k === 0) {\n                if (dop) {\n                  offset = bdo + trun.data_offset; // If the data-offset is present, it is relative to the base-data-offset established in the track fragment header\n                } else {\n                  offset = bdo; // the data for this run starts the base-data-offset defined by the track fragment header\n                }\n              } else {\n                offset = last_run_position; // this run starts immediately after the data of the previous run\n              }\n              last_run_position = offset + size;\n\n              const number_in_traf = traf.sample_number;\n              traf.sample_number++;\n\n              const sample: Sample = {\n                cts,\n                description_index,\n                description: trak.mdia.minf.stbl.stsd.entries[description_index],\n                dts,\n                duration,\n                moof_number: this.lastMoofIndex,\n                number_in_traf,\n                number: trak.samples.length,\n                offset,\n                size,\n                timescale: trak.mdia.mdhd.timescale,\n                track_id: trak.tkhd.track_id,\n                is_sync: (sample_flags >> 16) & 0x1 ? false : true,\n                is_leading: (sample_flags >> 26) & 0x3,\n                depends_on: (sample_flags >> 24) & 0x3,\n                is_depended_on: (sample_flags >> 22) & 0x3,\n                has_redundancy: (sample_flags >> 20) & 0x3,\n                degradation_priority: sample_flags & 0xffff,\n              };\n\n              traf.first_sample_index = trak.samples.length;\n              trak.samples.push(sample);\n\n              if (\n                traf.sbgps.length > 0 ||\n                traf.sgpds.length > 0 ||\n                trak.mdia.minf.stbl.sbgps.length > 0 ||\n                trak.mdia.minf.stbl.sgpds.length > 0\n              ) {\n                ISOFile.setSampleGroupProperties(\n                  trak,\n                  sample,\n                  sample.number_in_traf,\n                  traf.sample_groups_info,\n                );\n              }\n            }\n          }\n          if (traf.subs) {\n            trak.has_fragment_subsamples = true;\n            let sample_index = traf.first_sample_index;\n            for (let j = 0; j < traf.subs.entries.length; j++) {\n              sample_index += traf.subs.entries[j].sample_delta;\n              const sample = trak.samples[sample_index - 1];\n              sample.subsamples = traf.subs.entries[j].subsamples;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Try to get sample data for a given sample:\n   * returns null if not found\n   * returns the same sample if already requested\n   *\n   * @bundle isofile-sample-processing.js\n   */\n  getSample(trak: trakBox, sampleNum: number) {\n    const sample = trak.samples[sampleNum];\n\n    if (!this.moov) return;\n\n    if (!sample.data) {\n      /* Not yet fetched */\n      sample.data = new Uint8Array(sample.size);\n      sample.alreadyRead = 0;\n      this.samplesDataSize += sample.size;\n      Log.debug(\n        'ISOFile',\n        'Allocating sample #' +\n          sampleNum +\n          ' on track #' +\n          trak.tkhd.track_id +\n          ' of size ' +\n          sample.size +\n          ' (total: ' +\n          this.samplesDataSize +\n          ')',\n      );\n    } else if (sample.alreadyRead === sample.size) {\n      /* Already fetched entirely */\n      return sample;\n    }\n\n    /* The sample has only been partially fetched, we need to check in all buffers */\n    while (true) {\n      let stream = this.stream;\n      let index = stream.findPosition(true, sample.offset + sample.alreadyRead, false);\n      let buffer: MP4BoxBuffer;\n      let fileStart: number;\n      if (index > -1) {\n        // We haven't yet transferred the sample data to mdat\n        buffer = stream.buffers[index];\n        fileStart = buffer.fileStart;\n      } else {\n        // We might have already transferred the sample data to mdat\n        for (const mdat of this.mdats) {\n          if (!mdat.stream) {\n            Log.debug(\n              'ISOFile',\n              'mdat stream not yet fully read for #' + this.mdats.indexOf(mdat) + ' mdat',\n            );\n            continue; // mdat stream not yet fully read\n          }\n          index = mdat.stream.findPosition(\n            true,\n            sample.offset + sample.alreadyRead - mdat.start - mdat.hdr_size,\n            false,\n          );\n          if (index > -1) {\n            stream = mdat.stream;\n            buffer = mdat.stream.buffers[index];\n            fileStart = mdat.start + mdat.hdr_size + buffer.fileStart;\n            break;\n          }\n        }\n      }\n\n      if (buffer) {\n        const lengthAfterStart =\n          buffer.byteLength - (sample.offset + sample.alreadyRead - fileStart);\n        if (sample.size - sample.alreadyRead <= lengthAfterStart) {\n          /* the (rest of the) sample is entirely contained in this buffer */\n\n          Log.debug(\n            'ISOFile',\n            'Getting sample #' +\n              sampleNum +\n              ' data (alreadyRead: ' +\n              sample.alreadyRead +\n              ' offset: ' +\n              (sample.offset + sample.alreadyRead - fileStart) +\n              ' read size: ' +\n              (sample.size - sample.alreadyRead) +\n              ' full size: ' +\n              sample.size +\n              ')',\n          );\n\n          DataStream.memcpy(\n            sample.data.buffer,\n            sample.alreadyRead,\n            buffer,\n            sample.offset + sample.alreadyRead - fileStart,\n            sample.size - sample.alreadyRead,\n          );\n\n          /* update the number of bytes used in this buffer and check if it needs to be removed */\n          buffer.usedBytes += sample.size - sample.alreadyRead;\n          stream.logBufferLevel();\n\n          sample.alreadyRead = sample.size;\n\n          return sample;\n        } else {\n          /* the sample does not end in this buffer */\n\n          if (lengthAfterStart === 0) return;\n\n          Log.debug(\n            'ISOFile',\n            'Getting sample #' +\n              sampleNum +\n              ' partial data (alreadyRead: ' +\n              sample.alreadyRead +\n              ' offset: ' +\n              (sample.offset + sample.alreadyRead - fileStart) +\n              ' read size: ' +\n              lengthAfterStart +\n              ' full size: ' +\n              sample.size +\n              ')',\n          );\n\n          // NOTE:  this was an error before\n          //        it used to be DataStream.memcpy({...})\n          DataStream.memcpy(\n            sample.data.buffer,\n            sample.alreadyRead,\n            buffer,\n            sample.offset + sample.alreadyRead - fileStart,\n            lengthAfterStart,\n          );\n          sample.alreadyRead += lengthAfterStart;\n\n          /* update the number of bytes used in this buffer and check if it needs to be removed */\n          buffer.usedBytes += lengthAfterStart;\n          stream.logBufferLevel();\n\n          /* keep looking in the next buffer */\n        }\n      } else return;\n    }\n  }\n\n  /**\n   * Release the memory used to store the data of the sample\n   *\n   * @bundle isofile-sample-processing.js\n   */\n  releaseSample(trak: trakBox, sampleNum: number) {\n    const sample = trak.samples[sampleNum];\n    if (sample.data) {\n      this.samplesDataSize -= sample.size;\n      sample.data = undefined;\n      sample.alreadyRead = 0;\n      return sample.size;\n    } else {\n      return 0;\n    }\n  }\n\n  /** @bundle isofile-sample-processing.js */\n  getAllocatedSampleDataSize() {\n    return this.samplesDataSize;\n  }\n\n  /**\n   * Builds the MIME Type 'codecs' sub-parameters for the whole file\n   *\n   * @bundle isofile-sample-processing.js\n   */\n  getCodecs() {\n    let codecs = '';\n    for (let i = 0; i < this.moov.traks.length; i++) {\n      const trak = this.moov.traks[i];\n      if (i > 0) {\n        codecs += ',';\n      }\n      codecs += trak.mdia.minf.stbl.stsd.entries[0].getCodec();\n    }\n    return codecs;\n  }\n\n  /**\n   * Helper function\n   *\n   * @bundle isofile-sample-processing.js\n   */\n  getTrexById(id: number) {\n    if (!this.moov || !this.moov.mvex) return;\n    for (let i = 0; i < this.moov.mvex.trexs.length; i++) {\n      const trex = this.moov.mvex.trexs[i];\n      if (trex.track_id === id) return trex;\n    }\n  }\n\n  /**\n   * Helper function\n   *\n   * @bundle isofile-sample-processing.js\n   */\n  getTrackById(id: number): trakBox {\n    if (!this.moov) return;\n    for (let j = 0; j < this.moov.traks.length; j++) {\n      const trak = this.moov.traks[j];\n      if (trak.tkhd.track_id === id) return trak;\n    }\n  }\n\n  /** @bundle isofile-item-processing.js */\n  flattenItemInfo() {\n    const items = this.items;\n    const entity_groups = this.entity_groups;\n    const meta = this.meta;\n    if (!meta || !meta.hdlr || !meta.iinf) return;\n    for (let i = 0; i < meta.iinf.item_infos.length; i++) {\n      const id = meta.iinf.item_infos[i].item_ID;\n      items[id] = {\n        id,\n        name: meta.iinf.item_infos[i].item_name,\n        ref_to: [],\n        content_type: meta.iinf.item_infos[i].content_type,\n        content_encoding: meta.iinf.item_infos[i].content_encoding,\n        item_uri_type: meta.iinf.item_infos[i].item_uri_type,\n        type: meta.iinf.item_infos[i].item_type ? meta.iinf.item_infos[i].item_type : 'mime',\n        protection:\n          // NOTE:   This was `meta.iinf.item_infos[i].protection_index` before\n          meta.iinf.item_infos[i].item_protection_index > 0\n            ? // NOTE:   This was `meta.iinf.item_infos[i].protection_index - 1` before\n              meta.ipro.protections[meta.iinf.item_infos[i].item_protection_index - 1]\n            : undefined,\n      };\n    }\n    if (meta.grpl) {\n      for (let i = 0; i < meta.grpl.boxes.length; i++) {\n        const entityGroup = meta.grpl.boxes[i];\n        entity_groups[entityGroup.group_id] = {\n          id: entityGroup.group_id,\n          entity_ids: entityGroup.entity_ids,\n          type: entityGroup.type,\n        };\n      }\n    }\n    if (meta.iloc) {\n      for (let i = 0; i < meta.iloc.items.length; i++) {\n        const itemloc = meta.iloc.items[i];\n        const item = items[itemloc.item_ID];\n        if (itemloc.data_reference_index !== 0) {\n          Log.warn('Item storage with reference to other files: not supported');\n          item.source = meta.dinf.boxes[itemloc.data_reference_index - 1];\n        }\n        item.extents = [];\n        item.size = 0;\n        for (let j = 0; j < itemloc.extents.length; j++) {\n          item.extents[j] = {\n            offset: itemloc.extents[j].extent_offset + itemloc.base_offset,\n            length: itemloc.extents[j].extent_length,\n            alreadyRead: 0,\n          };\n          if (itemloc.construction_method === 1) {\n            item.extents[j].offset += meta.idat.start + meta.idat.hdr_size;\n          }\n          item.size += item.extents[j].length;\n        }\n      }\n    }\n    if (meta.pitm) {\n      items[meta.pitm.item_id].primary = true;\n    }\n    if (meta.iref) {\n      for (let i = 0; i < meta.iref.references.length; i++) {\n        const ref = meta.iref.references[i];\n        for (let j = 0; j < ref.references.length; j++) {\n          items[ref.from_item_ID].ref_to.push({ type: ref.type, id: ref.references[j] });\n        }\n      }\n    }\n    if (meta.iprp) {\n      for (let k = 0; k < meta.iprp.ipmas.length; k++) {\n        const ipma = meta.iprp.ipmas[k];\n        for (let i = 0; i < ipma.associations.length; i++) {\n          const association = ipma.associations[i];\n          const item = items[association.id] ?? entity_groups[association.id];\n          if (item) {\n            if (item.properties === undefined) {\n              item.properties = {\n                boxes: [],\n              };\n            }\n            for (let j = 0; j < association.props.length; j++) {\n              const propEntry = association.props[j];\n              if (\n                propEntry.property_index > 0 &&\n                propEntry.property_index - 1 < meta.iprp.ipco.boxes.length\n              ) {\n                const propbox = meta.iprp.ipco.boxes[propEntry.property_index - 1];\n                item.properties[propbox.type] = propbox;\n                item.properties.boxes.push(propbox);\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  /** @bundle isofile-item-processing.js */\n  getItem(item_id: number) {\n    if (!this.meta) return;\n\n    const item = this.items[item_id];\n    if (!item.data && item.size) {\n      /* Not yet fetched */\n      item.data = new Uint8Array(item.size);\n      item.alreadyRead = 0;\n      this.itemsDataSize += item.size;\n      Log.debug(\n        'ISOFile',\n        'Allocating item #' +\n          item_id +\n          ' of size ' +\n          item.size +\n          ' (total: ' +\n          this.itemsDataSize +\n          ')',\n      );\n    } else if (item.alreadyRead === item.size) {\n      /* Already fetched entirely */\n      return item;\n    }\n\n    /* The item has only been partially fetched, we need to check in all buffers to find the remaining extents*/\n\n    for (let i = 0; i < item.extents.length; i++) {\n      const extent = item.extents[i];\n      if (extent.alreadyRead === extent.length) {\n        continue;\n      } else {\n        const index = this.stream.findPosition(true, extent.offset + extent.alreadyRead, false);\n        if (index > -1) {\n          const buffer = this.stream.buffers[index];\n          const lengthAfterStart =\n            buffer.byteLength - (extent.offset + extent.alreadyRead - buffer.fileStart);\n          if (extent.length - extent.alreadyRead <= lengthAfterStart) {\n            /* the (rest of the) extent is entirely contained in this buffer */\n\n            Log.debug(\n              'ISOFile',\n              'Getting item #' +\n                item_id +\n                ' extent #' +\n                i +\n                ' data (alreadyRead: ' +\n                extent.alreadyRead +\n                ' offset: ' +\n                (extent.offset + extent.alreadyRead - buffer.fileStart) +\n                ' read size: ' +\n                (extent.length - extent.alreadyRead) +\n                ' full extent size: ' +\n                extent.length +\n                ' full item size: ' +\n                item.size +\n                ')',\n            );\n\n            // Note: this used to be a memcpy({ ... })\n            DataStream.memcpy(\n              item.data.buffer,\n              item.alreadyRead,\n              buffer,\n              extent.offset + extent.alreadyRead - buffer.fileStart,\n              extent.length - extent.alreadyRead,\n            );\n\n            /* update the number of bytes used in this buffer and check if it needs to be removed */\n            if (!this.parsingMdat || this.discardMdatData)\n              buffer.usedBytes += extent.length - extent.alreadyRead;\n            this.stream.logBufferLevel();\n\n            item.alreadyRead += extent.length - extent.alreadyRead;\n            extent.alreadyRead = extent.length;\n          } else {\n            /* the sample does not end in this buffer */\n\n            Log.debug(\n              'ISOFile',\n              'Getting item #' +\n                item_id +\n                ' extent #' +\n                i +\n                ' partial data (alreadyRead: ' +\n                extent.alreadyRead +\n                ' offset: ' +\n                (extent.offset + extent.alreadyRead - buffer.fileStart) +\n                ' read size: ' +\n                lengthAfterStart +\n                ' full extent size: ' +\n                extent.length +\n                ' full item size: ' +\n                item.size +\n                ')',\n            );\n\n            // Note: this used to be a memcpy({ ... })\n            DataStream.memcpy(\n              item.data.buffer,\n              item.alreadyRead,\n              buffer,\n              extent.offset + extent.alreadyRead - buffer.fileStart,\n              lengthAfterStart,\n            );\n            extent.alreadyRead += lengthAfterStart;\n            item.alreadyRead += lengthAfterStart;\n\n            /* update the number of bytes used in this buffer and check if it needs to be removed */\n            if (!this.parsingMdat || this.discardMdatData) buffer.usedBytes += lengthAfterStart;\n            this.stream.logBufferLevel();\n            return;\n          }\n        } else return;\n      }\n    }\n    if (item.alreadyRead === item.size) {\n      /* fetched entirely */\n      return item;\n    }\n  }\n\n  /**\n   * Release the memory used to store the data of the item\n   *\n   * @bundle isofile-item-processing.js\n   */\n  releaseItem(item_id: number) {\n    const item = this.items[item_id];\n    if (item.data) {\n      this.itemsDataSize -= item.size;\n      item.data = undefined;\n      item.alreadyRead = 0;\n      for (let i = 0; i < item.extents.length; i++) {\n        const extent = item.extents[i];\n        extent.alreadyRead = 0;\n      }\n      return item.size;\n    } else {\n      return 0;\n    }\n  }\n\n  /** @bundle isofile-item-processing.js */\n  processItems(callback: (item: Item) => void) {\n    for (const i in this.items) {\n      const item = this.items[i];\n      this.getItem(item.id);\n      if (callback && !item.sent) {\n        callback(item);\n        item.sent = true;\n        item.data = undefined;\n      }\n    }\n  }\n\n  /** @bundle isofile-item-processing.js */\n  hasItem(name: string) {\n    for (const i in this.items) {\n      const item = this.items[i];\n      if (item.name === name) {\n        return item.id;\n      }\n    }\n    return -1;\n  }\n\n  /** @bundle isofile-item-processing.js */\n  getMetaHandler() {\n    if (this.meta) return this.meta.hdlr.handler;\n  }\n\n  /** @bundle isofile-item-processing.js */\n  getPrimaryItem() {\n    if (this.meta && this.meta.pitm) return this.getItem(this.meta.pitm.item_id);\n  }\n\n  /** @bundle isofile-item-processing.js */\n  itemToFragmentedTrackFile({ itemId }: { itemId?: number } = {}) {\n    let item;\n    if (itemId) {\n      item = this.getItem(itemId);\n    } else {\n      item = this.getPrimaryItem();\n    }\n    if (!item) return;\n\n    const file = new ISOFile();\n    file.discardMdatData = false;\n    // assuming the track type is the same as the item type\n    const trackOptions: IsoFileOptions = {\n      type: item.type,\n      description_boxes: item.properties.boxes,\n    };\n    if (item.properties.ispe) {\n      trackOptions.width = item.properties.ispe.image_width;\n      trackOptions.height = item.properties.ispe.image_height;\n    }\n    const trackId = file.addTrack(trackOptions);\n    if (trackId) {\n      file.addSample(trackId, item.data);\n      return file;\n    }\n  }\n\n  /**\n   * position in the current buffer of the beginning of the last box parsed\n   *\n   * @bundle isofile-advanced-parsing.js\n   */\n  lastBoxStartPosition = 0;\n  /**\n   * indicator if the parsing is stuck in the middle of an mdat box\n   *\n   * @bundle isofile-advanced-parsing.js\n   */\n  parsingMdat?: mdatBox;\n  /* next file position that the parser needs:\n   *  - 0 until the first buffer (i.e. fileStart ===0) has been received\n   *  - otherwise, the next box start until the moov box has been parsed\n   *  - otherwise, the position of the next sample to fetch\n   * @bundle isofile-advanced-parsing.js\n   */\n  nextParsePosition = 0;\n  /**\n   * keep mdat data\n   *\n   * @bundle isofile-advanced-parsing.js\n   */\n  discardMdatData = true;\n\n  /** @bundle isofile-advanced-parsing.js */\n  processIncompleteBox(ret: IncompleteBox) {\n    /* we did not have enough bytes in the current buffer to parse the entire box */\n    if (ret.type === 'mdat') {\n      /* we had enough bytes to get its type and size and it's an 'mdat' */\n\n      /* special handling for mdat boxes, since we don't actually need to parse it linearly\n\t\t   we create the box */\n      const box = new mdatBox(ret.size);\n      this.parsingMdat = box;\n      this.boxes.push(box);\n      this.mdats.push(box);\n      box.start = ret.start;\n      box.hdr_size = ret.hdr_size;\n      box.original_size = ret.original_size;\n      this.stream.addUsedBytes(box.hdr_size);\n\n      /* indicate that the parsing should start from the end of the box */\n      this.lastBoxStartPosition = box.start + box.size;\n      /* let's see if we have the end of the box in the other buffers */\n      const found = this.stream.seek(box.start + box.size, false, this.discardMdatData);\n      if (found) {\n        /* we can now transfer the data to the mdat box stream */\n        this.transferMdatData();\n        /* found the end of the box */\n        this.parsingMdat = undefined;\n        /* let's see if we can parse more in this buffer */\n        return true;\n      } else {\n        /* 'mdat' end not found in the existing buffers */\n        /* determine the next position in the file to start parsing from */\n        if (!this.moovStartFound) {\n          /* moov not find yet,\n\t\t\t\t   the file probably has 'mdat' at the beginning, and 'moov' at the end,\n\t\t\t\t   indicate that the downloader should not try to download those bytes now */\n          this.nextParsePosition = box.start + box.size;\n        } else {\n          /* we have the start of the moov box,\n\t\t\t\t   the next bytes should try to complete the current 'mdat' */\n          this.nextParsePosition = this.stream.findEndContiguousBuf();\n        }\n        /* not much we can do, wait for more buffers to arrive */\n        return false;\n      }\n    } else {\n      /* box is incomplete, we may not even know its type */\n      if (ret.type === 'moov') {\n        /* the incomplete box is a 'moov' box */\n        this.moovStartFound = true;\n        if (this.mdats.length === 0) {\n          this.isProgressive = true;\n        }\n      }\n      /* either it's not an mdat box (and we need to parse it, we cannot skip it)\n\t\t   (TODO: we could skip 'free' boxes ...)\n\t\t\t   or we did not have enough data to parse the type and size of the box,\n\t\t   we try to concatenate the current buffer with the next buffer to restart parsing */\n      const merged = this.stream.mergeNextBuffer ? this.stream.mergeNextBuffer() : false;\n      if (merged) {\n        /* The next buffer was contiguous, the merging succeeded,\n\t\t\t   we can now continue parsing,\n\t\t\t   the next best position to parse is at the end of this new buffer */\n        this.nextParsePosition = this.stream.getEndPosition();\n        return true;\n      } else {\n        /* we cannot concatenate existing buffers because they are not contiguous or because there is no additional buffer */\n        /* The next best position to parse is still at the end of this old buffer */\n        if (!ret.type) {\n          /* There were not enough bytes in the buffer to parse the box type and length,\n\t\t\t\t   the next fetch should retrieve those missing bytes, i.e. the next bytes after this buffer */\n          this.nextParsePosition = this.stream.getEndPosition();\n        } else {\n          /* we had enough bytes to parse size and type of the incomplete box\n\t\t\t\t   if we haven't found yet the moov box, skip this one and try the next one\n\t\t\t\t   if we have found the moov box, let's continue linear parsing */\n          if (this.moovStartFound) {\n            this.nextParsePosition = this.stream.getEndPosition();\n          } else {\n            this.nextParsePosition = this.stream.getPosition() + ret.size;\n          }\n        }\n        return false;\n      }\n    }\n  }\n\n  /** @bundle isofile-advanced-parsing.js */\n  hasIncompleteMdat() {\n    return this.parsingMdat !== undefined;\n  }\n\n  /**\n   * Transfer the data of the mdat box to its stream\n   * @param mdat the mdat box to use\n   */\n  transferMdatData(inMdat?: mdatBox) {\n    const mdat = inMdat ?? this.parsingMdat;\n    if (this.discardMdatData) {\n      Log.debug('ISOFile', \"Discarding 'mdat' data, not transferring it to the mdat box stream\");\n      return;\n    }\n    if (!mdat) {\n      Log.warn('ISOFile', \"Cannot transfer 'mdat' data, no mdat box is being parsed\");\n      return;\n    }\n\n    // Start by finding the starting buffer\n    const startBufferIndex = this.stream.findPosition(true, mdat.start + mdat.hdr_size, false);\n    const endBufferIndex = this.stream.findPosition(true, mdat.start + mdat.size, false);\n\n    if (startBufferIndex === -1 || endBufferIndex === -1) {\n      Log.warn('ISOFile', \"Cannot transfer 'mdat' data, start or end buffer not found\");\n      return;\n    }\n\n    // Transfer the data\n    mdat.stream = new MultiBufferStream();\n    for (let i = startBufferIndex; i <= endBufferIndex; i++) {\n      const buffer = this.stream.buffers[i];\n      const startOffset =\n        i === startBufferIndex ? mdat.start + mdat.hdr_size - buffer.fileStart : 0;\n      const endOffset =\n        i === endBufferIndex ? mdat.start + mdat.size - buffer.fileStart : buffer.byteLength;\n      if (endOffset > startOffset) {\n        Log.debug(\n          'ISOFile',\n          \"Transferring 'mdat' data from buffer #\" +\n            i +\n            ' (' +\n            startOffset +\n            ' to ' +\n            endOffset +\n            ')',\n        );\n\n        const transferSize = endOffset - startOffset;\n        const newBuffer = new MP4BoxBuffer(transferSize);\n        const lastPosition = mdat.stream.getAbsoluteEndPosition();\n        DataStream.memcpy(newBuffer, 0, buffer, startOffset, transferSize);\n        newBuffer.fileStart = lastPosition;\n\n        // Insert the new buffer into the mdat stream\n        mdat.stream.insertBuffer(newBuffer);\n\n        // Consume the bytes in the original stream\n        buffer.usedBytes += transferSize;\n      }\n    }\n  }\n\n  /** @bundle isofile-advanced-parsing.js */\n  processIncompleteMdat() {\n    /* we are in the parsing of an incomplete mdat box */\n    const box = this.parsingMdat;\n    const found = this.stream.seek(box.start + box.size, false, this.discardMdatData);\n    if (found) {\n      Log.debug('ISOFile', \"Found 'mdat' end in buffered data\");\n      /* we can now transfer the data to the mdat box stream */\n      this.transferMdatData();\n      /* the end of the mdat has been found */\n      this.parsingMdat = undefined;\n      /* we can parse more in this buffer */\n      return true;\n    } else {\n      /* we don't have the end of this mdat yet,\n\t\t   indicate that the next byte to fetch is the end of the buffers we have so far,\n\t\t   return and wait for more buffer to come */\n      this.nextParsePosition = this.stream.findEndContiguousBuf();\n      return false;\n    }\n  }\n\n  /** @bundle isofile-advanced-parsing.js */\n  restoreParsePosition() {\n    /* Reposition at the start position of the previous box not entirely parsed */\n    return this.stream.seek(this.lastBoxStartPosition, true, this.discardMdatData);\n  }\n\n  /** @bundle isofile-advanced-parsing.js */\n  saveParsePosition() {\n    /* remember the position of the box start in case we need to roll back (if the box is incomplete) */\n    this.lastBoxStartPosition = this.stream.getPosition();\n  }\n\n  /** @bundle isofile-advanced-parsing.js */\n  updateUsedBytes(box: Box, _ret: ReturnType<typeof parseOneBox>) {\n    if (this.stream.addUsedBytes) {\n      if (box.type === 'mdat') {\n        /* for an mdat box, only its header is considered used, other bytes will be used when sample data is requested */\n        this.stream.addUsedBytes(box.hdr_size);\n        if (this.discardMdatData) {\n          this.stream.addUsedBytes(box.size - box.hdr_size);\n        }\n      } else {\n        /* for all other boxes, the entire box data is considered used */\n        this.stream.addUsedBytes(box.size);\n      }\n    }\n  }\n\n  /** @bundle isofile-advanced-creation.js */\n  addBox<T extends Box>(box: T): T {\n    return Box.prototype.addBox.call(this, box);\n  }\n\n  /** @bundle isofile-advanced-creation.js */\n  init(options: IsoFileOptions = {}) {\n    const ftyp = this.addBox(new ftypBox());\n    ftyp.major_brand = (options.brands && options.brands[0]) || 'iso4';\n    ftyp.minor_version = 0;\n    ftyp.compatible_brands = options.brands || ['iso4'];\n\n    const moov = this.addBox(new moovBox());\n    moov.addBox(new mvexBox());\n\n    const mvhd = moov.addBox(new mvhdBox());\n    mvhd.timescale = options.timescale || 600;\n    mvhd.rate = options.rate || 1 << 16;\n    mvhd.creation_time = 0;\n    mvhd.modification_time = 0;\n    mvhd.duration = options.duration || 0;\n    mvhd.volume = options.width ? 0 : 0x0100;\n    mvhd.matrix = [1 << 16, 0, 0, 0, 1 << 16, 0, 0, 0, 0x40000000];\n    mvhd.next_track_id = 1;\n\n    return this;\n  }\n\n  /** @bundle isofile-advanced-creation.js */\n  addTrack(_options: IsoFileOptions = {}) {\n    if (!this.moov) {\n      this.init(_options);\n    }\n\n    const options: IsoFileOptions = _options || {};\n\n    options.width = options.width || 320;\n    options.height = options.height || 320;\n    options.id = options.id || this.moov.mvhd.next_track_id;\n    options.type = options.type || 'avc1';\n\n    const trak = this.moov.addBox(new trakBox());\n    this.moov.mvhd.next_track_id = options.id + 1;\n\n    const tkhd = trak.addBox(new tkhdBox());\n    tkhd.flags = TKHD_FLAG_ENABLED | TKHD_FLAG_IN_MOVIE | TKHD_FLAG_IN_PREVIEW;\n    tkhd.creation_time = 0;\n    tkhd.modification_time = 0;\n    tkhd.track_id = options.id;\n    tkhd.duration = options.duration || 0;\n    tkhd.layer = options.layer || 0;\n    tkhd.alternate_group = 0;\n    tkhd.volume = 1;\n    tkhd.matrix = [1 << 16, 0, 0, 0, 1 << 16, 0, 0, 0, 0x40000000];\n    tkhd.width = options.width << 16;\n    tkhd.height = options.height << 16;\n\n    const mdia = trak.addBox(new mdiaBox());\n    const mdhd = mdia.addBox(new mdhdBox());\n    mdhd.creation_time = 0;\n    mdhd.modification_time = 0;\n    mdhd.timescale = options.timescale || 1;\n    mdhd.duration = options.media_duration || 0;\n    // @ts-expect-error FIXME:   some code expects language to be a number\n    mdhd.language = options.language || 'und';\n\n    const hdlr = mdia.addBox(new hdlrBox());\n    hdlr.handler = options.hdlr || 'vide';\n    hdlr.name = options.name || 'Track created with MP4Box.js';\n\n    const elng = mdia.addBox(new elngBox());\n    elng.extended_language = options.language || 'fr-FR';\n\n    const minf = mdia.addBox(new minfBox());\n\n    const sampleEntry = BoxRegistry.sampleEntry[options.type];\n    if (!sampleEntry) return;\n\n    const sample_description_entry = new sampleEntry();\n    sample_description_entry.data_reference_index = 1;\n\n    if (sample_description_entry instanceof VisualSampleEntry) {\n      const sde = sample_description_entry as VisualSampleEntry;\n      const vmhd = minf.addBox(new vmhdBox());\n      vmhd.graphicsmode = 0;\n      vmhd.opcolor = [0, 0, 0];\n\n      sde.width = options.width;\n      sde.height = options.height;\n      sde.horizresolution = 0x48 << 16;\n      sde.vertresolution = 0x48 << 16;\n      sde.frame_count = 1;\n      sde.compressorname = options.type + ' Compressor';\n      sde.depth = 0x18;\n\n      if (options.avcDecoderConfigRecord) {\n        const avcC = sde.addBox(new avcCBox(options.avcDecoderConfigRecord.byteLength));\n        avcC.parse(new DataStream(options.avcDecoderConfigRecord));\n      } else if (options.hevcDecoderConfigRecord) {\n        const hvcC = sde.addBox(new hvcCBox(options.hevcDecoderConfigRecord.byteLength));\n        hvcC.parse(new DataStream(options.hevcDecoderConfigRecord));\n      }\n    } else if (sample_description_entry instanceof AudioSampleEntry) {\n      const sde = sample_description_entry as AudioSampleEntry;\n      const smhd = minf.addBox(new smhdBox());\n      smhd.balance = options.balance || 0;\n\n      sde.channel_count = options.channel_count || 2;\n      sde.samplesize = options.samplesize || 16;\n      sde.samplerate = options.samplerate || 1 << 16;\n    } else if (sample_description_entry instanceof HintSampleEntry) {\n      minf.addBox(new hmhdBox()); // TODO: add properties\n    } else if (sample_description_entry instanceof SubtitleSampleEntry) {\n      minf.addBox(new sthdBox());\n      if (sample_description_entry instanceof stppSampleEntry) {\n        sample_description_entry.namespace = options.namespace || 'nonamespace';\n        sample_description_entry.schema_location = options.schema_location || '';\n        sample_description_entry.auxiliary_mime_types = options.auxiliary_mime_types || '';\n      }\n    } else if (sample_description_entry instanceof MetadataSampleEntry) {\n      minf.addBox(new nmhdBox());\n    } else if (sample_description_entry instanceof SystemSampleEntry) {\n      minf.addBox(new nmhdBox());\n    } else {\n      minf.addBox(new nmhdBox());\n    }\n\n    if (options.description) {\n      (sample_description_entry.addBox as (box: Box) => Box).call(\n        sample_description_entry,\n        options.description,\n      );\n    }\n    if (options.description_boxes) {\n      options.description_boxes.forEach(function (b) {\n        (sample_description_entry.addBox as (box: Box) => Box).call(sample_description_entry, b);\n      });\n    }\n    const dinf = minf.addBox(new dinfBox());\n    const dref = dinf.addBox(new drefBox());\n    const url = new urlBox();\n    url.flags = 0x1;\n    dref.addEntry(url);\n\n    const stbl = minf.addBox(new stblBox());\n    const stsd = stbl.addBox(new stsdBox());\n    stsd.addEntry(sample_description_entry);\n\n    const stts = stbl.addBox(new sttsBox());\n    stts.sample_counts = [];\n    stts.sample_deltas = [];\n\n    const stsc = stbl.addBox(new stscBox());\n    stsc.first_chunk = [];\n    stsc.samples_per_chunk = [];\n    stsc.sample_description_index = [];\n\n    const stco = stbl.addBox(new stcoBox());\n    stco.chunk_offsets = [];\n    const stsz = stbl.addBox(new stszBox());\n    stsz.sample_sizes = [];\n\n    const trex = this.moov.mvex.addBox(new trexBox());\n    trex.track_id = options.id;\n    trex.default_sample_description_index = options.default_sample_description_index || 1;\n    trex.default_sample_duration = options.default_sample_duration || 0;\n    trex.default_sample_size = options.default_sample_size || 0;\n    trex.default_sample_flags = options.default_sample_flags || 0;\n\n    this.buildTrakSampleLists(trak);\n    return options.id;\n  }\n\n  /** @bundle isofile-advanced-creation.js */\n  addSample(\n    track_id: number,\n    data: Uint8Array<ArrayBuffer>,\n    {\n      sample_description_index,\n      duration = 1,\n      cts = 0,\n      dts = 0,\n      is_sync = false,\n      is_leading = 0,\n      depends_on = 0,\n      is_depended_on = 0,\n      has_redundancy = 0,\n      degradation_priority = 0,\n      subsamples,\n      offset = 0,\n    }: {\n      sample_description_index?: number;\n      duration?: number;\n      cts?: number;\n      dts?: number;\n      is_sync?: boolean;\n      is_leading?: number;\n      depends_on?: number;\n      is_depended_on?: number;\n      has_redundancy?: number;\n      degradation_priority?: number;\n      subsamples?: Array<SubSample>;\n      offset?: number;\n    } = {},\n  ) {\n    const trak = this.getTrackById(track_id);\n    if (trak === undefined) return;\n\n    const descriptionIndex = sample_description_index ? sample_description_index - 1 : 0;\n\n    const sample: Sample = {\n      number: trak.samples.length,\n      track_id: trak.tkhd.track_id,\n      timescale: trak.mdia.mdhd.timescale,\n      description_index: descriptionIndex,\n      description: trak.mdia.minf.stbl.stsd.entries[descriptionIndex],\n      data,\n      size: data.byteLength,\n      alreadyRead: data.byteLength,\n      duration,\n      cts,\n      dts,\n      is_sync,\n      is_leading,\n      depends_on,\n      is_depended_on,\n      has_redundancy,\n      degradation_priority,\n      offset,\n      subsamples,\n    };\n\n    trak.samples.push(sample);\n    trak.samples_size += sample.size;\n    trak.samples_duration += sample.duration;\n    if (trak.first_dts === undefined) {\n      trak.first_dts = dts;\n    }\n\n    this.processSamples();\n\n    const moof = this.addBox(this.createMoof([sample]));\n    moof.computeSize();\n    /* adjusting the data_offset now that the moof size is known*/\n    moof.trafs[0].truns[0].data_offset = moof.size + 8; //8 is mdat header\n\n    const mdat = this.addBox(new mdatBox());\n    mdat.data = new Uint8Array(data);\n\n    return sample;\n  }\n\n  /** @bundle isofile-advanced-creation.js */\n  createMoof(samples: Array<Sample>) {\n    // All samples must be from the same track\n    if (samples.length === 0) return;\n    if (samples.some(s => s.track_id !== samples[0].track_id)) {\n      throw new Error(\n        'Cannot create moof for samples from different tracks: ' +\n          samples.map(s => s.track_id).join(', '),\n      );\n    }\n    const trackId = samples[0].track_id;\n    const trak = this.getTrackById(trackId);\n    if (!trak) {\n      throw new Error('Cannot create moof for non-existing track: ' + trackId);\n    }\n\n    // Create the moof box\n    const moof = new moofBox();\n\n    // Add the mfhd box with the sequence number\n    const mfhd = moof.addBox(new mfhdBox());\n    mfhd.sequence_number = ++this.nextMoofNumber;\n\n    // Create the traf box\n    const traf = moof.addBox(new trafBox());\n\n    // Add the tfhd and tfdt boxes\n    const tfhd = traf.addBox(new tfhdBox());\n    tfhd.track_id = trackId;\n    tfhd.flags = TFHD_FLAG_DEFAULT_BASE_IS_MOOF;\n    const tfdt = traf.addBox(new tfdtBox());\n    tfdt.baseMediaDecodeTime = samples[0].dts - (trak.first_dts || 0);\n\n    // Construct the trun box\n    const trun = traf.addBox(new trunBox());\n    trun.flags =\n      TRUN_FLAGS_DATA_OFFSET |\n      TRUN_FLAGS_DURATION |\n      TRUN_FLAGS_SIZE |\n      TRUN_FLAGS_FLAGS |\n      TRUN_FLAGS_CTS_OFFSET;\n    trun.data_offset = 0;\n    trun.first_sample_flags = 0;\n    trun.sample_count = samples.length;\n\n    for (const sample of samples) {\n      let sample_flags = 0;\n      if (sample.is_sync)\n        sample_flags = 1 << 25; // sample_depends_on_none (I picture)\n      else sample_flags = 1 << 16; // non-sync\n\n      trun.sample_duration.push(sample.duration);\n      trun.sample_size.push(sample.size);\n      trun.sample_flags.push(sample_flags);\n      trun.sample_composition_time_offset.push(sample.cts - sample.dts);\n    }\n\n    return moof;\n  }\n\n  /** @bundle box-print.js */\n  print(output: Output) {\n    output.indent = '';\n    for (let i = 0; i < this.boxes.length; i++) {\n      if (this.boxes[i]) {\n        this.boxes[i].print(output);\n      }\n    }\n  }\n}\n","/*\n * Copyright (c) 2012-2013. Telecom ParisTech/TSI/MM/GPAC Cyril Concolato\n * License: BSD-3-Clause (see LICENSE file)\n */\n\nimport { MultiBufferStream } from '#/buffer';\nimport { ISOFile } from '#/isofile';\n\nexport function createFile(keepMdatData = false, stream?: MultiBufferStream) {\n  /* Boolean indicating if bytes containing media data should be kept in memory */\n  const file = new ISOFile(stream, !keepMdatData);\n  return file;\n}\n","export * from '#/boxes/defaults';\nexport * from '#/boxes/emsg';\nexport * from '#/boxes/ftyp';\nexport * from '#/boxes/mdhd';\nexport * from '#/boxes/mfhd';\nexport * from '#/boxes/mvhd';\nexport * from '#/boxes/sidx';\nexport * from '#/boxes/ssix';\nexport * from '#/boxes/styp';\nexport * from '#/boxes/tfdt';\nexport * from '#/boxes/tfhd';\nexport * from '#/boxes/tkhd';\nexport * from '#/boxes/trun';\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class emsgBox extends FullBox {\n  static override readonly fourcc = 'emsg' as const;\n  box_name = 'EventMessageBox' as const;\n\n  timescale: number;\n  presentation_time: number;\n  event_duration: number;\n  id: number;\n  scheme_id_uri: string;\n  value: string;\n  presentation_time_delta: number;\n  message_data: Uint8Array;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    if (this.version === 1) {\n      this.timescale = stream.readUint32();\n      this.presentation_time = stream.readUint64();\n      this.event_duration = stream.readUint32();\n      this.id = stream.readUint32();\n      this.scheme_id_uri = stream.readCString();\n      this.value = stream.readCString();\n    } else {\n      this.scheme_id_uri = stream.readCString();\n      this.value = stream.readCString();\n      this.timescale = stream.readUint32();\n      this.presentation_time_delta = stream.readUint32();\n      this.event_duration = stream.readUint32();\n      this.id = stream.readUint32();\n    }\n    let message_size =\n      this.size -\n      this.hdr_size -\n      (4 * 4 + (this.scheme_id_uri.length + 1) + (this.value.length + 1));\n    if (this.version === 1) {\n      message_size -= 4;\n    }\n    this.message_data = stream.readUint8Array(message_size);\n  }\n\n  /** @bundle writing/emsg.js */\n  write(stream: MultiBufferStream) {\n    this.version = 0;\n    this.flags = 0;\n    this.size =\n      4 * 4 + this.message_data.length + (this.scheme_id_uri.length + 1) + (this.value.length + 1);\n    this.writeHeader(stream);\n    stream.writeCString(this.scheme_id_uri);\n    stream.writeCString(this.value);\n    stream.writeUint32(this.timescale);\n    stream.writeUint32(this.presentation_time_delta);\n    stream.writeUint32(this.event_duration);\n    stream.writeUint32(this.id);\n    stream.writeUint8Array(this.message_data);\n  }\n}\n","import { FullBox } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\ninterface Range {\n  level: number;\n  range_size: number;\n}\ninterface SubSegment {\n  ranges: Array<Range>;\n}\n\nexport class ssixBox extends FullBox {\n  static override readonly fourcc = 'ssix' as const;\n  box_name = 'CompressedSubsegmentIndexBox' as const;\n\n  subsegments: Array<SubSegment>;\n\n  parse(stream: MultiBufferStream) {\n    this.parseFullHeader(stream);\n    this.subsegments = [];\n    const subsegment_count = stream.readUint32();\n    for (let i = 0; i < subsegment_count; i++) {\n      const subsegment = {} as SubSegment;\n      this.subsegments.push(subsegment);\n      subsegment.ranges = [];\n      const range_count = stream.readUint32();\n      for (let j = 0; j < range_count; j++) {\n        const range = {} as Range;\n        subsegment.ranges.push(range);\n        range.level = stream.readUint8();\n        range.range_size = stream.readUint24();\n      }\n    }\n  }\n}\n","import { Box } from '#/box';\nimport type { MultiBufferStream } from '#/buffer';\n\nexport class stypBox extends Box {\n  static override readonly fourcc = 'styp' as const;\n  box_name = 'SegmentTypeBox' as const;\n\n  major_brand: string;\n  minor_version: number;\n  compatible_brands: Array<string>;\n\n  parse(stream: MultiBufferStream) {\n    let toparse = this.size - this.hdr_size;\n    this.major_brand = stream.readString(4);\n    this.minor_version = stream.readUint32();\n    toparse -= 8;\n    this.compatible_brands = [];\n    let i = 0;\n    while (toparse >= 4) {\n      this.compatible_brands[i] = stream.readString(4);\n      toparse -= 4;\n      i++;\n    }\n  }\n\n  write(stream: MultiBufferStream) {\n    this.size = 8 + 4 * this.compatible_brands.length;\n    this.writeHeader(stream);\n    stream.writeString(this.major_brand, undefined, 4);\n    stream.writeUint32(this.minor_version);\n    for (let i = 0; i < this.compatible_brands.length; i++) {\n      stream.writeString(this.compatible_brands[i], undefined, 4);\n    }\n  }\n}\n"],"mappings":"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","names":["pos","type","module","abuffer","start","str","start","start"]}