{
  "version": 3,
  "sources": ["../../../node_modules/comctx/core/src/protocol.ts", "../../../node_modules/comctx/core/src/utils/uuid.ts", "../../../node_modules/comctx/core/src/utils/setIntervalImmediate.ts", "../../../node_modules/comctx/core/src/utils/safeInstanceOf.ts", "../../../node_modules/comctx/core/src/utils/extractTransfer.ts", "../../../node_modules/comctx/core/src/comctx.ts", "../../worker-threads/src/worker-thread.ts", "../../../node_modules/mediabunny/dist/modules/src/misc.js", "../../../node_modules/mediabunny/dist/modules/src/logging.js", "../../../node_modules/mediabunny/dist/modules/src/metadata.js", "../../../node_modules/mediabunny/dist/modules/shared/bitstream.js", "../../../node_modules/mediabunny/dist/modules/shared/aac-misc.js", "../../../node_modules/mediabunny/dist/modules/src/codec.js", "../../../node_modules/mediabunny/dist/modules/shared/ac3-misc.js", "../../../node_modules/mediabunny/dist/modules/src/codec-data.js", "../../../node_modules/mediabunny/dist/modules/src/packet.js", "../../../node_modules/mediabunny/dist/modules/src/isobmff/isobmff-misc.js", "../../../node_modules/mediabunny/dist/modules/src/isobmff/isobmff-reader.js", "../../../node_modules/mediabunny/dist/modules/src/matroska/ebml.js", "../../../node_modules/mediabunny/dist/modules/src/matroska/matroska-misc.js", "../../../node_modules/mediabunny/dist/modules/src/adts/adts-reader.js", "../../../node_modules/mediabunny/dist/modules/src/sample.js", "../../../node_modules/mediabunny/dist/modules/src/encode.js", "../../../node_modules/mediabunny/dist/modules/src/custom-coder.js", "../../../node_modules/mediabunny/dist/modules/src/reader.js", "../../../node_modules/mediabunny/dist/modules/src/muxer.js", "../../../node_modules/mediabunny/dist/modules/src/subtitles.js", "../../../node_modules/mediabunny/dist/modules/src/isobmff/isobmff-boxes.js", "../../../node_modules/mediabunny/dist/modules/src/writer.js", "../../../node_modules/mediabunny/dist/modules/src/target.js", "../../../node_modules/mediabunny/dist/modules/src/isobmff/isobmff-muxer.js", "../../../node_modules/mediabunny/dist/modules/src/matroska/matroska-muxer.js", "../../../node_modules/mediabunny/dist/modules/src/media-source.js", "../../../node_modules/mediabunny/dist/modules/src/output-format.js", "../../../node_modules/mediabunny/dist/modules/src/output.js", "../../../node_modules/mediabunny/dist/modules/src/index.js", "../src/index.ts", "../src/worker.ts"],
  "sourcesContent": ["export const MESSAGE_TYPE = {\n  APPLY: 'apply',\n  CALLBACK: 'callback',\n  PING: 'ping',\n  PONG: 'pong'\n} as const\n\nexport const MESSAGE_SENDER = {\n  PROVIDER: 'provider',\n  INJECTOR: 'injector'\n} as const\n\nexport type MessageType = (typeof MESSAGE_TYPE)[keyof typeof MESSAGE_TYPE]\n\nexport type MessageSender = (typeof MESSAGE_SENDER)[keyof typeof MESSAGE_SENDER]\n\nexport type MessageMeta<T extends Record<string, any> = Record<string, any>> = T\n\nexport interface Message<T extends MessageMeta = MessageMeta> {\n  readonly type: MessageType\n  readonly id: string\n  readonly path: string[]\n  readonly sender: MessageSender\n  readonly callbackIds?: string[]\n  readonly args?: any[]\n  readonly data?: any\n  readonly error?: string\n  readonly meta: T\n  readonly namespace: string\n  readonly timeStamp: number\n}\n\nexport const checkMessage = (message?: Partial<Message>) => {\n  const isType = !!message?.type && Object.values(MESSAGE_TYPE).includes(message.type)\n\n  const isId = !!message?.id && typeof message.id === 'string'\n\n  const isPath =\n    !!message?.path && Array.isArray(message.path) && message.path.every((path) => typeof path === 'string')\n  const isSender = !!message?.sender && Object.values(MESSAGE_SENDER).includes(message.sender)\n\n  const isCallbackIds =\n    typeof message?.callbackIds === 'undefined' ||\n    (Array.isArray(message.callbackIds) && message.callbackIds.every((id) => typeof id === 'string'))\n\n  const isArgs = typeof message?.args === 'undefined' || Array.isArray(message.args)\n\n  const isError = typeof message?.error === 'undefined' || typeof message.error === 'string'\n\n  const isMeta = !!message?.meta && message.meta !== null && typeof message.meta === 'object'\n\n  const isNamespace = !!message?.namespace && typeof message.namespace === 'string'\n\n  const isTimeStamp = !!message?.timeStamp && typeof message.timeStamp === 'number'\n\n  return (\n    isType && isId && isPath && isSender && isCallbackIds && isArgs && isError && isMeta && isNamespace && isTimeStamp\n  )\n}\n", "const uuid = () => [...Array(4)].map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join('-')\n\nexport default uuid\n", "const setIntervalImmediate = <T extends any[] = any[]>(handler: (...args: T) => void, delay?: number, ...args: T) => {\n  let timer = setTimeout(() => {\n    clearTimeout(timer)\n    handler(...args)\n    timer = setInterval(handler, delay, ...args)\n  }, 0)\n  return () => clearInterval(timer)\n}\n\nexport default setIntervalImmediate\n", "const safeInstanceOf = (value: any, constructor: new (...args: any[]) => any) => {\n  return typeof constructor !== 'undefined' && value instanceof constructor\n}\n\nexport default safeInstanceOf\n", "import safeInstanceOf from './safeInstanceOf'\n\n// Helper function to extract transferable objects\nconst extractTransfer = <T>(target: T): Transferable[] => {\n  const visited = new WeakSet()\n\n  const extract = (value: unknown): Transferable[] => {\n    if (!value || typeof value !== 'object') {\n      return []\n    }\n\n    // Avoid infinite recursion\n    if (visited.has(value)) {\n      return []\n    }\n\n    visited.add(value)\n\n    // Check for basic transferable objects\n    if (\n      safeInstanceOf(value, globalThis.ArrayBuffer) ||\n      safeInstanceOf(value, globalThis.MessagePort) ||\n      safeInstanceOf(value, globalThis.ImageBitmap) ||\n      safeInstanceOf(value, globalThis.OffscreenCanvas) ||\n      safeInstanceOf(value, globalThis.AudioData) ||\n      safeInstanceOf(value, globalThis.VideoFrame) ||\n      safeInstanceOf(value, globalThis.RTCDataChannel) ||\n      safeInstanceOf(value, globalThis.MediaSourceHandle) ||\n      safeInstanceOf(value, globalThis.MIDIAccess) ||\n      safeInstanceOf(value, globalThis.MediaStreamTrack) ||\n      safeInstanceOf(value, globalThis.ReadableStream) ||\n      safeInstanceOf(value, globalThis.WritableStream) ||\n      safeInstanceOf(value, globalThis.TransformStream)\n    ) {\n      return [value]\n    }\n\n    // Handle arrays\n    if (Array.isArray(value)) {\n      return value.flatMap(extract)\n    }\n\n    // Handle objects - recursively extract transferables from properties\n    return Object.values(value).flatMap(extract)\n  }\n\n  return extract(target)\n}\n\nexport default extractTransfer\n", "import uuid from '@/utils/uuid'\nimport setIntervalImmediate from '@/utils/setIntervalImmediate'\nimport extractTransfer from '@/utils/extractTransfer'\nimport { checkMessage, Message, MESSAGE_SENDER, MESSAGE_TYPE, MessageMeta } from './protocol'\n\nconst PROXY_MARKER = Symbol('PROXY_MARKER')\n\ntype MaybePromise<T> = T | Promise<T>\n\nexport type OffMessage = () => MaybePromise<void>\n\nexport type SendMessage<T extends MessageMeta = MessageMeta> = (\n  message: Message<T>,\n  transfer: Transferable[]\n) => MaybePromise<void>\n\nexport type OnMessage<T extends MessageMeta = MessageMeta> = (\n  callback: (message?: Partial<Message<T>>) => void\n) => MaybePromise<OffMessage | void>\n\nexport interface Adapter<T extends MessageMeta = MessageMeta> {\n  sendMessage: SendMessage<T>\n  onMessage: OnMessage<T>\n}\n\nexport type Context<T extends Record<string, any> = Record<string, any>> = (...args: any[]) => T\n\nexport interface Options {\n  namespace?: string\n  heartbeatCheck?: boolean\n  heartbeatInterval?: number\n  heartbeatTimeout?: number\n  transfer?: boolean\n  backup?: boolean\n}\n\nconst heartbeatCheck = async (adapter: Adapter, options: Required<Options>) => {\n  let clearHeartbeatInterval: () => void\n  let clearHeartbeatTimeout: () => void\n  const offMessages = new Set<OffMessage>()\n\n  const heartbeatInterval = new Promise<void>((resolve, reject) => {\n    clearHeartbeatInterval = setIntervalImmediate(async () => {\n      try {\n        const messageId = uuid()\n        const offMessage = await adapter.onMessage((message) => {\n          if (!checkMessage(message)) return\n          const _message = message as Message\n          if (_message.namespace !== options.namespace) return\n          if (_message.sender !== MESSAGE_SENDER.PROVIDER) return\n          if (_message.type !== MESSAGE_TYPE.PONG) return\n          if (_message.id !== messageId) return\n          resolve()\n        })\n\n        offMessage && offMessages.add(offMessage)\n\n        const pingMessage: Message = {\n          type: MESSAGE_TYPE.PING,\n          sender: MESSAGE_SENDER.INJECTOR,\n          id: messageId,\n          path: [],\n          meta: {},\n          namespace: options.namespace,\n          timeStamp: Date.now()\n        }\n        adapter.sendMessage(pingMessage, options.transfer ? extractTransfer(pingMessage) : [])\n      } catch (error) {\n        reject(error)\n      }\n    }, options.heartbeatInterval)\n  })\n\n  const heartbeatTimeout = new Promise<void>((_, reject) => {\n    const timer = setTimeout(\n      () => reject(new Error(`Provider unavailable: heartbeat check timeout ${options.heartbeatTimeout}ms.`)),\n      options.heartbeatTimeout\n    )\n    clearHeartbeatTimeout = () => clearTimeout(timer)\n  })\n\n  await Promise.race([heartbeatInterval, heartbeatTimeout]).finally(() => {\n    clearHeartbeatInterval()\n    clearHeartbeatTimeout()\n    offMessages.forEach((offMessage) => offMessage())\n    offMessages.clear()\n  })\n}\n\nconst createProvide = <T extends Record<string, any>>(target: T, adapter: Adapter, options: Required<Options>) => {\n  adapter.onMessage(async (message) => {\n    if (!checkMessage(message)) return\n    const _message = message as Message\n    if (_message.namespace !== options.namespace) return\n    if (_message.sender !== MESSAGE_SENDER.INJECTOR) return\n\n    switch (_message!.type) {\n      case MESSAGE_TYPE.PING: {\n        const pongMessage: Message = {\n          type: MESSAGE_TYPE.PONG,\n          sender: MESSAGE_SENDER.PROVIDER,\n          id: _message.id,\n          path: _message.path,\n          meta: _message.meta,\n          namespace: options.namespace,\n          timeStamp: Date.now()\n        }\n        adapter.sendMessage(pongMessage, options.transfer ? extractTransfer(pongMessage) : [])\n        break\n      }\n      case MESSAGE_TYPE.APPLY: {\n        try {\n          const mapArgs = _message.args?.map((arg) => {\n            if (_message.callbackIds?.includes(arg)) {\n              return (...args: any[]) => {\n                const callbackMessage: Message = {\n                  type: MESSAGE_TYPE.CALLBACK,\n                  sender: MESSAGE_SENDER.PROVIDER,\n                  id: arg,\n                  path: _message.path,\n                  meta: _message.meta,\n                  data: args,\n                  namespace: options.namespace,\n                  timeStamp: Date.now()\n                }\n                adapter.sendMessage(callbackMessage, options.transfer ? extractTransfer(callbackMessage) : [])\n              }\n            } else {\n              return arg\n            }\n          })\n          // @ts-expect-error: initial write\n          _message.data = await (\n            _message.path?.reduce((acc, key) => acc[key], target) as unknown as (...args: any[]) => any\n          ).apply(target, mapArgs || [])\n        } catch (error) {\n          // @ts-expect-error: initial write\n          _message.error = (error as Error).message\n        }\n        const responseMessage: Message = {\n          type: MESSAGE_TYPE.APPLY,\n          sender: MESSAGE_SENDER.PROVIDER,\n          id: _message.id,\n          path: _message.path,\n          data: _message.data,\n          error: _message.error,\n          meta: _message.meta,\n          namespace: options.namespace,\n          timeStamp: Date.now()\n        }\n        adapter.sendMessage(responseMessage, options.transfer ? extractTransfer(responseMessage) : [])\n        break\n      }\n    }\n  })\n  return target\n}\n\nconst createInject = <T extends Record<string, any>>(source: T, adapter: Adapter, options: Required<Options>) => {\n  const createProxy = (target: T, path: string[]) => {\n    const proxy = new Proxy<T>(target, {\n      get(_target, key, receiver) {\n        if (_target[PROXY_MARKER as keyof typeof _target]) {\n          return Reflect.get(_target, key, receiver)\n        }\n        const noop = () => {}\n        noop[PROXY_MARKER] = true\n        return createProxy(noop as unknown as T, [...path, key] as string[])\n      },\n      apply(_target, _this, args) {\n        return new Promise<Message>(async (resolve, reject) => {\n          try {\n            options.heartbeatCheck && (await heartbeatCheck(adapter, options))\n\n            const callbackIds: string[] = []\n            const mapArgs = args.map((arg) => {\n              if (typeof arg === 'function') {\n                const callbackId = uuid()\n                callbackIds.push(callbackId)\n                adapter.onMessage((message) => {\n                  if (!checkMessage(message)) return\n                  const _message = message as Message\n                  if (_message.namespace !== options.namespace) return\n                  if (_message.sender !== MESSAGE_SENDER.PROVIDER) return\n                  if (_message.type !== MESSAGE_TYPE.CALLBACK) return\n                  if (_message.id !== callbackId) return\n                  arg(..._message.data)\n                })\n                return callbackId\n              } else {\n                return arg\n              }\n            })\n\n            const messageId = uuid()\n            const offMessage = await adapter.onMessage((message) => {\n              if (!checkMessage(message)) return\n              const _message = message as Message\n              if (_message.namespace !== options.namespace) return\n              if (_message.sender !== MESSAGE_SENDER.PROVIDER) return\n              if (_message.type !== MESSAGE_TYPE.APPLY) return\n              if (_message.id !== messageId) return\n              _message.error ? reject(new Error(_message.error)) : resolve(_message.data)\n              offMessage?.()\n            })\n\n            const applyMessage: Message = {\n              type: MESSAGE_TYPE.APPLY,\n              sender: MESSAGE_SENDER.INJECTOR,\n              id: messageId,\n              path,\n              args: mapArgs,\n              meta: {},\n              callbackIds,\n              timeStamp: Date.now(),\n              namespace: options.namespace\n            }\n            adapter.sendMessage(applyMessage, options.transfer ? extractTransfer(applyMessage) : [])\n          } catch (error) {\n            reject(error)\n          }\n        })\n      }\n    })\n\n    return proxy\n  }\n\n  return createProxy(source, [])\n}\n\nconst provideProxy = <T extends Context>(context: T, options: Required<Options>) => {\n  let target: ReturnType<T>\n  return <M extends MessageMeta = MessageMeta>(adapter: Adapter<M>, ...args: Parameters<T>) =>\n    (target ??= createProvide(context(...args) as ReturnType<T>, adapter as Adapter, options))\n}\n\nconst injectProxy = <T extends Context>(context: T, options: Required<Options>) => {\n  let target: ReturnType<T>\n  return <M extends MessageMeta = MessageMeta>(adapter: Adapter<M>) =>\n    (target ??= createInject<ReturnType<T>>(\n      (options.backup ? Object.freeze(context()) : {}) as ReturnType<T>,\n      adapter as Adapter,\n      options\n    ))\n}\n\n/**\n * Creates a pair of proxies for the provider (provide) and injector (inject) to facilitate method calls and callbacks across communication layers.\n *\n * @param context - A factory function for the context that returns the target object to be proxied:\n *   - For the provider: This object directly handles remote calls.\n *   - For the injector: When the backup option is enabled, it serves as a local fallback implementation.\n * @param options - Configuration options:\n *   - namespace: The communication namespace used to isolate messages between different proxy instances (default is '__comctx__').\n *   - heartbeatCheck: Enable provider readiness check (default: true).\n *   - heartbeatInterval: The frequency at which to request heartbeats in milliseconds (default: 300).\n *   - heartbeatTimeout: Max wait time for heartbeat response in milliseconds (default: 1000).\n *   - transfer: Whether to use transferable objects for message transfer (default is false).\n *   - backup: Whether to use a backup implementation of the original object in the injector (default is false).\n * @returns Returns a tuple containing two elements:\n *   - [0] provideProxy: Accepts an adapter and creates a provider proxy.\n *   - [1] injectProxy: Accepts an adapter and creates an injector proxy.\n *\n * @example\n * const [provide, inject] = defineProxy(() => ({\n *   add: (a, b) => a + b\n * }), { namespace: 'math' })\n *\n * // Provider\n * provide(providerAdapter)\n *\n * // Injector\n * const math = inject(injectorAdapter)\n * await math.add(2, 3) // 5\n */\nexport const defineProxy = <T extends Context>(context: T, options?: Options) => {\n  const mergedOptions = {\n    namespace: options?.namespace ?? '__comctx__',\n    heartbeatCheck: options?.heartbeatCheck ?? true,\n    heartbeatInterval: options?.heartbeatInterval ?? 300,\n    heartbeatTimeout: options?.heartbeatTimeout ?? 1000,\n    transfer: options?.transfer ?? false,\n    backup: options?.backup ?? false\n  }\n\n  if (mergedOptions.heartbeatTimeout <= mergedOptions.heartbeatInterval) {\n    throw new Error(\n      `Invalid heartbeat config: timeout (${mergedOptions.heartbeatTimeout}ms) must exceed interval (${mergedOptions.heartbeatInterval}ms).`\n    )\n  }\n\n  return [provideProxy(context, mergedOptions), injectProxy(context, mergedOptions)] as const\n}\n\nexport default defineProxy\n", "import {\n\tdefineProxy,\n\ttype Adapter,\n\ttype SendMessage,\n\ttype OnMessage,\n} from 'comctx';\n\n/**\n * Adapter for providing (worker exposing methods to main thread).\n */\nclass WorkerProvideAdapter implements Adapter {\n\tsendMessage: SendMessage = ( message, transfer ) => {\n\t\tself.postMessage( message, { transfer } );\n\t};\n\n\tonMessage: OnMessage = ( callback ) => {\n\t\tconst handler = ( event: MessageEvent ) => callback( event.data );\n\t\tself.addEventListener( 'message', handler );\n\t\treturn () => self.removeEventListener( 'message', handler );\n\t};\n}\n\n/**\n * Normalizes an arbitrary thrown value into an `Error` with a non-empty\n * message.\n *\n * The RPC reply sent back to the main thread only carries the error\n * *message*. Thrown values without one - e.g. a `WebAssembly.Exception`\n * escaping a wasm module, a thrown string, or an `Error` with an empty\n * message - would otherwise be indistinguishable from a successful\n * `undefined` result on the main thread, so the caller's promise would\n * resolve instead of reject. See\n * https://github.com/WordPress/gutenberg/issues/80259.\n *\n * @param error - Thrown value.\n * @return An `Error` with a non-empty message.\n */\nfunction normalizeThrowable( error: unknown ): Error {\n\tif ( error instanceof Error && error.message ) {\n\t\treturn error;\n\t}\n\n\tlet message = '';\n\ttry {\n\t\tmessage = String( error );\n\t} catch {\n\t\t// Ignore values that cannot be stringified.\n\t}\n\n\treturn new Error( message || 'Unknown error in worker thread' );\n}\n\n/**\n * Wraps all methods of a target object so that any thrown value is\n * normalized into an `Error` with a non-empty message before it reaches\n * the RPC layer.\n *\n * @param target - Object containing methods to wrap.\n * @return A copy of the object with all methods wrapped.\n */\nfunction withNormalizedErrors< T extends object >( target: T ): T {\n\tconst wrapped: Record< string, unknown > = {};\n\n\tfor ( const key of Object.keys( target ) ) {\n\t\tconst value = ( target as Record< string, unknown > )[ key ];\n\n\t\tif ( typeof value !== 'function' ) {\n\t\t\twrapped[ key ] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\twrapped[ key ] = async ( ...args: unknown[] ) => {\n\t\t\ttry {\n\t\t\t\treturn await value.apply( target, args );\n\t\t\t} catch ( error ) {\n\t\t\t\tthrow normalizeThrowable( error );\n\t\t\t}\n\t\t};\n\t}\n\n\treturn wrapped as T;\n}\n\n/**\n * Exposes an object's methods to be called from the main thread.\n *\n * This function should be called in the worker script to make methods\n * available for RPC calls. Only methods (functions) on the object will\n * be exposed; other properties are ignored.\n *\n * @example\n * ```typescript\n * // worker.ts\n * import { expose } from '@wordpress/worker-threads/worker';\n *\n * const api = {\n *   async processImage(buffer: ArrayBuffer): Promise<ArrayBuffer> {\n *     // ... processing logic\n *     return resultBuffer;\n *   },\n *\n *   async calculateSum(a: number, b: number): Promise<number> {\n *     return a + b;\n *   }\n * };\n *\n * expose(api);\n *\n * // Export the type for use with wrap() on main thread\n * export type WorkerAPI = typeof api;\n * ```\n *\n * @param target - Object containing methods to expose to the main thread.\n */\nexport function expose< T extends object >( target: T ): void {\n\t// Create the provide function using defineProxy with the target,\n\t// normalizing thrown values so every failure reaches the main\n\t// thread as a rejection.\n\tconst [ provide ] = defineProxy( () => withNormalizedErrors( target ), {\n\t\tnamespace: '__wordpress_worker__',\n\t\theartbeatCheck: false,\n\t\ttransfer: true,\n\t} );\n\n\t// Start providing the target through the adapter.\n\tprovide( new WorkerProvideAdapter() );\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Logging } from './logging.js';\nexport function assert(x) {\n    if (!x) {\n        throw new Error('Assertion failed.');\n    }\n}\nexport const normalizeRotation = (rotation) => {\n    const mappedRotation = (rotation % 360 + 360) % 360;\n    if (mappedRotation === 0 || mappedRotation === 90 || mappedRotation === 180 || mappedRotation === 270) {\n        return mappedRotation;\n    }\n    else {\n        throw new Error(`Invalid rotation ${rotation}.`);\n    }\n};\nexport const last = (arr) => {\n    return arr && arr[arr.length - 1];\n};\nexport const isU32 = (value) => {\n    return value >= 0 && value < 2 ** 32;\n};\n/** Reads an exponential-Golomb universal code from a Bitstream.  */\nexport const readExpGolomb = (bitstream) => {\n    let leadingZeroBits = 0;\n    while (bitstream.readBits(1) === 0 && leadingZeroBits < 32) {\n        leadingZeroBits++;\n    }\n    if (leadingZeroBits >= 32) {\n        throw new Error('Invalid exponential-Golomb code.');\n    }\n    const result = (1 << leadingZeroBits) - 1 + bitstream.readBits(leadingZeroBits);\n    return result;\n};\n/** Reads a signed exponential-Golomb universal code from a Bitstream. */\nexport const readSignedExpGolomb = (bitstream) => {\n    const codeNum = readExpGolomb(bitstream);\n    return ((codeNum & 1) === 0)\n        ? -(codeNum >> 1)\n        : ((codeNum + 1) >> 1);\n};\nexport const writeBits = (bytes, start, end, value) => {\n    for (let i = start; i < end; i++) {\n        const byteIndex = Math.floor(i / 8);\n        let byte = bytes[byteIndex];\n        const bitIndex = 0b111 - (i & 0b111);\n        byte &= ~(1 << bitIndex);\n        byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;\n        bytes[byteIndex] = byte;\n    }\n};\nexport const toUint8Array = (source) => {\n    if (source.constructor === Uint8Array) { // We want a true Uint8Array, not something that extends it like Buffer\n        return source;\n    }\n    else if (ArrayBuffer.isView(source)) {\n        return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n    }\n    else {\n        return new Uint8Array(source);\n    }\n};\nexport const toDataView = (source) => {\n    if (source.constructor === DataView) {\n        return source;\n    }\n    else if (ArrayBuffer.isView(source)) {\n        return new DataView(source.buffer, source.byteOffset, source.byteLength);\n    }\n    else {\n        return new DataView(source);\n    }\n};\nexport const textDecoder = /* #__PURE__ */ new TextDecoder();\nexport const textEncoder = /* #__PURE__ */ new TextEncoder();\nexport const isIso88591Compatible = (text) => {\n    for (let i = 0; i < text.length; i++) {\n        const code = text.charCodeAt(i);\n        if (code > 255) {\n            return false;\n        }\n    }\n    return true;\n};\nconst invertObject = (object) => {\n    return Object.fromEntries(Object.entries(object).map(([key, value]) => [value, key]));\n};\n// For the color space mappings, see Rec. ITU-T H.273.\nexport const COLOR_PRIMARIES_MAP = {\n    bt709: 1, // ITU-R BT.709\n    bt470bg: 5, // ITU-R BT.470BG\n    smpte170m: 6, // ITU-R BT.601 525 - SMPTE 170M\n    bt2020: 9, // ITU-R BT.202\n    smpte432: 12, // SMPTE EG 432-1\n};\nexport const COLOR_PRIMARIES_MAP_INVERSE = /* #__PURE__ */ invertObject(COLOR_PRIMARIES_MAP);\nexport const TRANSFER_CHARACTERISTICS_MAP = {\n    'bt709': 1, // ITU-R BT.709\n    'smpte170m': 6, // SMPTE 170M\n    'linear': 8, // Linear transfer characteristics\n    'iec61966-2-1': 13, // IEC 61966-2-1\n    'pq': 16, // Rec. ITU-R BT.2100-2 perceptual quantization (PQ) system\n    'hlg': 18, // Rec. ITU-R BT.2100-2 hybrid loggamma (HLG) system\n};\nexport const TRANSFER_CHARACTERISTICS_MAP_INVERSE = /* #__PURE__ */ invertObject(TRANSFER_CHARACTERISTICS_MAP);\nexport const MATRIX_COEFFICIENTS_MAP = {\n    'rgb': 0, // Identity\n    'bt709': 1, // ITU-R BT.709\n    'bt470bg': 5, // ITU-R BT.470BG\n    'smpte170m': 6, // SMPTE 170M\n    'bt2020-ncl': 9, // ITU-R BT.2020-2 (non-constant luminance)\n};\nexport const MATRIX_COEFFICIENTS_MAP_INVERSE = /* #__PURE__ */ invertObject(MATRIX_COEFFICIENTS_MAP);\nexport const colorSpaceIsComplete = (colorSpace) => {\n    return (!!colorSpace\n        && !!colorSpace.primaries\n        && !!colorSpace.transfer\n        && !!colorSpace.matrix\n        && colorSpace.fullRange !== undefined);\n};\nexport const isAllowSharedBufferSource = (x) => {\n    return (x instanceof ArrayBuffer\n        || (typeof SharedArrayBuffer !== 'undefined' && x instanceof SharedArrayBuffer)\n        || ArrayBuffer.isView(x));\n};\nexport class AsyncMutex {\n    constructor() {\n        this.currentPromise = Promise.resolve();\n        this.pending = 0;\n    }\n    async acquire() {\n        let resolver;\n        const nextPromise = new Promise((resolve) => {\n            let resolved = false;\n            resolver = () => {\n                if (resolved) {\n                    return;\n                }\n                resolve();\n                this.pending--;\n                resolved = true;\n            };\n        });\n        const currentPromiseAlias = this.currentPromise;\n        this.currentPromise = nextPromise;\n        this.pending++;\n        await currentPromiseAlias;\n        return resolver;\n    }\n}\nexport const HEX_STRING_REGEX = /^[0-9a-fA-F]+$/;\nexport const bytesToHexString = (bytes) => {\n    return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');\n};\nexport const hexStringToBytes = (hexString) => {\n    assert(hexString.length % 2 === 0);\n    const bytes = new Uint8Array(hexString.length / 2);\n    for (let i = 0; i < hexString.length; i += 2) {\n        bytes[i / 2] = parseInt(hexString.slice(i, i + 2), 16);\n    }\n    return bytes;\n};\nexport const reverseBitsU32 = (x) => {\n    x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);\n    x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);\n    x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4);\n    x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8);\n    x = ((x >> 16) & 0x0000ffff) | ((x & 0x0000ffff) << 16);\n    return x >>> 0; // Ensure it's treated as an unsigned 32-bit integer\n};\n/** Returns the smallest index i such that val[i] === key, or -1 if no such index exists. */\nexport const binarySearchExact = (arr, key, valueGetter) => {\n    let low = 0;\n    let high = arr.length - 1;\n    let ans = -1;\n    while (low <= high) {\n        const mid = (low + high) >> 1;\n        const midVal = valueGetter(arr[mid]);\n        if (midVal === key) {\n            ans = mid;\n            high = mid - 1; // Continue searching left to find the lowest index\n        }\n        else if (midVal < key) {\n            low = mid + 1;\n        }\n        else {\n            high = mid - 1;\n        }\n    }\n    return ans;\n};\n/** Returns the largest index i such that val[i] <= key, or -1 if no such index exists. */\nexport const binarySearchLessOrEqual = (arr, key, valueGetter) => {\n    let low = 0;\n    let high = arr.length - 1;\n    let ans = -1;\n    while (low <= high) {\n        const mid = (low + (high - low + 1) / 2) | 0;\n        const midVal = valueGetter(arr[mid]);\n        if (midVal <= key) {\n            ans = mid;\n            low = mid + 1;\n        }\n        else {\n            high = mid - 1;\n        }\n    }\n    return ans;\n};\n/** Assumes the array is already sorted. */\nexport const insertSorted = (arr, item, valueGetter) => {\n    const insertionIndex = binarySearchLessOrEqual(arr, valueGetter(item), valueGetter);\n    arr.splice(insertionIndex + 1, 0, item); // This even behaves correctly for the -1 case\n};\nexport const promiseWithResolvers = () => {\n    let resolve;\n    let reject;\n    const promise = new Promise((res, rej) => {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise, resolve: resolve, reject: reject };\n};\nexport const removeItem = (arr, item) => {\n    const index = arr.indexOf(item);\n    if (index !== -1) {\n        arr.splice(index, 1);\n    }\n};\nexport const findLast = (arr, predicate) => {\n    for (let i = arr.length - 1; i >= 0; i--) {\n        if (predicate(arr[i])) {\n            return arr[i];\n        }\n    }\n    return undefined;\n};\nexport const findLastIndex = (arr, predicate) => {\n    for (let i = arr.length - 1; i >= 0; i--) {\n        if (predicate(arr[i])) {\n            return i;\n        }\n    }\n    return -1;\n};\nexport const toAsyncIterator = async function* (source) {\n    if (Symbol.iterator in source) {\n        // @ts-expect-error Trust me\n        yield* source[Symbol.iterator]();\n    }\n    else {\n        // @ts-expect-error Trust me\n        yield* source[Symbol.asyncIterator]();\n    }\n};\nexport const validateAnyIterable = (iterable) => {\n    if (!(Symbol.iterator in iterable) && !(Symbol.asyncIterator in iterable)) {\n        throw new TypeError('Argument must be an iterable or async iterable.');\n    }\n};\nexport const assertNever = (x) => {\n    // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n    throw new Error(`Unexpected value: ${x}`);\n};\nexport const getUint24 = (view, byteOffset, littleEndian) => {\n    const byte1 = view.getUint8(byteOffset);\n    const byte2 = view.getUint8(byteOffset + 1);\n    const byte3 = view.getUint8(byteOffset + 2);\n    if (littleEndian) {\n        return byte1 | (byte2 << 8) | (byte3 << 16);\n    }\n    else {\n        return (byte1 << 16) | (byte2 << 8) | byte3;\n    }\n};\nexport const getInt24 = (view, byteOffset, littleEndian) => {\n    // The left shift pushes the most significant bit into the sign bit region, and the subsequent right shift\n    // then correctly interprets the sign bit.\n    return getUint24(view, byteOffset, littleEndian) << 8 >> 8;\n};\nexport const setUint24 = (view, byteOffset, value, littleEndian) => {\n    // Ensure the value is within 24-bit unsigned range (0 to 16777215)\n    value = value >>> 0; // Convert to unsigned 32-bit\n    value = value & 0xFFFFFF; // Mask to 24 bits\n    if (littleEndian) {\n        view.setUint8(byteOffset, value & 0xFF);\n        view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n        view.setUint8(byteOffset + 2, (value >>> 16) & 0xFF);\n    }\n    else {\n        view.setUint8(byteOffset, (value >>> 16) & 0xFF);\n        view.setUint8(byteOffset + 1, (value >>> 8) & 0xFF);\n        view.setUint8(byteOffset + 2, value & 0xFF);\n    }\n};\nexport const setInt24 = (view, byteOffset, value, littleEndian) => {\n    // Ensure the value is within 24-bit signed range (-8388608 to 8388607)\n    value = clamp(value, -8388608, 8388607);\n    // Convert negative values to their 24-bit representation\n    if (value < 0) {\n        value = (value + 0x1000000) & 0xFFFFFF;\n    }\n    setUint24(view, byteOffset, value, littleEndian);\n};\nexport const setInt64 = (view, byteOffset, value, littleEndian) => {\n    if (littleEndian) {\n        view.setUint32(byteOffset + 0, value, true);\n        view.setInt32(byteOffset + 4, Math.floor(value / 2 ** 32), true);\n    }\n    else {\n        view.setInt32(byteOffset + 0, Math.floor(value / 2 ** 32), true);\n        view.setUint32(byteOffset + 4, value, true);\n    }\n};\n/**\n * Calls a function on each value spat out by an async generator. The reason for writing this manually instead of\n * using a generator function is that the generator function queues return() calls - here, we forward them immediately.\n */\nexport const mapAsyncGenerator = (generator, map) => {\n    return {\n        async next() {\n            const result = await generator.next();\n            if (result.done) {\n                return { value: undefined, done: true };\n            }\n            else {\n                return { value: map(result.value), done: false };\n            }\n        },\n        return() {\n            return generator.return();\n        },\n        throw(error) {\n            return generator.throw(error);\n        },\n        [Symbol.asyncIterator]() {\n            return this;\n        },\n    };\n};\nexport const clamp = (value, min, max) => {\n    return Math.max(min, Math.min(max, value));\n};\nexport const UNDETERMINED_LANGUAGE = 'und';\nexport const roundIfAlmostInteger = (value) => {\n    const rounded = Math.round(value);\n    if (Math.abs(value / rounded - 1) < 10 * Number.EPSILON) {\n        return rounded;\n    }\n    else {\n        return value;\n    }\n};\nexport const roundToMultiple = (value, multiple) => {\n    return Math.round(value / multiple) * multiple;\n};\nexport const roundToDivisor = (value, multiple) => {\n    return Math.round(value * multiple) / multiple;\n};\nexport const floorToMultiple = (value, multiple) => {\n    return Math.floor(value / multiple) * multiple;\n};\nexport const floorToDivisor = (value, multiple) => {\n    return Math.floor(value * multiple) / multiple;\n};\nexport const ilog = (x) => {\n    let ret = 0;\n    while (x) {\n        ret++;\n        x >>= 1;\n    }\n    return ret;\n};\nconst ISO_639_2_REGEX = /^[a-z]{3}$/;\nexport const isIso639Dash2LanguageCode = (x) => {\n    return ISO_639_2_REGEX.test(x);\n};\n// Since the result will be truncated, add a bit of eps to compensate for floating point errors\nexport const SECOND_TO_MICROSECOND_FACTOR = 1e6 * (1 + Number.EPSILON);\n/**\n * Merges two RequestInit objects with special handling for headers.\n * Headers are merged case-insensitively, but original casing is preserved.\n * init2 headers take precedence and will override case-insensitive matches from init1.\n */\nexport const mergeRequestInit = (init1, init2) => {\n    const merged = { ...init1, ...init2 };\n    // Special handling for headers\n    if (init1.headers || init2.headers) {\n        const headers1 = init1.headers ? normalizeHeaders(init1.headers) : {};\n        const headers2 = init2.headers ? normalizeHeaders(init2.headers) : {};\n        const mergedHeaders = { ...headers1 };\n        // For each header in headers2, check if a case-insensitive match exists in mergedHeaders\n        Object.entries(headers2).forEach(([key2, value2]) => {\n            const existingKey = Object.keys(mergedHeaders).find(key1 => key1.toLowerCase() === key2.toLowerCase());\n            if (existingKey) {\n                delete mergedHeaders[existingKey];\n            }\n            mergedHeaders[key2] = value2;\n        });\n        merged.headers = mergedHeaders;\n    }\n    return merged;\n};\n/** Normalizes HeadersInit to a Record<string, string> format. */\nexport const normalizeHeaders = (headers) => {\n    if (headers instanceof Headers) {\n        const result = {};\n        headers.forEach((value, key) => {\n            result[key] = value;\n        });\n        return result;\n    }\n    if (Array.isArray(headers)) {\n        const result = {};\n        headers.forEach(([key, value]) => {\n            result[key] = value;\n        });\n        return result;\n    }\n    return headers;\n};\nexport const retriedFetch = async (fetchFn, url, requestInit, getRetryDelay, shouldStop) => {\n    let attempts = 0;\n    while (true) {\n        try {\n            return await fetchFn(url, requestInit);\n        }\n        catch (error) {\n            if (shouldStop()) {\n                throw error;\n            }\n            attempts++;\n            const retryDelayInSeconds = getRetryDelay(attempts, error, url);\n            if (retryDelayInSeconds === null) {\n                throw error;\n            }\n            Logging._error('Retrying failed fetch. Error:', error);\n            if (!Number.isFinite(retryDelayInSeconds) || retryDelayInSeconds < 0) {\n                throw new TypeError('Retry delay must be a non-negative finite number.');\n            }\n            if (retryDelayInSeconds > 0) {\n                await wait(1000 * retryDelayInSeconds);\n            }\n            if (shouldStop()) {\n                throw error;\n            }\n        }\n    }\n};\nexport const computeRationalApproximation = (x, maxDenominator) => {\n    // Handle negative numbers\n    const sign = x < 0 ? -1 : 1;\n    x = Math.abs(x);\n    let prevNumerator = 0, prevDenominator = 1;\n    let currNumerator = 1, currDenominator = 0;\n    // Continued fraction algorithm\n    let remainder = x;\n    while (true) {\n        const integer = Math.floor(remainder);\n        // Calculate next convergent\n        const nextNumerator = integer * currNumerator + prevNumerator;\n        const nextDenominator = integer * currDenominator + prevDenominator;\n        if (nextDenominator > maxDenominator) {\n            return {\n                num: sign * currNumerator,\n                den: currDenominator,\n            };\n        }\n        prevNumerator = currNumerator;\n        prevDenominator = currDenominator;\n        currNumerator = nextNumerator;\n        currDenominator = nextDenominator;\n        remainder = 1 / (remainder - integer);\n        // Guard against precision issues\n        if (!isFinite(remainder)) {\n            break;\n        }\n    }\n    return {\n        num: sign * currNumerator,\n        den: currDenominator,\n    };\n};\nexport class CallSerializer {\n    constructor() {\n        this.currentPromise = Promise.resolve();\n    }\n    call(fn) {\n        return this.currentPromise = this.currentPromise.then(fn);\n    }\n}\nlet isWebKitCache = null;\nexport const isWebKit = () => {\n    if (isWebKitCache !== null) {\n        return isWebKitCache;\n    }\n    // This even returns true for WebKit-wrapping browsers such as Chrome on iOS\n    return isWebKitCache = !!(typeof navigator !== 'undefined'\n        && (\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        navigator.vendor?.match(/apple/i)\n            // Or, in workers:\n            || (/AppleWebKit/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent))\n            || /\\b(iPad|iPhone|iPod)\\b/.test(navigator.userAgent)));\n};\nlet isFirefoxCache = null;\nexport const isFirefox = () => {\n    if (isFirefoxCache !== null) {\n        return isFirefoxCache;\n    }\n    return isFirefoxCache = typeof navigator !== 'undefined' && navigator.userAgent?.includes('Firefox');\n};\nlet isChromiumCache = null;\nexport const isChromium = () => {\n    if (isChromiumCache !== null) {\n        return isChromiumCache;\n    }\n    return isChromiumCache = !!(typeof navigator !== 'undefined'\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        && (navigator.vendor?.includes('Google Inc') || /Chrome/.test(navigator.userAgent)));\n};\nlet chromiumVersionCache = null;\nexport const getChromiumVersion = () => {\n    if (chromiumVersionCache !== null) {\n        return chromiumVersionCache;\n    }\n    if (typeof navigator === 'undefined') {\n        return null;\n    }\n    const match = /\\bChrome\\/(\\d+)/.exec(navigator.userAgent);\n    if (!match) {\n        return null;\n    }\n    return chromiumVersionCache = Number(match[1]);\n};\n/** Acts like `??` except the condition is -1 and not null/undefined. */\nexport const coalesceIndex = (a, b) => {\n    return a !== -1 ? a : b;\n};\nexport const closedIntervalsOverlap = (startA, endA, startB, endB) => {\n    return startA <= endB && startB <= endA;\n};\nexport const keyValueIterator = function* (object) {\n    for (const key in object) {\n        const value = object[key];\n        if (value === undefined) {\n            continue;\n        }\n        yield { key, value };\n    }\n};\nexport const imageMimeTypeToExtension = (mimeType) => {\n    switch (mimeType.toLowerCase()) {\n        case 'image/jpeg':\n        case 'image/jpg':\n            return '.jpg';\n        case 'image/png':\n            return '.png';\n        case 'image/gif':\n            return '.gif';\n        case 'image/webp':\n            return '.webp';\n        case 'image/bmp':\n            return '.bmp';\n        case 'image/svg+xml':\n            return '.svg';\n        case 'image/tiff':\n            return '.tiff';\n        case 'image/avif':\n            return '.avif';\n        case 'image/x-icon':\n        case 'image/vnd.microsoft.icon':\n            return '.ico';\n        default:\n            return null;\n    }\n};\nexport const base64ToBytes = (base64) => {\n    const decoded = atob(base64);\n    const bytes = new Uint8Array(decoded.length);\n    for (let i = 0; i < decoded.length; i++) {\n        bytes[i] = decoded.charCodeAt(i);\n    }\n    return bytes;\n};\nexport const bytesToBase64 = (bytes) => {\n    let string = '';\n    for (let i = 0; i < bytes.length; i++) {\n        string += String.fromCharCode(bytes[i]);\n    }\n    return btoa(string);\n};\nexport const uint8ArraysAreEqual = (a, b) => {\n    if (a.length !== b.length) {\n        return false;\n    }\n    for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) {\n            return false;\n        }\n    }\n    return true;\n};\nexport const polyfillSymbolDispose = () => {\n    // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html\n    // @ts-expect-error Readonly\n    Symbol.dispose ??= Symbol('Symbol.dispose');\n};\nexport const isNumber = (x) => {\n    return typeof x === 'number' && !Number.isNaN(x);\n};\nexport const joinPaths = (basePath, relativePath) => {\n    // If relativePath is a full URL with protocol, return it as-is\n    if (relativePath.includes('://')) {\n        return relativePath;\n    }\n    // Strip query parameters from URL base paths so their contents don't mess up the join\n    if (basePath.includes('://')) {\n        const queryIndex = basePath.indexOf('?');\n        if (queryIndex !== -1) {\n            basePath = basePath.slice(0, queryIndex);\n        }\n    }\n    let result;\n    if (relativePath.startsWith('/')) {\n        const protocolIndex = basePath.indexOf('://');\n        if (protocolIndex === -1) {\n            result = relativePath;\n        }\n        else {\n            const pathStart = basePath.indexOf('/', protocolIndex + 3);\n            if (pathStart === -1) {\n                result = basePath + relativePath;\n            }\n            else {\n                result = basePath.slice(0, pathStart) + relativePath;\n            }\n        }\n    }\n    else {\n        const lastSlash = basePath.lastIndexOf('/');\n        if (lastSlash === -1) {\n            result = relativePath;\n        }\n        else {\n            result = basePath.slice(0, lastSlash + 1) + relativePath;\n        }\n    }\n    // Normalize ./ and ../\n    let prefix = '';\n    const protocolIndex = result.indexOf('://');\n    if (protocolIndex !== -1) {\n        const pathStart = result.indexOf('/', protocolIndex + 3);\n        if (pathStart !== -1) {\n            prefix = result.slice(0, pathStart);\n            result = result.slice(pathStart);\n        }\n    }\n    const segments = result.split('/');\n    const normalized = [];\n    for (const segment of segments) {\n        if (segment === '..') {\n            normalized.pop();\n        }\n        else if (segment !== '.') {\n            normalized.push(segment);\n        }\n    }\n    return prefix + normalized.join('/');\n};\nexport const arrayCount = (array, predicate) => {\n    let count = 0;\n    for (let i = 0; i < array.length; i++) {\n        if (predicate(array[i])) {\n            count++;\n        }\n    }\n    return count;\n};\nexport const arrayArgmin = (array, getValue) => {\n    let minIndex = -1;\n    let minValue = Infinity;\n    for (let i = 0; i < array.length; i++) {\n        const value = getValue(array[i]);\n        if (value < minValue) {\n            minValue = value;\n            minIndex = i;\n        }\n    }\n    return minIndex;\n};\nexport const arrayArgmax = (array, getValue) => {\n    let maxIndex = -1;\n    let maxValue = -Infinity;\n    for (let i = 0; i < array.length; i++) {\n        const value = getValue(array[i]);\n        if (value > maxValue) {\n            maxValue = value;\n            maxIndex = i;\n        }\n    }\n    return maxIndex;\n};\nexport const simplifyRational = (rational) => {\n    assert(Number.isInteger(rational.num));\n    assert(Number.isInteger(rational.den));\n    assert(rational.den !== 0);\n    let a = Math.abs(rational.num);\n    let b = Math.abs(rational.den);\n    // Euclidean algorithm\n    while (b !== 0) {\n        const t = a % b;\n        a = b;\n        b = t;\n    }\n    const gcd = a || 1;\n    return {\n        num: rational.num / gcd,\n        den: rational.den / gcd,\n    };\n};\nexport const validateRectangle = (rect, propertyPath) => {\n    if (typeof rect !== 'object' || !rect) {\n        throw new TypeError(`${propertyPath} must be an object.`);\n    }\n    if (!Number.isInteger(rect.left) || rect.left < 0) {\n        throw new TypeError(`${propertyPath}.left must be a non-negative integer.`);\n    }\n    if (!Number.isInteger(rect.top) || rect.top < 0) {\n        throw new TypeError(`${propertyPath}.top must be a non-negative integer.`);\n    }\n    if (!Number.isInteger(rect.width) || rect.width < 0) {\n        throw new TypeError(`${propertyPath}.width must be a non-negative integer.`);\n    }\n    if (!Number.isInteger(rect.height) || rect.height < 0) {\n        throw new TypeError(`${propertyPath}.height must be a non-negative integer.`);\n    }\n};\nlet unthrottledTimerWorker;\nlet nextUnthrottledTimerId = 1;\nconst unthrottledTimeoutCallbacks = new Map();\nconst unthrottledIntervalCallbacks = new Map();\nconst shouldUseNativeTimers = () => {\n    return typeof window === 'undefined';\n};\nconst unthrottledTimerWorkerMain = () => {\n    const timeoutHandles = new Map();\n    const intervalHandles = new Map();\n    self.onmessage = (event) => {\n        const message = event.data;\n        switch (message.type) {\n            case 'set-timeout':\n                {\n                    const handle = setTimeout(() => {\n                        timeoutHandles.delete(message.timerId);\n                        self.postMessage({ type: 'fire', timerId: message.timerId });\n                    }, message.delay);\n                    timeoutHandles.set(message.timerId, handle);\n                }\n                ;\n                break;\n            case 'set-interval':\n                {\n                    const handle = setInterval(() => {\n                        self.postMessage({ type: 'fire', timerId: message.timerId });\n                    }, message.delay);\n                    intervalHandles.set(message.timerId, handle);\n                }\n                ;\n                break;\n            case 'clear-timeout':\n                {\n                    const handle = timeoutHandles.get(message.timerId);\n                    if (handle !== undefined) {\n                        clearTimeout(handle);\n                        timeoutHandles.delete(message.timerId);\n                    }\n                }\n                ;\n                break;\n            case 'clear-interval':\n                {\n                    const handle = intervalHandles.get(message.timerId);\n                    if (handle !== undefined) {\n                        clearInterval(handle);\n                        intervalHandles.delete(message.timerId);\n                    }\n                }\n                ;\n                break;\n        }\n    };\n};\nconst getUnthrottledTimerWorker = () => {\n    if (unthrottledTimerWorker) {\n        return unthrottledTimerWorker;\n    }\n    const workerSource = `(${unthrottledTimerWorkerMain.toString()})();`;\n    const workerURL = URL.createObjectURL(new Blob([workerSource], { type: 'text/javascript' }));\n    unthrottledTimerWorker = new Worker(workerURL);\n    URL.revokeObjectURL(workerURL);\n    unthrottledTimerWorker.onmessage = (event) => {\n        const message = event.data;\n        const timeoutCallback = unthrottledTimeoutCallbacks.get(message.timerId);\n        if (timeoutCallback) {\n            unthrottledTimeoutCallbacks.delete(message.timerId);\n            timeoutCallback();\n            return;\n        }\n        const intervalCallback = unthrottledIntervalCallbacks.get(message.timerId);\n        if (intervalCallback) {\n            intervalCallback();\n        }\n    };\n    return unthrottledTimerWorker;\n};\nexport const setTimeoutUnthrottled = (\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ncallback, delay) => {\n    if (shouldUseNativeTimers()) {\n        return { id: setTimeout(callback, delay) };\n    }\n    const timerId = nextUnthrottledTimerId++;\n    unthrottledTimeoutCallbacks.set(timerId, () => {\n        callback();\n    });\n    getUnthrottledTimerWorker().postMessage({\n        type: 'set-timeout',\n        timerId,\n        delay,\n    });\n    return { id: timerId };\n};\nexport const clearTimeoutUnthrottled = (timer) => {\n    if (shouldUseNativeTimers()) {\n        clearTimeout(timer.id);\n        return;\n    }\n    assert(typeof timer.id === 'number');\n    unthrottledTimeoutCallbacks.delete(timer.id);\n    getUnthrottledTimerWorker().postMessage({\n        type: 'clear-timeout',\n        timerId: timer.id,\n    });\n};\nexport const setIntervalUnthrottled = (\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\ncallback, delay) => {\n    if (shouldUseNativeTimers()) {\n        return { id: setInterval(callback, delay) };\n    }\n    const timerId = nextUnthrottledTimerId++;\n    unthrottledIntervalCallbacks.set(timerId, () => {\n        callback();\n    });\n    getUnthrottledTimerWorker().postMessage({\n        type: 'set-interval',\n        timerId,\n        delay,\n    });\n    return { id: timerId };\n};\nexport const clearIntervalUnthrottled = (timer) => {\n    if (shouldUseNativeTimers()) {\n        clearInterval(timer.id);\n        return;\n    }\n    assert(typeof timer.id === 'number');\n    unthrottledIntervalCallbacks.delete(timer.id);\n    getUnthrottledTimerWorker().postMessage({\n        type: 'clear-interval',\n        timerId: timer.id,\n    });\n};\nexport const wait = (ms) => {\n    return new Promise(resolve => setTimeout(resolve, ms));\n};\nexport const rejectAfter = (ms, message = 'Promise rejected') => {\n    return new Promise((_, reject) => {\n        setTimeout(() => reject(new Error(message)), ms);\n    });\n};\nexport const toArray = (x) => {\n    if (Array.isArray(x)) {\n        return x;\n    }\n    else {\n        return [x];\n    }\n};\n/**\n * A class that manages event listeners and dispatches events to them.\n *\n * @group Miscellaneous\n * @public\n */\nexport class EventEmitter {\n    constructor() {\n        /** @internal */\n        this._listeners = new Map();\n    }\n    /** Registers a listener for the given event. Returns a function that, when called, removes the listener again. */\n    on(event, listener, options) {\n        if (!this._listeners.has(event)) {\n            this._listeners.set(event, new Set());\n        }\n        const entry = { fn: listener, once: options?.once ?? false };\n        this._listeners.get(event).add(entry);\n        return () => {\n            this._listeners.get(event)?.delete(entry);\n        };\n    }\n    /** @internal */\n    _emit(...args) {\n        const [event, data] = args;\n        const listeners = this._listeners.get(event);\n        if (!listeners) {\n            return;\n        }\n        for (const entry of listeners) {\n            try {\n                entry.fn(data);\n            }\n            catch (error) {\n                // Deliberately not routed through Logging here: Logging emits via an EventEmitter, so a throwing\n                // log listener would recurse straight back into this handler.\n                console.error(error);\n            }\n            if (entry.once) {\n                listeners.delete(entry);\n            }\n        }\n    }\n}\nexport const ceilToMultipleOfTwo = (value) => Math.ceil(value / 2) * 2;\n/**\n * Utility class for running async functions in parallel up to a certain level of parallelism. Can be used to apply\n * backpressure only if the concurrency level would be exceeded.\n *\n * @group Miscellaneous\n * @public\n*/\nexport class ConcurrentRunner {\n    constructor(parallelism) {\n        /** @internal */\n        this._queue = [];\n        /** @internal */\n        this._errored = false;\n        this.parallelism = parallelism;\n    }\n    /** Whether any function has errored. The runner is effectively bricked if this is `true`, by design. */\n    get errored() {\n        return this._errored;\n    }\n    /** The number of tasks currently running. */\n    get inFlightCount() {\n        return this._queue.length;\n    }\n    /**\n     * Schedules an async function to be run. If the maximum allowed level of parallelism has not yet been reached,\n     * the function will be executed immediately and `run()` will resolve immediately. Otherwise, the function will be\n     * called as soon as any currently-running function finishes, and `run()` will only resolve then.\n     *\n     * Throws if the runner is errored.\n     */\n    async run(fn) {\n        if (this._errored) {\n            await Promise.race(this._queue); // Will surface the error\n        }\n        while (this._queue.length >= this.parallelism) {\n            await Promise.race(this._queue);\n        }\n        const promise = fn();\n        this._queue.push(promise);\n        void promise\n            .then(() => removeItem(this._queue, promise))\n            .catch(() => this._errored = true);\n    }\n    /** Waits for all currently running functions to finish. Throws if the runner is errored. */\n    async flush() {\n        await Promise.all(this._queue);\n    }\n}\nexport const isRecordStringString = (value) => {\n    return value !== null\n        && typeof value === 'object'\n        && Object.getPrototypeOf(value) === Object.prototype\n        && Object.values(value).every(x => typeof x === 'string');\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { EventEmitter } from './misc.js';\n/**\n * Controls how much information Mediabunny prints to the console. Higher levels include all lower levels.\n *\n * @group Logging\n * @public\n */\nexport var LogLevel;\n(function (LogLevel) {\n    /** Nothing is printed to the console. */\n    LogLevel[LogLevel[\"Silent\"] = 0] = \"Silent\";\n    /** Only errors are printed. */\n    LogLevel[LogLevel[\"Errors\"] = 1] = \"Errors\";\n    /** Errors and warnings are printed. */\n    LogLevel[LogLevel[\"Warnings\"] = 2] = \"Warnings\";\n    /** Errors, warnings, and informational messages are printed. */\n    LogLevel[LogLevel[\"Info\"] = 3] = \"Info\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Mediabunny's central logging singleton. Use {@link Logging.level} to control how much is printed to the console,\n * and subscribe to log events using {@link Logging.on}.\n *\n * Having manual control over logging is useful for command-line applications where you want full say over the output.\n *\n * @group Logging\n * @public\n */\nexport class Logging {\n    constructor() { }\n    /** The current log level. Defaults to {@link LogLevel.Info}. */\n    static get level() {\n        return Logging._level;\n    }\n    static set level(value) {\n        if (value !== LogLevel.Silent\n            && value !== LogLevel.Errors\n            && value !== LogLevel.Warnings\n            && value !== LogLevel.Info) {\n            throw new TypeError('Invalid log level. Use one of the values of the LogLevel enum.');\n        }\n        Logging._level = value;\n    }\n    /** @internal */\n    static get _emitter() {\n        // Created lazily to avoid touching the EventEmitter binding at module-eval time\n        return Logging._emitterInstance ??= new EventEmitter();\n    }\n    /** Registers a listener for a log event. Returns a function that, when called, removes the listener again. */\n    static on(event, listener, options) {\n        return Logging._emitter.on(event, listener, options);\n    }\n    /** @internal */\n    static _error(...args) {\n        Logging._emitter._emit('error', args);\n        if (Logging._level >= LogLevel.Errors) {\n            console.error(...args);\n        }\n    }\n    /** @internal */\n    static _warn(...args) {\n        Logging._emitter._emit('warn', args);\n        if (Logging._level >= LogLevel.Warnings) {\n            console.warn(...args);\n        }\n    }\n    /** @internal */\n    static _info(...args) {\n        Logging._emitter._emit('info', args);\n        if (Logging._level >= LogLevel.Info) {\n            console.info(...args);\n        }\n    }\n}\n/** @internal */\nLogging._level = LogLevel.Info;\n/** @internal */\nLogging._emitterInstance = null;\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { isRecordStringString } from './misc.js';\n/**\n * Image data with additional metadata.\n *\n * @group Metadata tags\n * @public\n */\nexport class RichImageData {\n    /** Creates a new {@link RichImageData}. */\n    constructor(\n    /** The raw image data. */\n    data, \n    /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */\n    mimeType) {\n        this.data = data;\n        this.mimeType = mimeType;\n        if (!(data instanceof Uint8Array)) {\n            throw new TypeError('data must be a Uint8Array.');\n        }\n        if (typeof mimeType !== 'string') {\n            throw new TypeError('mimeType must be a string.');\n        }\n    }\n}\n/**\n * A file attached to a media file.\n *\n * @group Metadata tags\n * @public\n */\nexport class AttachedFile {\n    /** Creates a new {@link AttachedFile}. */\n    constructor(\n    /** The raw file data. */\n    data, \n    /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */\n    mimeType, \n    /** The name of the file. */\n    name, \n    /** A description of the file. */\n    description) {\n        this.data = data;\n        this.mimeType = mimeType;\n        this.name = name;\n        this.description = description;\n        if (!(data instanceof Uint8Array)) {\n            throw new TypeError('data must be a Uint8Array.');\n        }\n        if (mimeType !== undefined && typeof mimeType !== 'string') {\n            throw new TypeError('mimeType, when provided, must be a string.');\n        }\n        if (name !== undefined && typeof name !== 'string') {\n            throw new TypeError('name, when provided, must be a string.');\n        }\n        if (description !== undefined && typeof description !== 'string') {\n            throw new TypeError('description, when provided, must be a string.');\n        }\n    }\n}\n;\nexport const validateMetadataTags = (tags) => {\n    if (!tags || typeof tags !== 'object') {\n        throw new TypeError('tags must be an object.');\n    }\n    if (tags.title !== undefined && typeof tags.title !== 'string') {\n        throw new TypeError('tags.title, when provided, must be a string.');\n    }\n    if (tags.description !== undefined && typeof tags.description !== 'string') {\n        throw new TypeError('tags.description, when provided, must be a string.');\n    }\n    if (tags.artist !== undefined && typeof tags.artist !== 'string') {\n        throw new TypeError('tags.artist, when provided, must be a string.');\n    }\n    if (tags.album !== undefined && typeof tags.album !== 'string') {\n        throw new TypeError('tags.album, when provided, must be a string.');\n    }\n    if (tags.albumArtist !== undefined && typeof tags.albumArtist !== 'string') {\n        throw new TypeError('tags.albumArtist, when provided, must be a string.');\n    }\n    if (tags.trackNumber !== undefined && (!Number.isInteger(tags.trackNumber) || tags.trackNumber <= 0)) {\n        throw new TypeError('tags.trackNumber, when provided, must be a positive integer.');\n    }\n    if (tags.tracksTotal !== undefined\n        && (!Number.isInteger(tags.tracksTotal) || tags.tracksTotal <= 0)) {\n        throw new TypeError('tags.tracksTotal, when provided, must be a positive integer.');\n    }\n    if (tags.discNumber !== undefined && (!Number.isInteger(tags.discNumber) || tags.discNumber <= 0)) {\n        throw new TypeError('tags.discNumber, when provided, must be a positive integer.');\n    }\n    if (tags.discsTotal !== undefined\n        && (!Number.isInteger(tags.discsTotal) || tags.discsTotal <= 0)) {\n        throw new TypeError('tags.discsTotal, when provided, must be a positive integer.');\n    }\n    if (tags.genre !== undefined && typeof tags.genre !== 'string') {\n        throw new TypeError('tags.genre, when provided, must be a string.');\n    }\n    if (tags.date !== undefined && (!(tags.date instanceof Date) || Number.isNaN(tags.date.getTime()))) {\n        throw new TypeError('tags.date, when provided, must be a valid Date.');\n    }\n    if (tags.lyrics !== undefined && typeof tags.lyrics !== 'string') {\n        throw new TypeError('tags.lyrics, when provided, must be a string.');\n    }\n    if (tags.images !== undefined) {\n        if (!Array.isArray(tags.images)) {\n            throw new TypeError('tags.images, when provided, must be an array.');\n        }\n        for (const image of tags.images) {\n            if (!image || typeof image !== 'object') {\n                throw new TypeError('Each image in tags.images must be an object.');\n            }\n            if (!(image.data instanceof Uint8Array)) {\n                throw new TypeError('Each image.data must be a Uint8Array.');\n            }\n            if (typeof image.mimeType !== 'string') {\n                throw new TypeError('Each image.mimeType must be a string.');\n            }\n            if (!['coverFront', 'coverBack', 'unknown'].includes(image.kind)) {\n                throw new TypeError('Each image.kind must be \\'coverFront\\', \\'coverBack\\', or \\'unknown\\'.');\n            }\n        }\n    }\n    if (tags.comment !== undefined && typeof tags.comment !== 'string') {\n        throw new TypeError('tags.comment, when provided, must be a string.');\n    }\n    if (tags.raw !== undefined) {\n        if (!tags.raw || typeof tags.raw !== 'object') {\n            throw new TypeError('tags.raw, when provided, must be an object.');\n        }\n        for (const value of Object.values(tags.raw)) {\n            if (value !== null\n                && typeof value !== 'string'\n                && !(value instanceof Uint8Array)\n                && !(value instanceof RichImageData)\n                && !(value instanceof AttachedFile)\n                && !isRecordStringString(value)) {\n                throw new TypeError('Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, '\n                    + 'Record<string, string>, or null.');\n            }\n        }\n    }\n};\nexport const metadataTagsAreEmpty = (tags) => {\n    return tags.title === undefined\n        && tags.description === undefined\n        && tags.artist === undefined\n        && tags.album === undefined\n        && tags.albumArtist === undefined\n        && tags.trackNumber === undefined\n        && tags.tracksTotal === undefined\n        && tags.discNumber === undefined\n        && tags.discsTotal === undefined\n        && tags.genre === undefined\n        && tags.date === undefined\n        && tags.lyrics === undefined\n        && (!tags.images || tags.images.length === 0)\n        && tags.comment === undefined\n        && (tags.raw === undefined || Object.keys(tags.raw).length === 0);\n};\nexport const DEFAULT_TRACK_DISPOSITION = {\n    default: true,\n    primary: true,\n    forced: false,\n    original: false,\n    commentary: false,\n    hearingImpaired: false,\n    visuallyImpaired: false,\n};\nexport const validateTrackDisposition = (disposition) => {\n    if (!disposition || typeof disposition !== 'object') {\n        throw new TypeError('disposition must be an object.');\n    }\n    if (disposition.default !== undefined && typeof disposition.default !== 'boolean') {\n        throw new TypeError('disposition.default must be a boolean.');\n    }\n    if (disposition.primary !== undefined && typeof disposition.primary !== 'boolean') {\n        throw new TypeError('disposition.primary must be a boolean.');\n    }\n    if (disposition.forced !== undefined && typeof disposition.forced !== 'boolean') {\n        throw new TypeError('disposition.forced must be a boolean.');\n    }\n    if (disposition.original !== undefined && typeof disposition.original !== 'boolean') {\n        throw new TypeError('disposition.original must be a boolean.');\n    }\n    if (disposition.commentary !== undefined && typeof disposition.commentary !== 'boolean') {\n        throw new TypeError('disposition.commentary must be a boolean.');\n    }\n    if (disposition.hearingImpaired !== undefined && typeof disposition.hearingImpaired !== 'boolean') {\n        throw new TypeError('disposition.hearingImpaired must be a boolean.');\n    }\n    if (disposition.visuallyImpaired !== undefined && typeof disposition.visuallyImpaired !== 'boolean') {\n        throw new TypeError('disposition.visuallyImpaired must be a boolean.');\n    }\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport class Bitstream {\n    constructor(bytes) {\n        this.bytes = bytes;\n        /** Current offset in bits. */\n        this.pos = 0;\n    }\n    seekToByte(byteOffset) {\n        this.pos = 8 * byteOffset;\n    }\n    readBit() {\n        const byteIndex = Math.floor(this.pos / 8);\n        const byte = this.bytes[byteIndex] ?? 0;\n        const bitIndex = 0b111 - (this.pos & 0b111);\n        const bit = (byte & (1 << bitIndex)) >> bitIndex;\n        this.pos++;\n        return bit;\n    }\n    readBits(n) {\n        if (n === 1) {\n            return this.readBit();\n        }\n        let result = 0;\n        for (let i = 0; i < n; i++) {\n            result <<= 1;\n            result |= this.readBit();\n        }\n        return result;\n    }\n    writeBits(n, value) {\n        const end = this.pos + n;\n        for (let i = this.pos; i < end; i++) {\n            const byteIndex = Math.floor(i / 8);\n            let byte = this.bytes[byteIndex];\n            const bitIndex = 0b111 - (i & 0b111);\n            byte &= ~(1 << bitIndex);\n            byte |= ((value & (1 << (end - i - 1))) >> (end - i - 1)) << bitIndex;\n            this.bytes[byteIndex] = byte;\n        }\n        this.pos = end;\n    }\n    ;\n    readAlignedByte() {\n        if (this.pos % 8 !== 0) {\n            throw new Error('Bitstream is not byte-aligned.');\n        }\n        const byteIndex = this.pos / 8;\n        const byte = this.bytes[byteIndex] ?? 0;\n        this.pos += 8;\n        return byte;\n    }\n    skipBits(n) {\n        this.pos += n;\n    }\n    getBitsLeft() {\n        return this.bytes.length * 8 - this.pos;\n    }\n    clone() {\n        const clone = new Bitstream(this.bytes);\n        clone.pos = this.pos;\n        return clone;\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Bitstream } from './bitstream.js';\nexport const aacFrequencyTable = [\n    96000, 88200, 64000, 48000, 44100, 32000,\n    24000, 22050, 16000, 12000, 11025, 8000, 7350,\n];\nexport const aacChannelMap = [-1, 1, 2, 3, 4, 5, 6, 8];\nexport const parseAacAudioSpecificConfig = (bytes) => {\n    if (!bytes || bytes.byteLength < 2) {\n        throw new TypeError('AAC description must be at least 2 bytes long.');\n    }\n    const bitstream = new Bitstream(bytes);\n    let objectType = bitstream.readBits(5);\n    if (objectType === 31) {\n        objectType = 32 + bitstream.readBits(6);\n    }\n    const frequencyIndex = bitstream.readBits(4);\n    let sampleRate = null;\n    if (frequencyIndex === 15) {\n        sampleRate = bitstream.readBits(24);\n    }\n    else {\n        if (frequencyIndex < aacFrequencyTable.length) {\n            sampleRate = aacFrequencyTable[frequencyIndex];\n        }\n    }\n    const channelConfiguration = bitstream.readBits(4);\n    let numberOfChannels = null;\n    if (channelConfiguration >= 1 && channelConfiguration <= 7) {\n        numberOfChannels = aacChannelMap[channelConfiguration];\n    }\n    return {\n        objectType,\n        frequencyIndex,\n        sampleRate,\n        channelConfiguration,\n        numberOfChannels,\n    };\n};\nexport const buildAacAudioSpecificConfig = (config) => {\n    let frequencyIndex = aacFrequencyTable.indexOf(config.sampleRate);\n    let customSampleRate = null;\n    if (frequencyIndex === -1) {\n        frequencyIndex = 15;\n        customSampleRate = config.sampleRate;\n    }\n    const channelConfiguration = aacChannelMap.indexOf(config.numberOfChannels);\n    if (channelConfiguration === -1) {\n        throw new TypeError(`Unsupported number of channels: ${config.numberOfChannels}`);\n    }\n    let bitCount = 5 + 4 + 4;\n    if (config.objectType >= 32) {\n        bitCount += 6;\n    }\n    if (frequencyIndex === 15) {\n        bitCount += 24;\n    }\n    const byteCount = Math.ceil(bitCount / 8);\n    const bytes = new Uint8Array(byteCount);\n    const bitstream = new Bitstream(bytes);\n    if (config.objectType < 32) {\n        bitstream.writeBits(5, config.objectType);\n    }\n    else {\n        bitstream.writeBits(5, 31);\n        bitstream.writeBits(6, config.objectType - 32);\n    }\n    bitstream.writeBits(4, frequencyIndex);\n    if (frequencyIndex === 15) {\n        bitstream.writeBits(24, customSampleRate);\n    }\n    bitstream.writeBits(4, channelConfiguration);\n    return bytes;\n};\nexport const buildAdtsHeaderTemplate = (config) => {\n    const header = new Uint8Array(7);\n    const bitstream = new Bitstream(header);\n    const { objectType, frequencyIndex, channelConfiguration } = config;\n    const profile = objectType - 1;\n    bitstream.writeBits(12, 0b1111_11111111); // Syncword\n    bitstream.writeBits(1, 0); // MPEG Version\n    bitstream.writeBits(2, 0); // Layer\n    bitstream.writeBits(1, 1); // Protection absence\n    bitstream.writeBits(2, profile); // Profile\n    bitstream.writeBits(4, frequencyIndex); // MPEG-4 Sampling Frequency Index\n    bitstream.writeBits(1, 0); // Private bit\n    bitstream.writeBits(3, channelConfiguration); // MPEG-4 Channel Configuration\n    bitstream.writeBits(1, 0); // Originality\n    bitstream.writeBits(1, 0); // Home\n    bitstream.writeBits(1, 0); // Copyright ID bit\n    bitstream.writeBits(1, 0); // Copyright ID start\n    bitstream.skipBits(13); // Frame length (to be filled per packet)\n    bitstream.writeBits(11, 0x7ff); // Buffer fullness\n    bitstream.writeBits(2, 0); // Number of AAC frames minus 1\n    // Omit CRC check\n    return { header, bitstream };\n};\nexport const writeAdtsFrameLength = (bitstream, frameLength) => {\n    bitstream.pos = 30;\n    bitstream.writeBits(13, frameLength);\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { parseAacAudioSpecificConfig } from '../shared/aac-misc.js';\nimport { COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, assert, base64ToBytes, bytesToHexString, isAllowSharedBufferSource, last, reverseBitsU32, toDataView, } from './misc.js';\n/**\n * List of known video codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const VIDEO_CODECS = [\n    'avc',\n    'hevc',\n    'vp9',\n    'av1',\n    'vp8',\n];\n/**\n * List of known PCM (uncompressed) audio codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const PCM_AUDIO_CODECS = [\n    'pcm-s16', // We don't prefix 'le' so we're compatible with the WebCodecs-registered PCM codec strings\n    'pcm-s16be',\n    'pcm-s24',\n    'pcm-s24be',\n    'pcm-s32',\n    'pcm-s32be',\n    'pcm-f32',\n    'pcm-f32be',\n    'pcm-f64',\n    'pcm-f64be',\n    'pcm-u8',\n    'pcm-s8',\n    'ulaw',\n    'alaw',\n];\n/**\n * List of known compressed audio codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const NON_PCM_AUDIO_CODECS = [\n    'aac',\n    'opus',\n    'mp3',\n    'vorbis',\n    'flac',\n    'ac3',\n    'eac3',\n];\n/**\n * List of known audio codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const AUDIO_CODECS = [\n    ...NON_PCM_AUDIO_CODECS,\n    ...PCM_AUDIO_CODECS,\n];\n/**\n * List of known subtitle codecs, ordered by encoding preference.\n * @group Codecs\n * @public\n */\nexport const SUBTITLE_CODECS = [\n    'webvtt',\n]; // TODO add the rest\n// https://en.wikipedia.org/wiki/Advanced_Video_Coding\nexport const AVC_LEVEL_TABLE = [\n    { maxMacroblocks: 99, maxBitrate: 64000, maxDpbMbs: 396, level: 0x0A }, // Level 1\n    { maxMacroblocks: 396, maxBitrate: 192000, maxDpbMbs: 900, level: 0x0B }, // Level 1.1\n    { maxMacroblocks: 396, maxBitrate: 384000, maxDpbMbs: 2376, level: 0x0C }, // Level 1.2\n    { maxMacroblocks: 396, maxBitrate: 768000, maxDpbMbs: 2376, level: 0x0D }, // Level 1.3\n    { maxMacroblocks: 396, maxBitrate: 2000000, maxDpbMbs: 2376, level: 0x14 }, // Level 2\n    { maxMacroblocks: 792, maxBitrate: 4000000, maxDpbMbs: 4752, level: 0x15 }, // Level 2.1\n    { maxMacroblocks: 1620, maxBitrate: 4000000, maxDpbMbs: 8100, level: 0x16 }, // Level 2.2\n    { maxMacroblocks: 1620, maxBitrate: 10000000, maxDpbMbs: 8100, level: 0x1E }, // Level 3\n    { maxMacroblocks: 3600, maxBitrate: 14000000, maxDpbMbs: 18000, level: 0x1F }, // Level 3.1\n    { maxMacroblocks: 5120, maxBitrate: 20000000, maxDpbMbs: 20480, level: 0x20 }, // Level 3.2\n    { maxMacroblocks: 8192, maxBitrate: 20000000, maxDpbMbs: 32768, level: 0x28 }, // Level 4\n    { maxMacroblocks: 8192, maxBitrate: 50000000, maxDpbMbs: 32768, level: 0x29 }, // Level 4.1\n    { maxMacroblocks: 8704, maxBitrate: 50000000, maxDpbMbs: 34816, level: 0x2A }, // Level 4.2\n    { maxMacroblocks: 22080, maxBitrate: 135000000, maxDpbMbs: 110400, level: 0x32 }, // Level 5\n    { maxMacroblocks: 36864, maxBitrate: 240000000, maxDpbMbs: 184320, level: 0x33 }, // Level 5.1\n    { maxMacroblocks: 36864, maxBitrate: 240000000, maxDpbMbs: 184320, level: 0x34 }, // Level 5.2\n    { maxMacroblocks: 139264, maxBitrate: 240000000, maxDpbMbs: 696320, level: 0x3C }, // Level 6\n    { maxMacroblocks: 139264, maxBitrate: 480000000, maxDpbMbs: 696320, level: 0x3D }, // Level 6.1\n    { maxMacroblocks: 139264, maxBitrate: 800000000, maxDpbMbs: 696320, level: 0x3E }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding\nconst HEVC_LEVEL_TABLE = [\n    { maxPictureSize: 36864, maxBitrate: 128000, tier: 'L', level: 30 }, // Level 1 (Low Tier)\n    { maxPictureSize: 122880, maxBitrate: 1500000, tier: 'L', level: 60 }, // Level 2 (Low Tier)\n    { maxPictureSize: 245760, maxBitrate: 3000000, tier: 'L', level: 63 }, // Level 2.1 (Low Tier)\n    { maxPictureSize: 552960, maxBitrate: 6000000, tier: 'L', level: 90 }, // Level 3 (Low Tier)\n    { maxPictureSize: 983040, maxBitrate: 10000000, tier: 'L', level: 93 }, // Level 3.1 (Low Tier)\n    { maxPictureSize: 2228224, maxBitrate: 12000000, tier: 'L', level: 120 }, // Level 4 (Low Tier)\n    { maxPictureSize: 2228224, maxBitrate: 30000000, tier: 'H', level: 120 }, // Level 4 (High Tier)\n    { maxPictureSize: 2228224, maxBitrate: 20000000, tier: 'L', level: 123 }, // Level 4.1 (Low Tier)\n    { maxPictureSize: 2228224, maxBitrate: 50000000, tier: 'H', level: 123 }, // Level 4.1 (High Tier)\n    { maxPictureSize: 8912896, maxBitrate: 25000000, tier: 'L', level: 150 }, // Level 5 (Low Tier)\n    { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 150 }, // Level 5 (High Tier)\n    { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'L', level: 153 }, // Level 5.1 (Low Tier)\n    { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 153 }, // Level 5.1 (High Tier)\n    { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'L', level: 156 }, // Level 5.2 (Low Tier)\n    { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 156 }, // Level 5.2 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'L', level: 180 }, // Level 6 (Low Tier)\n    { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 180 }, // Level 6 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 120000000, tier: 'L', level: 183 }, // Level 6.1 (Low Tier)\n    { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 183 }, // Level 6.1 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'L', level: 186 }, // Level 6.2 (Low Tier)\n    { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 186 }, // Level 6.2 (High Tier)\n];\n// https://en.wikipedia.org/wiki/VP9\nexport const VP9_LEVEL_TABLE = [\n    { maxPictureSize: 36864, maxBitrate: 200000, level: 10 }, // Level 1\n    { maxPictureSize: 73728, maxBitrate: 800000, level: 11 }, // Level 1.1\n    { maxPictureSize: 122880, maxBitrate: 1800000, level: 20 }, // Level 2\n    { maxPictureSize: 245760, maxBitrate: 3600000, level: 21 }, // Level 2.1\n    { maxPictureSize: 552960, maxBitrate: 7200000, level: 30 }, // Level 3\n    { maxPictureSize: 983040, maxBitrate: 12000000, level: 31 }, // Level 3.1\n    { maxPictureSize: 2228224, maxBitrate: 18000000, level: 40 }, // Level 4\n    { maxPictureSize: 2228224, maxBitrate: 30000000, level: 41 }, // Level 4.1\n    { maxPictureSize: 8912896, maxBitrate: 60000000, level: 50 }, // Level 5\n    { maxPictureSize: 8912896, maxBitrate: 120000000, level: 51 }, // Level 5.1\n    { maxPictureSize: 8912896, maxBitrate: 180000000, level: 52 }, // Level 5.2\n    { maxPictureSize: 35651584, maxBitrate: 180000000, level: 60 }, // Level 6\n    { maxPictureSize: 35651584, maxBitrate: 240000000, level: 61 }, // Level 6.1\n    { maxPictureSize: 35651584, maxBitrate: 480000000, level: 62 }, // Level 6.2\n];\n// https://en.wikipedia.org/wiki/AV1\nconst AV1_LEVEL_TABLE = [\n    { maxPictureSize: 147456, maxBitrate: 1500000, tier: 'M', level: 0 }, // Level 2.0 (Main Tier)\n    { maxPictureSize: 278784, maxBitrate: 3000000, tier: 'M', level: 1 }, // Level 2.1 (Main Tier)\n    { maxPictureSize: 665856, maxBitrate: 6000000, tier: 'M', level: 4 }, // Level 3.0 (Main Tier)\n    { maxPictureSize: 1065024, maxBitrate: 10000000, tier: 'M', level: 5 }, // Level 3.1 (Main Tier)\n    { maxPictureSize: 2359296, maxBitrate: 12000000, tier: 'M', level: 8 }, // Level 4.0 (Main Tier)\n    { maxPictureSize: 2359296, maxBitrate: 30000000, tier: 'H', level: 8 }, // Level 4.0 (High Tier)\n    { maxPictureSize: 2359296, maxBitrate: 20000000, tier: 'M', level: 9 }, // Level 4.1 (Main Tier)\n    { maxPictureSize: 2359296, maxBitrate: 50000000, tier: 'H', level: 9 }, // Level 4.1 (High Tier)\n    { maxPictureSize: 8912896, maxBitrate: 30000000, tier: 'M', level: 12 }, // Level 5.0 (Main Tier)\n    { maxPictureSize: 8912896, maxBitrate: 100000000, tier: 'H', level: 12 }, // Level 5.0 (High Tier)\n    { maxPictureSize: 8912896, maxBitrate: 40000000, tier: 'M', level: 13 }, // Level 5.1 (Main Tier)\n    { maxPictureSize: 8912896, maxBitrate: 160000000, tier: 'H', level: 13 }, // Level 5.1 (High Tier)\n    { maxPictureSize: 8912896, maxBitrate: 60000000, tier: 'M', level: 14 }, // Level 5.2 (Main Tier)\n    { maxPictureSize: 8912896, maxBitrate: 240000000, tier: 'H', level: 14 }, // Level 5.2 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 15 }, // Level 5.3 (Main Tier)\n    { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 15 }, // Level 5.3 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 60000000, tier: 'M', level: 16 }, // Level 6.0 (Main Tier)\n    { maxPictureSize: 35651584, maxBitrate: 240000000, tier: 'H', level: 16 }, // Level 6.0 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 100000000, tier: 'M', level: 17 }, // Level 6.1 (Main Tier)\n    { maxPictureSize: 35651584, maxBitrate: 480000000, tier: 'H', level: 17 }, // Level 6.1 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 18 }, // Level 6.2 (Main Tier)\n    { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 18 }, // Level 6.2 (High Tier)\n    { maxPictureSize: 35651584, maxBitrate: 160000000, tier: 'M', level: 19 }, // Level 6.3 (Main Tier)\n    { maxPictureSize: 35651584, maxBitrate: 800000000, tier: 'H', level: 19 }, // Level 6.3 (High Tier)\n];\nconst VP9_DEFAULT_SUFFIX = '.01.01.01.01.00';\nconst AV1_DEFAULT_SUFFIX = '.0.110.01.01.01.0';\nexport const buildVideoCodecString = (codec, width, height, bitrate) => {\n    if (codec === 'avc') {\n        const profileIndication = 0x64; // High Profile\n        const totalMacroblocks = Math.ceil(width / 16) * Math.ceil(height / 16);\n        // Determine the level based on the table\n        const levelInfo = AVC_LEVEL_TABLE.find(level => totalMacroblocks <= level.maxMacroblocks && bitrate <= level.maxBitrate) ?? last(AVC_LEVEL_TABLE);\n        const levelIndication = levelInfo ? levelInfo.level : 0;\n        const hexProfileIndication = profileIndication.toString(16).padStart(2, '0');\n        const hexProfileCompatibility = '00';\n        const hexLevelIndication = levelIndication.toString(16).padStart(2, '0');\n        return `avc1.${hexProfileIndication}${hexProfileCompatibility}${hexLevelIndication}`;\n    }\n    else if (codec === 'hevc') {\n        const profilePrefix = ''; // Profile space 0\n        const profileIdc = 1; // Main Profile\n        const compatibilityFlags = '6'; // Taken from the example in ISO 14496-15\n        const pictureSize = width * height;\n        const levelInfo = HEVC_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(HEVC_LEVEL_TABLE);\n        const constraintFlags = 'B0'; // Progressive source flag\n        return 'hev1.'\n            + `${profilePrefix}${profileIdc}.`\n            + `${compatibilityFlags}.`\n            + `${levelInfo.tier}${levelInfo.level}.`\n            + `${constraintFlags}`;\n    }\n    else if (codec === 'vp8') {\n        return 'vp8'; // Easy, this one\n    }\n    else if (codec === 'vp9') {\n        const profile = '00'; // Profile 0\n        const pictureSize = width * height;\n        const levelInfo = VP9_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(VP9_LEVEL_TABLE);\n        const bitDepth = '08'; // 8-bit\n        return `vp09.${profile}.${levelInfo.level.toString().padStart(2, '0')}.${bitDepth}`;\n    }\n    else if (codec === 'av1') {\n        const profile = 0; // Main Profile, single digit\n        const pictureSize = width * height;\n        const levelInfo = AV1_LEVEL_TABLE.find(level => pictureSize <= level.maxPictureSize && bitrate <= level.maxBitrate) ?? last(AV1_LEVEL_TABLE);\n        const level = levelInfo.level.toString().padStart(2, '0');\n        const bitDepth = '08'; // 8-bit\n        return `av01.${profile}.${level}${levelInfo.tier}.${bitDepth}`;\n    }\n    // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n    throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const generateVp9CodecConfigurationFromCodecString = (codecString) => {\n    // Reference: https://www.webmproject.org/docs/container/#vp9-codec-feature-metadata-codecprivate\n    const parts = codecString.split('.'); // We can derive the required values from the codec string\n    const profile = Number(parts[1]);\n    const level = Number(parts[2]);\n    const bitDepth = Number(parts[3]);\n    const chromaSubsampling = parts[4] ? Number(parts[4]) : 1;\n    return [\n        1, 1, profile,\n        2, 1, level,\n        3, 1, bitDepth,\n        4, 1, chromaSubsampling,\n    ];\n};\nexport const generateAv1CodecConfigurationFromCodecString = (codecString) => {\n    // Reference: https://aomediacodec.github.io/av1-isobmff/\n    const parts = codecString.split('.'); // We can derive the required values from the codec string\n    const marker = 1;\n    const version = 1;\n    const firstByte = (marker << 7) + version;\n    const profile = Number(parts[1]);\n    const levelAndTier = parts[2];\n    const level = Number(levelAndTier.slice(0, -1));\n    const secondByte = (profile << 5) + level;\n    const tier = levelAndTier.slice(-1) === 'H' ? 1 : 0;\n    const bitDepth = Number(parts[3]);\n    const highBitDepth = bitDepth === 8 ? 0 : 1;\n    const twelveBit = 0;\n    const monochrome = parts[4] ? Number(parts[4]) : 0;\n    const chromaSubsamplingX = parts[5] ? Number(parts[5][0]) : 1;\n    const chromaSubsamplingY = parts[5] ? Number(parts[5][1]) : 1;\n    const chromaSamplePosition = parts[5] ? Number(parts[5][2]) : 0; // CSP_UNKNOWN\n    const thirdByte = (tier << 7)\n        + (highBitDepth << 6)\n        + (twelveBit << 5)\n        + (monochrome << 4)\n        + (chromaSubsamplingX << 3)\n        + (chromaSubsamplingY << 2)\n        + chromaSamplePosition;\n    const initialPresentationDelayPresent = 0; // Should be fine\n    const fourthByte = initialPresentationDelayPresent;\n    return [firstByte, secondByte, thirdByte, fourthByte];\n};\nexport const extractVideoCodecString = (trackInfo) => {\n    const { codec, codecDescription, colorSpace, avcCodecInfo, hevcCodecInfo, vp9CodecInfo, av1CodecInfo } = trackInfo;\n    if (codec === 'avc') {\n        assert(trackInfo.avcType !== null);\n        if (avcCodecInfo) {\n            const bytes = new Uint8Array([\n                avcCodecInfo.avcProfileIndication,\n                avcCodecInfo.profileCompatibility,\n                avcCodecInfo.avcLevelIndication,\n            ]);\n            return `avc${trackInfo.avcType}.${bytesToHexString(bytes)}`;\n        }\n        if (!codecDescription || codecDescription.byteLength < 4) {\n            throw new TypeError('AVC decoder description is not provided or is not at least 4 bytes long.');\n        }\n        return `avc${trackInfo.avcType}.${bytesToHexString(codecDescription.subarray(1, 4))}`;\n    }\n    else if (codec === 'hevc') {\n        let generalProfileSpace;\n        let generalProfileIdc;\n        let compatibilityFlags;\n        let generalTierFlag;\n        let generalLevelIdc;\n        let constraintFlags;\n        if (hevcCodecInfo) {\n            generalProfileSpace = hevcCodecInfo.generalProfileSpace;\n            generalProfileIdc = hevcCodecInfo.generalProfileIdc;\n            compatibilityFlags = reverseBitsU32(hevcCodecInfo.generalProfileCompatibilityFlags);\n            generalTierFlag = hevcCodecInfo.generalTierFlag;\n            generalLevelIdc = hevcCodecInfo.generalLevelIdc;\n            constraintFlags = [...hevcCodecInfo.generalConstraintIndicatorFlags];\n        }\n        else {\n            if (!codecDescription || codecDescription.byteLength < 23) {\n                throw new TypeError('HEVC decoder description is not provided or is not at least 23 bytes long.');\n            }\n            const view = toDataView(codecDescription);\n            const profileByte = view.getUint8(1);\n            generalProfileSpace = (profileByte >> 6) & 0x03;\n            generalProfileIdc = profileByte & 0x1F;\n            compatibilityFlags = reverseBitsU32(view.getUint32(2));\n            generalTierFlag = (profileByte >> 5) & 0x01;\n            generalLevelIdc = view.getUint8(12);\n            constraintFlags = [];\n            for (let i = 0; i < 6; i++) {\n                constraintFlags.push(view.getUint8(6 + i));\n            }\n        }\n        let codecString = 'hev1.';\n        codecString += ['', 'A', 'B', 'C'][generalProfileSpace] + generalProfileIdc;\n        codecString += '.';\n        codecString += compatibilityFlags.toString(16).toUpperCase();\n        codecString += '.';\n        codecString += generalTierFlag === 0 ? 'L' : 'H';\n        codecString += generalLevelIdc;\n        while (constraintFlags.length > 0 && constraintFlags[constraintFlags.length - 1] === 0) {\n            constraintFlags.pop();\n        }\n        if (constraintFlags.length > 0) {\n            codecString += '.';\n            codecString += constraintFlags.map(x => x.toString(16).toUpperCase()).join('.');\n        }\n        return codecString;\n    }\n    else if (codec === 'vp8') {\n        return 'vp8'; // Easy, this one\n    }\n    else if (codec === 'vp9') {\n        if (!vp9CodecInfo) {\n            // Calculate level based on dimensions\n            const pictureSize = trackInfo.width * trackInfo.height;\n            let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n            for (const entry of VP9_LEVEL_TABLE) {\n                if (pictureSize <= entry.maxPictureSize) {\n                    level = entry.level;\n                    break;\n                }\n            }\n            // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n            return `vp09.00.${level.toString().padStart(2, '0')}.08`;\n        }\n        const profile = vp9CodecInfo.profile.toString().padStart(2, '0');\n        const level = vp9CodecInfo.level.toString().padStart(2, '0');\n        const bitDepth = vp9CodecInfo.bitDepth.toString().padStart(2, '0');\n        const chromaSubsampling = vp9CodecInfo.chromaSubsampling.toString().padStart(2, '0');\n        const colourPrimaries = vp9CodecInfo.colourPrimaries.toString().padStart(2, '0');\n        const transferCharacteristics = vp9CodecInfo.transferCharacteristics.toString().padStart(2, '0');\n        const matrixCoefficients = vp9CodecInfo.matrixCoefficients.toString().padStart(2, '0');\n        const videoFullRangeFlag = vp9CodecInfo.videoFullRangeFlag.toString().padStart(2, '0');\n        let string = `vp09.${profile}.${level}.${bitDepth}.${chromaSubsampling}`;\n        string += `.${colourPrimaries}.${transferCharacteristics}.${matrixCoefficients}.${videoFullRangeFlag}`;\n        if (string.endsWith(VP9_DEFAULT_SUFFIX)) {\n            string = string.slice(0, -VP9_DEFAULT_SUFFIX.length);\n        }\n        return string;\n    }\n    else if (codec === 'av1') {\n        if (!av1CodecInfo) {\n            // Calculate level based on dimensions\n            const pictureSize = trackInfo.width * trackInfo.height;\n            let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n            for (const entry of VP9_LEVEL_TABLE) {\n                if (pictureSize <= entry.maxPictureSize) {\n                    level = entry.level;\n                    break;\n                }\n            }\n            // We don't really know better, so let's return a general-purpose, common codec string and hope for the best\n            return `av01.0.${level.toString().padStart(2, '0')}M.08`;\n        }\n        // https://aomediacodec.github.io/av1-isobmff/#codecsparam\n        const profile = av1CodecInfo.profile; // Single digit\n        const level = av1CodecInfo.level.toString().padStart(2, '0');\n        const tier = av1CodecInfo.tier ? 'H' : 'M';\n        const bitDepth = av1CodecInfo.bitDepth.toString().padStart(2, '0');\n        const monochrome = av1CodecInfo.monochrome ? '1' : '0';\n        const chromaSubsampling = 100 * av1CodecInfo.chromaSubsamplingX\n            + 10 * av1CodecInfo.chromaSubsamplingY\n            + 1 * (av1CodecInfo.chromaSubsamplingX && av1CodecInfo.chromaSubsamplingY\n                ? av1CodecInfo.chromaSamplePosition\n                : 0);\n        // The defaults are 1 (ITU-R BT.709)\n        const colorPrimaries = colorSpace?.primaries ? COLOR_PRIMARIES_MAP[colorSpace.primaries] : 1;\n        const transferCharacteristics = colorSpace?.transfer ? TRANSFER_CHARACTERISTICS_MAP[colorSpace.transfer] : 1;\n        const matrixCoefficients = colorSpace?.matrix ? MATRIX_COEFFICIENTS_MAP[colorSpace.matrix] : 1;\n        const videoFullRangeFlag = colorSpace?.fullRange ? 1 : 0;\n        let string = `av01.${profile}.${level}${tier}.${bitDepth}`;\n        string += `.${monochrome}.${chromaSubsampling.toString().padStart(3, '0')}`;\n        string += `.${colorPrimaries.toString().padStart(2, '0')}`;\n        string += `.${transferCharacteristics.toString().padStart(2, '0')}`;\n        string += `.${matrixCoefficients.toString().padStart(2, '0')}`;\n        string += `.${videoFullRangeFlag}`;\n        if (string.endsWith(AV1_DEFAULT_SUFFIX)) {\n            string = string.slice(0, -AV1_DEFAULT_SUFFIX.length);\n        }\n        return string;\n    }\n    throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const buildAudioCodecString = (codec, numberOfChannels, sampleRate) => {\n    if (codec === 'aac') {\n        // If stereo or higher channels and lower sample rate, likely using HE-AAC v2 with PS\n        if (numberOfChannels >= 2 && sampleRate <= 24000) {\n            return 'mp4a.40.29'; // HE-AAC v2 (AAC LC + SBR + PS)\n        }\n        // If sample rate is low, likely using HE-AAC v1 with SBR\n        if (sampleRate <= 24000) {\n            return 'mp4a.40.5'; // HE-AAC v1 (AAC LC + SBR)\n        }\n        // Default to standard AAC-LC for higher sample rates\n        return 'mp4a.40.2'; // AAC-LC\n    }\n    else if (codec === 'mp3') {\n        return 'mp3';\n    }\n    else if (codec === 'opus') {\n        return 'opus';\n    }\n    else if (codec === 'vorbis') {\n        return 'vorbis';\n    }\n    else if (codec === 'flac') {\n        return 'flac';\n    }\n    else if (codec === 'ac3') {\n        return 'ac-3';\n    }\n    else if (codec === 'eac3') {\n        return 'ec-3';\n    }\n    else if (PCM_AUDIO_CODECS.includes(codec)) {\n        return codec;\n    }\n    throw new TypeError(`Unhandled codec '${codec}'.`);\n};\nexport const extractAudioCodecString = (trackInfo) => {\n    const { codec, codecDescription, aacCodecInfo } = trackInfo;\n    if (codec === 'aac') {\n        if (!aacCodecInfo) {\n            throw new TypeError('AAC codec info must be provided.');\n        }\n        if (aacCodecInfo.isMpeg2) {\n            return 'mp4a.67';\n        }\n        else {\n            let objectType;\n            if (aacCodecInfo.objectType !== null) {\n                objectType = aacCodecInfo.objectType;\n            }\n            else {\n                const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription);\n                objectType = audioSpecificConfig.objectType;\n            }\n            return `mp4a.40.${objectType}`;\n        }\n    }\n    else if (codec === 'mp3') {\n        return 'mp3';\n    }\n    else if (codec === 'opus') {\n        return 'opus';\n    }\n    else if (codec === 'vorbis') {\n        return 'vorbis';\n    }\n    else if (codec === 'flac') {\n        return 'flac';\n    }\n    else if (codec === 'ac3') {\n        return 'ac-3';\n    }\n    else if (codec === 'eac3') {\n        return 'ec-3';\n    }\n    else if (codec && PCM_AUDIO_CODECS.includes(codec)) {\n        return codec;\n    }\n    throw new TypeError(`Unhandled codec '${codec}'.`);\n};\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const guessDescriptionForVideo = (decoderConfig) => {\n    return undefined; // All codecs allow an undefined description\n};\nexport const guessDescriptionForAudio = (decoderConfig) => {\n    switch (decoderConfig.codec) {\n        case 'flac':\n            {\n                const referenceDescription = base64ToBytes('ZkxhQ4AAACIQABAAAAYtACWtCsRC8AANRBhVFucAcYu5ASE2m1Dxv8tw');\n                if (decoderConfig.sampleRate >= (1 << 20) || decoderConfig.numberOfChannels > 8) {\n                    return false;\n                }\n                referenceDescription[18] = decoderConfig.sampleRate >>> 12;\n                referenceDescription[19] = decoderConfig.sampleRate >>> 4;\n                referenceDescription[20]\n                    = ((decoderConfig.sampleRate & 0x0f) << 4) | ((decoderConfig.numberOfChannels - 1) << 1);\n                return referenceDescription;\n            }\n            ;\n        case 'vorbis':\n            {\n                // eslint-disable-next-line @stylistic/max-len\n                const referenceDescription = base64ToBytes('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AAAAAAAAAAAIAAAYcAAACDChDBQashIAiAIAcCiKZQHHsSzgOJYFJMmyAJYF0DyApgFEEQAIAAAocAAACLBBU2JxgEJDVgIAUQAABsWxLE0TRZKkaZoniiRJ0zxPFGma53meacLzPM80IYqiaJoQRVE0TZimaaoqME1VFQAAUOAAABBgg6bE4gCFhqwEAEICAByKYlma5nmeJ4qmqZokSdM8TxRF0TRNU1VJkqZ5niiKommapqqyLE3zPFEURdNUVVWFpnmeKIqiaaqq6sLzPE8URdE0VdV14XmeJ4qiaJqq6roQRVE0TdNUTVV1XSCKpmmaqqqqrgtETxRNU1Vd13WB54miaaqqq7ouEE3TVFVVdV1ZBpimaaqq68oyQFVV1XVdV5YBqqqqruu6sgxQVdd1XVmWZQCu67qyLMsCAAAOHAAAAoygk4wqi7DRhAsPQKEhKwKAKAAAwBimFFPKMCYhpBAaxiSEFEImJaXSUqogpFJSKRWEVEoqJaOUUmopVRBSKamUCkIqJZVSAADYgQMA2IGFUGjISgAgDwCAMEYpxhhzTiKkFGPOOScRUoox55yTSjHmnHPOSSkZc8w556SUzjnnnHNSSuacc845KaVzzjnnnJRSSuecc05KKSWEzkEnpZTSOeecEwAAVOAAABBgo8jmBCNBhYasBABSAQAMjmNZmuZ5omialiRpmud5niiapiZJmuZ5nieKqsnzPE8URdE0VZXneZ4oiqJpqirXFUXTNE1VVV2yLIqmaZqq6rowTdNUVdd1XZimaaqq67oubFtVVdV1ZRm2raqq6rqyDFzXdWXZloEsu67s2rIAAPAEBwCgAhtWRzgpGgssNGQlAJABAEAYg5BCCCFlEEIKIYSUUggJAAAYcAAACDChDBQashIASAUAAIyx1lprrbXWQGettdZaa62AzFprrbXWWmuttdZaa6211lJrrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmstpZRSSimllFJKKaWUUkoppZRSSgUA+lU4APg/2LA6wknRWGChISsBgHAAAMAYpRhzDEIppVQIMeacdFRai7FCiDHnJKTUWmzFc85BKCGV1mIsnnMOQikpxVZjUSmEUlJKLbZYi0qho5JSSq3VWIwxqaTWWoutxmKMSSm01FqLMRYjbE2ptdhqq7EYY2sqLbQYY4zFCF9kbC2m2moNxggjWywt1VprMMYY3VuLpbaaizE++NpSLDHWXAAAd4MDAESCjTOsJJ0VjgYXGrISAAgJACAQUooxxhhzzjnnpFKMOeaccw5CCKFUijHGnHMOQgghlIwx5pxzEEIIIYRSSsaccxBCCCGEkFLqnHMQQgghhBBKKZ1zDkIIIYQQQimlgxBCCCGEEEoopaQUQgghhBBCCKmklEIIIYRSQighlZRSCCGEEEIpJaSUUgohhFJCCKGElFJKKYUQQgillJJSSimlEkoJJYQSUikppRRKCCGUUkpKKaVUSgmhhBJKKSWllFJKIYQQSikFAAAcOAAABBhBJxlVFmGjCRcegEJDVgIAZAAAkKKUUiktRYIipRikGEtGFXNQWoqocgxSzalSziDmJJaIMYSUk1Qy5hRCDELqHHVMKQYtlRhCxhik2HJLoXMOAAAAQQCAgJAAAAMEBTMAwOAA4XMQdAIERxsAgCBEZohEw0JweFAJEBFTAUBigkIuAFRYXKRdXECXAS7o4q4DIQQhCEEsDqCABByccMMTb3jCDU7QKSp1IAAAAAAADADwAACQXAAREdHMYWRobHB0eHyAhIiMkAgAAAAAABcAfAAAJCVAREQ0cxgZGhscHR4fICEiIyQBAIAAAgAAAAAggAAEBAQAAAAAAAIAAAAEBA==');\n                const view = toDataView(referenceDescription);\n                view.setUint8(15, decoderConfig.numberOfChannels);\n                view.setUint32(16, decoderConfig.sampleRate, true);\n                return referenceDescription;\n            }\n            ;\n        default: return undefined; // All other codecs allow an undefined description\n    }\n};\nexport const OPUS_SAMPLE_RATE = 48_000;\nconst PCM_CODEC_REGEX = /^pcm-([usf])(\\d+)(be)?$/;\nexport const parsePcmCodec = (codec) => {\n    assert(PCM_AUDIO_CODECS.includes(codec));\n    if (codec === 'ulaw') {\n        return { dataType: 'ulaw', sampleSize: 1, littleEndian: true, silentValue: 255 };\n    }\n    else if (codec === 'alaw') {\n        return { dataType: 'alaw', sampleSize: 1, littleEndian: true, silentValue: 213 };\n    }\n    const match = PCM_CODEC_REGEX.exec(codec);\n    assert(match);\n    let dataType;\n    if (match[1] === 'u') {\n        dataType = 'unsigned';\n    }\n    else if (match[1] === 's') {\n        dataType = 'signed';\n    }\n    else {\n        dataType = 'float';\n    }\n    const sampleSize = (Number(match[2]) / 8);\n    const littleEndian = match[3] !== 'be';\n    const silentValue = codec === 'pcm-u8' ? 2 ** 7 : 0;\n    return { dataType, sampleSize, littleEndian, silentValue };\n};\nexport const inferCodecFromCodecString = (codecString) => {\n    // Video codecs\n    if (codecString.startsWith('avc1') || codecString.startsWith('avc3')) {\n        return 'avc';\n    }\n    else if (codecString.startsWith('hev1') || codecString.startsWith('hvc1')) {\n        return 'hevc';\n    }\n    else if (codecString === 'vp8') {\n        return 'vp8';\n    }\n    else if (codecString.startsWith('vp09')) {\n        return 'vp9';\n    }\n    else if (codecString.startsWith('av01')) {\n        return 'av1';\n    }\n    // Audio codecs\n    if (codecString === 'mp3'\n        || codecString === 'mp4a.69'\n        || codecString === 'mp4a.6B'\n        || codecString === 'mp4a.6b'\n        || codecString === 'mp4a.40.34') {\n        return 'mp3';\n    }\n    else if (codecString.startsWith('mp4a.40.') || codecString === 'mp4a.67') {\n        return 'aac';\n    }\n    else if (codecString === 'opus') {\n        return 'opus';\n    }\n    else if (codecString === 'vorbis') {\n        return 'vorbis';\n    }\n    else if (codecString === 'flac') {\n        return 'flac';\n    }\n    else if (codecString === 'ac-3' || codecString === 'ac3') {\n        return 'ac3';\n    }\n    else if (codecString === 'ec-3' || codecString === 'eac3') {\n        return 'eac3';\n    }\n    else if (codecString === 'ulaw') {\n        return 'ulaw';\n    }\n    else if (codecString === 'alaw') {\n        return 'alaw';\n    }\n    else if (PCM_CODEC_REGEX.test(codecString)) {\n        return codecString;\n    }\n    // Subtitle codecs\n    if (codecString === 'webvtt') {\n        return 'webvtt';\n    }\n    return null;\n};\nexport const getVideoEncoderConfigExtension = (codec) => {\n    if (codec === 'avc') {\n        return {\n            avc: {\n                format: 'avc', // Ensure the format is not Annex B\n            },\n        };\n    }\n    else if (codec === 'hevc') {\n        return {\n            hevc: {\n                format: 'hevc', // Ensure the format is not Annex B\n            },\n        };\n    }\n    return {};\n};\nexport const getAudioEncoderConfigExtension = (codec) => {\n    if (codec === 'aac') {\n        return {\n            aac: {\n                format: 'aac', // Ensure the format is not ADTS\n            },\n        };\n    }\n    else if (codec === 'opus') {\n        return {\n            opus: {\n                format: 'opus',\n            },\n        };\n    }\n    return {};\n};\nconst VALID_VIDEO_CODEC_STRING_PREFIXES = ['avc1', 'avc3', 'hev1', 'hvc1', 'vp8', 'vp09', 'av01'];\nconst AVC_CODEC_STRING_REGEX = /^(avc1|avc3)\\.[0-9a-fA-F]{6}$/;\nconst HEVC_CODEC_STRING_REGEX = /^(hev1|hvc1)\\.(?:[ABC]?\\d+)\\.[0-9a-fA-F]{1,8}\\.[LH]\\d+(?:\\.[0-9a-fA-F]{1,2}){0,6}$/;\nconst VP9_CODEC_STRING_REGEX = /^vp09(?:\\.\\d{2}){3}(?:(?:\\.\\d{2}){5})?$/;\nconst AV1_CODEC_STRING_REGEX = /^av01\\.\\d\\.\\d{2}[MH]\\.\\d{2}(?:\\.\\d\\.\\d{3}\\.\\d{2}\\.\\d{2}\\.\\d{2}\\.\\d)?$/;\nexport const validateVideoChunkMetadata = (metadata) => {\n    if (!metadata) {\n        throw new TypeError('Video chunk metadata must be provided.');\n    }\n    if (typeof metadata !== 'object') {\n        throw new TypeError('Video chunk metadata must be an object.');\n    }\n    if (!metadata.decoderConfig) {\n        throw new TypeError('Video chunk metadata must include a decoder configuration.');\n    }\n    if (typeof metadata.decoderConfig !== 'object') {\n        throw new TypeError('Video chunk metadata decoder configuration must be an object.');\n    }\n    if (typeof metadata.decoderConfig.codec !== 'string') {\n        throw new TypeError('Video chunk metadata decoder configuration must specify a codec string.');\n    }\n    if (!VALID_VIDEO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n        throw new TypeError('Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in'\n            + ' the Mediabunny Codec Registry.');\n    }\n    if (!Number.isInteger(metadata.decoderConfig.codedWidth) || metadata.decoderConfig.codedWidth <= 0) {\n        throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).');\n    }\n    if (!Number.isInteger(metadata.decoderConfig.codedHeight) || metadata.decoderConfig.codedHeight <= 0) {\n        throw new TypeError('Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).');\n    }\n    if (metadata.decoderConfig.displayAspectWidth !== undefined\n        && (!Number.isInteger(metadata.decoderConfig.displayAspectWidth)\n            || metadata.decoderConfig.displayAspectWidth <= 0)) {\n        throw new TypeError('Video chunk metadata decoder configuration displayAspectWidth, when defined, must be a positive integer.');\n    }\n    if (metadata.decoderConfig.displayAspectHeight !== undefined\n        && (!Number.isInteger(metadata.decoderConfig.displayAspectHeight)\n            || metadata.decoderConfig.displayAspectHeight <= 0)) {\n        throw new TypeError('Video chunk metadata decoder configuration displayAspectHeight, when defined, must be a positive integer.');\n    }\n    if ((metadata.decoderConfig.displayAspectWidth !== undefined)\n        !== (metadata.decoderConfig.displayAspectHeight !== undefined)) {\n        throw new TypeError('Video chunk metadata decoder configuration must specify both displayAspectWidth and displayAspectHeight,'\n            + ' or neither.');\n    }\n    if (metadata.decoderConfig.description !== undefined) {\n        if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n            throw new TypeError('Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n                + ' ArrayBuffer view.');\n        }\n    }\n    if (metadata.decoderConfig.colorSpace !== undefined) {\n        const { colorSpace } = metadata.decoderConfig;\n        if (typeof colorSpace !== 'object') {\n            throw new TypeError('Video chunk metadata decoder configuration colorSpace, when provided, must be an object.');\n        }\n        const primariesValues = Object.keys(COLOR_PRIMARIES_MAP);\n        if (colorSpace.primaries != null && !primariesValues.includes(colorSpace.primaries)) {\n            throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of`\n                + ` ${primariesValues.join(', ')}.`);\n        }\n        const transferValues = Object.keys(TRANSFER_CHARACTERISTICS_MAP);\n        if (colorSpace.transfer != null && !transferValues.includes(colorSpace.transfer)) {\n            throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of`\n                + ` ${transferValues.join(', ')}.`);\n        }\n        const matrixValues = Object.keys(MATRIX_COEFFICIENTS_MAP);\n        if (colorSpace.matrix != null && !matrixValues.includes(colorSpace.matrix)) {\n            throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of`\n                + ` ${matrixValues.join(', ')}.`);\n        }\n        if (colorSpace.fullRange != null && typeof colorSpace.fullRange !== 'boolean') {\n            throw new TypeError('Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.');\n        }\n    }\n    if (metadata.decoderConfig.codec.startsWith('avc1') || metadata.decoderConfig.codec.startsWith('avc3')) {\n        // AVC-specific validation\n        if (!AVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n            throw new TypeError('Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as'\n                + ' specified in Section 3.4 of RFC 6381.');\n        }\n        // `description` may or may not be set, depending on if the format is AVCC or Annex B, so don't perform any\n        // validation for it.\n        // https://www.w3.org/TR/webcodecs-avc-codec-registration\n    }\n    else if (metadata.decoderConfig.codec.startsWith('hev1') || metadata.decoderConfig.codec.startsWith('hvc1')) {\n        // HEVC-specific validation\n        if (!HEVC_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n            throw new TypeError('Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as'\n                + ' specified in Section E.3 of ISO 14496-15.');\n        }\n        // `description` may or may not be set, depending on if the format is HEVC or Annex B, so don't perform any\n        // validation for it.\n        // https://www.w3.org/TR/webcodecs-hevc-codec-registration\n    }\n    else if (metadata.decoderConfig.codec.startsWith('vp8')) {\n        // VP8-specific validation\n        if (metadata.decoderConfig.codec !== 'vp8') {\n            throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be \"vp8\".');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('vp09')) {\n        // VP9-specific validation\n        if (!VP9_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n            throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as'\n                + ' specified in Section \"Codecs Parameter String\" of https://www.webmproject.org/vp9/mp4/.');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('av01')) {\n        // AV1-specific validation\n        if (!AV1_CODEC_STRING_REGEX.test(metadata.decoderConfig.codec)) {\n            throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as'\n                + ' specified in Section \"Codecs Parameter String\" of https://aomediacodec.github.io/av1-isobmff/.');\n        }\n    }\n};\nconst VALID_AUDIO_CODEC_STRING_PREFIXES = [\n    'mp4a', 'mp3', 'opus', 'vorbis', 'flac', 'ulaw', 'alaw', 'pcm', 'ac-3', 'ec-3',\n];\nexport const validateAudioChunkMetadata = (metadata) => {\n    if (!metadata) {\n        throw new TypeError('Audio chunk metadata must be provided.');\n    }\n    if (typeof metadata !== 'object') {\n        throw new TypeError('Audio chunk metadata must be an object.');\n    }\n    if (!metadata.decoderConfig) {\n        throw new TypeError('Audio chunk metadata must include a decoder configuration.');\n    }\n    if (typeof metadata.decoderConfig !== 'object') {\n        throw new TypeError('Audio chunk metadata decoder configuration must be an object.');\n    }\n    if (typeof metadata.decoderConfig.codec !== 'string') {\n        throw new TypeError('Audio chunk metadata decoder configuration must specify a codec string.');\n    }\n    if (!VALID_AUDIO_CODEC_STRING_PREFIXES.some(prefix => metadata.decoderConfig.codec.startsWith(prefix))) {\n        throw new TypeError('Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in'\n            + ' the Mediabunny Codec Registry.');\n    }\n    if (!Number.isInteger(metadata.decoderConfig.sampleRate) || metadata.decoderConfig.sampleRate <= 0) {\n        throw new TypeError('Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).');\n    }\n    if (!Number.isInteger(metadata.decoderConfig.numberOfChannels) || metadata.decoderConfig.numberOfChannels <= 0) {\n        throw new TypeError('Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).');\n    }\n    if (metadata.decoderConfig.description !== undefined) {\n        if (!isAllowSharedBufferSource(metadata.decoderConfig.description)) {\n            throw new TypeError('Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an'\n                + ' ArrayBuffer view.');\n        }\n    }\n    if (metadata.decoderConfig.codec.startsWith('mp4a')\n        // These three refer to MP3:\n        && metadata.decoderConfig.codec !== 'mp4a.69'\n        && metadata.decoderConfig.codec !== 'mp4a.6B'\n        && metadata.decoderConfig.codec !== 'mp4a.6b') {\n        // AAC-specific validation\n        const validStrings = ['mp4a.40.2', 'mp4a.40.02', 'mp4a.40.5', 'mp4a.40.05', 'mp4a.40.29', 'mp4a.67'];\n        if (!validStrings.includes(metadata.decoderConfig.codec)) {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as'\n                + ' specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.');\n        }\n        // `description` may or may not be set, depending on if the format is AAC or ADTS, so don't perform any\n        // validation for it.\n        // https://www.w3.org/TR/webcodecs-aac-codec-registration\n    }\n    else if (metadata.decoderConfig.codec.startsWith('mp3') || metadata.decoderConfig.codec.startsWith('mp4a')) {\n        // MP3-specific validation\n        if (metadata.decoderConfig.codec !== 'mp3'\n            && metadata.decoderConfig.codec !== 'mp4a.69'\n            && metadata.decoderConfig.codec !== 'mp4a.6B'\n            && metadata.decoderConfig.codec !== 'mp4a.6b') {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be \"mp3\", \"mp4a.69\" or'\n                + ' \"mp4a.6B\".');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('opus')) {\n        // Opus-specific validation\n        if (metadata.decoderConfig.codec !== 'opus') {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be \"opus\".');\n        }\n        if (metadata.decoderConfig.description && metadata.decoderConfig.description.byteLength < 18) {\n            // Description is optional for Opus per-spec, so we shouldn't enforce it\n            throw new TypeError('Audio chunk metadata decoder configuration description, when specified, is expected to be an'\n                + ' Identification Header as specified in Section 5.1 of RFC 7845.');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('vorbis')) {\n        // Vorbis-specific validation\n        if (metadata.decoderConfig.codec !== 'vorbis') {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be \"vorbis\".');\n        }\n        if (!metadata.decoderConfig.description) {\n            throw new TypeError('Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to'\n                + ' adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('flac')) {\n        // FLAC-specific validation\n        if (metadata.decoderConfig.codec !== 'flac') {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be \"flac\".');\n        }\n        const minDescriptionSize = 4 + 4 + 34; // 'fLaC' + metadata block header + STREAMINFO block\n        if (!metadata.decoderConfig.description || metadata.decoderConfig.description.byteLength < minDescriptionSize) {\n            throw new TypeError('Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to'\n                + ' adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('ac-3') || metadata.decoderConfig.codec.startsWith('ac3')) {\n        // AC3-specific validation\n        if (metadata.decoderConfig.codec !== 'ac-3') {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for AC-3 must be \"ac-3\".');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('ec-3') || metadata.decoderConfig.codec.startsWith('eac3')) {\n        // EAC3-specific validation\n        if (metadata.decoderConfig.codec !== 'ec-3') {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for EC-3 must be \"ec-3\".');\n        }\n    }\n    else if (metadata.decoderConfig.codec.startsWith('pcm')\n        || metadata.decoderConfig.codec.startsWith('ulaw')\n        || metadata.decoderConfig.codec.startsWith('alaw')) {\n        // PCM-specific validation\n        if (!PCM_AUDIO_CODECS.includes(metadata.decoderConfig.codec)) {\n            throw new TypeError('Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM'\n                + ` codecs (${PCM_AUDIO_CODECS.join(', ')}).`);\n        }\n    }\n};\nexport const validateSubtitleMetadata = (metadata) => {\n    if (!metadata) {\n        throw new TypeError('Subtitle metadata must be provided.');\n    }\n    if (typeof metadata !== 'object') {\n        throw new TypeError('Subtitle metadata must be an object.');\n    }\n    if (!metadata.config) {\n        throw new TypeError('Subtitle metadata must include a config object.');\n    }\n    if (typeof metadata.config !== 'object') {\n        throw new TypeError('Subtitle metadata config must be an object.');\n    }\n    if (typeof metadata.config.description !== 'string') {\n        throw new TypeError('Subtitle metadata config description must be a string.');\n    }\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/** Sample rates indexed by fscod (Table 4.1) */\nexport const AC3_SAMPLE_RATES = [48000, 44100, 32000];\n/** E-AC-3 reduced sample rates for fscod2 per ATSC A/52:2018 */\nexport const EAC3_REDUCED_SAMPLE_RATES = [24000, 22050, 16000];\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { AVC_LEVEL_TABLE, VP9_LEVEL_TABLE } from './codec.js';\nimport { assert, assertNever, base64ToBytes, bytesToBase64, keyValueIterator, getUint24, last, readExpGolomb, readSignedExpGolomb, textDecoder, textEncoder, toDataView, toUint8Array, getChromiumVersion, isChromium, setUint24, } from './misc.js';\nimport { Logging } from './logging.js';\nimport { AC3_SAMPLE_RATES, EAC3_REDUCED_SAMPLE_RATES } from '../shared/ac3-misc.js';\nimport { Bitstream } from '../shared/bitstream.js';\n// References for AVC/HEVC code:\n// ISO 14496-15\n// Rec. ITU-T H.264\n// Rec. ITU-T H.265\n// https://stackoverflow.com/questions/24884827\nexport var AvcNalUnitType;\n(function (AvcNalUnitType) {\n    AvcNalUnitType[AvcNalUnitType[\"NON_IDR_SLICE\"] = 1] = \"NON_IDR_SLICE\";\n    AvcNalUnitType[AvcNalUnitType[\"SLICE_DPA\"] = 2] = \"SLICE_DPA\";\n    AvcNalUnitType[AvcNalUnitType[\"SLICE_DPB\"] = 3] = \"SLICE_DPB\";\n    AvcNalUnitType[AvcNalUnitType[\"SLICE_DPC\"] = 4] = \"SLICE_DPC\";\n    AvcNalUnitType[AvcNalUnitType[\"IDR\"] = 5] = \"IDR\";\n    AvcNalUnitType[AvcNalUnitType[\"SEI\"] = 6] = \"SEI\";\n    AvcNalUnitType[AvcNalUnitType[\"SPS\"] = 7] = \"SPS\";\n    AvcNalUnitType[AvcNalUnitType[\"PPS\"] = 8] = \"PPS\";\n    AvcNalUnitType[AvcNalUnitType[\"AUD\"] = 9] = \"AUD\";\n    AvcNalUnitType[AvcNalUnitType[\"SPS_EXT\"] = 13] = \"SPS_EXT\";\n})(AvcNalUnitType || (AvcNalUnitType = {}));\nexport var HevcNalUnitType;\n(function (HevcNalUnitType) {\n    HevcNalUnitType[HevcNalUnitType[\"RASL_N\"] = 8] = \"RASL_N\";\n    HevcNalUnitType[HevcNalUnitType[\"RASL_R\"] = 9] = \"RASL_R\";\n    HevcNalUnitType[HevcNalUnitType[\"BLA_W_LP\"] = 16] = \"BLA_W_LP\";\n    HevcNalUnitType[HevcNalUnitType[\"RSV_IRAP_VCL23\"] = 23] = \"RSV_IRAP_VCL23\";\n    HevcNalUnitType[HevcNalUnitType[\"VPS_NUT\"] = 32] = \"VPS_NUT\";\n    HevcNalUnitType[HevcNalUnitType[\"SPS_NUT\"] = 33] = \"SPS_NUT\";\n    HevcNalUnitType[HevcNalUnitType[\"PPS_NUT\"] = 34] = \"PPS_NUT\";\n    HevcNalUnitType[HevcNalUnitType[\"AUD_NUT\"] = 35] = \"AUD_NUT\";\n    HevcNalUnitType[HevcNalUnitType[\"PREFIX_SEI_NUT\"] = 39] = \"PREFIX_SEI_NUT\";\n    HevcNalUnitType[HevcNalUnitType[\"SUFFIX_SEI_NUT\"] = 40] = \"SUFFIX_SEI_NUT\";\n})(HevcNalUnitType || (HevcNalUnitType = {}));\nexport const iterateNalUnitsInAnnexB = function* (packetData) {\n    let i = 0;\n    let nalStart = -1;\n    while (i < packetData.length - 2) {\n        const zeroIndex = packetData.indexOf(0, i);\n        if (zeroIndex === -1 || zeroIndex >= packetData.length - 2) {\n            break;\n        }\n        i = zeroIndex;\n        let startCodeLength = 0;\n        // Check for 4-byte start code (0x00000001)\n        if (i + 3 < packetData.length\n            && packetData[i + 1] === 0\n            && packetData[i + 2] === 0\n            && packetData[i + 3] === 1) {\n            startCodeLength = 4;\n        }\n        else if (packetData[i + 1] === 0 && packetData[i + 2] === 1) {\n            // Check for 3-byte start code (0x000001)\n            startCodeLength = 3;\n        }\n        if (startCodeLength === 0) {\n            i++;\n            continue;\n        }\n        // If we had a previous NAL unit, yield it\n        if (nalStart !== -1 && i > nalStart) {\n            yield {\n                offset: nalStart,\n                length: i - nalStart,\n            };\n        }\n        nalStart = i + startCodeLength;\n        i = nalStart;\n    }\n    // Yield the last NAL unit if there is one\n    if (nalStart !== -1 && nalStart < packetData.length) {\n        yield {\n            offset: nalStart,\n            length: packetData.length - nalStart,\n        };\n    }\n};\nexport const iterateNalUnitsInLengthPrefixed = function* (packetData, lengthSize) {\n    let offset = 0;\n    const dataView = new DataView(packetData.buffer, packetData.byteOffset, packetData.byteLength);\n    while (offset + lengthSize <= packetData.length) {\n        let nalUnitLength;\n        if (lengthSize === 1) {\n            nalUnitLength = dataView.getUint8(offset);\n        }\n        else if (lengthSize === 2) {\n            nalUnitLength = dataView.getUint16(offset, false);\n        }\n        else if (lengthSize === 3) {\n            nalUnitLength = getUint24(dataView, offset, false);\n        }\n        else {\n            assert(lengthSize === 4);\n            nalUnitLength = dataView.getUint32(offset, false);\n        }\n        offset += lengthSize;\n        yield {\n            offset,\n            length: nalUnitLength,\n        };\n        offset += nalUnitLength;\n    }\n};\nexport const iterateAvcNalUnits = (packetData, decoderConfig) => {\n    if (decoderConfig.description) {\n        const bytes = toUint8Array(decoderConfig.description);\n        const lengthSizeMinusOne = bytes[4] & 0b11;\n        const lengthSize = (lengthSizeMinusOne + 1);\n        return iterateNalUnitsInLengthPrefixed(packetData, lengthSize);\n    }\n    else {\n        return iterateNalUnitsInAnnexB(packetData);\n    }\n};\nexport const extractNalUnitTypeForAvc = (byte) => {\n    return byte & 0x1F;\n};\nconst removeEmulationPreventionBytes = (data) => {\n    const result = [];\n    const len = data.length;\n    for (let i = 0; i < len; i++) {\n        // Look for the 0x000003 pattern\n        if (i + 2 < len && data[i] === 0x00 && data[i + 1] === 0x00 && data[i + 2] === 0x03) {\n            result.push(0x00, 0x00); // Push the first two bytes\n            i += 2; // Skip the 0x03 byte\n        }\n        else {\n            result.push(data[i]);\n        }\n    }\n    return new Uint8Array(result);\n};\nconst ANNEX_B_START_CODE = new Uint8Array([0, 0, 0, 1]);\nexport const concatNalUnitsInAnnexB = (nalUnits) => {\n    const totalLength = nalUnits.reduce((a, b) => a + ANNEX_B_START_CODE.byteLength + b.byteLength, 0);\n    const result = new Uint8Array(totalLength);\n    let offset = 0;\n    for (const nalUnit of nalUnits) {\n        result.set(ANNEX_B_START_CODE, offset);\n        offset += ANNEX_B_START_CODE.byteLength;\n        result.set(nalUnit, offset);\n        offset += nalUnit.byteLength;\n    }\n    return result;\n};\nexport const concatNalUnitsInLengthPrefixed = (nalUnits, lengthSize) => {\n    const totalLength = nalUnits.reduce((a, b) => a + lengthSize + b.byteLength, 0);\n    const result = new Uint8Array(totalLength);\n    let offset = 0;\n    for (const nalUnit of nalUnits) {\n        const dataView = new DataView(result.buffer, result.byteOffset, result.byteLength);\n        switch (lengthSize) {\n            case 1:\n                dataView.setUint8(offset, nalUnit.byteLength);\n                break;\n            case 2:\n                dataView.setUint16(offset, nalUnit.byteLength, false);\n                break;\n            case 3:\n                setUint24(dataView, offset, nalUnit.byteLength, false);\n                break;\n            case 4:\n                dataView.setUint32(offset, nalUnit.byteLength, false);\n                break;\n        }\n        offset += lengthSize;\n        result.set(nalUnit, offset);\n        offset += nalUnit.byteLength;\n    }\n    return result;\n};\nexport const concatAvcNalUnits = (nalUnits, decoderConfig) => {\n    if (decoderConfig.description) {\n        // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config\n        const bytes = toUint8Array(decoderConfig.description);\n        const lengthSizeMinusOne = bytes[4] & 0b11;\n        const lengthSize = (lengthSizeMinusOne + 1);\n        return concatNalUnitsInLengthPrefixed(nalUnits, lengthSize);\n    }\n    else {\n        // Stream is in Annex B format\n        return concatNalUnitsInAnnexB(nalUnits);\n    }\n};\n/** Builds an AvcDecoderConfigurationRecord from an AVC packet in Annex B format. */\nexport const extractAvcDecoderConfigurationRecord = (packetData) => {\n    try {\n        const spsUnits = [];\n        const ppsUnits = [];\n        const spsExtUnits = [];\n        for (const loc of iterateNalUnitsInAnnexB(packetData)) {\n            const nalUnit = packetData.subarray(loc.offset, loc.offset + loc.length);\n            const type = extractNalUnitTypeForAvc(nalUnit[0]);\n            if (type === AvcNalUnitType.SPS) {\n                spsUnits.push(nalUnit);\n            }\n            else if (type === AvcNalUnitType.PPS) {\n                ppsUnits.push(nalUnit);\n            }\n            else if (type === AvcNalUnitType.SPS_EXT) {\n                spsExtUnits.push(nalUnit);\n            }\n        }\n        if (spsUnits.length === 0) {\n            return null;\n        }\n        if (ppsUnits.length === 0) {\n            return null;\n        }\n        // Let's get the first SPS for profile and level information\n        const spsData = spsUnits[0];\n        const spsInfo = parseAvcSps(spsData);\n        assert(spsInfo !== null);\n        const hasExtendedData = spsInfo.profileIdc === 100\n            || spsInfo.profileIdc === 110\n            || spsInfo.profileIdc === 122\n            || spsInfo.profileIdc === 144;\n        return {\n            configurationVersion: 1,\n            avcProfileIndication: spsInfo.profileIdc,\n            profileCompatibility: spsInfo.constraintFlags,\n            avcLevelIndication: spsInfo.levelIdc,\n            lengthSizeMinusOne: 3, // Typically 4 bytes for length field\n            sequenceParameterSets: spsUnits,\n            pictureParameterSets: ppsUnits,\n            chromaFormat: hasExtendedData ? spsInfo.chromaFormatIdc : null,\n            bitDepthLumaMinus8: hasExtendedData ? spsInfo.bitDepthLumaMinus8 : null,\n            bitDepthChromaMinus8: hasExtendedData ? spsInfo.bitDepthChromaMinus8 : null,\n            sequenceParameterSetExt: hasExtendedData ? spsExtUnits : null,\n        };\n    }\n    catch (error) {\n        Logging._error('Error building AVC Decoder Configuration Record:', error);\n        return null;\n    }\n};\n/** Serializes an AvcDecoderConfigurationRecord into the format specified in Section 5.3.3.1 of ISO 14496-15. */\nexport const serializeAvcDecoderConfigurationRecord = (record) => {\n    const bytes = [];\n    // Write header\n    bytes.push(record.configurationVersion);\n    bytes.push(record.avcProfileIndication);\n    bytes.push(record.profileCompatibility);\n    bytes.push(record.avcLevelIndication);\n    bytes.push(0xFC | (record.lengthSizeMinusOne & 0x03)); // Reserved bits (6) + lengthSizeMinusOne (2)\n    // Reserved bits (3) + numOfSequenceParameterSets (5)\n    bytes.push(0xE0 | (record.sequenceParameterSets.length & 0x1F));\n    // Write SPS\n    for (const sps of record.sequenceParameterSets) {\n        const length = sps.byteLength;\n        bytes.push(length >> 8); // High byte\n        bytes.push(length & 0xFF); // Low byte\n        for (let i = 0; i < length; i++) {\n            bytes.push(sps[i]);\n        }\n    }\n    bytes.push(record.pictureParameterSets.length);\n    // Write PPS\n    for (const pps of record.pictureParameterSets) {\n        const length = pps.byteLength;\n        bytes.push(length >> 8); // High byte\n        bytes.push(length & 0xFF); // Low byte\n        for (let i = 0; i < length; i++) {\n            bytes.push(pps[i]);\n        }\n    }\n    if (record.avcProfileIndication === 100\n        || record.avcProfileIndication === 110\n        || record.avcProfileIndication === 122\n        || record.avcProfileIndication === 144) {\n        assert(record.chromaFormat !== null);\n        assert(record.bitDepthLumaMinus8 !== null);\n        assert(record.bitDepthChromaMinus8 !== null);\n        assert(record.sequenceParameterSetExt !== null);\n        bytes.push(0xFC | (record.chromaFormat & 0x03)); // Reserved bits + chroma_format\n        bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07)); // Reserved bits + bit_depth_luma_minus8\n        bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07)); // Reserved bits + bit_depth_chroma_minus8\n        bytes.push(record.sequenceParameterSetExt.length);\n        // Write SPS Ext\n        for (const spsExt of record.sequenceParameterSetExt) {\n            const length = spsExt.byteLength;\n            bytes.push(length >> 8); // High byte\n            bytes.push(length & 0xFF); // Low byte\n            for (let i = 0; i < length; i++) {\n                bytes.push(spsExt[i]);\n            }\n        }\n    }\n    return new Uint8Array(bytes);\n};\n/** Deserializes an AvcDecoderConfigurationRecord from the format specified in Section 5.3.3.1 of ISO 14496-15. */\nexport const deserializeAvcDecoderConfigurationRecord = (data) => {\n    try {\n        const view = toDataView(data);\n        let offset = 0;\n        // Read header\n        const configurationVersion = view.getUint8(offset++);\n        const avcProfileIndication = view.getUint8(offset++);\n        const profileCompatibility = view.getUint8(offset++);\n        const avcLevelIndication = view.getUint8(offset++);\n        const lengthSizeMinusOne = view.getUint8(offset++) & 0x03;\n        const numOfSequenceParameterSets = view.getUint8(offset++) & 0x1F;\n        // Read SPS\n        const sequenceParameterSets = [];\n        for (let i = 0; i < numOfSequenceParameterSets; i++) {\n            const length = view.getUint16(offset, false);\n            offset += 2;\n            sequenceParameterSets.push(data.subarray(offset, offset + length));\n            offset += length;\n        }\n        const numOfPictureParameterSets = view.getUint8(offset++);\n        // Read PPS\n        const pictureParameterSets = [];\n        for (let i = 0; i < numOfPictureParameterSets; i++) {\n            const length = view.getUint16(offset, false);\n            offset += 2;\n            pictureParameterSets.push(data.subarray(offset, offset + length));\n            offset += length;\n        }\n        const record = {\n            configurationVersion,\n            avcProfileIndication,\n            profileCompatibility,\n            avcLevelIndication,\n            lengthSizeMinusOne,\n            sequenceParameterSets,\n            pictureParameterSets,\n            chromaFormat: null,\n            bitDepthLumaMinus8: null,\n            bitDepthChromaMinus8: null,\n            sequenceParameterSetExt: null,\n        };\n        // Check if there are extended profile fields\n        if ((avcProfileIndication === 100\n            || avcProfileIndication === 110\n            || avcProfileIndication === 122\n            || avcProfileIndication === 144)\n            && offset + 4 <= data.length) {\n            const chromaFormat = view.getUint8(offset++) & 0x03;\n            const bitDepthLumaMinus8 = view.getUint8(offset++) & 0x07;\n            const bitDepthChromaMinus8 = view.getUint8(offset++) & 0x07;\n            const numOfSequenceParameterSetExt = view.getUint8(offset++);\n            record.chromaFormat = chromaFormat;\n            record.bitDepthLumaMinus8 = bitDepthLumaMinus8;\n            record.bitDepthChromaMinus8 = bitDepthChromaMinus8;\n            // Read SPS Ext\n            const sequenceParameterSetExt = [];\n            for (let i = 0; i < numOfSequenceParameterSetExt; i++) {\n                const length = view.getUint16(offset, false);\n                offset += 2;\n                sequenceParameterSetExt.push(data.subarray(offset, offset + length));\n                offset += length;\n            }\n            record.sequenceParameterSetExt = sequenceParameterSetExt;\n        }\n        return record;\n    }\n    catch (error) {\n        Logging._error('Error deserializing AVC Decoder Configuration Record:', error);\n        return null;\n    }\n};\nconst AVC_HEVC_ASPECT_RATIO_IDC_TABLE = {\n    1: { num: 1, den: 1 },\n    2: { num: 12, den: 11 },\n    3: { num: 10, den: 11 },\n    4: { num: 16, den: 11 },\n    5: { num: 40, den: 33 },\n    6: { num: 24, den: 11 },\n    7: { num: 20, den: 11 },\n    8: { num: 32, den: 11 },\n    9: { num: 80, den: 33 },\n    10: { num: 18, den: 11 },\n    11: { num: 15, den: 11 },\n    12: { num: 64, den: 33 },\n    13: { num: 160, den: 99 },\n    14: { num: 4, den: 3 },\n    15: { num: 3, den: 2 },\n    16: { num: 2, den: 1 },\n};\n/** Parses an AVC SPS (Sequence Parameter Set) to extract basic information. */\nexport const parseAvcSps = (sps) => {\n    try {\n        const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n        bitstream.skipBits(1); // forbidden_zero_bit\n        bitstream.skipBits(2); // nal_ref_idc\n        const nalUnitType = bitstream.readBits(5);\n        if (nalUnitType !== 7) { // SPS NAL unit type is 7\n            return null;\n        }\n        const profileIdc = bitstream.readAlignedByte();\n        const constraintFlags = bitstream.readAlignedByte();\n        const levelIdc = bitstream.readAlignedByte();\n        readExpGolomb(bitstream); // seq_parameter_set_id\n        // \"When chroma_format_idc is not present, it shall be inferred to be equal to 1 (4:2:0 chroma format).\"\n        let chromaFormatIdc = 1;\n        // \"When bit_depth_luma_minus8 is not present, it shall be inferred to be equal to 0.\"\"\n        let bitDepthLumaMinus8 = 0;\n        // \"When bit_depth_chroma_minus8 is not present, it shall be inferred to be equal to 0.\"\n        let bitDepthChromaMinus8 = 0;\n        // \"When separate_colour_plane_flag is not present, it shall be inferred to be equal to 0.\"\n        let separateColourPlaneFlag = 0;\n        // Handle high profile chroma_format_idc\n        if (profileIdc === 100\n            || profileIdc === 110\n            || profileIdc === 122\n            || profileIdc === 244\n            || profileIdc === 44\n            || profileIdc === 83\n            || profileIdc === 86\n            || profileIdc === 118\n            || profileIdc === 128) {\n            chromaFormatIdc = readExpGolomb(bitstream);\n            if (chromaFormatIdc === 3) {\n                separateColourPlaneFlag = bitstream.readBits(1);\n            }\n            bitDepthLumaMinus8 = readExpGolomb(bitstream);\n            bitDepthChromaMinus8 = readExpGolomb(bitstream);\n            bitstream.skipBits(1); // qpprime_y_zero_transform_bypass_flag\n            const seqScalingMatrixPresentFlag = bitstream.readBits(1);\n            if (seqScalingMatrixPresentFlag) {\n                for (let i = 0; i < (chromaFormatIdc !== 3 ? 8 : 12); i++) {\n                    const seqScalingListPresentFlag = bitstream.readBits(1);\n                    if (seqScalingListPresentFlag) {\n                        const sizeOfScalingList = i < 6 ? 16 : 64;\n                        let lastScale = 8;\n                        let nextScale = 8;\n                        for (let j = 0; j < sizeOfScalingList; j++) {\n                            if (nextScale !== 0) {\n                                const deltaScale = readSignedExpGolomb(bitstream);\n                                nextScale = (lastScale + deltaScale + 256) % 256;\n                            }\n                            lastScale = nextScale === 0 ? lastScale : nextScale;\n                        }\n                    }\n                }\n            }\n        }\n        readExpGolomb(bitstream); // log2_max_frame_num_minus4\n        const picOrderCntType = readExpGolomb(bitstream);\n        if (picOrderCntType === 0) {\n            readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n        }\n        else if (picOrderCntType === 1) {\n            bitstream.skipBits(1); // delta_pic_order_always_zero_flag\n            readSignedExpGolomb(bitstream); // offset_for_non_ref_pic\n            readSignedExpGolomb(bitstream); // offset_for_top_to_bottom_field\n            const numRefFramesInPicOrderCntCycle = readExpGolomb(bitstream);\n            for (let i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n                readSignedExpGolomb(bitstream); // offset_for_ref_frame[i]\n            }\n        }\n        readExpGolomb(bitstream); // max_num_ref_frames\n        bitstream.skipBits(1); // gaps_in_frame_num_value_allowed_flag\n        const picWidthInMbsMinus1 = readExpGolomb(bitstream);\n        const picHeightInMapUnitsMinus1 = readExpGolomb(bitstream);\n        const codedWidth = 16 * (picWidthInMbsMinus1 + 1);\n        const codedHeight = 16 * (picHeightInMapUnitsMinus1 + 1);\n        let displayWidth = codedWidth;\n        let displayHeight = codedHeight;\n        const frameMbsOnlyFlag = bitstream.readBits(1);\n        if (!frameMbsOnlyFlag) {\n            bitstream.skipBits(1); // mb_adaptive_frame_field_flag\n        }\n        bitstream.skipBits(1); // direct_8x8_inference_flag\n        const frameCroppingFlag = bitstream.readBits(1);\n        if (frameCroppingFlag) {\n            const frameCropLeftOffset = readExpGolomb(bitstream);\n            const frameCropRightOffset = readExpGolomb(bitstream);\n            const frameCropTopOffset = readExpGolomb(bitstream);\n            const frameCropBottomOffset = readExpGolomb(bitstream);\n            let cropUnitX;\n            let cropUnitY;\n            const chromaArrayType = separateColourPlaneFlag === 0 ? chromaFormatIdc : 0;\n            if (chromaArrayType === 0) {\n                // \"If ChromaArrayType is equal to 0, CropUnitX and CropUnitY are derived as:\"\n                cropUnitX = 1;\n                cropUnitY = 2 - frameMbsOnlyFlag;\n            }\n            else {\n                // \"Otherwise (ChromaArrayType is equal to 1, 2, or 3), CropUnitX and CropUnitY are derived as:\"\n                const subWidthC = chromaFormatIdc === 3 ? 1 : 2;\n                const subHeightC = chromaFormatIdc === 1 ? 2 : 1;\n                cropUnitX = subWidthC;\n                cropUnitY = subHeightC * (2 - frameMbsOnlyFlag);\n            }\n            displayWidth -= (cropUnitX * (frameCropLeftOffset + frameCropRightOffset));\n            displayHeight -= (cropUnitY * (frameCropTopOffset + frameCropBottomOffset));\n        }\n        // 2 = unspecified\n        let colourPrimaries = 2;\n        let transferCharacteristics = 2;\n        let matrixCoefficients = 2;\n        let fullRangeFlag = 0;\n        let pixelAspectRatio = { num: 1, den: 1 };\n        let numReorderFrames = null;\n        let maxDecFrameBuffering = null;\n        const vuiParametersPresentFlag = bitstream.readBits(1);\n        if (vuiParametersPresentFlag) {\n            const aspectRatioInfoPresentFlag = bitstream.readBits(1);\n            if (aspectRatioInfoPresentFlag) {\n                const aspectRatioIdc = bitstream.readBits(8);\n                if (aspectRatioIdc === 255) { // Extended_SAR\n                    pixelAspectRatio = {\n                        num: bitstream.readBits(16),\n                        den: bitstream.readBits(16),\n                    };\n                }\n                else {\n                    const aspectRatio = AVC_HEVC_ASPECT_RATIO_IDC_TABLE[aspectRatioIdc];\n                    if (aspectRatio) {\n                        pixelAspectRatio = aspectRatio;\n                    }\n                }\n            }\n            const overscanInfoPresentFlag = bitstream.readBits(1);\n            if (overscanInfoPresentFlag) {\n                bitstream.skipBits(1); // overscan_appropriate_flag\n            }\n            const videoSignalTypePresentFlag = bitstream.readBits(1);\n            if (videoSignalTypePresentFlag) {\n                bitstream.skipBits(3); // video_format\n                fullRangeFlag = bitstream.readBits(1);\n                const colourDescriptionPresentFlag = bitstream.readBits(1);\n                if (colourDescriptionPresentFlag) {\n                    colourPrimaries = bitstream.readBits(8);\n                    transferCharacteristics = bitstream.readBits(8);\n                    matrixCoefficients = bitstream.readBits(8);\n                }\n            }\n            const chromaLocInfoPresentFlag = bitstream.readBits(1);\n            if (chromaLocInfoPresentFlag) {\n                readExpGolomb(bitstream); // chroma_sample_loc_type_top_field\n                readExpGolomb(bitstream); // chroma_sample_loc_type_bottom_field\n            }\n            const timingInfoPresentFlag = bitstream.readBits(1);\n            if (timingInfoPresentFlag) {\n                bitstream.skipBits(32); // num_units_in_tick\n                bitstream.skipBits(32); // time_scale\n                bitstream.skipBits(1); // fixed_frame_rate_flag\n            }\n            const nalHrdParametersPresentFlag = bitstream.readBits(1);\n            if (nalHrdParametersPresentFlag) {\n                skipAvcHrdParameters(bitstream);\n            }\n            const vclHrdParametersPresentFlag = bitstream.readBits(1);\n            if (vclHrdParametersPresentFlag) {\n                skipAvcHrdParameters(bitstream);\n            }\n            if (nalHrdParametersPresentFlag || vclHrdParametersPresentFlag) {\n                bitstream.skipBits(1); // low_delay_hrd_flag\n            }\n            bitstream.skipBits(1); // pic_struct_present_flag\n            const bitstreamRestrictionFlag = bitstream.readBits(1);\n            if (bitstreamRestrictionFlag) {\n                bitstream.skipBits(1); // motion_vectors_over_pic_boundaries_flag\n                readExpGolomb(bitstream); // max_bytes_per_pic_denom\n                readExpGolomb(bitstream); // max_bits_per_mb_denom\n                readExpGolomb(bitstream); // log2_max_mv_length_horizontal\n                readExpGolomb(bitstream); // log2_max_mv_length_vertical\n                numReorderFrames = readExpGolomb(bitstream);\n                maxDecFrameBuffering = readExpGolomb(bitstream);\n            }\n        }\n        if (numReorderFrames === null) {\n            assert(maxDecFrameBuffering === null);\n            const constraintSet3Flag = constraintFlags & 0b00010000;\n            if ((profileIdc === 44 || profileIdc === 86 || profileIdc === 100\n                || profileIdc === 110 || profileIdc === 122 || profileIdc === 244) && constraintSet3Flag) {\n                // \"If profile_idc is equal to 44, 86, 100, 110, 122, or 244 and constraint_set3_flag is equal to 1, the\n                // value of num_reorder_frames shall be inferred to be equal to 0.\"\n                numReorderFrames = 0;\n                maxDecFrameBuffering = 0;\n            }\n            else {\n                const picWidthInMbs = picWidthInMbsMinus1 + 1;\n                const picHeightInMapUnits = picHeightInMapUnitsMinus1 + 1;\n                const frameHeightInMbs = (2 - frameMbsOnlyFlag) * picHeightInMapUnits;\n                const levelInfo = AVC_LEVEL_TABLE.find(x => x.level >= levelIdc) ?? last(AVC_LEVEL_TABLE);\n                // \"MaxDpbFrames is equal to\n                // Min( MaxDpbMbs / ( picWidthInMbs * frameHeightInMbs ), 16 ) and MaxDpbMbs is given in Table A-1.\"\n                const maxDpbFrames = Math.min(Math.floor(levelInfo.maxDpbMbs / (picWidthInMbs * frameHeightInMbs)), 16);\n                // \"Otherwise, [...] the value of num_reorder_frames shall be inferred to be equal to MaxDpbFrames.\"\n                numReorderFrames = maxDpbFrames;\n                maxDecFrameBuffering = maxDpbFrames;\n            }\n        }\n        assert(maxDecFrameBuffering !== null);\n        return {\n            profileIdc,\n            constraintFlags,\n            levelIdc,\n            frameMbsOnlyFlag,\n            chromaFormatIdc,\n            bitDepthLumaMinus8,\n            bitDepthChromaMinus8,\n            codedWidth,\n            codedHeight,\n            displayWidth,\n            displayHeight,\n            pixelAspectRatio,\n            colourPrimaries,\n            matrixCoefficients,\n            transferCharacteristics,\n            fullRangeFlag,\n            numReorderFrames,\n            maxDecFrameBuffering,\n        };\n    }\n    catch (error) {\n        Logging._error('Error parsing AVC SPS:', error);\n        return null;\n    }\n};\nconst skipAvcHrdParameters = (bitstream) => {\n    const cpb_cnt_minus1 = readExpGolomb(bitstream);\n    bitstream.skipBits(4); // bit_rate_scale\n    bitstream.skipBits(4); // cpb_size_scale\n    for (let i = 0; i <= cpb_cnt_minus1; i++) {\n        readExpGolomb(bitstream); // bit_rate_value_minus1[i]\n        readExpGolomb(bitstream); // cpb_size_value_minus1[i]\n        bitstream.skipBits(1); // cbr_flag[i]\n    }\n    bitstream.skipBits(5); // initial_cpb_removal_delay_length_minus1\n    bitstream.skipBits(5); // cpb_removal_delay_length_minus1\n    bitstream.skipBits(5); // dpb_output_delay_length_minus1\n    bitstream.skipBits(5); // time_offset_length\n};\nexport const concatHevcNalUnits = (nalUnits, decoderConfig) => {\n    if (decoderConfig.description) {\n        // Stream is length-prefixed. Let's extract the size of the length prefix from the decoder config\n        const bytes = toUint8Array(decoderConfig.description);\n        const lengthSizeMinusOne = bytes[21] & 0b11;\n        const lengthSize = (lengthSizeMinusOne + 1);\n        return concatNalUnitsInLengthPrefixed(nalUnits, lengthSize);\n    }\n    else {\n        // Stream is in Annex B format\n        return concatNalUnitsInAnnexB(nalUnits);\n    }\n};\nexport const iterateHevcNalUnits = (packetData, decoderConfig) => {\n    if (decoderConfig.description) {\n        const bytes = toUint8Array(decoderConfig.description);\n        const lengthSizeMinusOne = bytes[21] & 0b11;\n        const lengthSize = (lengthSizeMinusOne + 1);\n        return iterateNalUnitsInLengthPrefixed(packetData, lengthSize);\n    }\n    else {\n        return iterateNalUnitsInAnnexB(packetData);\n    }\n};\nexport const extractNalUnitTypeForHevc = (byte) => {\n    return (byte >> 1) & 0x3F;\n};\n/** Parses an HEVC SPS (Sequence Parameter Set) to extract video information. */\nexport const parseHevcSps = (sps) => {\n    try {\n        const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n        bitstream.skipBits(16); // NAL header\n        bitstream.readBits(4); // sps_video_parameter_set_id\n        const spsMaxSubLayersMinus1 = bitstream.readBits(3);\n        const spsTemporalIdNestingFlag = bitstream.readBits(1);\n        const { general_profile_space, general_tier_flag, general_profile_idc, general_profile_compatibility_flags, general_constraint_indicator_flags, general_level_idc, } = parseProfileTierLevel(bitstream, spsMaxSubLayersMinus1);\n        readExpGolomb(bitstream); // sps_seq_parameter_set_id\n        const chromaFormatIdc = readExpGolomb(bitstream);\n        let separateColourPlaneFlag = 0;\n        if (chromaFormatIdc === 3) {\n            separateColourPlaneFlag = bitstream.readBits(1);\n        }\n        const picWidthInLumaSamples = readExpGolomb(bitstream);\n        const picHeightInLumaSamples = readExpGolomb(bitstream);\n        let displayWidth = picWidthInLumaSamples;\n        let displayHeight = picHeightInLumaSamples;\n        if (bitstream.readBits(1)) { // conformance_window_flag\n            const confWinLeftOffset = readExpGolomb(bitstream);\n            const confWinRightOffset = readExpGolomb(bitstream);\n            const confWinTopOffset = readExpGolomb(bitstream);\n            const confWinBottomOffset = readExpGolomb(bitstream);\n            // SubWidthC and SubHeightC depend on chroma_format_idc and separate_colour_plane_flag\n            let subWidthC = 1;\n            let subHeightC = 1;\n            const chromaArrayType = separateColourPlaneFlag === 0 ? chromaFormatIdc : 0;\n            if (chromaArrayType === 1) {\n                subWidthC = 2;\n                subHeightC = 2;\n            }\n            else if (chromaArrayType === 2) {\n                subWidthC = 2;\n                subHeightC = 1;\n            }\n            displayWidth -= (confWinLeftOffset + confWinRightOffset) * subWidthC;\n            displayHeight -= (confWinTopOffset + confWinBottomOffset) * subHeightC;\n        }\n        const bitDepthLumaMinus8 = readExpGolomb(bitstream);\n        const bitDepthChromaMinus8 = readExpGolomb(bitstream);\n        readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n        const spsSubLayerOrderingInfoPresentFlag = bitstream.readBits(1);\n        const startI = spsSubLayerOrderingInfoPresentFlag ? 0 : spsMaxSubLayersMinus1;\n        let spsMaxNumReorderPics = 0;\n        for (let i = startI; i <= spsMaxSubLayersMinus1; i++) {\n            readExpGolomb(bitstream); // sps_max_dec_pic_buffering_minus1[i]\n            spsMaxNumReorderPics = readExpGolomb(bitstream); // sps_max_num_reorder_pics[i]\n            readExpGolomb(bitstream); // sps_max_latency_increase_plus1[i]\n        }\n        readExpGolomb(bitstream); // log2_min_luma_coding_block_size_minus3\n        readExpGolomb(bitstream); // log2_diff_max_min_luma_coding_block_size\n        readExpGolomb(bitstream); // log2_min_luma_transform_block_size_minus2\n        readExpGolomb(bitstream); // log2_diff_max_min_luma_transform_block_size\n        readExpGolomb(bitstream); // max_transform_hierarchy_depth_inter\n        readExpGolomb(bitstream); // max_transform_hierarchy_depth_intra\n        if (bitstream.readBits(1)) { // scaling_list_enabled_flag\n            if (bitstream.readBits(1)) {\n                skipScalingListData(bitstream);\n            }\n        }\n        bitstream.skipBits(1); // amp_enabled_flag\n        bitstream.skipBits(1); // sample_adaptive_offset_enabled_flag\n        if (bitstream.readBits(1)) { // pcm_enabled_flag\n            bitstream.skipBits(4); // pcm_sample_bit_depth_luma_minus1\n            bitstream.skipBits(4); // pcm_sample_bit_depth_chroma_minus1\n            readExpGolomb(bitstream); // log2_min_pcm_luma_coding_block_size_minus3\n            readExpGolomb(bitstream); // log2_diff_max_min_pcm_luma_coding_block_size\n            bitstream.skipBits(1); // pcm_loop_filter_disabled_flag\n        }\n        const numShortTermRefPicSets = readExpGolomb(bitstream);\n        skipAllStRefPicSets(bitstream, numShortTermRefPicSets);\n        if (bitstream.readBits(1)) { // long_term_ref_pics_present_flag\n            const numLongTermRefPicsSps = readExpGolomb(bitstream);\n            for (let i = 0; i < numLongTermRefPicsSps; i++) {\n                readExpGolomb(bitstream); // lt_ref_pic_poc_lsb_sps[i]\n                bitstream.skipBits(1); // used_by_curr_pic_lt_sps_flag[i]\n            }\n        }\n        bitstream.skipBits(1); // sps_temporal_mvp_enabled_flag\n        bitstream.skipBits(1); // strong_intra_smoothing_enabled_flag\n        let colourPrimaries = 2;\n        let transferCharacteristics = 2;\n        let matrixCoefficients = 2;\n        let fullRangeFlag = 0;\n        let minSpatialSegmentationIdc = 0;\n        let pixelAspectRatio = { num: 1, den: 1 };\n        if (bitstream.readBits(1)) { // vui_parameters_present_flag\n            const vui = parseHevcVui(bitstream, spsMaxSubLayersMinus1);\n            pixelAspectRatio = vui.pixelAspectRatio;\n            colourPrimaries = vui.colourPrimaries;\n            transferCharacteristics = vui.transferCharacteristics;\n            matrixCoefficients = vui.matrixCoefficients;\n            fullRangeFlag = vui.fullRangeFlag;\n            minSpatialSegmentationIdc = vui.minSpatialSegmentationIdc;\n        }\n        return {\n            displayWidth,\n            displayHeight,\n            pixelAspectRatio,\n            colourPrimaries,\n            transferCharacteristics,\n            matrixCoefficients,\n            fullRangeFlag,\n            maxDecFrameBuffering: spsMaxNumReorderPics + 1,\n            spsMaxSubLayersMinus1,\n            spsTemporalIdNestingFlag,\n            generalProfileSpace: general_profile_space,\n            generalTierFlag: general_tier_flag,\n            generalProfileIdc: general_profile_idc,\n            generalProfileCompatibilityFlags: general_profile_compatibility_flags,\n            generalConstraintIndicatorFlags: general_constraint_indicator_flags,\n            generalLevelIdc: general_level_idc,\n            chromaFormatIdc,\n            bitDepthLumaMinus8,\n            bitDepthChromaMinus8,\n            minSpatialSegmentationIdc,\n        };\n    }\n    catch (error) {\n        Logging._error('Error parsing HEVC SPS:', error);\n        return null;\n    }\n};\n/** Builds a HevcDecoderConfigurationRecord from an HEVC packet in Annex B format. */\nexport const extractHevcDecoderConfigurationRecord = (packetData) => {\n    try {\n        const vpsUnits = [];\n        const spsUnits = [];\n        const ppsUnits = [];\n        const seiUnits = [];\n        for (const loc of iterateNalUnitsInAnnexB(packetData)) {\n            const nalUnit = packetData.subarray(loc.offset, loc.offset + loc.length);\n            const type = extractNalUnitTypeForHevc(nalUnit[0]);\n            if (type === HevcNalUnitType.VPS_NUT) {\n                vpsUnits.push(nalUnit);\n            }\n            else if (type === HevcNalUnitType.SPS_NUT) {\n                spsUnits.push(nalUnit);\n            }\n            else if (type === HevcNalUnitType.PPS_NUT) {\n                ppsUnits.push(nalUnit);\n            }\n            else if (type === HevcNalUnitType.PREFIX_SEI_NUT || type === HevcNalUnitType.SUFFIX_SEI_NUT) {\n                seiUnits.push(nalUnit);\n            }\n        }\n        if (spsUnits.length === 0 || ppsUnits.length === 0)\n            return null;\n        const spsInfo = parseHevcSps(spsUnits[0]);\n        if (!spsInfo)\n            return null;\n        // Parse PPS for parallelismType\n        let parallelismType = 0;\n        if (ppsUnits.length > 0) {\n            const pps = ppsUnits[0];\n            const ppsBitstream = new Bitstream(removeEmulationPreventionBytes(pps));\n            ppsBitstream.skipBits(16); // NAL header\n            readExpGolomb(ppsBitstream); // pps_pic_parameter_set_id\n            readExpGolomb(ppsBitstream); // pps_seq_parameter_set_id\n            ppsBitstream.skipBits(1); // dependent_slice_segments_enabled_flag\n            ppsBitstream.skipBits(1); // output_flag_present_flag\n            ppsBitstream.skipBits(3); // num_extra_slice_header_bits\n            ppsBitstream.skipBits(1); // sign_data_hiding_enabled_flag\n            ppsBitstream.skipBits(1); // cabac_init_present_flag\n            readExpGolomb(ppsBitstream); // num_ref_idx_l0_default_active_minus1\n            readExpGolomb(ppsBitstream); // num_ref_idx_l1_default_active_minus1\n            readSignedExpGolomb(ppsBitstream); // init_qp_minus26\n            ppsBitstream.skipBits(1); // constrained_intra_pred_flag\n            ppsBitstream.skipBits(1); // transform_skip_enabled_flag\n            if (ppsBitstream.readBits(1)) { // cu_qp_delta_enabled_flag\n                readExpGolomb(ppsBitstream); // diff_cu_qp_delta_depth\n            }\n            readSignedExpGolomb(ppsBitstream); // pps_cb_qp_offset\n            readSignedExpGolomb(ppsBitstream); // pps_cr_qp_offset\n            ppsBitstream.skipBits(1); // pps_slice_chroma_qp_offsets_present_flag\n            ppsBitstream.skipBits(1); // weighted_pred_flag\n            ppsBitstream.skipBits(1); // weighted_bipred_flag\n            ppsBitstream.skipBits(1); // transquant_bypass_enabled_flag\n            const tiles_enabled_flag = ppsBitstream.readBits(1);\n            const entropy_coding_sync_enabled_flag = ppsBitstream.readBits(1);\n            if (!tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n                parallelismType = 0;\n            else if (tiles_enabled_flag && !entropy_coding_sync_enabled_flag)\n                parallelismType = 2;\n            else if (!tiles_enabled_flag && entropy_coding_sync_enabled_flag)\n                parallelismType = 3;\n            else\n                parallelismType = 0;\n        }\n        const arrays = [\n            ...(vpsUnits.length\n                ? [\n                    {\n                        arrayCompleteness: 1,\n                        nalUnitType: HevcNalUnitType.VPS_NUT,\n                        nalUnits: vpsUnits,\n                    },\n                ]\n                : []),\n            ...(spsUnits.length\n                ? [\n                    {\n                        arrayCompleteness: 1,\n                        nalUnitType: HevcNalUnitType.SPS_NUT,\n                        nalUnits: spsUnits,\n                    },\n                ]\n                : []),\n            ...(ppsUnits.length\n                ? [\n                    {\n                        arrayCompleteness: 1,\n                        nalUnitType: HevcNalUnitType.PPS_NUT,\n                        nalUnits: ppsUnits,\n                    },\n                ]\n                : []),\n            ...(seiUnits.length\n                ? [\n                    {\n                        arrayCompleteness: 1,\n                        nalUnitType: extractNalUnitTypeForHevc(seiUnits[0][0]),\n                        nalUnits: seiUnits,\n                    },\n                ]\n                : []),\n        ];\n        const record = {\n            configurationVersion: 1,\n            generalProfileSpace: spsInfo.generalProfileSpace,\n            generalTierFlag: spsInfo.generalTierFlag,\n            generalProfileIdc: spsInfo.generalProfileIdc,\n            generalProfileCompatibilityFlags: spsInfo.generalProfileCompatibilityFlags,\n            generalConstraintIndicatorFlags: spsInfo.generalConstraintIndicatorFlags,\n            generalLevelIdc: spsInfo.generalLevelIdc,\n            minSpatialSegmentationIdc: spsInfo.minSpatialSegmentationIdc,\n            parallelismType,\n            chromaFormatIdc: spsInfo.chromaFormatIdc,\n            bitDepthLumaMinus8: spsInfo.bitDepthLumaMinus8,\n            bitDepthChromaMinus8: spsInfo.bitDepthChromaMinus8,\n            avgFrameRate: 0,\n            constantFrameRate: 0,\n            numTemporalLayers: spsInfo.spsMaxSubLayersMinus1 + 1,\n            temporalIdNested: spsInfo.spsTemporalIdNestingFlag,\n            lengthSizeMinusOne: 3,\n            arrays,\n        };\n        return record;\n    }\n    catch (error) {\n        Logging._error('Error building HEVC Decoder Configuration Record:', error);\n        return null;\n    }\n};\nconst parseProfileTierLevel = (bitstream, maxNumSubLayersMinus1) => {\n    const general_profile_space = bitstream.readBits(2);\n    const general_tier_flag = bitstream.readBits(1);\n    const general_profile_idc = bitstream.readBits(5);\n    let general_profile_compatibility_flags = 0;\n    for (let i = 0; i < 32; i++) {\n        general_profile_compatibility_flags = (general_profile_compatibility_flags << 1) | bitstream.readBits(1);\n    }\n    const general_constraint_indicator_flags = new Uint8Array(6);\n    for (let i = 0; i < 6; i++) {\n        general_constraint_indicator_flags[i] = bitstream.readBits(8);\n    }\n    const general_level_idc = bitstream.readBits(8);\n    const sub_layer_profile_present_flag = [];\n    const sub_layer_level_present_flag = [];\n    for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n        sub_layer_profile_present_flag.push(bitstream.readBits(1));\n        sub_layer_level_present_flag.push(bitstream.readBits(1));\n    }\n    if (maxNumSubLayersMinus1 > 0) {\n        for (let i = maxNumSubLayersMinus1; i < 8; i++) {\n            bitstream.skipBits(2); // reserved_zero_2bits\n        }\n    }\n    for (let i = 0; i < maxNumSubLayersMinus1; i++) {\n        if (sub_layer_profile_present_flag[i])\n            bitstream.skipBits(88);\n        if (sub_layer_level_present_flag[i])\n            bitstream.skipBits(8);\n    }\n    return {\n        general_profile_space,\n        general_tier_flag,\n        general_profile_idc,\n        general_profile_compatibility_flags,\n        general_constraint_indicator_flags,\n        general_level_idc,\n    };\n};\nconst skipScalingListData = (bitstream) => {\n    for (let sizeId = 0; sizeId < 4; sizeId++) {\n        for (let matrixId = 0; matrixId < (sizeId === 3 ? 2 : 6); matrixId++) {\n            const scaling_list_pred_mode_flag = bitstream.readBits(1);\n            if (!scaling_list_pred_mode_flag) {\n                readExpGolomb(bitstream); // scaling_list_pred_matrix_id_delta\n            }\n            else {\n                const coefNum = Math.min(64, 1 << (4 + (sizeId << 1)));\n                if (sizeId > 1) {\n                    readSignedExpGolomb(bitstream); // scaling_list_dc_coef_minus8\n                }\n                for (let i = 0; i < coefNum; i++) {\n                    readSignedExpGolomb(bitstream); // scaling_list_delta_coef\n                }\n            }\n        }\n    }\n};\nconst skipAllStRefPicSets = (bitstream, num_short_term_ref_pic_sets) => {\n    const NumDeltaPocs = [];\n    for (let stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; stRpsIdx++) {\n        NumDeltaPocs[stRpsIdx] = skipStRefPicSet(bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs);\n    }\n};\nconst skipStRefPicSet = (bitstream, stRpsIdx, num_short_term_ref_pic_sets, NumDeltaPocs) => {\n    let NumDeltaPocsThis = 0;\n    let inter_ref_pic_set_prediction_flag = 0;\n    let RefRpsIdx = 0;\n    if (stRpsIdx !== 0) {\n        inter_ref_pic_set_prediction_flag = bitstream.readBits(1);\n    }\n    if (inter_ref_pic_set_prediction_flag) {\n        if (stRpsIdx === num_short_term_ref_pic_sets) {\n            const delta_idx_minus1 = readExpGolomb(bitstream);\n            RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);\n        }\n        else {\n            RefRpsIdx = stRpsIdx - 1;\n        }\n        bitstream.readBits(1); // delta_rps_sign\n        readExpGolomb(bitstream); // abs_delta_rps_minus1\n        // The number of iterations is NumDeltaPocs[RefRpsIdx] + 1\n        const numDelta = NumDeltaPocs[RefRpsIdx] ?? 0;\n        for (let j = 0; j <= numDelta; j++) {\n            const used_by_curr_pic_flag = bitstream.readBits(1);\n            if (!used_by_curr_pic_flag) {\n                bitstream.readBits(1); // use_delta_flag\n            }\n        }\n        NumDeltaPocsThis = NumDeltaPocs[RefRpsIdx];\n    }\n    else {\n        const num_negative_pics = readExpGolomb(bitstream);\n        const num_positive_pics = readExpGolomb(bitstream);\n        for (let i = 0; i < num_negative_pics; i++) {\n            readExpGolomb(bitstream); // delta_poc_s0_minus1[i]\n            bitstream.readBits(1); // used_by_curr_pic_s0_flag[i]\n        }\n        for (let i = 0; i < num_positive_pics; i++) {\n            readExpGolomb(bitstream); // delta_poc_s1_minus1[i]\n            bitstream.readBits(1); // used_by_curr_pic_s1_flag[i]\n        }\n        NumDeltaPocsThis = num_negative_pics + num_positive_pics;\n    }\n    return NumDeltaPocsThis;\n};\nconst parseHevcVui = (bitstream, sps_max_sub_layers_minus1) => {\n    // Defaults: 2 = unspecified\n    let colourPrimaries = 2;\n    let transferCharacteristics = 2;\n    let matrixCoefficients = 2;\n    let fullRangeFlag = 0;\n    let minSpatialSegmentationIdc = 0;\n    let pixelAspectRatio = { num: 1, den: 1 };\n    if (bitstream.readBits(1)) { // aspect_ratio_info_present_flag\n        const aspect_ratio_idc = bitstream.readBits(8);\n        if (aspect_ratio_idc === 255) {\n            pixelAspectRatio = {\n                num: bitstream.readBits(16),\n                den: bitstream.readBits(16),\n            };\n        }\n        else {\n            const aspectRatio = AVC_HEVC_ASPECT_RATIO_IDC_TABLE[aspect_ratio_idc];\n            if (aspectRatio) {\n                pixelAspectRatio = aspectRatio;\n            }\n        }\n    }\n    if (bitstream.readBits(1)) { // overscan_info_present_flag\n        bitstream.readBits(1); // overscan_appropriate_flag\n    }\n    if (bitstream.readBits(1)) { // video_signal_type_present_flag\n        bitstream.readBits(3); // video_format\n        fullRangeFlag = bitstream.readBits(1);\n        if (bitstream.readBits(1)) { // colour_description_present_flag\n            colourPrimaries = bitstream.readBits(8);\n            transferCharacteristics = bitstream.readBits(8);\n            matrixCoefficients = bitstream.readBits(8);\n        }\n    }\n    if (bitstream.readBits(1)) { // chroma_loc_info_present_flag\n        readExpGolomb(bitstream); // chroma_sample_loc_type_top_field\n        readExpGolomb(bitstream); // chroma_sample_loc_type_bottom_field\n    }\n    bitstream.readBits(1); // neutral_chroma_indication_flag\n    bitstream.readBits(1); // field_seq_flag\n    bitstream.readBits(1); // frame_field_info_present_flag\n    if (bitstream.readBits(1)) { // default_display_window_flag\n        readExpGolomb(bitstream); // def_disp_win_left_offset\n        readExpGolomb(bitstream); // def_disp_win_right_offset\n        readExpGolomb(bitstream); // def_disp_win_top_offset\n        readExpGolomb(bitstream); // def_disp_win_bottom_offset\n    }\n    if (bitstream.readBits(1)) { // vui_timing_info_present_flag\n        bitstream.readBits(32); // vui_num_units_in_tick\n        bitstream.readBits(32); // vui_time_scale\n        if (bitstream.readBits(1)) { // vui_poc_proportional_to_timing_flag\n            readExpGolomb(bitstream); // vui_num_ticks_poc_diff_one_minus1\n        }\n        if (bitstream.readBits(1)) {\n            skipHevcHrdParameters(bitstream, true, sps_max_sub_layers_minus1);\n        }\n    }\n    if (bitstream.readBits(1)) { // bitstream_restriction_flag\n        bitstream.readBits(1); // tiles_fixed_structure_flag\n        bitstream.readBits(1); // motion_vectors_over_pic_boundaries_flag\n        bitstream.readBits(1); // restricted_ref_pic_lists_flag\n        minSpatialSegmentationIdc = readExpGolomb(bitstream);\n        readExpGolomb(bitstream); // max_bytes_per_pic_denom\n        readExpGolomb(bitstream); // max_bits_per_min_cu_denom\n        readExpGolomb(bitstream); // log2_max_mv_length_horizontal\n        readExpGolomb(bitstream); // log2_max_mv_length_vertical\n    }\n    return {\n        pixelAspectRatio,\n        colourPrimaries,\n        transferCharacteristics,\n        matrixCoefficients,\n        fullRangeFlag,\n        minSpatialSegmentationIdc,\n    };\n};\nconst skipHevcHrdParameters = (bitstream, commonInfPresentFlag, maxNumSubLayersMinus1) => {\n    let nal_hrd_parameters_present_flag = false;\n    let vcl_hrd_parameters_present_flag = false;\n    let sub_pic_hrd_params_present_flag = false;\n    if (commonInfPresentFlag) {\n        nal_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n        vcl_hrd_parameters_present_flag = bitstream.readBits(1) === 1;\n        if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {\n            sub_pic_hrd_params_present_flag = bitstream.readBits(1) === 1;\n            if (sub_pic_hrd_params_present_flag) {\n                bitstream.readBits(8); // tick_divisor_minus2\n                bitstream.readBits(5); // du_cpb_removal_delay_increment_length_minus1\n                bitstream.readBits(1); // sub_pic_cpb_params_in_pic_timing_sei_flag\n                bitstream.readBits(5); // dpb_output_delay_du_length_minus1\n            }\n            bitstream.readBits(4); // bit_rate_scale\n            bitstream.readBits(4); // cpb_size_scale\n            if (sub_pic_hrd_params_present_flag) {\n                bitstream.readBits(4); // cpb_size_du_scale\n            }\n            bitstream.readBits(5); // initial_cpb_removal_delay_length_minus1\n            bitstream.readBits(5); // au_cpb_removal_delay_length_minus1\n            bitstream.readBits(5); // dpb_output_delay_length_minus1\n        }\n    }\n    for (let i = 0; i <= maxNumSubLayersMinus1; i++) {\n        const fixed_pic_rate_general_flag = bitstream.readBits(1) === 1;\n        let fixed_pic_rate_within_cvs_flag = true; // Default assumption if general is true\n        if (!fixed_pic_rate_general_flag) {\n            fixed_pic_rate_within_cvs_flag = bitstream.readBits(1) === 1;\n        }\n        let low_delay_hrd_flag = false; // Default assumption\n        if (fixed_pic_rate_within_cvs_flag) {\n            readExpGolomb(bitstream); // elemental_duration_in_tc_minus1[i]\n        }\n        else {\n            low_delay_hrd_flag = bitstream.readBits(1) === 1;\n        }\n        let CpbCnt = 1; // Default if low_delay is true\n        if (!low_delay_hrd_flag) {\n            const cpb_cnt_minus1 = readExpGolomb(bitstream); // cpb_cnt_minus1[i]\n            CpbCnt = cpb_cnt_minus1 + 1;\n        }\n        if (nal_hrd_parameters_present_flag) {\n            skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n        }\n        if (vcl_hrd_parameters_present_flag) {\n            skipSubLayerHrdParameters(bitstream, CpbCnt, sub_pic_hrd_params_present_flag);\n        }\n    }\n};\nconst skipSubLayerHrdParameters = (bitstream, CpbCnt, sub_pic_hrd_params_present_flag) => {\n    for (let i = 0; i < CpbCnt; i++) {\n        readExpGolomb(bitstream); // bit_rate_value_minus1[i]\n        readExpGolomb(bitstream); // cpb_size_value_minus1[i]\n        if (sub_pic_hrd_params_present_flag) {\n            readExpGolomb(bitstream); // cpb_size_du_value_minus1[i]\n            readExpGolomb(bitstream); // bit_rate_du_value_minus1[i]\n        }\n        bitstream.readBits(1); // cbr_flag[i]\n    }\n};\n/** Serializes an HevcDecoderConfigurationRecord into the format specified in Section 8.3.3.1 of ISO 14496-15. */\nexport const serializeHevcDecoderConfigurationRecord = (record) => {\n    const bytes = [];\n    bytes.push(record.configurationVersion);\n    bytes.push(((record.generalProfileSpace & 0x3) << 6)\n        | ((record.generalTierFlag & 0x1) << 5)\n        | (record.generalProfileIdc & 0x1F));\n    bytes.push((record.generalProfileCompatibilityFlags >>> 24) & 0xFF);\n    bytes.push((record.generalProfileCompatibilityFlags >>> 16) & 0xFF);\n    bytes.push((record.generalProfileCompatibilityFlags >>> 8) & 0xFF);\n    bytes.push(record.generalProfileCompatibilityFlags & 0xFF);\n    bytes.push(...record.generalConstraintIndicatorFlags);\n    bytes.push(record.generalLevelIdc & 0xFF);\n    bytes.push(0xF0 | ((record.minSpatialSegmentationIdc >> 8) & 0x0F)); // Reserved + high nibble\n    bytes.push(record.minSpatialSegmentationIdc & 0xFF); // Low byte\n    bytes.push(0xFC | (record.parallelismType & 0x03));\n    bytes.push(0xFC | (record.chromaFormatIdc & 0x03));\n    bytes.push(0xF8 | (record.bitDepthLumaMinus8 & 0x07));\n    bytes.push(0xF8 | (record.bitDepthChromaMinus8 & 0x07));\n    bytes.push((record.avgFrameRate >> 8) & 0xFF); // High byte\n    bytes.push(record.avgFrameRate & 0xFF); // Low byte\n    bytes.push(((record.constantFrameRate & 0x03) << 6)\n        | ((record.numTemporalLayers & 0x07) << 3)\n        | ((record.temporalIdNested & 0x01) << 2)\n        | (record.lengthSizeMinusOne & 0x03));\n    bytes.push(record.arrays.length & 0xFF);\n    for (const arr of record.arrays) {\n        bytes.push(((arr.arrayCompleteness & 0x01) << 7)\n            | (0 << 6)\n            | (arr.nalUnitType & 0x3F));\n        bytes.push((arr.nalUnits.length >> 8) & 0xFF); // High byte\n        bytes.push(arr.nalUnits.length & 0xFF); // Low byte\n        for (const nal of arr.nalUnits) {\n            bytes.push((nal.length >> 8) & 0xFF); // High byte\n            bytes.push(nal.length & 0xFF); // Low byte\n            for (let i = 0; i < nal.length; i++) {\n                bytes.push(nal[i]);\n            }\n        }\n    }\n    return new Uint8Array(bytes);\n};\n/** Deserializes an HevcDecoderConfigurationRecord from the format specified in Section 8.3.3.1 of ISO 14496-15. */\nexport const deserializeHevcDecoderConfigurationRecord = (data) => {\n    try {\n        const view = toDataView(data);\n        let offset = 0;\n        const configurationVersion = view.getUint8(offset++);\n        const byte1 = view.getUint8(offset++);\n        const generalProfileSpace = (byte1 >> 6) & 0x3;\n        const generalTierFlag = (byte1 >> 5) & 0x1;\n        const generalProfileIdc = byte1 & 0x1F;\n        const generalProfileCompatibilityFlags = view.getUint32(offset, false);\n        offset += 4;\n        const generalConstraintIndicatorFlags = data.subarray(offset, offset + 6);\n        offset += 6;\n        const generalLevelIdc = view.getUint8(offset++);\n        const minSpatialSegmentationIdc = ((view.getUint8(offset++) & 0x0F) << 8) | view.getUint8(offset++);\n        const parallelismType = view.getUint8(offset++) & 0x03;\n        const chromaFormatIdc = view.getUint8(offset++) & 0x03;\n        const bitDepthLumaMinus8 = view.getUint8(offset++) & 0x07;\n        const bitDepthChromaMinus8 = view.getUint8(offset++) & 0x07;\n        const avgFrameRate = view.getUint16(offset, false);\n        offset += 2;\n        const byte21 = view.getUint8(offset++);\n        const constantFrameRate = (byte21 >> 6) & 0x03;\n        const numTemporalLayers = (byte21 >> 3) & 0x07;\n        const temporalIdNested = (byte21 >> 2) & 0x01;\n        const lengthSizeMinusOne = byte21 & 0x03;\n        const numOfArrays = view.getUint8(offset++);\n        const arrays = [];\n        for (let i = 0; i < numOfArrays; i++) {\n            const arrByte = view.getUint8(offset++);\n            const arrayCompleteness = (arrByte >> 7) & 0x01;\n            const nalUnitType = arrByte & 0x3F;\n            const numNalus = view.getUint16(offset, false);\n            offset += 2;\n            const nalUnits = [];\n            for (let j = 0; j < numNalus; j++) {\n                const nalUnitLength = view.getUint16(offset, false);\n                offset += 2;\n                nalUnits.push(data.subarray(offset, offset + nalUnitLength));\n                offset += nalUnitLength;\n            }\n            arrays.push({\n                arrayCompleteness,\n                nalUnitType,\n                nalUnits,\n            });\n        }\n        return {\n            configurationVersion,\n            generalProfileSpace,\n            generalTierFlag,\n            generalProfileIdc,\n            generalProfileCompatibilityFlags,\n            generalConstraintIndicatorFlags,\n            generalLevelIdc,\n            minSpatialSegmentationIdc,\n            parallelismType,\n            chromaFormatIdc,\n            bitDepthLumaMinus8,\n            bitDepthChromaMinus8,\n            avgFrameRate,\n            constantFrameRate,\n            numTemporalLayers,\n            temporalIdNested,\n            lengthSizeMinusOne,\n            arrays,\n        };\n    }\n    catch (error) {\n        Logging._error('Error deserializing HEVC Decoder Configuration Record:', error);\n        return null;\n    }\n};\nvar HevcNaluOrderState;\n(function (HevcNaluOrderState) {\n    HevcNaluOrderState[HevcNaluOrderState[\"audAllowed\"] = 0] = \"audAllowed\";\n    HevcNaluOrderState[HevcNaluOrderState[\"beforeFirstVcl\"] = 1] = \"beforeFirstVcl\";\n    HevcNaluOrderState[HevcNaluOrderState[\"afterFirstVcl\"] = 2] = \"afterFirstVcl\";\n    HevcNaluOrderState[HevcNaluOrderState[\"eoBitstreamAllowed\"] = 3] = \"eoBitstreamAllowed\";\n    HevcNaluOrderState[HevcNaluOrderState[\"noMoreDataAllowed\"] = 4] = \"noMoreDataAllowed\";\n})(HevcNaluOrderState || (HevcNaluOrderState = {}));\n// This function sanitzes the contents of an HEVC packet such that\n// https://source.chromium.org/chromium/chromium/src/+/main:media/formats/mp4/hevc.cc's validation logic does not trip\n// up on its contents. The validation is often too strict and rejects packets that Chromium could decode just fine.\n// Chromium code retrieved on 2026-04-29.\n// See https://issues.chromium.org/issues/507611247.\nexport const sanitizeHevcPacketForChromium = (packetData, decoderConfig) => {\n    const removedNalUnits = new Set();\n    let orderState = HevcNaluOrderState.audAllowed;\n    for (const loc of iterateHevcNalUnits(packetData, decoderConfig)) {\n        if (orderState === HevcNaluOrderState.noMoreDataAllowed) {\n            removedNalUnits.add(loc.offset);\n            continue;\n        }\n        const type = extractNalUnitTypeForHevc(packetData[loc.offset]);\n        if (orderState === HevcNaluOrderState.eoBitstreamAllowed && type !== 37 /* EOB_NUT */) {\n            removedNalUnits.add(loc.offset);\n            continue;\n        }\n        let remove = false;\n        if (type === 35) { // AUD_NUT\n            if (orderState > HevcNaluOrderState.audAllowed) {\n                remove = true;\n            }\n            else {\n                orderState = HevcNaluOrderState.beforeFirstVcl;\n            }\n        }\n        else if (type <= 31) { // VCL (0-31)\n            if (orderState > HevcNaluOrderState.afterFirstVcl) {\n                remove = true;\n            }\n            else {\n                orderState = HevcNaluOrderState.afterFirstVcl;\n            }\n        }\n        else if (type === 36) { // EOS_NUT\n            if (orderState !== HevcNaluOrderState.afterFirstVcl) {\n                remove = true;\n            }\n            else {\n                orderState = HevcNaluOrderState.eoBitstreamAllowed;\n            }\n        }\n        else if (type === 37) { // EOB_NUT\n            if (orderState < HevcNaluOrderState.afterFirstVcl) {\n                remove = true;\n            }\n            else {\n                orderState = HevcNaluOrderState.noMoreDataAllowed;\n            }\n        }\n        else if (type === 32 || type === 33 || type === 34 || type === 39\n            || (type >= 41 && type <= 44) || (type >= 48 && type <= 55)) { // VPS, SPS, PPS, PREFIX_SEI, RSV_NVCL41..44, UNSPEC48..55\n            if (orderState > HevcNaluOrderState.beforeFirstVcl) {\n                remove = true;\n            }\n            else {\n                orderState = HevcNaluOrderState.beforeFirstVcl;\n            }\n        }\n        else if (type === 38 || type === 40\n            || (type >= 45 && type <= 47) || (type >= 56 && type <= 63)) { // FD, SUFFIX_SEI, RSV_NVCL45..47, UNSPEC56..63\n            if (orderState < HevcNaluOrderState.afterFirstVcl) {\n                remove = true;\n            }\n        }\n        if (remove) {\n            removedNalUnits.add(loc.offset);\n        }\n    }\n    // If nothing violated the rules, return null to signal that\n    if (removedNalUnits.size === 0) {\n        return null;\n    }\n    const filteredNalUnits = [];\n    for (const loc of iterateHevcNalUnits(packetData, decoderConfig)) {\n        if (!removedNalUnits.has(loc.offset)) {\n            filteredNalUnits.push(packetData.subarray(loc.offset, loc.offset + loc.length));\n        }\n    }\n    return concatHevcNalUnits(filteredNalUnits, decoderConfig);\n};\nexport const extractVp9CodecInfoFromPacket = (packet) => {\n    // eslint-disable-next-line @stylistic/max-len\n    // https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.7-20170222-draft.pdf\n    // http://downloads.webmproject.org/docs/vp9/vp9-bitstream_superframe-and-uncompressed-header_v1.0.pdf\n    const bitstream = new Bitstream(packet);\n    // Frame marker (0b10)\n    const frameMarker = bitstream.readBits(2);\n    if (frameMarker !== 2) {\n        return null;\n    }\n    // Profile\n    const profileLowBit = bitstream.readBits(1);\n    const profileHighBit = bitstream.readBits(1);\n    const profile = (profileHighBit << 1) + profileLowBit;\n    // Skip reserved bit for profile 3\n    if (profile === 3) {\n        bitstream.skipBits(1);\n    }\n    // show_existing_frame\n    const showExistingFrame = bitstream.readBits(1);\n    if (showExistingFrame === 1) {\n        return null;\n    }\n    // frame_type (0 = key frame)\n    const frameType = bitstream.readBits(1);\n    if (frameType !== 0) {\n        return null;\n    }\n    // Skip show_frame and error_resilient_mode\n    bitstream.skipBits(2);\n    // Sync code (0x498342)\n    const syncCode = bitstream.readBits(24);\n    if (syncCode !== 0x498342) {\n        return null;\n    }\n    // Color config\n    let bitDepth = 8;\n    if (profile >= 2) {\n        const tenOrTwelveBit = bitstream.readBits(1);\n        bitDepth = tenOrTwelveBit ? 12 : 10;\n    }\n    // Color space\n    const colorSpace = bitstream.readBits(3);\n    let chromaSubsampling = 0;\n    let videoFullRangeFlag = 0;\n    if (colorSpace !== 7) { // 7 is CS_RGB\n        const colorRange = bitstream.readBits(1);\n        videoFullRangeFlag = colorRange;\n        if (profile === 1 || profile === 3) {\n            const subsamplingX = bitstream.readBits(1);\n            const subsamplingY = bitstream.readBits(1);\n            // 0 = 4:2:0 vertical\n            // 1 = 4:2:0 colocated\n            // 2 = 4:2:2\n            // 3 = 4:4:4\n            chromaSubsampling = !subsamplingX && !subsamplingY\n                ? 3 // 0,0 = 4:4:4\n                : subsamplingX && !subsamplingY\n                    ? 2 // 1,0 = 4:2:2\n                    : 1; // 1,1 = 4:2:0 colocated (default)\n            // Skip reserved bit\n            bitstream.skipBits(1);\n        }\n        else {\n            // For profile 0 and 2, always 4:2:0\n            chromaSubsampling = 1; // Using colocated as default\n        }\n    }\n    else {\n        // RGB is always 4:4:4\n        chromaSubsampling = 3;\n        videoFullRangeFlag = 1;\n    }\n    // Parse frame size\n    const widthMinusOne = bitstream.readBits(16);\n    const heightMinusOne = bitstream.readBits(16);\n    const width = widthMinusOne + 1;\n    const height = heightMinusOne + 1;\n    // Calculate level based on dimensions\n    const pictureSize = width * height;\n    let level = last(VP9_LEVEL_TABLE).level; // Default to highest level\n    for (const entry of VP9_LEVEL_TABLE) {\n        if (pictureSize <= entry.maxPictureSize) {\n            level = entry.level;\n            break;\n        }\n    }\n    // Map color_space to standard values\n    const matrixCoefficients = colorSpace === 7\n        ? 0\n        : colorSpace === 2\n            ? 1\n            : colorSpace === 1\n                ? 6\n                : 2;\n    const colourPrimaries = colorSpace === 2\n        ? 1\n        : colorSpace === 1\n            ? 6\n            : 2;\n    const transferCharacteristics = colorSpace === 2\n        ? 1\n        : colorSpace === 1\n            ? 6\n            : 2;\n    return {\n        profile,\n        level,\n        bitDepth,\n        chromaSubsampling,\n        videoFullRangeFlag,\n        colourPrimaries,\n        transferCharacteristics,\n        matrixCoefficients,\n    };\n};\n/** Iterates over all OBUs in an AV1 packet bistream. */\nexport const iterateAv1PacketObus = function* (packet) {\n    // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n    const bitstream = new Bitstream(packet);\n    const readLeb128 = () => {\n        let value = 0;\n        for (let i = 0; i < 8; i++) {\n            const byte = bitstream.readAlignedByte();\n            value |= ((byte & 0x7f) << (i * 7));\n            if (!(byte & 0x80)) {\n                break;\n            }\n            // Spec requirement\n            if (i === 7 && (byte & 0x80)) {\n                return null;\n            }\n        }\n        // Spec requirement\n        if (value >= 2 ** 32 - 1) {\n            return null;\n        }\n        return value;\n    };\n    while (bitstream.getBitsLeft() >= 8) {\n        // Parse OBU header\n        bitstream.skipBits(1);\n        const obuType = bitstream.readBits(4);\n        const obuExtension = bitstream.readBits(1);\n        const obuHasSizeField = bitstream.readBits(1);\n        bitstream.skipBits(1);\n        // Skip extension header if present\n        if (obuExtension) {\n            bitstream.skipBits(8);\n        }\n        // Read OBU size if present\n        let obuSize;\n        if (obuHasSizeField) {\n            const obuSizeValue = readLeb128();\n            if (obuSizeValue === null)\n                return; // It was invalid\n            obuSize = obuSizeValue;\n        }\n        else {\n            // Calculate remaining bits and convert to bytes, rounding down\n            obuSize = Math.floor(bitstream.getBitsLeft() / 8);\n        }\n        assert(bitstream.pos % 8 === 0);\n        yield {\n            type: obuType,\n            data: packet.subarray(bitstream.pos / 8, bitstream.pos / 8 + obuSize),\n        };\n        // Move to next OBU\n        bitstream.skipBits(obuSize * 8);\n    }\n};\n/**\n * When AV1 codec information is not provided by the container, we can still try to extract the information by digging\n * into the AV1 bitstream.\n */\nexport const extractAv1CodecInfoFromPacket = (packet) => {\n    // https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n    for (const { type, data } of iterateAv1PacketObus(packet)) {\n        if (type !== 1) {\n            continue; // 1 == OBU_SEQUENCE_HEADER\n        }\n        const bitstream = new Bitstream(data);\n        // Read sequence header fields\n        const seqProfile = bitstream.readBits(3);\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n        const stillPicture = bitstream.readBits(1);\n        const reducedStillPictureHeader = bitstream.readBits(1);\n        let seqLevel = 0;\n        let seqTier = 0;\n        let bufferDelayLengthMinus1 = 0;\n        if (reducedStillPictureHeader) {\n            seqLevel = bitstream.readBits(5);\n        }\n        else {\n            // Parse timing_info_present_flag\n            const timingInfoPresentFlag = bitstream.readBits(1);\n            if (timingInfoPresentFlag) {\n                // Skip timing info (num_units_in_display_tick, time_scale, equal_picture_interval)\n                bitstream.skipBits(32); // num_units_in_display_tick\n                bitstream.skipBits(32); // time_scale\n                const equalPictureInterval = bitstream.readBits(1);\n                if (equalPictureInterval) {\n                    // Skip num_ticks_per_picture_minus_1 (uvlc)\n                    // Since this is variable length, we'd need to implement uvlc reading\n                    // For now, we'll return null as this is rare\n                    return null;\n                }\n            }\n            // Parse decoder_model_info_present_flag\n            const decoderModelInfoPresentFlag = bitstream.readBits(1);\n            if (decoderModelInfoPresentFlag) {\n                // Store buffer_delay_length_minus_1 instead of just skipping\n                bufferDelayLengthMinus1 = bitstream.readBits(5);\n                bitstream.skipBits(32); // num_units_in_decoding_tick\n                bitstream.skipBits(5); // buffer_removal_time_length_minus_1\n                bitstream.skipBits(5); // frame_presentation_time_length_minus_1\n            }\n            // Parse operating_points_cnt_minus_1\n            const operatingPointsCntMinus1 = bitstream.readBits(5);\n            // For each operating point\n            for (let i = 0; i <= operatingPointsCntMinus1; i++) {\n                // operating_point_idc[i]\n                bitstream.skipBits(12);\n                // seq_level_idx[i]\n                const seqLevelIdx = bitstream.readBits(5);\n                if (i === 0) {\n                    seqLevel = seqLevelIdx;\n                }\n                if (seqLevelIdx > 7) {\n                    // seq_tier[i]\n                    const seqTierTemp = bitstream.readBits(1);\n                    if (i === 0) {\n                        seqTier = seqTierTemp;\n                    }\n                }\n                if (decoderModelInfoPresentFlag) {\n                    // decoder_model_present_for_this_op[i]\n                    const decoderModelPresentForThisOp = bitstream.readBits(1);\n                    if (decoderModelPresentForThisOp) {\n                        const n = bufferDelayLengthMinus1 + 1;\n                        bitstream.skipBits(n); // decoder_buffer_delay[op]\n                        bitstream.skipBits(n); // encoder_buffer_delay[op]\n                        bitstream.skipBits(1); // low_delay_mode_flag[op]\n                    }\n                }\n                // initial_display_delay_present_flag\n                const initialDisplayDelayPresentFlag = bitstream.readBits(1);\n                if (initialDisplayDelayPresentFlag) {\n                    // initial_display_delay_minus_1[i]\n                    bitstream.skipBits(4);\n                }\n            }\n        }\n        // Frame size\n        const frameWidthBitsMinus1 = bitstream.readBits(4);\n        const frameHeightBitsMinus1 = bitstream.readBits(4);\n        const n1 = frameWidthBitsMinus1 + 1;\n        bitstream.skipBits(n1); // max_frame_width_minus_1\n        const n2 = frameHeightBitsMinus1 + 1;\n        bitstream.skipBits(n2); // max_frame_height_minus_1\n        // Frame IDs\n        let frameIdNumbersPresentFlag = 0;\n        if (reducedStillPictureHeader) {\n            frameIdNumbersPresentFlag = 0;\n        }\n        else {\n            frameIdNumbersPresentFlag = bitstream.readBits(1);\n        }\n        if (frameIdNumbersPresentFlag) {\n            bitstream.skipBits(4); // delta_frame_id_length_minus_2\n            bitstream.skipBits(3); // additional_frame_id_length_minus_1\n        }\n        bitstream.skipBits(1); // use_128x128_superblock\n        bitstream.skipBits(1); // enable_filter_intra\n        bitstream.skipBits(1); // enable_intra_edge_filter\n        if (!reducedStillPictureHeader) {\n            bitstream.skipBits(1); // enable_interintra_compound\n            bitstream.skipBits(1); // enable_masked_compound\n            bitstream.skipBits(1); // enable_warped_motion\n            bitstream.skipBits(1); // enable_dual_filter\n            const enableOrderHint = bitstream.readBits(1);\n            if (enableOrderHint) {\n                bitstream.skipBits(1); // enable_jnt_comp\n                bitstream.skipBits(1); // enable_ref_frame_mvs\n            }\n            const seqChooseScreenContentTools = bitstream.readBits(1);\n            let seqForceScreenContentTools = 0;\n            if (seqChooseScreenContentTools) {\n                seqForceScreenContentTools = 2; // SELECT_SCREEN_CONTENT_TOOLS\n            }\n            else {\n                seqForceScreenContentTools = bitstream.readBits(1);\n            }\n            if (seqForceScreenContentTools > 0) {\n                const seqChooseIntegerMv = bitstream.readBits(1);\n                if (!seqChooseIntegerMv) {\n                    bitstream.skipBits(1); // seq_force_integer_mv\n                }\n            }\n            if (enableOrderHint) {\n                bitstream.skipBits(3); // order_hint_bits_minus_1\n            }\n        }\n        bitstream.skipBits(1); // enable_superres\n        bitstream.skipBits(1); // enable_cdef\n        bitstream.skipBits(1); // enable_restoration\n        // color_config()\n        const highBitdepth = bitstream.readBits(1);\n        let bitDepth = 8;\n        if (seqProfile === 2 && highBitdepth) {\n            const twelveBit = bitstream.readBits(1);\n            bitDepth = twelveBit ? 12 : 10;\n        }\n        else if (seqProfile <= 2) {\n            bitDepth = highBitdepth ? 10 : 8;\n        }\n        let monochrome = 0;\n        if (seqProfile !== 1) {\n            monochrome = bitstream.readBits(1);\n        }\n        let chromaSubsamplingX = 1;\n        let chromaSubsamplingY = 1;\n        let chromaSamplePosition = 0;\n        if (!monochrome) {\n            if (seqProfile === 0) {\n                chromaSubsamplingX = 1;\n                chromaSubsamplingY = 1;\n            }\n            else if (seqProfile === 1) {\n                chromaSubsamplingX = 0;\n                chromaSubsamplingY = 0;\n            }\n            else {\n                if (bitDepth === 12) {\n                    chromaSubsamplingX = bitstream.readBits(1);\n                    if (chromaSubsamplingX) {\n                        chromaSubsamplingY = bitstream.readBits(1);\n                    }\n                }\n            }\n            if (chromaSubsamplingX && chromaSubsamplingY) {\n                chromaSamplePosition = bitstream.readBits(2);\n            }\n        }\n        return {\n            profile: seqProfile,\n            level: seqLevel,\n            tier: seqTier,\n            bitDepth,\n            monochrome,\n            chromaSubsamplingX,\n            chromaSubsamplingY,\n            chromaSamplePosition,\n        };\n    }\n    return null;\n};\nexport const parseOpusIdentificationHeader = (bytes) => {\n    const view = toDataView(bytes);\n    const outputChannelCount = view.getUint8(9);\n    const preSkip = view.getUint16(10, true);\n    const inputSampleRate = view.getUint32(12, true);\n    const outputGain = view.getInt16(16, true);\n    const channelMappingFamily = view.getUint8(18);\n    let channelMappingTable = null;\n    if (channelMappingFamily) {\n        channelMappingTable = bytes.subarray(19, 19 + 2 + outputChannelCount);\n    }\n    return {\n        outputChannelCount,\n        preSkip,\n        inputSampleRate,\n        outputGain,\n        channelMappingFamily,\n        channelMappingTable,\n    };\n};\n// From https://datatracker.ietf.org/doc/html/rfc6716, in 48 kHz samples\nconst OPUS_FRAME_DURATION_TABLE = [\n    480, 960, 1920, 2880,\n    480, 960, 1920, 2880,\n    480, 960, 1920, 2880,\n    480, 960,\n    480, 960,\n    120, 240, 480, 960,\n    120, 240, 480, 960,\n    120, 240, 480, 960,\n    120, 240, 480, 960,\n];\nexport const parseOpusTocByte = (packet) => {\n    const config = packet[0] >> 3;\n    return {\n        durationInSamples: OPUS_FRAME_DURATION_TABLE[config],\n    };\n};\n// Based on vorbis_parser.c from FFmpeg.\nexport const parseModesFromVorbisSetupPacket = (setupHeader) => {\n    // Verify that this is a Setup header.\n    if (setupHeader.length < 7) {\n        throw new Error('Setup header is too short.');\n    }\n    if (setupHeader[0] !== 5) {\n        throw new Error('Wrong packet type in Setup header.');\n    }\n    const signature = String.fromCharCode(...setupHeader.slice(1, 7));\n    if (signature !== 'vorbis') {\n        throw new Error('Invalid packet signature in Setup header.');\n    }\n    // Reverse the entire buffer.\n    const bufSize = setupHeader.length;\n    const revBuffer = new Uint8Array(bufSize);\n    for (let i = 0; i < bufSize; i++) {\n        revBuffer[i] = setupHeader[bufSize - 1 - i];\n    }\n    // Initialize a Bitstream on the reversed buffer.\n    const bitstream = new Bitstream(revBuffer);\n    // --- Find the framing bit.\n    // In FFmpeg code, we scan until get_bits1() returns 1.\n    let gotFramingBit = 0;\n    while (bitstream.getBitsLeft() > 97) {\n        if (bitstream.readBits(1) === 1) {\n            gotFramingBit = bitstream.pos;\n            break;\n        }\n    }\n    if (gotFramingBit === 0) {\n        throw new Error('Invalid Setup header: framing bit not found.');\n    }\n    // --- Search backwards for a valid mode header.\n    // We try to “guess” the number of modes by reading a fixed pattern.\n    let modeCount = 0;\n    let gotModeHeader = false;\n    let lastModeCount = 0;\n    while (bitstream.getBitsLeft() >= 97) {\n        const tempPos = bitstream.pos;\n        const a = bitstream.readBits(8);\n        const b = bitstream.readBits(16);\n        const c = bitstream.readBits(16);\n        // If a > 63 or b or c nonzero, assume we’ve gone too far.\n        if (a > 63 || b !== 0 || c !== 0) {\n            bitstream.pos = tempPos;\n            break;\n        }\n        bitstream.skipBits(1);\n        modeCount++;\n        if (modeCount > 64) {\n            break;\n        }\n        const bsClone = bitstream.clone();\n        const candidate = bsClone.readBits(6) + 1;\n        if (candidate === modeCount) {\n            gotModeHeader = true;\n            lastModeCount = modeCount;\n        }\n    }\n    if (!gotModeHeader) {\n        throw new Error('Invalid Setup header: mode header not found.');\n    }\n    if (lastModeCount > 63) {\n        throw new Error(`Unsupported mode count: ${lastModeCount}.`);\n    }\n    const finalModeCount = lastModeCount;\n    // --- Reinitialize the bitstream.\n    bitstream.pos = 0;\n    // Skip the bits up to the found framing bit.\n    bitstream.skipBits(gotFramingBit);\n    // --- Now read, for each mode (in reverse order), 40 bits then one bit.\n    // That one bit is the mode blockflag.\n    const modeBlockflags = Array(finalModeCount).fill(0);\n    for (let i = finalModeCount - 1; i >= 0; i--) {\n        bitstream.skipBits(40);\n        modeBlockflags[i] = bitstream.readBits(1);\n    }\n    return { modeBlockflags };\n};\n/** Determines a packet's type (key or delta) by digging into the packet bitstream. */\nexport const determineVideoPacketType = (codec, decoderConfig, packetData) => {\n    switch (codec) {\n        case 'avc':\n            {\n                for (const loc of iterateAvcNalUnits(packetData, decoderConfig)) {\n                    const nalTypeByte = packetData[loc.offset];\n                    const type = extractNalUnitTypeForAvc(nalTypeByte);\n                    if (type >= AvcNalUnitType.NON_IDR_SLICE && type <= AvcNalUnitType.SLICE_DPC) {\n                        return 'delta';\n                    }\n                    if (type === AvcNalUnitType.IDR) {\n                        return 'key';\n                    }\n                    // In addition to IDR, Recovery Point SEI also counts as a valid H.264 keyframe by current consensus.\n                    // See https://github.com/w3c/webcodecs/issues/650 for the relevant discussion. WebKit and Firefox have\n                    // always supported them, but Chromium hasn't, therefore the (admittedly dirty) version check.\n                    if (type === AvcNalUnitType.SEI && (!isChromium() || getChromiumVersion() >= 144)) {\n                        const nalUnit = packetData.subarray(loc.offset, loc.offset + loc.length);\n                        const bytes = removeEmulationPreventionBytes(nalUnit);\n                        let pos = 1; // Skip NALU header\n                        // sei_rbsp()\n                        do {\n                            // sei_message()\n                            let payloadType = 0;\n                            while (true) {\n                                const nextByte = bytes[pos++];\n                                if (nextByte === undefined)\n                                    break;\n                                payloadType += nextByte;\n                                if (nextByte < 255) {\n                                    break;\n                                }\n                            }\n                            let payloadSize = 0;\n                            while (true) {\n                                const nextByte = bytes[pos++];\n                                if (nextByte === undefined)\n                                    break;\n                                payloadSize += nextByte;\n                                if (nextByte < 255) {\n                                    break;\n                                }\n                            }\n                            // sei_payload()\n                            const PAYLOAD_TYPE_RECOVERY_POINT = 6;\n                            if (payloadType === PAYLOAD_TYPE_RECOVERY_POINT) {\n                                const bitstream = new Bitstream(bytes);\n                                bitstream.pos = 8 * pos;\n                                const recoveryFrameCount = readExpGolomb(bitstream);\n                                const exactMatchFlag = bitstream.readBits(1);\n                                if (recoveryFrameCount === 0 && exactMatchFlag === 1) {\n                                    // https://github.com/w3c/webcodecs/pull/910\n                                    // \"recovery_frame_cnt == 0 and exact_match_flag=1 in the SEI recovery payload\"\n                                    return 'key';\n                                }\n                            }\n                            pos += payloadSize;\n                        } while (pos < bytes.length - 1);\n                    }\n                }\n                return 'delta';\n            }\n            ;\n        case 'hevc':\n            {\n                for (const loc of iterateHevcNalUnits(packetData, decoderConfig)) {\n                    const type = extractNalUnitTypeForHevc(packetData[loc.offset]);\n                    if (type < HevcNalUnitType.BLA_W_LP) {\n                        return 'delta';\n                    }\n                    if (type <= HevcNalUnitType.RSV_IRAP_VCL23) {\n                        return 'key';\n                    }\n                }\n                return 'delta';\n            }\n            ;\n        case 'vp8':\n            {\n                // VP8, once again, by far the easiest to deal with.\n                const frameType = packetData[0] & 0b1;\n                return frameType === 0 ? 'key' : 'delta';\n            }\n            ;\n        case 'vp9':\n            {\n                const bitstream = new Bitstream(packetData);\n                if (bitstream.readBits(2) !== 2) {\n                    return null;\n                }\n                ;\n                const profileLowBit = bitstream.readBits(1);\n                const profileHighBit = bitstream.readBits(1);\n                const profile = (profileHighBit << 1) + profileLowBit;\n                // Skip reserved bit for profile 3\n                if (profile === 3) {\n                    bitstream.skipBits(1);\n                }\n                const showExistingFrame = bitstream.readBits(1);\n                if (showExistingFrame) {\n                    return null;\n                }\n                const frameType = bitstream.readBits(1);\n                return frameType === 0 ? 'key' : 'delta';\n            }\n            ;\n        case 'av1':\n            {\n                let reducedStillPictureHeader = false;\n                for (const { type, data } of iterateAv1PacketObus(packetData)) {\n                    if (type === 1) { // OBU_SEQUENCE_HEADER\n                        const bitstream = new Bitstream(data);\n                        bitstream.skipBits(4);\n                        reducedStillPictureHeader = !!bitstream.readBits(1);\n                    }\n                    else if (type === 3 // OBU_FRAME_HEADER\n                        || type === 6 // OBU_FRAME\n                        || type === 7 // OBU_REDUNDANT_FRAME_HEADER\n                    ) {\n                        if (reducedStillPictureHeader) {\n                            return 'key';\n                        }\n                        const bitstream = new Bitstream(data);\n                        const showExistingFrame = bitstream.readBits(1);\n                        if (showExistingFrame) {\n                            return null;\n                        }\n                        const frameType = bitstream.readBits(2);\n                        return frameType === 0 ? 'key' : 'delta';\n                    }\n                }\n                return null;\n            }\n            ;\n        default:\n            {\n                assertNever(codec);\n                assert(false);\n            }\n            ;\n    }\n};\nexport var FlacBlockType;\n(function (FlacBlockType) {\n    FlacBlockType[FlacBlockType[\"STREAMINFO\"] = 0] = \"STREAMINFO\";\n    FlacBlockType[FlacBlockType[\"VORBIS_COMMENT\"] = 4] = \"VORBIS_COMMENT\";\n    FlacBlockType[FlacBlockType[\"PICTURE\"] = 6] = \"PICTURE\";\n})(FlacBlockType || (FlacBlockType = {}));\nexport const readVorbisComments = (bytes, metadataTags) => {\n    // https://datatracker.ietf.org/doc/html/rfc7845#section-5.2\n    const commentView = toDataView(bytes);\n    let commentPos = 0;\n    const vendorStringLength = commentView.getUint32(commentPos, true);\n    commentPos += 4;\n    const vendorString = textDecoder.decode(bytes.subarray(commentPos, commentPos + vendorStringLength));\n    commentPos += vendorStringLength;\n    if (vendorStringLength > 0) {\n        // Expose the vendor string in the raw metadata\n        metadataTags.raw ??= {};\n        metadataTags.raw['vendor'] ??= vendorString;\n    }\n    const listLength = commentView.getUint32(commentPos, true);\n    commentPos += 4;\n    // Loop over all metadata tags\n    for (let i = 0; i < listLength; i++) {\n        const stringLength = commentView.getUint32(commentPos, true);\n        commentPos += 4;\n        const string = textDecoder.decode(bytes.subarray(commentPos, commentPos + stringLength));\n        commentPos += stringLength;\n        const separatorIndex = string.indexOf('=');\n        if (separatorIndex === -1) {\n            continue;\n        }\n        const key = string.slice(0, separatorIndex).toUpperCase();\n        const value = string.slice(separatorIndex + 1);\n        metadataTags.raw ??= {};\n        metadataTags.raw[key] ??= value;\n        switch (key) {\n            case 'TITLE':\n                {\n                    metadataTags.title ??= value;\n                }\n                ;\n                break;\n            case 'DESCRIPTION':\n                {\n                    metadataTags.description ??= value;\n                }\n                ;\n                break;\n            case 'ARTIST':\n                {\n                    metadataTags.artist ??= value;\n                }\n                ;\n                break;\n            case 'ALBUM':\n                {\n                    metadataTags.album ??= value;\n                }\n                ;\n                break;\n            case 'ALBUMARTIST':\n                {\n                    metadataTags.albumArtist ??= value;\n                }\n                ;\n                break;\n            case 'COMMENT':\n                {\n                    metadataTags.comment ??= value;\n                }\n                ;\n                break;\n            case 'LYRICS':\n                {\n                    metadataTags.lyrics ??= value;\n                }\n                ;\n                break;\n            case 'TRACKNUMBER':\n                {\n                    const parts = value.split('/');\n                    const trackNum = Number.parseInt(parts[0], 10);\n                    const tracksTotal = parts[1] && Number.parseInt(parts[1], 10);\n                    if (Number.isInteger(trackNum) && trackNum > 0) {\n                        metadataTags.trackNumber ??= trackNum;\n                    }\n                    if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n                        metadataTags.tracksTotal ??= tracksTotal;\n                    }\n                }\n                ;\n                break;\n            case 'TRACKTOTAL':\n                {\n                    const tracksTotal = Number.parseInt(value, 10);\n                    if (Number.isInteger(tracksTotal) && tracksTotal > 0) {\n                        metadataTags.tracksTotal ??= tracksTotal;\n                    }\n                }\n                ;\n                break;\n            case 'DISCNUMBER':\n                {\n                    const parts = value.split('/');\n                    const discNum = Number.parseInt(parts[0], 10);\n                    const discsTotal = parts[1] && Number.parseInt(parts[1], 10);\n                    if (Number.isInteger(discNum) && discNum > 0) {\n                        metadataTags.discNumber ??= discNum;\n                    }\n                    if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) {\n                        metadataTags.discsTotal ??= discsTotal;\n                    }\n                }\n                ;\n                break;\n            case 'DISCTOTAL':\n                {\n                    const discsTotal = Number.parseInt(value, 10);\n                    if (Number.isInteger(discsTotal) && discsTotal > 0) {\n                        metadataTags.discsTotal ??= discsTotal;\n                    }\n                }\n                ;\n                break;\n            case 'DATE':\n                {\n                    const date = new Date(value);\n                    if (!Number.isNaN(date.getTime())) {\n                        metadataTags.date ??= date;\n                    }\n                }\n                ;\n                break;\n            case 'GENRE':\n                {\n                    metadataTags.genre ??= value;\n                }\n                ;\n                break;\n            case 'METADATA_BLOCK_PICTURE':\n                {\n                    // https://datatracker.ietf.org/doc/rfc9639/ Section 8.8\n                    const decoded = base64ToBytes(value);\n                    const view = toDataView(decoded);\n                    const pictureType = view.getUint32(0, false);\n                    const mediaTypeLength = view.getUint32(4, false);\n                    const mediaType = String.fromCharCode(...decoded.subarray(8, 8 + mediaTypeLength)); // ASCII\n                    const descriptionLength = view.getUint32(8 + mediaTypeLength, false);\n                    const description = textDecoder.decode(decoded.subarray(12 + mediaTypeLength, 12 + mediaTypeLength + descriptionLength));\n                    const dataLength = view.getUint32(mediaTypeLength + descriptionLength + 28);\n                    const data = decoded.subarray(mediaTypeLength + descriptionLength + 32, mediaTypeLength + descriptionLength + 32 + dataLength);\n                    metadataTags.images ??= [];\n                    metadataTags.images.push({\n                        data,\n                        mimeType: mediaType,\n                        kind: pictureType === 3 ? 'coverFront' : pictureType === 4 ? 'coverBack' : 'unknown',\n                        name: undefined,\n                        description: description || undefined,\n                    });\n                }\n                ;\n                break;\n        }\n    }\n};\nexport const createVorbisComments = (headerBytes, tags, writeImages) => {\n    // https://datatracker.ietf.org/doc/html/rfc7845#section-5.2\n    const commentHeaderParts = [\n        headerBytes,\n    ];\n    const vendorString = 'Mediabunny';\n    const encodedVendorString = textEncoder.encode(vendorString);\n    let currentBuffer = new Uint8Array(4 + encodedVendorString.length);\n    let currentView = new DataView(currentBuffer.buffer);\n    currentView.setUint32(0, encodedVendorString.length, true);\n    currentBuffer.set(encodedVendorString, 4);\n    commentHeaderParts.push(currentBuffer);\n    const writtenTags = new Set();\n    const addCommentTag = (key, value) => {\n        const joined = `${key}=${value}`;\n        const encoded = textEncoder.encode(joined);\n        currentBuffer = new Uint8Array(4 + encoded.length);\n        currentView = new DataView(currentBuffer.buffer);\n        currentView.setUint32(0, encoded.length, true);\n        currentBuffer.set(encoded, 4);\n        commentHeaderParts.push(currentBuffer);\n        writtenTags.add(key);\n    };\n    for (const { key, value } of keyValueIterator(tags)) {\n        switch (key) {\n            case 'title':\n                {\n                    addCommentTag('TITLE', value);\n                }\n                ;\n                break;\n            case 'description':\n                {\n                    addCommentTag('DESCRIPTION', value);\n                }\n                ;\n                break;\n            case 'artist':\n                {\n                    addCommentTag('ARTIST', value);\n                }\n                ;\n                break;\n            case 'album':\n                {\n                    addCommentTag('ALBUM', value);\n                }\n                ;\n                break;\n            case 'albumArtist':\n                {\n                    addCommentTag('ALBUMARTIST', value);\n                }\n                ;\n                break;\n            case 'genre':\n                {\n                    addCommentTag('GENRE', value);\n                }\n                ;\n                break;\n            case 'date':\n                {\n                    const rawVersion = tags.raw?.['DATE'] ?? tags.raw?.['date'];\n                    if (rawVersion && typeof rawVersion === 'string') {\n                        addCommentTag('DATE', rawVersion);\n                    }\n                    else {\n                        addCommentTag('DATE', value.toISOString().slice(0, 10));\n                    }\n                }\n                ;\n                break;\n            case 'comment':\n                {\n                    addCommentTag('COMMENT', value);\n                }\n                ;\n                break;\n            case 'lyrics':\n                {\n                    addCommentTag('LYRICS', value);\n                }\n                ;\n                break;\n            case 'trackNumber':\n                {\n                    addCommentTag('TRACKNUMBER', value.toString());\n                }\n                ;\n                break;\n            case 'tracksTotal':\n                {\n                    addCommentTag('TRACKTOTAL', value.toString());\n                }\n                ;\n                break;\n            case 'discNumber':\n                {\n                    addCommentTag('DISCNUMBER', value.toString());\n                }\n                ;\n                break;\n            case 'discsTotal':\n                {\n                    addCommentTag('DISCTOTAL', value.toString());\n                }\n                ;\n                break;\n            case 'images':\n                {\n                    // For example, in .flac, we put the pictures in a different section,\n                    // not in the Vorbis comment header.\n                    if (!writeImages) {\n                        break;\n                    }\n                    for (const image of value) {\n                        // https://datatracker.ietf.org/doc/rfc9639/ Section 8.8\n                        const pictureType = image.kind === 'coverFront' ? 3 : image.kind === 'coverBack' ? 4 : 0;\n                        const encodedMediaType = new Uint8Array(image.mimeType.length);\n                        for (let i = 0; i < image.mimeType.length; i++) {\n                            encodedMediaType[i] = image.mimeType.charCodeAt(i);\n                        }\n                        const encodedDescription = textEncoder.encode(image.description ?? '');\n                        const buffer = new Uint8Array(4 // Picture type\n                            + 4 // MIME type length\n                            + encodedMediaType.length // MIME type\n                            + 4 // Description length\n                            + encodedDescription.length // Description\n                            + 16 // Width, height, color depth, number of colors\n                            + 4 // Picture data length\n                            + image.data.length);\n                        const view = toDataView(buffer);\n                        view.setUint32(0, pictureType, false);\n                        view.setUint32(4, encodedMediaType.length, false);\n                        buffer.set(encodedMediaType, 8);\n                        view.setUint32(8 + encodedMediaType.length, encodedDescription.length, false);\n                        buffer.set(encodedDescription, 12 + encodedMediaType.length);\n                        // Skip a bunch of fields (width, height, color depth, number of colors)\n                        view.setUint32(28 + encodedMediaType.length + encodedDescription.length, image.data.length, false);\n                        buffer.set(image.data, 32 + encodedMediaType.length + encodedDescription.length);\n                        const encoded = bytesToBase64(buffer);\n                        addCommentTag('METADATA_BLOCK_PICTURE', encoded);\n                    }\n                }\n                ;\n                break;\n            case 'raw':\n                {\n                    // Handled later\n                }\n                ;\n                break;\n            default: assertNever(key);\n        }\n    }\n    if (tags.raw) {\n        for (const key in tags.raw) {\n            const value = tags.raw[key] ?? tags.raw[key.toLowerCase()];\n            if (key === 'vendor' || value == null || writtenTags.has(key)) {\n                continue;\n            }\n            if (typeof value === 'string') {\n                addCommentTag(key, value);\n            }\n        }\n    }\n    const listLengthBuffer = new Uint8Array(4);\n    toDataView(listLengthBuffer).setUint32(0, writtenTags.size, true);\n    commentHeaderParts.splice(2, 0, listLengthBuffer); // Insert after the header and vendor section\n    // Merge all comment header parts into a single buffer\n    const commentHeaderLength = commentHeaderParts.reduce((a, b) => a + b.length, 0);\n    const commentHeader = new Uint8Array(commentHeaderLength);\n    let pos = 0;\n    for (const part of commentHeaderParts) {\n        commentHeader.set(part, pos);\n        pos += part.length;\n    }\n    return commentHeader;\n};\n// ============================================================================\n// AC-3 / E-AC-3 Parsing\n// Reference: ETSI TS 102 366 V1.4.1\n// ============================================================================\n/**\n * Channel counts indexed by acmod (Table 4.3).\n * Does NOT include LFE - add lfeon to get total channel count.\n */\nexport const AC3_ACMOD_CHANNEL_COUNTS = [2, 1, 2, 3, 3, 4, 4, 5];\n/**\n * Parse an AC-3 syncframe to extract BSI (Bit Stream Information) fields.\n * Section 4.3\n */\nexport const parseAc3SyncFrame = (data) => {\n    if (data.length < 7) {\n        return null;\n    }\n    // Check sync word (0x0B77)\n    if (data[0] !== 0x0B || data[1] !== 0x77) {\n        return null;\n    }\n    const bitstream = new Bitstream(data);\n    bitstream.skipBits(16); // sync word\n    bitstream.skipBits(16); // crc1\n    const fscod = bitstream.readBits(2);\n    if (fscod === 3) {\n        return null; // Reserved, invalid\n    }\n    const frmsizecod = bitstream.readBits(6);\n    const bsid = bitstream.readBits(5);\n    // Verify this is AC-3\n    if (bsid > 8) {\n        return null;\n    }\n    const bsmod = bitstream.readBits(3);\n    const acmod = bitstream.readBits(3);\n    // Skip cmixlev (center downmix level) if three front channels are in use (L, C, R).\n    if ((acmod & 0x1) !== 0 && acmod !== 0x1) {\n        bitstream.skipBits(2);\n    }\n    // Skip surmixlev (surround downmix level) if surround channels are in use.\n    if ((acmod & 0x4) !== 0) {\n        bitstream.skipBits(2);\n    }\n    // Skip dsurmod if stereo (acmod === 2)\n    if (acmod === 0x2) {\n        bitstream.skipBits(2);\n    }\n    const lfeon = bitstream.readBits(1);\n    const bitRateCode = Math.floor(frmsizecod / 2);\n    return { fscod, bsid, bsmod, acmod, lfeon, bitRateCode };\n};\n/**\n * AC-3 frame sizes in bytes, indexed by [3 * frmsizecod + fscod].\n * fscod: 0=48kHz, 1=44.1kHz, 2=32kHz\n * Values are 16-bit words * 2 (to convert to bytes).\n * Table 4.13\n */\nexport const AC3_FRAME_SIZES = [\n    // frmsizecod, [48kHz, 44.1kHz, 32kHz] in bytes\n    64 * 2, 69 * 2, 96 * 2,\n    64 * 2, 70 * 2, 96 * 2,\n    80 * 2, 87 * 2, 120 * 2,\n    80 * 2, 88 * 2, 120 * 2,\n    96 * 2, 104 * 2, 144 * 2,\n    96 * 2, 105 * 2, 144 * 2,\n    112 * 2, 121 * 2, 168 * 2,\n    112 * 2, 122 * 2, 168 * 2,\n    128 * 2, 139 * 2, 192 * 2,\n    128 * 2, 140 * 2, 192 * 2,\n    160 * 2, 174 * 2, 240 * 2,\n    160 * 2, 175 * 2, 240 * 2,\n    192 * 2, 208 * 2, 288 * 2,\n    192 * 2, 209 * 2, 288 * 2,\n    224 * 2, 243 * 2, 336 * 2,\n    224 * 2, 244 * 2, 336 * 2,\n    256 * 2, 278 * 2, 384 * 2,\n    256 * 2, 279 * 2, 384 * 2,\n    320 * 2, 348 * 2, 480 * 2,\n    320 * 2, 349 * 2, 480 * 2,\n    384 * 2, 417 * 2, 576 * 2,\n    384 * 2, 418 * 2, 576 * 2,\n    448 * 2, 487 * 2, 672 * 2,\n    448 * 2, 488 * 2, 672 * 2,\n    512 * 2, 557 * 2, 768 * 2,\n    512 * 2, 558 * 2, 768 * 2,\n    640 * 2, 696 * 2, 960 * 2,\n    640 * 2, 697 * 2, 960 * 2,\n    768 * 2, 835 * 2, 1152 * 2,\n    768 * 2, 836 * 2, 1152 * 2,\n    896 * 2, 975 * 2, 1344 * 2,\n    896 * 2, 976 * 2, 1344 * 2,\n    1024 * 2, 1114 * 2, 1536 * 2,\n    1024 * 2, 1115 * 2, 1536 * 2,\n    1152 * 2, 1253 * 2, 1728 * 2,\n    1152 * 2, 1254 * 2, 1728 * 2,\n    1280 * 2, 1393 * 2, 1920 * 2,\n    1280 * 2, 1394 * 2, 1920 * 2,\n];\n/** Number of samples per AC-3 syncframe (always 1536) */\nexport const AC3_SAMPLES_PER_FRAME = 1536;\n/**\n * AC-3 registration_descriptor for MPEG-TS.\n * Section A.2.3\n */\nexport const AC3_REGISTRATION_DESCRIPTOR = new Uint8Array([0x05, 0x04, 0x41, 0x43, 0x2d, 0x33]);\n/** E-AC-3 registration_descriptor for MPEG-TS/ */\nexport const EAC3_REGISTRATION_DESCRIPTOR = new Uint8Array([0x05, 0x04, 0x45, 0x41, 0x43, 0x33]);\n/** Number of audio blocks per syncframe, indexed by numblkscod */\nexport const EAC3_NUMBLKS_TABLE = [1, 2, 3, 6];\n/**\n * Parse an E-AC-3 syncframe to extract BSI fields.\n * Section E.1.2\n */\nexport const parseEac3SyncFrame = (data) => {\n    if (data.length < 6) {\n        return null;\n    }\n    // Check sync word (0x0B77)\n    if (data[0] !== 0x0B || data[1] !== 0x77) {\n        return null;\n    }\n    const bitstream = new Bitstream(data);\n    bitstream.skipBits(16); // sync word\n    const strmtyp = bitstream.readBits(2);\n    bitstream.skipBits(3); // substreamid\n    // Only parse independent substreams (strmtyp 0 or 2)\n    if (strmtyp !== 0 && strmtyp !== 2) {\n        return null;\n    }\n    const frmsiz = bitstream.readBits(11);\n    const fscod = bitstream.readBits(2);\n    let fscod2 = 0;\n    let numblkscod;\n    if (fscod === 3) {\n        // fscod2 enables reduced sample rates (24/22.05/16 kHz) per ATSC A/52:2018\n        fscod2 = bitstream.readBits(2);\n        numblkscod = 3; // Implicitly 6 blocks when fscod=3\n    }\n    else {\n        numblkscod = bitstream.readBits(2);\n    }\n    const acmod = bitstream.readBits(3);\n    const lfeon = bitstream.readBits(1);\n    const bsid = bitstream.readBits(5);\n    // Verify this is E-AC-3\n    if (bsid < 11 || bsid > 16) {\n        return null;\n    }\n    // Calculate data rate: ((frmsiz + 1) * fs) / (numblks * 16)\n    const numblks = EAC3_NUMBLKS_TABLE[numblkscod];\n    let fs;\n    if (fscod < 3) {\n        fs = AC3_SAMPLE_RATES[fscod] / 1000;\n    }\n    else {\n        fs = EAC3_REDUCED_SAMPLE_RATES[fscod2] / 1000;\n    }\n    const dataRate = Math.round(((frmsiz + 1) * fs) / (numblks * 16));\n    // These fields require parsing beyond the first frame.\n    // Defaults are correct for almost all content.\n    const bsmod = 0;\n    const numDepSub = 0;\n    const chanLoc = 0;\n    const substream = {\n        fscod,\n        fscod2,\n        bsid,\n        bsmod,\n        acmod,\n        lfeon,\n        numDepSub,\n        chanLoc,\n    };\n    return {\n        dataRate,\n        substreams: [substream],\n    };\n};\n/**\n * Parse a dec3 box to extract E-AC-3 parameters.\n * Section F.6\n */\nexport const parseEac3Config = (data) => {\n    if (data.length < 2) {\n        return null;\n    }\n    const bitstream = new Bitstream(data);\n    const dataRate = bitstream.readBits(13);\n    const numIndSub = bitstream.readBits(3);\n    const substreams = [];\n    for (let i = 0; i <= numIndSub; i++) {\n        // Check we have enough data for this substream\n        // Each substream needs at least 24 bits (3 bytes) without dependent subs\n        if (Math.ceil(bitstream.pos / 8) + 3 > data.length) {\n            break;\n        }\n        const fscod = bitstream.readBits(2);\n        const bsid = bitstream.readBits(5);\n        bitstream.skipBits(1); // reserved\n        bitstream.skipBits(1); // asvc\n        const bsmod = bitstream.readBits(3);\n        const acmod = bitstream.readBits(3);\n        const lfeon = bitstream.readBits(1);\n        bitstream.skipBits(3); // reserved\n        const numDepSub = bitstream.readBits(4);\n        let chanLoc = 0;\n        if (numDepSub > 0) {\n            chanLoc = bitstream.readBits(9);\n        }\n        else {\n            bitstream.skipBits(1); // reserved\n        }\n        substreams.push({\n            fscod,\n            fscod2: null,\n            bsid,\n            bsmod,\n            acmod,\n            lfeon,\n            numDepSub,\n            chanLoc,\n        });\n    }\n    if (substreams.length === 0) {\n        return null;\n    }\n    return { dataRate, substreams };\n};\n/**\n * Get sample rate from E-AC-3 config.\n * See ATSC A/52:2018 for handling fscod2.\n */\nexport const getEac3SampleRate = (config) => {\n    const sub = config.substreams[0];\n    assert(sub);\n    if (sub.fscod < 3) {\n        return AC3_SAMPLE_RATES[sub.fscod];\n    }\n    else if (sub.fscod2 !== null && sub.fscod2 < 3) {\n        return EAC3_REDUCED_SAMPLE_RATES[sub.fscod2];\n    }\n    return null;\n};\n/**\n * Get channel count from E-AC-3 config (first independent substream only).\n */\nexport const getEac3ChannelCount = (config) => {\n    const sub = config.substreams[0];\n    assert(sub);\n    let channels = AC3_ACMOD_CHANNEL_COUNTS[sub.acmod] + sub.lfeon;\n    // Add channels from dependent substreams\n    if (sub.numDepSub > 0) {\n        const CHAN_LOC_COUNTS = [2, 2, 1, 1, 2, 2, 2, 1, 1];\n        for (let bit = 0; bit < 9; bit++) {\n            if (sub.chanLoc & (1 << (8 - bit))) {\n                channels += CHAN_LOC_COUNTS[bit];\n            }\n        }\n    }\n    return channels;\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { SECOND_TO_MICROSECOND_FACTOR } from './misc.js';\nexport const PLACEHOLDER_DATA = /* #__PURE__ */ new Uint8Array(0);\n/**\n * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's\n * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) and\n * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk), but can also be used\n * standalone.\n * @group Packets\n * @public\n */\nexport class EncodedPacket {\n    /** Creates a new {@link EncodedPacket} from raw bytes and timing information. */\n    constructor(\n    /**\n     * The encoded data of this packet. For any given codec, this data must adhere to the format specified in the\n     * Mediabunny Codec Registry.\n     */\n    data, \n    /** The type of this packet. */\n    type, \n    /**\n     * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps\n     * should not be presented.\n     */\n    timestamp, \n    /** The duration of this packet in seconds. */\n    duration, \n    /**\n     * The sequence number indicates the decode order of the packets. Packet A  must be decoded before packet B if A\n     * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet.\n     * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative\n     * ordering. Negative sequence numbers mean the sequence number is undefined.\n     */\n    sequenceNumber = -1, byteLength, sideData) {\n        this.data = data;\n        this.type = type;\n        this.timestamp = timestamp;\n        this.duration = duration;\n        this.sequenceNumber = sequenceNumber;\n        if (data === PLACEHOLDER_DATA && byteLength === undefined) {\n            throw new Error('Internal error: byteLength must be explicitly provided when constructing metadata-only packets.');\n        }\n        if (byteLength === undefined) {\n            byteLength = data.byteLength;\n        }\n        if (!(data instanceof Uint8Array)) {\n            throw new TypeError('data must be a Uint8Array.');\n        }\n        if (type !== 'key' && type !== 'delta') {\n            throw new TypeError('type must be either \"key\" or \"delta\".');\n        }\n        if (!Number.isFinite(timestamp)) {\n            throw new TypeError('timestamp must be a number.');\n        }\n        if (!Number.isFinite(duration) || duration < 0) {\n            throw new TypeError('duration must be a non-negative number.');\n        }\n        if (!Number.isFinite(sequenceNumber)) {\n            throw new TypeError('sequenceNumber must be a number.');\n        }\n        if (!Number.isInteger(byteLength) || byteLength < 0) {\n            throw new TypeError('byteLength must be a non-negative integer.');\n        }\n        if (sideData !== undefined && (typeof sideData !== 'object' || !sideData)) {\n            throw new TypeError('sideData, when provided, must be an object.');\n        }\n        if (sideData?.alpha !== undefined && !(sideData.alpha instanceof Uint8Array)) {\n            throw new TypeError('sideData.alpha, when provided, must be a Uint8Array.');\n        }\n        if (sideData?.alphaByteLength !== undefined\n            && (!Number.isInteger(sideData.alphaByteLength) || sideData.alphaByteLength < 0)) {\n            throw new TypeError('sideData.alphaByteLength, when provided, must be a non-negative integer.');\n        }\n        this.byteLength = byteLength;\n        this.sideData = sideData ?? {};\n        if (this.sideData.alpha && this.sideData.alphaByteLength === undefined) {\n            this.sideData.alphaByteLength = this.sideData.alpha.byteLength;\n        }\n    }\n    /**\n     * If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. They are the\n     * result of retrieving packets with {@link PacketRetrievalOptions.metadataOnly} set to `true`.\n     */\n    get isMetadataOnly() {\n        return this.data === PLACEHOLDER_DATA;\n    }\n    /** The timestamp of this packet in microseconds. */\n    get microsecondTimestamp() {\n        return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n    }\n    /** The duration of this packet in microseconds. */\n    get microsecondDuration() {\n        return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n    }\n    /** Converts this packet to an\n     * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the\n     * WebCodecs API. */\n    toEncodedVideoChunk() {\n        if (this.isMetadataOnly) {\n            throw new TypeError('Metadata-only packets cannot be converted to a video chunk.');\n        }\n        if (typeof EncodedVideoChunk === 'undefined') {\n            throw new Error('Your browser does not support EncodedVideoChunk.');\n        }\n        return new EncodedVideoChunk({\n            data: this.data,\n            type: this.type,\n            timestamp: this.microsecondTimestamp,\n            duration: this.microsecondDuration,\n        });\n    }\n    /**\n     * Converts this packet to an\n     * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the\n     * WebCodecs API, using the alpha side data instead of the color data. Throws if no alpha side data is defined.\n     */\n    alphaToEncodedVideoChunk(type = this.type) {\n        if (!this.sideData.alpha) {\n            throw new TypeError('This packet does not contain alpha side data.');\n        }\n        if (this.isMetadataOnly) {\n            throw new TypeError('Metadata-only packets cannot be converted to a video chunk.');\n        }\n        if (typeof EncodedVideoChunk === 'undefined') {\n            throw new Error('Your browser does not support EncodedVideoChunk.');\n        }\n        return new EncodedVideoChunk({\n            data: this.sideData.alpha,\n            type,\n            timestamp: this.microsecondTimestamp,\n            duration: this.microsecondDuration,\n        });\n    }\n    /** Converts this packet to an\n     * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk) for use with the\n     * WebCodecs API. */\n    toEncodedAudioChunk() {\n        if (this.isMetadataOnly) {\n            throw new TypeError('Metadata-only packets cannot be converted to an audio chunk.');\n        }\n        if (typeof EncodedAudioChunk === 'undefined') {\n            throw new Error('Your browser does not support EncodedAudioChunk.');\n        }\n        return new EncodedAudioChunk({\n            data: this.data,\n            type: this.type,\n            timestamp: this.microsecondTimestamp,\n            duration: this.microsecondDuration,\n        });\n    }\n    /**\n     * Creates an {@link EncodedPacket} from an\n     * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) or\n     * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk). This method is useful\n     * for converting chunks from the WebCodecs API to `EncodedPacket` instances.\n     */\n    static fromEncodedChunk(chunk, sideData) {\n        if (!(chunk instanceof EncodedVideoChunk || chunk instanceof EncodedAudioChunk)) {\n            throw new TypeError('chunk must be an EncodedVideoChunk or EncodedAudioChunk.');\n        }\n        const data = new Uint8Array(chunk.byteLength);\n        chunk.copyTo(data);\n        return new EncodedPacket(data, chunk.type, chunk.timestamp / 1e6, (chunk.duration ?? 0) / 1e6, undefined, undefined, sideData);\n    }\n    /** Clones this packet while optionally modifying the new packet's data. */\n    clone(options) {\n        if (options !== undefined && (typeof options !== 'object' || options === null)) {\n            throw new TypeError('options, when provided, must be an object.');\n        }\n        if (options?.data !== undefined && !(options.data instanceof Uint8Array)) {\n            throw new TypeError('options.data, when provided, must be a Uint8Array.');\n        }\n        if (options?.type !== undefined && options.type !== 'key' && options.type !== 'delta') {\n            throw new TypeError('options.type, when provided, must be either \"key\" or \"delta\".');\n        }\n        if (options?.timestamp !== undefined && !Number.isFinite(options.timestamp)) {\n            throw new TypeError('options.timestamp, when provided, must be a number.');\n        }\n        if (options?.duration !== undefined && !Number.isFinite(options.duration)) {\n            throw new TypeError('options.duration, when provided, must be a number.');\n        }\n        if (options?.sequenceNumber !== undefined && !Number.isFinite(options.sequenceNumber)) {\n            throw new TypeError('options.sequenceNumber, when provided, must be a number.');\n        }\n        if (options?.sideData !== undefined && (typeof options.sideData !== 'object' || options.sideData === null)) {\n            throw new TypeError('options.sideData, when provided, must be an object.');\n        }\n        return new EncodedPacket(options?.data ?? this.data, options?.type ?? this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, options?.sequenceNumber ?? this.sequenceNumber, this.byteLength, options?.sideData ?? this.sideData);\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { bytesToHexString, toDataView, uint8ArraysAreEqual } from '../misc.js';\nexport const buildIsobmffMimeType = (info) => {\n    const base = info.hasVideo\n        ? 'video/'\n        : info.hasAudio\n            ? 'audio/'\n            : 'application/';\n    let string = base + (info.isQuickTime ? 'quicktime' : 'mp4');\n    if (info.codecStrings.length > 0) {\n        const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n        string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n    }\n    return string;\n};\nexport const parsePsshBoxContents = (contents) => {\n    const view = toDataView(contents);\n    let pos = 0;\n    const version = view.getUint8(pos);\n    pos += 1;\n    pos += 3; // Flags\n    const systemId = bytesToHexString(contents.subarray(pos, pos + 16));\n    pos += 16;\n    let keyIds = null;\n    if (version > 0) {\n        const kidCount = view.getUint32(pos);\n        pos += 4;\n        if (kidCount > 0) {\n            keyIds = [];\n            for (let i = 0; i < kidCount; i++) {\n                keyIds.push(bytesToHexString(contents.subarray(pos, pos + 16)));\n                pos += 16;\n            }\n        }\n    }\n    const dataSize = view.getUint32(pos);\n    pos += 4;\n    return {\n        systemId,\n        keyIds,\n        data: contents.slice(pos, pos + dataSize),\n    };\n};\nexport const psshBoxesAreEqual = (a, b) => (a.systemId === b.systemId\n    && uint8ArraysAreEqual(a.data, b.data));\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { RichImageData } from '../metadata.js';\nimport { textDecoder } from '../misc.js';\nimport { readAscii, readBytes, readI32Be, readU16Be, readU32Be, readU64Be, readU8 } from '../reader.js';\nexport const MIN_BOX_HEADER_SIZE = 8;\nexport const MAX_BOX_HEADER_SIZE = 16;\nexport const readBoxHeader = (slice) => {\n    let totalSize = readU32Be(slice);\n    const name = readAscii(slice, 4);\n    let headerSize = 8;\n    const hasLargeSize = totalSize === 1;\n    if (hasLargeSize) {\n        totalSize = readU64Be(slice);\n        headerSize = 16;\n    }\n    const contentSize = totalSize - headerSize;\n    if (contentSize < 0) {\n        return null; // Hardly a box is it\n    }\n    return { name, totalSize, headerSize, contentSize };\n};\nexport const readFixed_16_16 = (slice) => {\n    return readI32Be(slice) / 0x10000;\n};\nexport const readFixed_2_30 = (slice) => {\n    return readI32Be(slice) / 0x40000000;\n};\nexport const readIsomVariableInteger = (slice) => {\n    let result = 0;\n    for (let i = 0; i < 4; i++) {\n        result <<= 7;\n        const nextByte = readU8(slice);\n        result |= nextByte & 0x7f;\n        if ((nextByte & 0x80) === 0) {\n            break;\n        }\n    }\n    return result;\n};\nexport const readMetadataStringShort = (slice) => {\n    let stringLength = readU16Be(slice);\n    slice.skip(2); // Language\n    stringLength = Math.min(stringLength, slice.remainingLength);\n    return textDecoder.decode(readBytes(slice, stringLength));\n};\nexport const readDataBox = (slice) => {\n    const header = readBoxHeader(slice);\n    if (!header || header.name !== 'data') {\n        return null;\n    }\n    if (slice.remainingLength < 8) {\n        // Box is too small\n        return null;\n    }\n    const typeIndicator = readU32Be(slice);\n    slice.skip(4); // Locale indicator\n    const data = readBytes(slice, header.contentSize - 8);\n    switch (typeIndicator) {\n        case 1: return textDecoder.decode(data); // UTF-8\n        case 2: return new TextDecoder('utf-16be').decode(data); // UTF-16-BE\n        case 13: return new RichImageData(data, 'image/jpeg');\n        case 14: return new RichImageData(data, 'image/png');\n        case 27: return new RichImageData(data, 'image/bmp');\n        default: return data;\n    }\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, assertNever, textDecoder, textEncoder } from '../misc.js';\nimport { readBytes, readF32Be, readF64Be, readU8 } from '../reader.js';\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat32 {\n    constructor(value) {\n        this.value = value;\n    }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLFloat64 {\n    constructor(value) {\n        this.value = value;\n    }\n}\n/** Wrapper around a number to be able to differentiate it in the writer. */\nexport class EBMLSignedInt {\n    constructor(value) {\n        this.value = value;\n    }\n}\nexport class EBMLUnicodeString {\n    constructor(value) {\n        this.value = value;\n    }\n}\n/** Defines some of the EBML IDs used by Matroska files. */\nexport var EBMLId;\n(function (EBMLId) {\n    EBMLId[EBMLId[\"EBML\"] = 440786851] = \"EBML\";\n    EBMLId[EBMLId[\"EBMLVersion\"] = 17030] = \"EBMLVersion\";\n    EBMLId[EBMLId[\"EBMLReadVersion\"] = 17143] = \"EBMLReadVersion\";\n    EBMLId[EBMLId[\"EBMLMaxIDLength\"] = 17138] = \"EBMLMaxIDLength\";\n    EBMLId[EBMLId[\"EBMLMaxSizeLength\"] = 17139] = \"EBMLMaxSizeLength\";\n    EBMLId[EBMLId[\"DocType\"] = 17026] = \"DocType\";\n    EBMLId[EBMLId[\"DocTypeVersion\"] = 17031] = \"DocTypeVersion\";\n    EBMLId[EBMLId[\"DocTypeReadVersion\"] = 17029] = \"DocTypeReadVersion\";\n    EBMLId[EBMLId[\"Void\"] = 236] = \"Void\";\n    EBMLId[EBMLId[\"Segment\"] = 408125543] = \"Segment\";\n    EBMLId[EBMLId[\"SeekHead\"] = 290298740] = \"SeekHead\";\n    EBMLId[EBMLId[\"Seek\"] = 19899] = \"Seek\";\n    EBMLId[EBMLId[\"SeekID\"] = 21419] = \"SeekID\";\n    EBMLId[EBMLId[\"SeekPosition\"] = 21420] = \"SeekPosition\";\n    EBMLId[EBMLId[\"Duration\"] = 17545] = \"Duration\";\n    EBMLId[EBMLId[\"Info\"] = 357149030] = \"Info\";\n    EBMLId[EBMLId[\"TimestampScale\"] = 2807729] = \"TimestampScale\";\n    EBMLId[EBMLId[\"MuxingApp\"] = 19840] = \"MuxingApp\";\n    EBMLId[EBMLId[\"WritingApp\"] = 22337] = \"WritingApp\";\n    EBMLId[EBMLId[\"Tracks\"] = 374648427] = \"Tracks\";\n    EBMLId[EBMLId[\"TrackEntry\"] = 174] = \"TrackEntry\";\n    EBMLId[EBMLId[\"TrackNumber\"] = 215] = \"TrackNumber\";\n    EBMLId[EBMLId[\"TrackUID\"] = 29637] = \"TrackUID\";\n    EBMLId[EBMLId[\"TrackType\"] = 131] = \"TrackType\";\n    EBMLId[EBMLId[\"FlagEnabled\"] = 185] = \"FlagEnabled\";\n    EBMLId[EBMLId[\"FlagDefault\"] = 136] = \"FlagDefault\";\n    EBMLId[EBMLId[\"FlagForced\"] = 21930] = \"FlagForced\";\n    EBMLId[EBMLId[\"FlagOriginal\"] = 21934] = \"FlagOriginal\";\n    EBMLId[EBMLId[\"FlagHearingImpaired\"] = 21931] = \"FlagHearingImpaired\";\n    EBMLId[EBMLId[\"FlagVisualImpaired\"] = 21932] = \"FlagVisualImpaired\";\n    EBMLId[EBMLId[\"FlagCommentary\"] = 21935] = \"FlagCommentary\";\n    EBMLId[EBMLId[\"FlagLacing\"] = 156] = \"FlagLacing\";\n    EBMLId[EBMLId[\"Name\"] = 21358] = \"Name\";\n    EBMLId[EBMLId[\"Language\"] = 2274716] = \"Language\";\n    EBMLId[EBMLId[\"LanguageBCP47\"] = 2274717] = \"LanguageBCP47\";\n    EBMLId[EBMLId[\"CodecID\"] = 134] = \"CodecID\";\n    EBMLId[EBMLId[\"CodecPrivate\"] = 25506] = \"CodecPrivate\";\n    EBMLId[EBMLId[\"CodecDelay\"] = 22186] = \"CodecDelay\";\n    EBMLId[EBMLId[\"SeekPreRoll\"] = 22203] = \"SeekPreRoll\";\n    EBMLId[EBMLId[\"DefaultDuration\"] = 2352003] = \"DefaultDuration\";\n    EBMLId[EBMLId[\"Video\"] = 224] = \"Video\";\n    EBMLId[EBMLId[\"PixelWidth\"] = 176] = \"PixelWidth\";\n    EBMLId[EBMLId[\"PixelHeight\"] = 186] = \"PixelHeight\";\n    EBMLId[EBMLId[\"DisplayWidth\"] = 21680] = \"DisplayWidth\";\n    EBMLId[EBMLId[\"DisplayHeight\"] = 21690] = \"DisplayHeight\";\n    EBMLId[EBMLId[\"DisplayUnit\"] = 21682] = \"DisplayUnit\";\n    EBMLId[EBMLId[\"AlphaMode\"] = 21440] = \"AlphaMode\";\n    EBMLId[EBMLId[\"Audio\"] = 225] = \"Audio\";\n    EBMLId[EBMLId[\"SamplingFrequency\"] = 181] = \"SamplingFrequency\";\n    EBMLId[EBMLId[\"Channels\"] = 159] = \"Channels\";\n    EBMLId[EBMLId[\"BitDepth\"] = 25188] = \"BitDepth\";\n    EBMLId[EBMLId[\"SimpleBlock\"] = 163] = \"SimpleBlock\";\n    EBMLId[EBMLId[\"BlockGroup\"] = 160] = \"BlockGroup\";\n    EBMLId[EBMLId[\"Block\"] = 161] = \"Block\";\n    EBMLId[EBMLId[\"BlockAdditions\"] = 30113] = \"BlockAdditions\";\n    EBMLId[EBMLId[\"BlockMore\"] = 166] = \"BlockMore\";\n    EBMLId[EBMLId[\"BlockAdditional\"] = 165] = \"BlockAdditional\";\n    EBMLId[EBMLId[\"BlockAddID\"] = 238] = \"BlockAddID\";\n    EBMLId[EBMLId[\"BlockDuration\"] = 155] = \"BlockDuration\";\n    EBMLId[EBMLId[\"ReferenceBlock\"] = 251] = \"ReferenceBlock\";\n    EBMLId[EBMLId[\"Cluster\"] = 524531317] = \"Cluster\";\n    EBMLId[EBMLId[\"Timestamp\"] = 231] = \"Timestamp\";\n    EBMLId[EBMLId[\"Cues\"] = 475249515] = \"Cues\";\n    EBMLId[EBMLId[\"CuePoint\"] = 187] = \"CuePoint\";\n    EBMLId[EBMLId[\"CueTime\"] = 179] = \"CueTime\";\n    EBMLId[EBMLId[\"CueTrackPositions\"] = 183] = \"CueTrackPositions\";\n    EBMLId[EBMLId[\"CueTrack\"] = 247] = \"CueTrack\";\n    EBMLId[EBMLId[\"CueClusterPosition\"] = 241] = \"CueClusterPosition\";\n    EBMLId[EBMLId[\"Colour\"] = 21936] = \"Colour\";\n    EBMLId[EBMLId[\"MatrixCoefficients\"] = 21937] = \"MatrixCoefficients\";\n    EBMLId[EBMLId[\"TransferCharacteristics\"] = 21946] = \"TransferCharacteristics\";\n    EBMLId[EBMLId[\"Primaries\"] = 21947] = \"Primaries\";\n    EBMLId[EBMLId[\"Range\"] = 21945] = \"Range\";\n    EBMLId[EBMLId[\"Projection\"] = 30320] = \"Projection\";\n    EBMLId[EBMLId[\"ProjectionType\"] = 30321] = \"ProjectionType\";\n    EBMLId[EBMLId[\"ProjectionPoseRoll\"] = 30325] = \"ProjectionPoseRoll\";\n    EBMLId[EBMLId[\"Attachments\"] = 423732329] = \"Attachments\";\n    EBMLId[EBMLId[\"AttachedFile\"] = 24999] = \"AttachedFile\";\n    EBMLId[EBMLId[\"FileDescription\"] = 18046] = \"FileDescription\";\n    EBMLId[EBMLId[\"FileName\"] = 18030] = \"FileName\";\n    EBMLId[EBMLId[\"FileMediaType\"] = 18016] = \"FileMediaType\";\n    EBMLId[EBMLId[\"FileData\"] = 18012] = \"FileData\";\n    EBMLId[EBMLId[\"FileUID\"] = 18094] = \"FileUID\";\n    EBMLId[EBMLId[\"Chapters\"] = 272869232] = \"Chapters\";\n    EBMLId[EBMLId[\"Tags\"] = 307544935] = \"Tags\";\n    EBMLId[EBMLId[\"Tag\"] = 29555] = \"Tag\";\n    EBMLId[EBMLId[\"Targets\"] = 25536] = \"Targets\";\n    EBMLId[EBMLId[\"TargetTypeValue\"] = 26826] = \"TargetTypeValue\";\n    EBMLId[EBMLId[\"TargetType\"] = 25546] = \"TargetType\";\n    EBMLId[EBMLId[\"TagTrackUID\"] = 25541] = \"TagTrackUID\";\n    EBMLId[EBMLId[\"TagEditionUID\"] = 25545] = \"TagEditionUID\";\n    EBMLId[EBMLId[\"TagChapterUID\"] = 25540] = \"TagChapterUID\";\n    EBMLId[EBMLId[\"TagAttachmentUID\"] = 25542] = \"TagAttachmentUID\";\n    EBMLId[EBMLId[\"SimpleTag\"] = 26568] = \"SimpleTag\";\n    EBMLId[EBMLId[\"TagName\"] = 17827] = \"TagName\";\n    EBMLId[EBMLId[\"TagLanguage\"] = 17530] = \"TagLanguage\";\n    EBMLId[EBMLId[\"TagString\"] = 17543] = \"TagString\";\n    EBMLId[EBMLId[\"TagBinary\"] = 17541] = \"TagBinary\";\n    EBMLId[EBMLId[\"ContentEncodings\"] = 28032] = \"ContentEncodings\";\n    EBMLId[EBMLId[\"ContentEncoding\"] = 25152] = \"ContentEncoding\";\n    EBMLId[EBMLId[\"ContentEncodingOrder\"] = 20529] = \"ContentEncodingOrder\";\n    EBMLId[EBMLId[\"ContentEncodingScope\"] = 20530] = \"ContentEncodingScope\";\n    EBMLId[EBMLId[\"ContentCompression\"] = 20532] = \"ContentCompression\";\n    EBMLId[EBMLId[\"ContentCompAlgo\"] = 16980] = \"ContentCompAlgo\";\n    EBMLId[EBMLId[\"ContentCompSettings\"] = 16981] = \"ContentCompSettings\";\n    EBMLId[EBMLId[\"ContentEncryption\"] = 20533] = \"ContentEncryption\";\n})(EBMLId || (EBMLId = {}));\nexport const LEVEL_0_EBML_IDS = [\n    EBMLId.EBML,\n    EBMLId.Segment,\n];\n// All the stuff that can appear in a segment, basically\nexport const LEVEL_1_EBML_IDS = [\n    EBMLId.SeekHead,\n    EBMLId.Info,\n    EBMLId.Cluster,\n    EBMLId.Tracks,\n    EBMLId.Cues,\n    EBMLId.Attachments,\n    EBMLId.Chapters,\n    EBMLId.Tags,\n];\nexport const LEVEL_0_AND_1_EBML_IDS = [\n    ...LEVEL_0_EBML_IDS,\n    ...LEVEL_1_EBML_IDS,\n];\nexport const measureUnsignedInt = (value) => {\n    if (value < (1 << 8)) {\n        return 1;\n    }\n    else if (value < (1 << 16)) {\n        return 2;\n    }\n    else if (value < (1 << 24)) {\n        return 3;\n    }\n    else if (value < 2 ** 32) {\n        return 4;\n    }\n    else if (value < 2 ** 40) {\n        return 5;\n    }\n    else {\n        return 6;\n    }\n};\nexport const measureUnsignedBigInt = (value) => {\n    if (value < (1n << 8n)) {\n        return 1;\n    }\n    else if (value < (1n << 16n)) {\n        return 2;\n    }\n    else if (value < (1n << 24n)) {\n        return 3;\n    }\n    else if (value < (1n << 32n)) {\n        return 4;\n    }\n    else if (value < (1n << 40n)) {\n        return 5;\n    }\n    else if (value < (1n << 48n)) {\n        return 6;\n    }\n    else if (value < (1n << 56n)) {\n        return 7;\n    }\n    else {\n        return 8;\n    }\n};\nexport const measureSignedInt = (value) => {\n    if (value >= -(1 << 6) && value < (1 << 6)) {\n        return 1;\n    }\n    else if (value >= -(1 << 13) && value < (1 << 13)) {\n        return 2;\n    }\n    else if (value >= -(1 << 20) && value < (1 << 20)) {\n        return 3;\n    }\n    else if (value >= -(1 << 27) && value < (1 << 27)) {\n        return 4;\n    }\n    else if (value >= -(2 ** 34) && value < 2 ** 34) {\n        return 5;\n    }\n    else {\n        return 6;\n    }\n};\nexport const measureVarInt = (value) => {\n    if (value < (1 << 7) - 1) {\n        /** Top bit is set, leaving 7 bits to hold the integer, but we can't store\n         * 127 because \"all bits set to one\" is a reserved value. Same thing for the\n         * other cases below:\n         */\n        return 1;\n    }\n    else if (value < (1 << 14) - 1) {\n        return 2;\n    }\n    else if (value < (1 << 21) - 1) {\n        return 3;\n    }\n    else if (value < (1 << 28) - 1) {\n        return 4;\n    }\n    else if (value < 2 ** 35 - 1) {\n        return 5;\n    }\n    else if (value < 2 ** 42 - 1) {\n        return 6;\n    }\n    else {\n        throw new Error('EBML varint size not supported ' + value);\n    }\n};\nexport class EBMLWriter {\n    constructor(writer) {\n        this.writer = writer;\n        this.helper = new Uint8Array(8);\n        this.helperView = new DataView(this.helper.buffer);\n        /**\n         * Stores the position from the start of the file to where EBML elements have been written. This is used to\n         * rewrite/edit elements that were already added before, and to measure sizes of things.\n         */\n        this.offsets = new WeakMap();\n        /** Same as offsets, but stores position where the element's data starts (after ID and size fields). */\n        this.dataOffsets = new WeakMap();\n    }\n    writeByte(value) {\n        this.helperView.setUint8(0, value);\n        this.writer.write(this.helper.subarray(0, 1));\n    }\n    writeFloat32(value) {\n        this.helperView.setFloat32(0, value, false);\n        this.writer.write(this.helper.subarray(0, 4));\n    }\n    writeFloat64(value) {\n        this.helperView.setFloat64(0, value, false);\n        this.writer.write(this.helper);\n    }\n    writeUnsignedInt(value, width = measureUnsignedInt(value)) {\n        let pos = 0;\n        // Each case falls through:\n        switch (width) {\n            case 6:\n                // Need to use division to access >32 bits of floating point var\n                this.helperView.setUint8(pos++, (value / 2 ** 40) | 0);\n            // eslint-disable-next-line no-fallthrough\n            case 5:\n                this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n            // eslint-disable-next-line no-fallthrough\n            case 4:\n                this.helperView.setUint8(pos++, value >> 24);\n            // eslint-disable-next-line no-fallthrough\n            case 3:\n                this.helperView.setUint8(pos++, value >> 16);\n            // eslint-disable-next-line no-fallthrough\n            case 2:\n                this.helperView.setUint8(pos++, value >> 8);\n            // eslint-disable-next-line no-fallthrough\n            case 1:\n                this.helperView.setUint8(pos++, value);\n                break;\n            default:\n                throw new Error('Bad unsigned int size ' + width);\n        }\n        this.writer.write(this.helper.subarray(0, pos));\n    }\n    writeUnsignedBigInt(value, width = measureUnsignedBigInt(value)) {\n        let pos = 0;\n        for (let i = width - 1; i >= 0; i--) {\n            this.helperView.setUint8(pos++, Number((value >> BigInt(i * 8)) & 0xffn));\n        }\n        this.writer.write(this.helper.subarray(0, pos));\n    }\n    writeSignedInt(value, width = measureSignedInt(value)) {\n        if (value < 0) {\n            // Two's complement stuff\n            value += 2 ** (width * 8);\n        }\n        this.writeUnsignedInt(value, width);\n    }\n    writeVarInt(value, width = measureVarInt(value)) {\n        let pos = 0;\n        switch (width) {\n            case 1:\n                this.helperView.setUint8(pos++, (1 << 7) | value);\n                break;\n            case 2:\n                this.helperView.setUint8(pos++, (1 << 6) | (value >> 8));\n                this.helperView.setUint8(pos++, value);\n                break;\n            case 3:\n                this.helperView.setUint8(pos++, (1 << 5) | (value >> 16));\n                this.helperView.setUint8(pos++, value >> 8);\n                this.helperView.setUint8(pos++, value);\n                break;\n            case 4:\n                this.helperView.setUint8(pos++, (1 << 4) | (value >> 24));\n                this.helperView.setUint8(pos++, value >> 16);\n                this.helperView.setUint8(pos++, value >> 8);\n                this.helperView.setUint8(pos++, value);\n                break;\n            case 5:\n                /**\n                 * JavaScript converts its doubles to 32-bit integers for bitwise\n                 * operations, so we need to do a division by 2^32 instead of a\n                 * right-shift of 32 to retain those top 3 bits\n                 */\n                this.helperView.setUint8(pos++, (1 << 3) | ((value / 2 ** 32) & 0x7));\n                this.helperView.setUint8(pos++, value >> 24);\n                this.helperView.setUint8(pos++, value >> 16);\n                this.helperView.setUint8(pos++, value >> 8);\n                this.helperView.setUint8(pos++, value);\n                break;\n            case 6:\n                this.helperView.setUint8(pos++, (1 << 2) | ((value / 2 ** 40) & 0x3));\n                this.helperView.setUint8(pos++, (value / 2 ** 32) | 0);\n                this.helperView.setUint8(pos++, value >> 24);\n                this.helperView.setUint8(pos++, value >> 16);\n                this.helperView.setUint8(pos++, value >> 8);\n                this.helperView.setUint8(pos++, value);\n                break;\n            default:\n                throw new Error('Bad EBML varint size ' + width);\n        }\n        this.writer.write(this.helper.subarray(0, pos));\n    }\n    writeAsciiString(str) {\n        this.writer.write(new Uint8Array(str.split('').map(x => x.charCodeAt(0))));\n    }\n    writeEBML(data) {\n        if (data === null)\n            return;\n        if (data instanceof Uint8Array) {\n            this.writer.write(data);\n        }\n        else if (Array.isArray(data)) {\n            for (const elem of data) {\n                this.writeEBML(elem);\n            }\n        }\n        else {\n            this.offsets.set(data, this.writer.getPos());\n            this.writeUnsignedInt(data.id); // ID field\n            if (Array.isArray(data.data)) {\n                const sizePos = this.writer.getPos();\n                const sizeSize = data.size === -1 ? 1 : (data.size ?? 4);\n                if (data.size === -1) {\n                    // Write the reserved all-one-bits marker for unknown/unbounded size.\n                    this.writeByte(0xff);\n                }\n                else {\n                    this.writer.seek(this.writer.getPos() + sizeSize);\n                }\n                const startPos = this.writer.getPos();\n                this.dataOffsets.set(data, startPos);\n                this.writeEBML(data.data);\n                if (data.size !== -1) {\n                    const size = this.writer.getPos() - startPos;\n                    const endPos = this.writer.getPos();\n                    this.writer.seek(sizePos);\n                    this.writeVarInt(size, sizeSize);\n                    this.writer.seek(endPos);\n                }\n            }\n            else if (typeof data.data === 'number') {\n                const size = data.size ?? measureUnsignedInt(data.data);\n                this.writeVarInt(size);\n                this.writeUnsignedInt(data.data, size);\n            }\n            else if (typeof data.data === 'bigint') {\n                const size = data.size ?? measureUnsignedBigInt(data.data);\n                this.writeVarInt(size);\n                this.writeUnsignedBigInt(data.data, size);\n            }\n            else if (typeof data.data === 'string') {\n                this.writeVarInt(data.data.length);\n                this.writeAsciiString(data.data);\n            }\n            else if (data.data instanceof Uint8Array) {\n                this.writeVarInt(data.data.byteLength, data.size);\n                this.writer.write(data.data);\n            }\n            else if (data.data instanceof EBMLFloat32) {\n                this.writeVarInt(4);\n                this.writeFloat32(data.data.value);\n            }\n            else if (data.data instanceof EBMLFloat64) {\n                this.writeVarInt(8);\n                this.writeFloat64(data.data.value);\n            }\n            else if (data.data instanceof EBMLSignedInt) {\n                const size = data.size ?? measureSignedInt(data.data.value);\n                this.writeVarInt(size);\n                this.writeSignedInt(data.data.value, size);\n            }\n            else if (data.data instanceof EBMLUnicodeString) {\n                const bytes = textEncoder.encode(data.data.value);\n                this.writeVarInt(bytes.length);\n                this.writer.write(bytes);\n            }\n            else {\n                assertNever(data.data);\n            }\n        }\n    }\n}\nexport const MAX_VAR_INT_SIZE = 8;\nexport const MIN_HEADER_SIZE = 2; // 1-byte ID and 1-byte size\nexport const MAX_HEADER_SIZE = 2 * MAX_VAR_INT_SIZE; // 8-byte ID and 8-byte size\nexport const readVarIntSize = (slice) => {\n    if (slice.remainingLength < 1) {\n        return null;\n    }\n    const firstByte = readU8(slice);\n    slice.skip(-1);\n    if (firstByte === 0) {\n        return null; // Invalid VINT\n    }\n    let width = 1;\n    let mask = 0x80;\n    while ((firstByte & mask) === 0) {\n        width++;\n        mask >>= 1;\n    }\n    // Check if we have enough bytes to read the full varint\n    if (slice.remainingLength < width) {\n        return null;\n    }\n    return width;\n};\nexport const readVarInt = (slice) => {\n    if (slice.remainingLength < 1) {\n        return null;\n    }\n    // Read the first byte to determine the width of the variable-length integer\n    const firstByte = readU8(slice);\n    if (firstByte === 0) {\n        return null; // Invalid VINT\n    }\n    // Find the position of VINT_MARKER, which determines the width\n    let width = 1;\n    let mask = 1 << 7;\n    while ((firstByte & mask) === 0) {\n        width++;\n        mask >>= 1;\n    }\n    if (slice.remainingLength < width - 1) {\n        // Not enough bytes\n        return null;\n    }\n    // First byte's value needs the marker bit cleared\n    let value = firstByte & (mask - 1);\n    // Read remaining bytes\n    for (let i = 1; i < width; i++) {\n        value *= 1 << 8;\n        value += readU8(slice);\n    }\n    return value;\n};\nexport const readUnsignedInt = (slice, width) => {\n    if (width < 1 || width > 8) {\n        throw new Error('Bad unsigned int size ' + width);\n    }\n    let value = 0;\n    // Read bytes from most significant to least significant\n    for (let i = 0; i < width; i++) {\n        value *= 1 << 8;\n        value += readU8(slice);\n    }\n    return value;\n};\nexport const readUnsignedBigInt = (slice, width) => {\n    if (width < 1) {\n        throw new Error('Bad unsigned int size ' + width);\n    }\n    let value = 0n;\n    for (let i = 0; i < width; i++) {\n        value <<= 8n;\n        value += BigInt(readU8(slice));\n    }\n    return value;\n};\nexport const readSignedInt = (slice, width) => {\n    let value = readUnsignedInt(slice, width);\n    // If the highest bit is set, convert from two's complement\n    if (value & (1 << (width * 8 - 1))) {\n        value -= 2 ** (width * 8);\n    }\n    return value;\n};\nexport const readElementId = (slice) => {\n    const size = readVarIntSize(slice);\n    if (size === null) {\n        return null;\n    }\n    if (slice.remainingLength < size) {\n        return null; // It don't fit\n    }\n    const id = readUnsignedInt(slice, size);\n    return id;\n};\n/** Returns `undefined` to indicate the EBML undefined size. Returns `null` if the size couldn't be read. */\nexport const readElementSize = (slice) => {\n    // Need at least 1 byte to read the size\n    if (slice.remainingLength < 1) {\n        return null;\n    }\n    const firstByte = readU8(slice);\n    if (firstByte === 0xff) {\n        return undefined;\n    }\n    slice.skip(-1);\n    const size = readVarInt(slice);\n    if (size === null) {\n        return null;\n    }\n    // In some (livestreamed) files, this is the value of the size field. While this technically is just a very\n    // large number, it is intended to behave like the reserved size 0xFF, meaning the size is undefined. We\n    // catch the number here. Note that it cannot be perfectly represented as a double, but the comparison works\n    // nonetheless.\n    // eslint-disable-next-line no-loss-of-precision\n    if (size === 0x00ffffffffffffff) {\n        return undefined;\n    }\n    return size;\n};\nexport const readElementHeader = (slice) => {\n    assert(slice.remainingLength >= MIN_HEADER_SIZE);\n    const id = readElementId(slice);\n    if (id === null) {\n        return null;\n    }\n    const size = readElementSize(slice);\n    if (size === null) {\n        return null;\n    }\n    return { id, size };\n};\nexport const readAsciiString = (slice, length) => {\n    const bytes = readBytes(slice, length);\n    // Actual string length might be shorter due to null terminators\n    let strLength = 0;\n    while (strLength < length && bytes[strLength] !== 0) {\n        strLength += 1;\n    }\n    return String.fromCharCode(...bytes.subarray(0, strLength));\n};\nexport const readUnicodeString = (slice, length) => {\n    const bytes = readBytes(slice, length);\n    // Actual string length might be shorter due to null terminators\n    let strLength = 0;\n    while (strLength < length && bytes[strLength] !== 0) {\n        strLength += 1;\n    }\n    return textDecoder.decode(bytes.subarray(0, strLength));\n};\nexport const readFloat = (slice, width) => {\n    if (width === 0) {\n        return 0;\n    }\n    if (width !== 4 && width !== 8) {\n        throw new Error('Bad float size ' + width);\n    }\n    return width === 4 ? readF32Be(slice) : readF64Be(slice);\n};\n/** Returns the byte offset in the file of the next element with a matching ID. */\nexport const searchForNextElementId = async (reader, startPos, ids, until) => {\n    const idsSet = new Set(ids);\n    let currentPos = startPos;\n    while (until === null || currentPos < until) {\n        let slice = reader.requestSliceRange(currentPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n        if (slice instanceof Promise)\n            slice = await slice;\n        if (!slice)\n            break;\n        const elementHeader = readElementHeader(slice);\n        if (!elementHeader) {\n            break;\n        }\n        if (idsSet.has(elementHeader.id)) {\n            return { pos: currentPos, found: true };\n        }\n        assertDefinedSize(elementHeader.size);\n        currentPos = slice.filePos + elementHeader.size;\n    }\n    return { pos: (until !== null && until > currentPos) ? until : currentPos, found: false };\n};\n/** Searches for the next occurrence of an element ID using a naive byte-wise search. */\nexport const resync = async (reader, startPos, ids, until) => {\n    const CHUNK_SIZE = 2 ** 16; // So we don't need to grab thousands of slices\n    const idsSet = new Set(ids);\n    let currentPos = startPos;\n    while (currentPos < until) {\n        let slice = reader.requestSliceRange(currentPos, 0, Math.min(CHUNK_SIZE, until - currentPos));\n        if (slice instanceof Promise)\n            slice = await slice;\n        if (!slice)\n            break;\n        if (slice.length < MAX_VAR_INT_SIZE)\n            break;\n        for (let i = 0; i < slice.length - MAX_VAR_INT_SIZE; i++) {\n            slice.filePos = currentPos;\n            const elementId = readElementId(slice);\n            if (elementId !== null && idsSet.has(elementId)) {\n                return currentPos;\n            }\n            currentPos++;\n        }\n    }\n    return null;\n};\nexport const CODEC_STRING_MAP = {\n    'avc': 'V_MPEG4/ISO/AVC',\n    'hevc': 'V_MPEGH/ISO/HEVC',\n    'vp8': 'V_VP8',\n    'vp9': 'V_VP9',\n    'av1': 'V_AV1',\n    'aac': 'A_AAC',\n    'mp3': 'A_MPEG/L3',\n    'opus': 'A_OPUS',\n    'vorbis': 'A_VORBIS',\n    'flac': 'A_FLAC',\n    'ac3': 'A_AC3',\n    'eac3': 'A_EAC3',\n    'pcm-u8': 'A_PCM/INT/LIT',\n    'pcm-s16': 'A_PCM/INT/LIT',\n    'pcm-s16be': 'A_PCM/INT/BIG',\n    'pcm-s24': 'A_PCM/INT/LIT',\n    'pcm-s24be': 'A_PCM/INT/BIG',\n    'pcm-s32': 'A_PCM/INT/LIT',\n    'pcm-s32be': 'A_PCM/INT/BIG',\n    'pcm-f32': 'A_PCM/FLOAT/IEEE',\n    'pcm-f64': 'A_PCM/FLOAT/IEEE',\n    'webvtt': 'S_TEXT/WEBVTT',\n};\nexport function assertDefinedSize(size) {\n    if (size === undefined) {\n        throw new Error('Undefined element size is used in a place where it is not supported.');\n    }\n}\n;\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nexport const buildMatroskaMimeType = (info) => {\n    const base = info.hasVideo\n        ? 'video/'\n        : info.hasAudio\n            ? 'audio/'\n            : 'application/';\n    let string = base + (info.isWebM ? 'webm' : 'x-matroska');\n    if (info.codecStrings.length > 0) {\n        const uniqueCodecMimeTypes = [...new Set(info.codecStrings.filter(Boolean))];\n        string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n    }\n    return string;\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Bitstream } from '../../shared/bitstream.js';\nimport { readBytes } from '../reader.js';\nexport const MIN_ADTS_FRAME_HEADER_SIZE = 7;\nexport const MAX_ADTS_FRAME_HEADER_SIZE = 9;\nexport const readAdtsFrameHeader = (slice) => {\n    // https://wiki.multimedia.cx/index.php/ADTS (last visited: 2025/08/17)\n    const startPos = slice.filePos;\n    const bytes = readBytes(slice, 9); // 9 with CRC, 7 without CRC\n    const bitstream = new Bitstream(bytes);\n    const syncword = bitstream.readBits(12);\n    if (syncword !== 0b1111_11111111) {\n        return null;\n    }\n    bitstream.skipBits(1); // MPEG version\n    const layer = bitstream.readBits(2);\n    if (layer !== 0) {\n        return null;\n    }\n    const protectionAbsence = bitstream.readBits(1);\n    const objectType = bitstream.readBits(2) + 1;\n    const samplingFrequencyIndex = bitstream.readBits(4);\n    if (samplingFrequencyIndex === 15) {\n        return null;\n    }\n    bitstream.skipBits(1); // Private bit\n    const channelConfiguration = bitstream.readBits(3);\n    if (channelConfiguration === 0) {\n        throw new Error('ADTS frames with channel configuration 0 are not supported.');\n    }\n    bitstream.skipBits(1); // Originality\n    bitstream.skipBits(1); // Home\n    bitstream.skipBits(1); // Copyright ID bit\n    bitstream.skipBits(1); // Copyright ID start\n    const frameLength = bitstream.readBits(13);\n    bitstream.skipBits(11); // Buffer fullness\n    const numberOfAacFrames = bitstream.readBits(2) + 1;\n    if (numberOfAacFrames !== 1) {\n        throw new Error('ADTS frames with more than one AAC frame are not supported.');\n    }\n    let crcCheck = null;\n    if (protectionAbsence === 1) { // No CRC\n        slice.filePos -= 2;\n    }\n    else { // CRC\n        crcCheck = bitstream.readBits(16);\n    }\n    return {\n        objectType,\n        samplingFrequencyIndex,\n        channelConfiguration,\n        frameLength,\n        numberOfAacFrames,\n        crcCheck,\n        startPos,\n    };\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nvar __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {\n    if (value !== null && value !== void 0) {\n        if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n        var dispose, inner;\n        if (async) {\n            if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n            dispose = value[Symbol.asyncDispose];\n        }\n        if (dispose === void 0) {\n            if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n            dispose = value[Symbol.dispose];\n            if (async) inner = dispose;\n        }\n        if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n        env.stack.push({ value: value, dispose: dispose, async: async });\n    }\n    else if (async) {\n        env.stack.push({ async: true });\n    }\n    return value;\n};\nvar __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {\n    return function (env) {\n        function fail(e) {\n            env.error = env.hasError ? new SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n            env.hasError = true;\n        }\n        var r, s = 0;\n        function next() {\n            while (r = env.stack.pop()) {\n                try {\n                    if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n                    if (r.dispose) {\n                        var result = r.dispose.call(r.value);\n                        if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n                    }\n                    else s |= 1;\n                }\n                catch (e) {\n                    fail(e);\n                }\n            }\n            if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n            if (env.hasError) throw env.error;\n        }\n        return next();\n    };\n})(typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n    var e = new Error(message);\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n});\nimport { assert, clamp, COLOR_PRIMARIES_MAP, isAllowSharedBufferSource, MATRIX_COEFFICIENTS_MAP, SECOND_TO_MICROSECOND_FACTOR, toDataView, toUint8Array, TRANSFER_CHARACTERISTICS_MAP, isFirefox, polyfillSymbolDispose, assertNever, isWebKit, simplifyRational, validateRectangle, normalizeRotation, roundToMultiple, arrayArgmin, } from './misc.js';\nimport { Logging } from './logging.js';\npolyfillSymbolDispose();\n// Let's manually handle logging the garbage collection errors that are typically logged by the browser. This way, they\n// also kick for audio samples (which is normally not the case), making sure any incorrect code is quickly caught.\nlet lastVideoGcErrorLog = -Infinity;\nlet lastAudioGcErrorLog = -Infinity;\nlet finalizationRegistry = null;\nif (typeof FinalizationRegistry !== 'undefined') {\n    finalizationRegistry = new FinalizationRegistry((value) => {\n        const now = performance.now();\n        if (value.type === 'video') {\n            if (now - lastVideoGcErrorLog >= 1000) {\n                // This error is annoying but oh so important\n                Logging._error(`A VideoSample was garbage collected without first being closed. For proper resource management,`\n                    + ` make sure to call close() on all your VideoSamples as soon as you're done using them.`);\n                lastVideoGcErrorLog = now;\n            }\n            if (typeof VideoFrame !== 'undefined' && value.data instanceof VideoFrame) {\n                value.data.close(); // Prevent the browser error since we're logging our own\n            }\n        }\n        else {\n            if (now - lastAudioGcErrorLog >= 1000) {\n                Logging._error(`An AudioSample was garbage collected without first being closed. For proper resource management,`\n                    + ` make sure to call close() on all your AudioSamples as soon as you're done using them.`);\n                lastAudioGcErrorLog = now;\n            }\n            if (typeof AudioData !== 'undefined' && value.data instanceof AudioData) {\n                value.data.close();\n            }\n        }\n    });\n}\n/**\n * Abstract base class for custom video sample resources. Implement this class to provide custom backing\n * for VideoSample instances.\n * @group Samples\n * @public\n */\nexport class VideoSampleResource {\n    constructor() {\n        /** @internal */\n        this._referenceCount = 0;\n        /** @internal */\n        this._lastAllocationBuffer = null;\n    }\n}\n/**\n * The list of {@link VideoSample} pixel formats.\n * @group Samples\n * @public\n */\nexport const VIDEO_SAMPLE_PIXEL_FORMATS = [\n    // 4:2:0 Y, U, V\n    'I420',\n    'I420P10',\n    'I420P12',\n    // 4:2:0 Y, U, V, A\n    'I420A',\n    'I420AP10',\n    'I420AP12',\n    // 4:2:2 Y, U, V\n    'I422',\n    'I422P10',\n    'I422P12',\n    // 4:2:2 Y, U, V, A\n    'I422A',\n    'I422AP10',\n    'I422AP12',\n    // 4:4:4 Y, U, V\n    'I444',\n    'I444P10',\n    'I444P12',\n    // 4:4:4 Y, U, V, A\n    'I444A',\n    'I444AP10',\n    'I444AP12',\n    // 4:2:0 Y, UV\n    'NV12',\n    // 4:4:4 RGBA\n    'RGBA',\n    // 4:4:4 RGBX (opaque)\n    'RGBX',\n    // 4:4:4 BGRA\n    'BGRA',\n    // 4:4:4 BGRX (opaque)\n    'BGRX',\n];\nconst VIDEO_SAMPLE_PIXEL_FORMATS_SET = new Set(VIDEO_SAMPLE_PIXEL_FORMATS);\n/**\n * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's\n * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame), but can also be used standalone.\n * @group Samples\n * @public\n */\nexport class VideoSample {\n    /** The width of the frame in pixels. */\n    get codedWidth() {\n        // This is wrong, but the fix is a v2 thing\n        return this.visibleRect.width;\n    }\n    /** The height of the frame in pixels. */\n    get codedHeight() {\n        // Same here\n        return this.visibleRect.height;\n    }\n    /** The display width of the frame in pixels, after aspect ratio adjustment and rotation. */\n    get displayWidth() {\n        return this.rotation % 180 === 0 ? this.squarePixelWidth : this.squarePixelHeight;\n    }\n    /** The display height of the frame in pixels, after aspect ratio adjustment and rotation. */\n    get displayHeight() {\n        return this.rotation % 180 === 0 ? this.squarePixelHeight : this.squarePixelWidth;\n    }\n    /** The presentation timestamp of the frame in microseconds. */\n    get microsecondTimestamp() {\n        return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n    }\n    /** The duration of the frame in microseconds. */\n    get microsecondDuration() {\n        return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n    }\n    /**\n     * Whether this sample uses a pixel format that can hold transparency data. Note that this doesn't necessarily mean\n     * that the sample is transparent.\n     */\n    get hasAlpha() {\n        return this.format && this.format.includes('A');\n    }\n    constructor(data, init) {\n        /** @internal */\n        this._closed = false;\n        if (data instanceof ArrayBuffer\n            || (typeof SharedArrayBuffer !== 'undefined' && data instanceof SharedArrayBuffer)\n            || ArrayBuffer.isView(data)) {\n            if (!init || typeof init !== 'object') {\n                throw new TypeError('init must be an object.');\n            }\n            if (init.format === undefined || !VIDEO_SAMPLE_PIXEL_FORMATS_SET.has(init.format)) {\n                throw new TypeError('init.format must be one of: ' + VIDEO_SAMPLE_PIXEL_FORMATS.join(', '));\n            }\n            if (!Number.isInteger(init.codedWidth) || init.codedWidth <= 0) {\n                throw new TypeError('init.codedWidth must be a positive integer.');\n            }\n            if (!Number.isInteger(init.codedHeight) || init.codedHeight <= 0) {\n                throw new TypeError('init.codedHeight must be a positive integer.');\n            }\n            if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n                throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n            }\n            if (!Number.isFinite(init.timestamp)) {\n                throw new TypeError('init.timestamp must be a number.');\n            }\n            if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n                throw new TypeError('init.duration, when provided, must be a non-negative number.');\n            }\n            if (init.layout !== undefined) {\n                if (!Array.isArray(init.layout)) {\n                    throw new TypeError('init.layout, when provided, must be an array.');\n                }\n                for (const plane of init.layout) {\n                    if (!plane || typeof plane !== 'object' || Array.isArray(plane)) {\n                        throw new TypeError('Each entry in init.layout must be an object.');\n                    }\n                    if (!Number.isInteger(plane.offset) || plane.offset < 0) {\n                        throw new TypeError('plane.offset must be a non-negative integer.');\n                    }\n                    if (!Number.isInteger(plane.stride) || plane.stride < 0) {\n                        throw new TypeError('plane.stride must be a non-negative integer.');\n                    }\n                }\n            }\n            if (init.visibleRect !== undefined) {\n                validateRectangle(init.visibleRect, 'init.visibleRect');\n            }\n            if (init.displayWidth !== undefined\n                && (!Number.isInteger(init.displayWidth) || init.displayWidth <= 0)) {\n                throw new TypeError('init.displayWidth, when provided, must be a positive integer.');\n            }\n            if (init.displayHeight !== undefined\n                && (!Number.isInteger(init.displayHeight) || init.displayHeight <= 0)) {\n                throw new TypeError('init.displayHeight, when provided, must be a positive integer.');\n            }\n            if ((init.displayWidth !== undefined) !== (init.displayHeight !== undefined)) {\n                throw new TypeError('init.displayWidth and init.displayHeight must be either both provided or both omitted.');\n            }\n            this._data = init._doNotCopy\n                ? toUint8Array(data)\n                : toUint8Array(data).slice(); // Copy it\n            this._layout = init.layout ?? createDefaultPlaneLayout(init.format, init.codedWidth, init.codedHeight);\n            this.format = init.format;\n            this.rotation = init.rotation ?? 0;\n            this.timestamp = init.timestamp;\n            this.duration = init.duration ?? 0;\n            let colorSpaceInit = init.colorSpace ?? null;\n            if (colorSpaceInit === null) {\n                if (this.format === 'RGBA' || this.format === 'RGBX'\n                    || this.format === 'BGRA' || this.format === 'BGRX') {\n                    // sRGB Color Space\n                    colorSpaceInit = {\n                        primaries: 'bt709',\n                        transfer: 'iec61966-2-1',\n                        matrix: 'rgb',\n                        fullRange: true,\n                    };\n                }\n                else {\n                    // REC709 Color Space\n                    colorSpaceInit = {\n                        primaries: 'bt709',\n                        transfer: 'bt709',\n                        matrix: 'bt709',\n                        fullRange: false,\n                    };\n                }\n            }\n            this.colorSpace = new VideoSampleColorSpace(colorSpaceInit);\n            this.visibleRect = {\n                left: init.visibleRect?.left ?? 0,\n                top: init.visibleRect?.top ?? 0,\n                width: init.visibleRect?.width ?? init.codedWidth,\n                height: init.visibleRect?.height ?? init.codedHeight,\n            };\n            if (init.displayWidth !== undefined) {\n                this.squarePixelWidth = this.rotation % 180 === 0 ? init.displayWidth : init.displayHeight;\n                this.squarePixelHeight = this.rotation % 180 === 0 ? init.displayHeight : init.displayWidth;\n            }\n            else {\n                this.squarePixelWidth = this.visibleRect.width;\n                this.squarePixelHeight = this.visibleRect.height;\n            }\n        }\n        else if (typeof VideoFrame !== 'undefined' && data instanceof VideoFrame) {\n            if (init?.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n                throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n            }\n            if (init?.timestamp !== undefined && !Number.isFinite(init?.timestamp)) {\n                throw new TypeError('init.timestamp, when provided, must be a number.');\n            }\n            if (init?.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n                throw new TypeError('init.duration, when provided, must be a non-negative number.');\n            }\n            if (init?.visibleRect !== undefined) {\n                validateRectangle(init.visibleRect, 'init.visibleRect');\n            }\n            this._data = data;\n            this._layout = null;\n            this.format = data.format;\n            this.visibleRect = {\n                left: data.visibleRect?.x ?? 0,\n                top: data.visibleRect?.y ?? 0,\n                width: data.visibleRect?.width ?? data.codedWidth,\n                height: data.visibleRect?.height ?? data.codedHeight,\n            };\n            // The VideoFrame's rotation is ignored here. It's still a new field, and I'm not sure of any application\n            // where the browser makes use of it. If a case gets found, I'll add it.\n            this.rotation = init?.rotation ?? 0;\n            // Assuming no innate VideoFrame rotation here\n            this.squarePixelWidth = data.displayWidth;\n            this.squarePixelHeight = data.displayHeight;\n            this.timestamp = init?.timestamp ?? data.timestamp / 1e6;\n            this.duration = init?.duration ?? (data.duration ?? 0) / 1e6;\n            this.colorSpace = new VideoSampleColorSpace(data.colorSpace);\n        }\n        else if ((typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement)\n            || (typeof SVGImageElement !== 'undefined' && data instanceof SVGImageElement)\n            || (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap)\n            || (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement)\n            || (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement)\n            || (typeof OffscreenCanvas !== 'undefined' && data instanceof OffscreenCanvas)) {\n            if (!init || typeof init !== 'object') {\n                throw new TypeError('init must be an object.');\n            }\n            if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n                throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n            }\n            if (!Number.isFinite(init.timestamp)) {\n                throw new TypeError('init.timestamp must be a number.');\n            }\n            if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n                throw new TypeError('init.duration, when provided, must be a non-negative number.');\n            }\n            if (typeof VideoFrame !== 'undefined') {\n                return new VideoSample(new VideoFrame(data, {\n                    timestamp: Math.trunc(init.timestamp * SECOND_TO_MICROSECOND_FACTOR),\n                    // Drag 0 to undefined\n                    duration: Math.trunc((init.duration ?? 0) * SECOND_TO_MICROSECOND_FACTOR) || undefined,\n                }), init);\n            }\n            let width = 0;\n            let height = 0;\n            // Determine the dimensions of the thing\n            if ('naturalWidth' in data) {\n                width = data.naturalWidth;\n                height = data.naturalHeight;\n            }\n            else if ('videoWidth' in data) {\n                width = data.videoWidth;\n                height = data.videoHeight;\n            }\n            else if ('width' in data) {\n                width = Number(data.width);\n                height = Number(data.height);\n            }\n            if (!width || !height) {\n                throw new TypeError('Could not determine dimensions.');\n            }\n            const canvas = new OffscreenCanvas(width, height);\n            const context = canvas.getContext('2d', {\n                alpha: isFirefox(), // Firefox has VideoFrame glitches with opaque canvases\n                willReadFrequently: true,\n            });\n            if (!context) {\n                throw new Error('OffscreenCanvas must have support for the \\'2d\\' context in order to create a VideoSample from'\n                    + ' this data.');\n            }\n            // Draw it to a canvas\n            context.drawImage(data, 0, 0);\n            this._data = canvas;\n            this._layout = null;\n            this.format = 'RGBX';\n            this.visibleRect = { left: 0, top: 0, width, height };\n            this.squarePixelWidth = width;\n            this.squarePixelHeight = height;\n            this.rotation = init.rotation ?? 0;\n            this.timestamp = init.timestamp;\n            this.duration = init.duration ?? 0;\n            this.colorSpace = new VideoSampleColorSpace({\n                matrix: 'rgb',\n                primaries: 'bt709',\n                transfer: 'iec61966-2-1',\n                fullRange: true,\n            });\n        }\n        else if (data instanceof VideoSampleResource) {\n            if (!init || typeof init !== 'object') {\n                throw new TypeError('init must be an object.');\n            }\n            if (init.rotation !== undefined && ![0, 90, 180, 270].includes(init.rotation)) {\n                throw new TypeError('init.rotation, when provided, must be 0, 90, 180, or 270.');\n            }\n            if (!Number.isFinite(init.timestamp)) {\n                throw new TypeError('init.timestamp must be a number.');\n            }\n            if (init.duration !== undefined && (!Number.isFinite(init.duration) || init.duration < 0)) {\n                throw new TypeError('init.duration, when provided, must be a non-negative number.');\n            }\n            this._data = data;\n            data._referenceCount++;\n            this.format = data.getFormat();\n            if (this.format !== null && !VIDEO_SAMPLE_PIXEL_FORMATS.includes(this.format)) {\n                throw new TypeError('getFormat() must return a VideoSamplePixelFormat or null.');\n            }\n            this.visibleRect = {\n                left: 0,\n                top: 0,\n                width: data.getCodedWidth(),\n                height: data.getCodedHeight(),\n            };\n            if (!Number.isInteger(this.visibleRect.width) || this.visibleRect.width <= 0) {\n                throw new TypeError('getCodedWidth() must return a positive integer.');\n            }\n            if (!Number.isInteger(this.visibleRect.height) || this.visibleRect.height <= 0) {\n                throw new TypeError('getCodedHeight() must return a positive integer.');\n            }\n            this.squarePixelWidth = data.getSquarePixelWidth();\n            if (!Number.isInteger(this.squarePixelWidth) || this.squarePixelWidth <= 0) {\n                throw new TypeError('getSquarePixelWidth() must return a positive integer.');\n            }\n            this.squarePixelHeight = data.getSquarePixelHeight();\n            if (!Number.isInteger(this.squarePixelHeight) || this.squarePixelHeight <= 0) {\n                throw new TypeError('getSquarePixelHeight() must return a positive integer.');\n            }\n            this.rotation = init.rotation ?? 0;\n            this.timestamp = init.timestamp;\n            this.duration = init.duration ?? 0;\n            this.colorSpace = data.getColorSpace();\n        }\n        else {\n            throw new TypeError('Invalid data type: Must be a BufferSource, CanvasImageSource, or VideoSampleResource.');\n        }\n        this.encodeOptions = init?.encodeOptions ?? {};\n        this.pixelAspectRatio = simplifyRational({\n            num: this.squarePixelWidth * this.codedHeight,\n            den: this.squarePixelHeight * this.codedWidth,\n        });\n        finalizationRegistry?.register(this, { type: 'video', data: this._data }, this);\n    }\n    /** Clones this video sample. */\n    clone() {\n        if (this._closed) {\n            throw new Error('VideoSample is closed.');\n        }\n        assert(this._data !== null);\n        if (this._data instanceof VideoSampleResource) {\n            return new VideoSample(this._data, {\n                timestamp: this.timestamp,\n                duration: this.duration,\n                rotation: this.rotation,\n                encodeOptions: this.encodeOptions,\n            });\n        }\n        else if (isVideoFrame(this._data)) {\n            return new VideoSample(this._data.clone(), {\n                timestamp: this.timestamp,\n                duration: this.duration,\n                rotation: this.rotation,\n                encodeOptions: this.encodeOptions,\n            });\n        }\n        else if (this._data instanceof Uint8Array) {\n            assert(this._layout);\n            return new VideoSample(this._data, {\n                format: this.format,\n                layout: this._layout,\n                codedWidth: this.codedWidth,\n                codedHeight: this.codedHeight,\n                timestamp: this.timestamp,\n                duration: this.duration,\n                colorSpace: this.colorSpace,\n                rotation: this.rotation,\n                visibleRect: this.visibleRect,\n                displayWidth: this.displayWidth,\n                displayHeight: this.displayHeight,\n                encodeOptions: this.encodeOptions,\n                // It's already been copied, if we copy it again we make the clone unnecessarily expensive\n                _doNotCopy: true,\n            });\n        }\n        else {\n            return new VideoSample(this._data, {\n                format: this.format,\n                codedWidth: this.codedWidth,\n                codedHeight: this.codedHeight,\n                timestamp: this.timestamp,\n                duration: this.duration,\n                colorSpace: this.colorSpace,\n                rotation: this.rotation,\n                visibleRect: this.visibleRect,\n                displayWidth: this.displayWidth,\n                displayHeight: this.displayHeight,\n                encodeOptions: this.encodeOptions,\n            });\n        }\n    }\n    /**\n     * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not\n     * needed anymore.\n     */\n    close() {\n        if (this._closed) {\n            return;\n        }\n        finalizationRegistry?.unregister(this);\n        if (this._data instanceof VideoSampleResource) {\n            this._data._referenceCount--;\n            if (this._data._referenceCount === 0) {\n                this._data.close();\n            }\n        }\n        else if (isVideoFrame(this._data)) {\n            this._data.close();\n        }\n        else {\n            this._data = null; // GC that shit\n        }\n        this._closed = true;\n    }\n    /**\n     * Returns the number of bytes required to hold this video sample's pixel data.\n     */\n    allocationSize(options = {}) {\n        validateVideoFrameCopyToOptions(options);\n        if (this._closed) {\n            throw new Error('VideoSample is closed.');\n        }\n        if ((options.format ?? this.format) == null) {\n            // https://github.com/Vanilagy/mediabunny/issues/267\n            // https://github.com/w3c/webcodecs/issues/920\n            throw new Error('Cannot get allocation size when format is null.');\n        }\n        if (isVideoFrame(this._data)) {\n            // Call the native method purely for performance\n            return this._data.allocationSize(options);\n        }\n        const combinedLayout = ParseVideoFrameCopyToOptions(this, options);\n        return combinedLayout.allocationSize;\n    }\n    /**\n     * Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView.\n     * @returns The byte layout of the planes of the copied data.\n     */\n    async copyTo(destination, options = {}) {\n        if (!isAllowSharedBufferSource(destination)) {\n            throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n        }\n        validateVideoFrameCopyToOptions(options);\n        if (this._closed) {\n            throw new Error('VideoSample is closed.');\n        }\n        if ((options.format ?? this.format) == null) {\n            throw new Error('Cannot copy video sample data when format is null.');\n        }\n        assert(this._data !== null);\n        if (isVideoFrame(this._data)) {\n            return this._data.copyTo(destination, options);\n        }\n        // Detect non-RGB to RGB conversion\n        if (options.format\n            && !['RGBA', 'RGBX', 'BGRA', 'BGRX'].includes(this.format)\n            && ['RGBA', 'RGBX', 'BGRA', 'BGRX'].includes(options.format)) {\n            // RGB conversion for custom VideoSampleResource\n            if (this._data instanceof VideoSampleResource) {\n                const env_1 = { stack: [], error: void 0, hasError: false };\n                try {\n                    const rgbSample = __addDisposableResource(env_1, await this._data.toRgbSample({\n                        timestamp: this.timestamp,\n                        duration: this.duration,\n                        rotation: this.rotation,\n                    }, options.colorSpace ?? 'srgb'), false);\n                    if (!(rgbSample instanceof VideoSample)) {\n                        throw new TypeError('toRgbSample() must return a VideoSample.');\n                    }\n                    if (!['RGBA', 'RGBX', 'BGRA', 'BGRX'].includes(rgbSample.format)) {\n                        throw new Error(`Sample returned by toRgbSample was expected to have an RGB format, got`\n                            + ` '${rgbSample.format}' instead.`);\n                    }\n                    // Note that we DON'T force the RGB format to be exactly what was requested; any RGB format will do\n                    return await rgbSample.copyTo(destination, options); // 'await' is intentional here cuz of using\n                }\n                catch (e_1) {\n                    env_1.error = e_1;\n                    env_1.hasError = true;\n                }\n                finally {\n                    __disposeResources(env_1);\n                }\n            }\n            else {\n                if (typeof VideoFrame === 'undefined') {\n                    throw new Error('For this sample, converting from a non-RGB to an RGB format requires VideoFrame to'\n                        + ' be defined.');\n                }\n                const tempFrame = this.toVideoFrame();\n                const result = await tempFrame.copyTo(destination, options);\n                tempFrame.close();\n                return result;\n            }\n        }\n        const combinedLayout = ParseVideoFrameCopyToOptions(this, options);\n        assert(this.format);\n        // 4. If destination.byteLength is less than combinedLayout’s allocationSize, return a promise rejected with\n        const destBytes = toUint8Array(destination);\n        if (destBytes.byteLength < combinedLayout.allocationSize) {\n            throw new TypeError(`Destination buffer too small. Required: ${combinedLayout.allocationSize},`\n                + ` Available: ${destBytes.byteLength}`);\n        }\n        const planeConfigs = getPlaneConfigs(this.format);\n        let dataPlanes;\n        if (this._data instanceof VideoSampleResource) {\n            let result = this._data.getDataPlanes();\n            if (result instanceof Promise)\n                result = await result;\n            if (!Array.isArray(result)\n                || result.some(x => !(x.data instanceof Uint8Array) || !Number.isInteger(x.stride) || x.stride < 0)) {\n                throw new TypeError('getDataPlanes() must return an array of objects with a Uint8Array \"data\" property and a'\n                    + ' non-negative integer \"stride\" property.');\n            }\n            dataPlanes = result;\n        }\n        else if (this._data instanceof Uint8Array) {\n            assert(this._layout);\n            assert(this._layout.length === planeConfigs.length);\n            dataPlanes = this._layout.map((planeLayout, i) => {\n                const height = Math.ceil(this.codedHeight / planeConfigs[i].heightDivisor);\n                return {\n                    data: this._data.subarray(planeLayout.offset, planeLayout.offset + planeLayout.stride * height),\n                    stride: planeLayout.stride,\n                };\n            });\n        }\n        else {\n            const canvas = this._data;\n            const context = canvas.getContext('2d');\n            assert(context); // We already got it earlier so it's definitely available\n            const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight);\n            dataPlanes = [{\n                    data: toUint8Array(imageData.data),\n                    stride: 4 * this.codedWidth,\n                }];\n        }\n        // Algo taken from WebCodecs spec:\n        // 6. Let p be a new Promise. (Implicit)\n        // 7. Let copyStepsQueue be the result of starting a new parallel queue. (Implicit)\n        // 8. Let planeLayouts be a new list.\n        const planeLayouts = [];\n        // Enqueue the following steps to copyStepsQueue: (fuck the queuing part)\n        // Let resource be the media resource referenced by [[resource reference]].\n        // (this.data)\n        // Let numPlanes be the number of planes as defined by [[format]].\n        const numPlanes = planeConfigs.length;\n        // Let planeIndex be 0.\n        // While planeIndex is less than combinedLayout’s numPlanes:\n        for (let planeIndex = 0; planeIndex < numPlanes; planeIndex++) {\n            const computedLayout = combinedLayout.computedLayouts[planeIndex];\n            // Let sourceStride be the stride of the plane in resource as identified by planeIndex.\n            const sourceStride = dataPlanes[planeIndex].stride;\n            const sourceData = dataPlanes[planeIndex].data;\n            // Let sourceOffset be the product of multiplying computedLayout’s sourceTop by sourceStride\n            let sourceOffset = computedLayout.sourceTop * sourceStride;\n            // Add computedLayout’s sourceLeftBytes to sourceOffset.\n            sourceOffset += computedLayout.sourceLeftBytes;\n            // Let destinationOffset be computedLayout’s destinationOffset.\n            let destinationOffset = computedLayout.destinationOffset;\n            // Let rowBytes be computedLayout’s sourceWidthBytes.\n            const rowBytes = computedLayout.sourceWidthBytes;\n            // Let layout be a new PlaneLayout, with offset set to destinationOffset and stride set to rowBytes.\n            // This is a spec error actually (https://github.com/w3c/webcodecs/issues/918)\n            const layout = {\n                offset: destinationOffset,\n                stride: computedLayout.destinationStride,\n            };\n            // Let row be 0.\n            // While row is less than computedLayout’s sourceHeight:\n            for (let row = 0; row < computedLayout.sourceHeight; row++) {\n                // Copy rowBytes bytes from resource starting at sourceOffset to destination starting\n                // at destinationOffset.\n                if (sourceOffset + rowBytes > sourceData.byteLength) {\n                    throw new Error(`Source buffer OOB read.`);\n                }\n                if (destinationOffset + rowBytes > destBytes.byteLength) {\n                    throw new Error(`Destination buffer OOB write.`);\n                }\n                const srcSub = sourceData.subarray(sourceOffset, sourceOffset + rowBytes);\n                destBytes.set(srcSub, destinationOffset);\n                // Increment sourceOffset by sourceStride.\n                sourceOffset += sourceStride;\n                // Increment destinationOffset by computedLayout’s destinationStride.\n                destinationOffset += computedLayout.destinationStride;\n            }\n            // Append layout to planeLayouts.\n            planeLayouts.push(layout);\n        }\n        // Now, handle converting between different RGB formats\n        if (options.format !== undefined) {\n            const needsRgbConversion = this.format.startsWith('RGB') !== options.format.startsWith('RGB');\n            // Going X->A requires setting the alpha to 255, going the other way doesn't since the value of X is w/e\n            const needsAlphaConversion = this.format.includes('X') && options.format.includes('A');\n            if (needsRgbConversion || needsAlphaConversion) {\n                // Loop over the destination bytes\n                for (let i = 0; i < combinedLayout.allocationSize; i += 4) {\n                    if (needsRgbConversion) {\n                        // Swap R with B\n                        const r = destBytes[i];\n                        const b = destBytes[i + 2];\n                        destBytes[i] = b;\n                        destBytes[i + 2] = r;\n                    }\n                    if (needsAlphaConversion) {\n                        destBytes[i + 3] = 255;\n                    }\n                }\n            }\n        }\n        // Queue a task to resolve p with planeLayouts.\n        return planeLayouts;\n    }\n    /**\n     * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this\n     * method *must* be closed separately from this video sample.\n     */\n    toVideoFrame() {\n        if (this._closed) {\n            throw new Error('VideoSample is closed.');\n        }\n        assert(this._data !== null);\n        if (this._data instanceof VideoSampleResource) {\n            if (this.format === null) {\n                throw new Error('Cannot convert a VideoSampleResource-backed VideoSample to VideoFrame if format is null.');\n            }\n            const planes = this._data.getDataPlanes();\n            if (planes instanceof Promise) {\n                throw new Error('Cannot convert a VideoSampleResource-backed VideoSample to VideoFrame if getDataPlanes() returns'\n                    + ' a promise.');\n            }\n            // We can't use allocationSize since that method assumes a tight packing\n            const size = planes.reduce((a, b) => a + b.data.byteLength, 0);\n            const buffer = new Uint8Array(size);\n            let offset = 0;\n            const offsets = [];\n            for (const plane of planes) {\n                buffer.set(plane.data, offset);\n                offsets.push(offset);\n                offset += plane.data.byteLength;\n            }\n            return new VideoFrame(buffer, {\n                format: this.format,\n                layout: planes.map((x, i) => ({\n                    offset: offsets[i],\n                    stride: x.stride,\n                })),\n                codedWidth: this.codedWidth,\n                codedHeight: this.codedHeight,\n                timestamp: this.microsecondTimestamp,\n                duration: this.microsecondDuration,\n                colorSpace: this.colorSpace,\n                displayWidth: this.squarePixelWidth, // Not display* since we're not passing rotation\n                displayHeight: this.squarePixelHeight,\n            });\n        }\n        else if (isVideoFrame(this._data)) {\n            return new VideoFrame(this._data, {\n                timestamp: this.microsecondTimestamp,\n                duration: this.microsecondDuration || undefined, // Drag 0 duration to undefined, glitches some codecs\n            });\n        }\n        else if (this._data instanceof Uint8Array) {\n            return new VideoFrame(this._data, {\n                format: this.format,\n                codedWidth: this.codedWidth,\n                codedHeight: this.codedHeight,\n                timestamp: this.microsecondTimestamp,\n                duration: this.microsecondDuration || undefined,\n                colorSpace: this.colorSpace,\n                displayWidth: this.squarePixelWidth, // Not display* since we're not passing rotation\n                displayHeight: this.squarePixelHeight,\n            });\n        }\n        else {\n            return new VideoFrame(this._data, {\n                timestamp: this.microsecondTimestamp,\n                duration: this.microsecondDuration || undefined,\n            });\n        }\n    }\n    draw(context, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) {\n        let sx = 0;\n        let sy = 0;\n        let sWidth = this.displayWidth;\n        let sHeight = this.displayHeight;\n        let dx = 0;\n        let dy = 0;\n        let dWidth = this.displayWidth;\n        let dHeight = this.displayHeight;\n        if (arg5 !== undefined) {\n            sx = arg1;\n            sy = arg2;\n            sWidth = arg3;\n            sHeight = arg4;\n            dx = arg5;\n            dy = arg6;\n            if (arg7 !== undefined) {\n                dWidth = arg7;\n                dHeight = arg8;\n            }\n            else {\n                dWidth = sWidth;\n                dHeight = sHeight;\n            }\n        }\n        else {\n            dx = arg1;\n            dy = arg2;\n            if (arg3 !== undefined) {\n                dWidth = arg3;\n                dHeight = arg4;\n            }\n        }\n        if (!((typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D)\n            || (typeof OffscreenCanvasRenderingContext2D !== 'undefined'\n                && context instanceof OffscreenCanvasRenderingContext2D))) {\n            throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.');\n        }\n        if (!Number.isFinite(sx)) {\n            throw new TypeError('sx must be a number.');\n        }\n        if (!Number.isFinite(sy)) {\n            throw new TypeError('sy must be a number.');\n        }\n        if (!Number.isFinite(sWidth) || sWidth < 0) {\n            throw new TypeError('sWidth must be a non-negative number.');\n        }\n        if (!Number.isFinite(sHeight) || sHeight < 0) {\n            throw new TypeError('sHeight must be a non-negative number.');\n        }\n        if (!Number.isFinite(dx)) {\n            throw new TypeError('dx must be a number.');\n        }\n        if (!Number.isFinite(dy)) {\n            throw new TypeError('dy must be a number.');\n        }\n        if (!Number.isFinite(dWidth) || dWidth < 0) {\n            throw new TypeError('dWidth must be a non-negative number.');\n        }\n        if (!Number.isFinite(dHeight) || dHeight < 0) {\n            throw new TypeError('dHeight must be a non-negative number.');\n        }\n        if (this._closed) {\n            throw new Error('VideoSample is closed.');\n        }\n        ({ sx, sy, sWidth, sHeight } = this._rotateSourceRegion(sx, sy, sWidth, sHeight, this.rotation));\n        const source = this.toCanvasImageSource();\n        context.save();\n        const centerX = dx + dWidth / 2;\n        const centerY = dy + dHeight / 2;\n        context.translate(centerX, centerY);\n        context.rotate(this.rotation * Math.PI / 180);\n        const aspectRatioChange = this.rotation % 180 === 0 ? 1 : dWidth / dHeight;\n        // Scale to compensate for aspect ratio changes when rotated\n        context.scale(1 / aspectRatioChange, aspectRatioChange);\n        context.drawImage(source, sx, sy, sWidth, sHeight, -dWidth / 2, -dHeight / 2, dWidth, dHeight);\n        context.restore();\n    }\n    /**\n     * Draws the sample in the middle of the canvas corresponding to the context with the specified fit behavior.\n     */\n    drawWithFit(context, options) {\n        if (!((typeof CanvasRenderingContext2D !== 'undefined' && context instanceof CanvasRenderingContext2D)\n            || (typeof OffscreenCanvasRenderingContext2D !== 'undefined'\n                && context instanceof OffscreenCanvasRenderingContext2D))) {\n            throw new TypeError('context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.');\n        }\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (!['fill', 'contain', 'cover'].includes(options.fit)) {\n            throw new TypeError('options.fit must be \\'fill\\', \\'contain\\', or \\'cover\\'.');\n        }\n        if (options.rotation !== undefined && ![0, 90, 180, 270].includes(options.rotation)) {\n            throw new TypeError('options.rotation, when provided, must be 0, 90, 180, or 270.');\n        }\n        if (options.crop !== undefined) {\n            validateCropRectangle(options.crop, 'options.');\n        }\n        const canvasWidth = context.canvas.width;\n        const canvasHeight = context.canvas.height;\n        const rotation = options.rotation ?? this.rotation;\n        const [rotatedWidth, rotatedHeight] = rotation % 180 === 0\n            ? [this.squarePixelWidth, this.squarePixelHeight]\n            : [this.squarePixelHeight, this.squarePixelWidth];\n        let finalCrop = options.crop;\n        if (finalCrop) {\n            finalCrop = clampCropRectangle(finalCrop, rotatedWidth, rotatedHeight);\n        }\n        // These variables specify where the final sample will be drawn on the canvas\n        let dx;\n        let dy;\n        let newWidth;\n        let newHeight;\n        const { sx, sy, sWidth, sHeight } = this._rotateSourceRegion(options.crop?.left ?? 0, options.crop?.top ?? 0, options.crop?.width ?? rotatedWidth, options.crop?.height ?? rotatedHeight, rotation);\n        if (options.fit === 'fill') {\n            dx = 0;\n            dy = 0;\n            newWidth = canvasWidth;\n            newHeight = canvasHeight;\n        }\n        else {\n            const [sampleWidth, sampleHeight] = options.crop\n                ? [options.crop.width, options.crop.height]\n                : [rotatedWidth, rotatedHeight];\n            const scale = options.fit === 'contain'\n                ? Math.min(canvasWidth / sampleWidth, canvasHeight / sampleHeight)\n                : Math.max(canvasWidth / sampleWidth, canvasHeight / sampleHeight);\n            newWidth = sampleWidth * scale;\n            newHeight = sampleHeight * scale;\n            dx = (canvasWidth - newWidth) / 2;\n            dy = (canvasHeight - newHeight) / 2;\n        }\n        context.save();\n        const aspectRatioChange = rotation % 180 === 0 ? 1 : newWidth / newHeight;\n        context.translate(canvasWidth / 2, canvasHeight / 2);\n        context.rotate(rotation * Math.PI / 180);\n        // This aspect ratio compensation is done so that we can draw the sample with the intended dimensions and\n        // don't need to think about how those dimensions change after the rotation\n        context.scale(1 / aspectRatioChange, aspectRatioChange);\n        context.translate(-canvasWidth / 2, -canvasHeight / 2);\n        // Important that we don't use .draw() here since that would take rotation into account, but we wanna handle it\n        // ourselves here\n        context.drawImage(this.toCanvasImageSource(), sx, sy, sWidth, sHeight, dx, dy, newWidth, newHeight);\n        context.restore();\n    }\n    /** @internal */\n    _rotateSourceRegion(sx, sy, sWidth, sHeight, rotation) {\n        // The provided sx,sy,sWidth,sHeight refer to the final rotated image, but that's not actually how the image is\n        // stored. Therefore, we must map these back onto the original, pre-rotation image.\n        if (rotation === 90) {\n            [sx, sy, sWidth, sHeight] = [\n                sy,\n                this.squarePixelHeight - sx - sWidth,\n                sHeight,\n                sWidth,\n            ];\n        }\n        else if (rotation === 180) {\n            [sx, sy] = [\n                this.squarePixelWidth - sx - sWidth,\n                this.squarePixelHeight - sy - sHeight,\n            ];\n        }\n        else if (rotation === 270) {\n            [sx, sy, sWidth, sHeight] = [\n                this.squarePixelWidth - sy - sHeight,\n                sx,\n                sHeight,\n                sWidth,\n            ];\n        }\n        return { sx, sy, sWidth, sHeight };\n    }\n    /**\n     * Converts this video sample to a\n     * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource) for drawing to a canvas.\n     *\n     * You must use the value returned by this method immediately, as any VideoFrame created internally may\n     * automatically be closed in the next microtask.\n     */\n    toCanvasImageSource() {\n        if (this._closed) {\n            throw new Error('VideoSample is closed.');\n        }\n        assert(this._data !== null);\n        if (this._data instanceof VideoSampleResource || this._data instanceof Uint8Array) {\n            // Requires VideoFrame to be defined\n            const videoFrame = this.toVideoFrame();\n            queueMicrotask(() => videoFrame.close()); // Let's automatically close the frame in the next microtask\n            return videoFrame;\n        }\n        else {\n            return this._data;\n        }\n    }\n    /**\n     * Transform this video sample to a new video sample given the options. Can be used to resize, rotate, and crop\n     * the sample.\n     *\n     * In non-browser environments, this method will not work by default. To make it work, register a custom\n     * transformer function via {@link registerVideoSampleTransformer}.\n     */\n    async transform(options) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) {\n            throw new TypeError('options.width, when provided, must be a positive integer.');\n        }\n        if (options.height !== undefined && (!Number.isInteger(options.height) || options.height <= 0)) {\n            throw new TypeError('options.height, when provided, must be a positive integer.');\n        }\n        if (options.roundDimensionsTo !== undefined\n            && (!Number.isInteger(options.roundDimensionsTo) || options.roundDimensionsTo <= 0)) {\n            throw new TypeError('options.roundDimensionsTo, when provided, must be a positive integer.');\n        }\n        if (options.fit !== undefined && !['fill', 'contain', 'cover'].includes(options.fit)) {\n            throw new TypeError('options.fit, when provided, must be one of \"fill\", \"contain\", or \"cover\".');\n        }\n        if (options.width !== undefined\n            && options.height !== undefined\n            && options.fit === undefined) {\n            throw new TypeError('When both options.width and options.height are provided, options.fit must also be provided.');\n        }\n        if (options.rotate !== undefined && ![0, 90, 180, 270].includes(options.rotate)) {\n            throw new TypeError('options.rotate, when provided, must be 0, 90, 180 or 270.');\n        }\n        if (options.crop !== undefined) {\n            validateCropRectangle(options.crop, 'options.');\n        }\n        if (options.alpha !== undefined && !['keep', 'discard'].includes(options.alpha)) {\n            throw new TypeError('options.alpha, when provided, must be \\'keep\\' or \\'discard\\'.');\n        }\n        const rotation = normalizeRotation(this.rotation + (options.rotate ?? 0));\n        const [rotatedWidth, rotatedHeight] = rotation % 180 === 0\n            ? [this.squarePixelWidth, this.squarePixelHeight]\n            : [this.squarePixelHeight, this.squarePixelWidth];\n        // Clamp crop rectangle to the rotated video dimensions\n        let finalCrop = options.crop;\n        if (finalCrop) {\n            finalCrop = clampCropRectangle(finalCrop, rotatedWidth, rotatedHeight);\n        }\n        const cropWidth = finalCrop ? finalCrop.width : rotatedWidth;\n        const cropHeight = finalCrop ? finalCrop.height : rotatedHeight;\n        const originalAspectRatio = cropWidth / cropHeight;\n        let targetWidth;\n        let targetHeight;\n        if (options.width !== undefined && options.height === undefined) {\n            targetWidth = options.width;\n            targetHeight = targetWidth / originalAspectRatio;\n        }\n        else if (options.width === undefined && options.height !== undefined) {\n            targetHeight = options.height;\n            targetWidth = targetHeight * originalAspectRatio;\n        }\n        else if (options.width !== undefined && options.height !== undefined) {\n            targetWidth = options.width;\n            targetHeight = options.height;\n        }\n        else {\n            targetWidth = cropWidth;\n            targetHeight = cropHeight;\n        }\n        targetWidth = roundToMultiple(targetWidth, options.roundDimensionsTo ?? 1);\n        targetHeight = roundToMultiple(targetHeight, options.roundDimensionsTo ?? 1);\n        const description = {\n            width: targetWidth,\n            height: targetHeight,\n            fit: options.fit ?? 'fill',\n            rotation,\n            crop: finalCrop ?? {\n                left: 0,\n                top: 0,\n                width: rotatedWidth,\n                height: rotatedHeight,\n            },\n            alpha: options.alpha ?? 'keep',\n        };\n        // Description's finalized; let's see if a registered transformer wants to handle it\n        for (const transformer of registeredVideoSampleTransformers) {\n            let result = transformer(this, description);\n            if (result instanceof Promise)\n                result = await result;\n            if (result !== null) {\n                return result;\n            }\n        }\n        // We need to handle it ourselves, and we use canvases to do it\n        let canvas = null;\n        let canvasIsNew = false;\n        for (const entry of transformationCanvasCache) {\n            if (entry.canvas.width === description.width && entry.canvas.height === description.height) {\n                canvas = entry.canvas;\n                entry.age = transformationCanvasCacheNextAge++;\n                break;\n            }\n        }\n        if (canvas === null) {\n            if (typeof OffscreenCanvas !== 'undefined') {\n                canvas = new OffscreenCanvas(description.width, description.height);\n            }\n            else {\n                if (typeof window === 'undefined' || typeof document === 'undefined') {\n                    throw new Error('Cannot transform VideoSamples in this environment. Either run in an environment with'\n                        + ' OffscreenCanvas or HTMLCanvasElement, or supply a custom VideoSample transformer using'\n                        + ' registerVideoSampleTransformer().');\n                }\n                canvas = document.createElement('canvas');\n                canvas.width = description.width;\n                canvas.height = description.height;\n            }\n            canvasIsNew = true;\n            if (transformationCanvasCache.length >= TRANSFORMATION_CANVAS_CACHE_MAX_SIZE) {\n                transformationCanvasCache.splice(arrayArgmin(transformationCanvasCache, x => x.age), 1);\n            }\n            transformationCanvasCache.push({\n                canvas,\n                age: transformationCanvasCacheNextAge++,\n            });\n        }\n        const context = canvas.getContext('2d', {\n            alpha: true,\n        });\n        if (!context) {\n            throw new Error('The \\'2d\\' canvas context is required to transform VideoSamples. Register a custom transformer using'\n                + ' registerVideoSampleTransformer to work around this limitation.');\n        }\n        if (description.alpha === 'discard') {\n            context.fillStyle = 'black';\n            context.fillRect(0, 0, description.width, description.height);\n        }\n        else if (!canvasIsNew) {\n            // Cached canvases carry stale pixels from a prior draw\n            context.clearRect(0, 0, description.width, description.height);\n        }\n        this.drawWithFit(context, {\n            fit: description.fit,\n            rotation: description.rotation,\n            crop: description.crop,\n        });\n        return new VideoSample(canvas, {\n            timestamp: this.timestamp,\n            duration: this.duration,\n            rotation: 0, // Any previous rotation is now baked in\n        });\n    }\n    /** Sets the rotation metadata of this video sample. */\n    setRotation(newRotation) {\n        if (![0, 90, 180, 270].includes(newRotation)) {\n            throw new TypeError('newRotation must be 0, 90, 180, or 270.');\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n        this.rotation = newRotation;\n    }\n    /** Sets the presentation timestamp of this video sample, in seconds. */\n    setTimestamp(newTimestamp) {\n        if (!Number.isFinite(newTimestamp)) {\n            throw new TypeError('newTimestamp must be a number.');\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n        this.timestamp = newTimestamp;\n    }\n    /** Sets the duration of this video sample, in seconds. */\n    setDuration(newDuration) {\n        if (!Number.isFinite(newDuration) || newDuration < 0) {\n            throw new TypeError('newDuration must be a non-negative number.');\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n        this.duration = newDuration;\n    }\n    /** Sets the encode options used when this sample is passed to an encoder. */\n    setEncodeOptions(newEncodeOptions) {\n        if (!newEncodeOptions || typeof newEncodeOptions !== 'object') {\n            throw new TypeError('newEncodeOptions must be an object.');\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n        this.encodeOptions = newEncodeOptions;\n    }\n    /** Calls `.close()`. */\n    [Symbol.dispose]() {\n        this.close();\n    }\n}\nconst registeredVideoSampleTransformers = [];\n/**\n * Registers a callback to handle the transformation of {@link VideoSample} instances. The callback can either return\n * the transformed sample, or `null` to indicate that it doesn't want to handle the given transformation task.\n * @group Samples\n * @public\n */\nexport const registerVideoSampleTransformer = (transformer) => {\n    if (registeredVideoSampleTransformers.includes(transformer)) {\n        return; // Already in there\n    }\n    registeredVideoSampleTransformers.push(transformer);\n};\nconst TRANSFORMATION_CANVAS_CACHE_MAX_SIZE = 3;\nconst transformationCanvasCache = [];\nlet transformationCanvasCacheNextAge = 0;\n/**\n * Describes the color space of a {@link VideoSample}. Corresponds to the WebCodecs API's VideoColorSpace.\n * @group Samples\n * @public\n */\nexport class VideoSampleColorSpace {\n    /** Creates a new VideoSampleColorSpace. */\n    constructor(init) {\n        if (init !== undefined) {\n            if (!init || typeof init !== 'object') {\n                throw new TypeError('init.colorSpace, when provided, must be an object.');\n            }\n            const primariesValues = Object.keys(COLOR_PRIMARIES_MAP);\n            if (init.primaries != null && !primariesValues.includes(init.primaries)) {\n                throw new TypeError(`init.colorSpace.primaries, when provided, must be one of ${primariesValues.join(', ')}.`);\n            }\n            const transferValues = Object.keys(TRANSFER_CHARACTERISTICS_MAP);\n            if (init.transfer != null && !transferValues.includes(init.transfer)) {\n                throw new TypeError(`init.colorSpace.transfer, when provided, must be one of ${transferValues.join(', ')}.`);\n            }\n            const matrixValues = Object.keys(MATRIX_COEFFICIENTS_MAP);\n            if (init.matrix != null && !matrixValues.includes(init.matrix)) {\n                throw new TypeError(`init.colorSpace.matrix, when provided, must be one of ${matrixValues.join(', ')}.`);\n            }\n            if (init.fullRange != null && typeof init.fullRange !== 'boolean') {\n                throw new TypeError('init.colorSpace.fullRange, when provided, must be a boolean.');\n            }\n        }\n        this.primaries = init?.primaries ?? null;\n        this.transfer = init?.transfer ?? null;\n        this.matrix = init?.matrix ?? null;\n        this.fullRange = init?.fullRange ?? null;\n    }\n    /** Serializes the color space to a JSON object. */\n    toJSON() {\n        return {\n            primaries: this.primaries,\n            transfer: this.transfer,\n            matrix: this.matrix,\n            fullRange: this.fullRange,\n        };\n    }\n}\nconst isVideoFrame = (x) => {\n    return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame;\n};\nexport const clampCropRectangle = (crop, outerWidth, outerHeight) => {\n    const left = Math.min(crop.left, outerWidth);\n    const top = Math.min(crop.top, outerHeight);\n    const width = Math.min(crop.width, outerWidth - left);\n    const height = Math.min(crop.height, outerHeight - top);\n    assert(width >= 0);\n    assert(height >= 0);\n    return { left, top, width, height };\n};\nexport const validateCropRectangle = (crop, prefix) => {\n    if (!crop || typeof crop !== 'object') {\n        throw new TypeError(prefix + 'crop, when provided, must be an object.');\n    }\n    if (!Number.isInteger(crop.left) || crop.left < 0) {\n        throw new TypeError(prefix + 'crop.left must be a non-negative integer.');\n    }\n    if (!Number.isInteger(crop.top) || crop.top < 0) {\n        throw new TypeError(prefix + 'crop.top must be a non-negative integer.');\n    }\n    if (!Number.isInteger(crop.width) || crop.width < 0) {\n        throw new TypeError(prefix + 'crop.width must be a non-negative integer.');\n    }\n    if (!Number.isInteger(crop.height) || crop.height < 0) {\n        throw new TypeError(prefix + 'crop.height must be a non-negative integer.');\n    }\n};\nconst validateVideoFrameCopyToOptions = (options) => {\n    if (!options || typeof options !== 'object') {\n        throw new TypeError('options must be an object.');\n    }\n    if (options.colorSpace !== undefined && !['display-p3', 'srgb'].includes(options.colorSpace)) {\n        throw new TypeError('options.colorSpace, when provided, must be \\'display-p3\\' or \\'srgb\\'.');\n    }\n    if (options.format !== undefined && typeof options.format !== 'string') {\n        throw new TypeError('options.format, when provided, must be a string.');\n    }\n    if (options.layout !== undefined) {\n        if (!Array.isArray(options.layout)) {\n            throw new TypeError('options.layout, when provided, must be an array.');\n        }\n        for (const plane of options.layout) {\n            if (!plane || typeof plane !== 'object') {\n                throw new TypeError('Each entry in options.layout must be an object.');\n            }\n            if (!Number.isInteger(plane.offset) || plane.offset < 0) {\n                throw new TypeError('plane.offset must be a non-negative integer.');\n            }\n            if (!Number.isInteger(plane.stride) || plane.stride < 0) {\n                throw new TypeError('plane.stride must be a non-negative integer.');\n            }\n        }\n    }\n    if (options.rect !== undefined) {\n        if (!options.rect || typeof options.rect !== 'object') {\n            throw new TypeError('options.rect, when provided, must be an object.');\n        }\n        if (options.rect.x !== undefined && (!Number.isInteger(options.rect.x) || options.rect.x < 0)) {\n            throw new TypeError('options.rect.x, when provided, must be a non-negative integer.');\n        }\n        if (options.rect.y !== undefined && (!Number.isInteger(options.rect.y) || options.rect.y < 0)) {\n            throw new TypeError('options.rect.y, when provided, must be a non-negative integer.');\n        }\n        if (options.rect.width !== undefined && (!Number.isInteger(options.rect.width) || options.rect.width < 0)) {\n            throw new TypeError('options.rect.width, when provided, must be a non-negative integer.');\n        }\n        if (options.rect.height !== undefined && (!Number.isInteger(options.rect.height) || options.rect.height < 0)) {\n            throw new TypeError('options.rect.height, when provided, must be a non-negative integer.');\n        }\n    }\n};\n/** Implements logic from WebCodecs § 9.4.6 \"Compute Layout and Allocation Size\" */\nconst createDefaultPlaneLayout = (format, codedWidth, codedHeight) => {\n    const planes = getPlaneConfigs(format);\n    const layouts = [];\n    let currentOffset = 0;\n    for (const plane of planes) {\n        // Per § 9.8, dimensions are usually \"rounded up to the nearest integer\".\n        const planeWidth = Math.ceil(codedWidth / plane.widthDivisor);\n        const planeHeight = Math.ceil(codedHeight / plane.heightDivisor);\n        const stride = planeWidth * plane.sampleBytes;\n        // Tight packing\n        const planeSize = stride * planeHeight;\n        layouts.push({\n            offset: currentOffset,\n            stride: stride,\n        });\n        currentOffset += planeSize;\n    }\n    return layouts;\n};\n/** Helper to retrieve plane configurations based on WebCodecs § 9.8 Pixel Format definitions. */\nexport const getPlaneConfigs = (format) => {\n    // Helper for standard YUV planes\n    const yuv = (yBytes, uvBytes, subX, subY, hasAlpha) => {\n        const configs = [\n            { sampleBytes: yBytes, widthDivisor: 1, heightDivisor: 1 },\n            { sampleBytes: uvBytes, widthDivisor: subX, heightDivisor: subY },\n            { sampleBytes: uvBytes, widthDivisor: subX, heightDivisor: subY },\n        ];\n        if (hasAlpha) {\n            // Match luma dimensions\n            configs.push({ sampleBytes: yBytes, widthDivisor: 1, heightDivisor: 1 });\n        }\n        return configs;\n    };\n    switch (format) {\n        case 'I420':\n            return yuv(1, 1, 2, 2, false);\n        case 'I420P10':\n        case 'I420P12':\n            return yuv(2, 2, 2, 2, false);\n        case 'I420A':\n            return yuv(1, 1, 2, 2, true);\n        case 'I420AP10':\n        case 'I420AP12':\n            return yuv(2, 2, 2, 2, true);\n        case 'I422':\n            return yuv(1, 1, 2, 1, false);\n        case 'I422P10':\n        case 'I422P12':\n            return yuv(2, 2, 2, 1, false);\n        case 'I422A':\n            return yuv(1, 1, 2, 1, true);\n        case 'I422AP10':\n        case 'I422AP12':\n            return yuv(2, 2, 2, 1, true);\n        case 'I444':\n            return yuv(1, 1, 1, 1, false);\n        case 'I444P10':\n        case 'I444P12':\n            return yuv(2, 2, 1, 1, false);\n        case 'I444A':\n            return yuv(1, 1, 1, 1, true);\n        case 'I444AP10':\n        case 'I444AP12':\n            return yuv(2, 2, 1, 1, true);\n        case 'NV12':\n            return [\n                { sampleBytes: 1, widthDivisor: 1, heightDivisor: 1 },\n                { sampleBytes: 2, widthDivisor: 2, heightDivisor: 2 }, // Interleaved U and V\n            ];\n        case 'RGBA':\n        case 'RGBX':\n        case 'BGRA':\n        case 'BGRX':\n            return [\n                { sampleBytes: 4, widthDivisor: 1, heightDivisor: 1 },\n            ];\n        default:\n            assertNever(format);\n            assert(false);\n    }\n};\n/** Taken from the WebCodecs spec. */\nconst ParseVideoFrameCopyToOptions = (sample, options) => {\n    // 1. Let defaultRect be the result of performing the getter steps for visibleRect.\n    const defaultRect = {\n        left: 0,\n        top: 0,\n        width: sample.codedWidth,\n        height: sample.codedHeight,\n    };\n    // 2. Let overrideRect be undefined.\n    // 3. If options.rect exists, assign the value of options.rect to overrideRect.\n    const overrideRect = options.rect;\n    // 4. Let parsedRect be the result of running the Parse Visible Rect algorithm...\n    const parsedRect = ParseVisibleRect(defaultRect, overrideRect, sample.codedWidth, sample.codedHeight, sample.format);\n    // 5. If parsedRect is an exception, return parsedRect. (Handled by throw)\n    // 6. Let optLayout be undefined.\n    // 7. If options.layout exists, assign its value to optLayout.\n    const optLayout = options.layout;\n    // 8. Let format be undefined.\n    let format;\n    // 9. If options.format does not exist, assign [[format]] to format.\n    if (!options.format || options.format === sample.format) {\n        format = sample.format;\n    }\n    else if (['RGBA', 'RGBX', 'BGRA', 'BGRX'].includes(options.format)) {\n        // 10. Otherwise, if options.format is equal to one of RGBA, RGBX, BGRA, BGRX, then assign options.format\n        //  to format...\n        format = options.format;\n    }\n    else {\n        throw new Error('NotSupportedError: Invalid destination format.');\n    }\n    // 11. Let combinedLayout be the result of running the Compute Layout and Allocation Size algorithm...\n    return ComputeLayoutAndAllocationSize(parsedRect, format, optLayout);\n};\n/** Taken from the WebCodecs spec. */\nconst ParseVisibleRect = (defaultRect, overrideRect, codedWidth, codedHeight, format) => {\n    // 1. Let sourceRect be defaultRect\n    const sourceRect = { ...defaultRect };\n    // 2. If overrideRect is not undefined:\n    if (overrideRect !== undefined) {\n        // If either of overrideRect.width or height is 0, return a TypeError.\n        if (overrideRect.width === 0 || overrideRect.height === 0) {\n            throw new TypeError('visibleRect dimensions cannot be zero.');\n        }\n        // If the sum of overrideRect.x and overrideRect.width is greater than codedWidth, return a TypeError.\n        if ((overrideRect.x || 0) + (overrideRect.width || 0) > codedWidth) {\n            throw new TypeError('visibleRect exceeds codedWidth.');\n        }\n        // If the sum of overrideRect.y and overrideRect.height is greater than codedHeight, return a TypeError.\n        if ((overrideRect.y || 0) + (overrideRect.height || 0) > codedHeight) {\n            throw new TypeError('visibleRect exceeds codedHeight.');\n        }\n        // Assign overrideRect to sourceRect.\n        sourceRect.x = overrideRect.x || 0;\n        sourceRect.y = overrideRect.y || 0;\n        sourceRect.width = overrideRect.width || 0;\n        sourceRect.height = overrideRect.height || 0;\n    }\n    // 3. Let validAlignment be the result of running the Verify Rect Offset Alignment algorithm.\n    const validAlignment = VerifyRectOffsetAlignment(format, sourceRect);\n    // 4. If validAlignment is false, throw a TypeError.\n    if (!validAlignment) {\n        throw new TypeError('visibleRect alignment is invalid for the format.');\n    }\n    // 5. Return sourceRect.\n    return sourceRect;\n};\n/** Taken from the WebCodecs spec. */\nconst VerifyRectOffsetAlignment = (format, rect) => {\n    // 1. If format is null, return true.\n    if (format === null)\n        return true;\n    const planes = getPlaneConfigs(format);\n    // 2. Let planeIndex be 0.\n    // 3. Let numPlanes be the number of planes as defined by format.\n    // 4. While planeIndex is less than numPlanes:\n    for (let planeIndex = 0; planeIndex < planes.length; planeIndex++) {\n        const plane = planes[planeIndex];\n        const sampleWidth = plane.widthDivisor;\n        const sampleHeight = plane.heightDivisor;\n        // If rect.x is not a multiple of sampleWidth, return false.\n        if ((rect.x || 0) % sampleWidth !== 0)\n            return false;\n        // If rect.y is not a multiple of sampleHeight, return false.\n        if ((rect.y || 0) % sampleHeight !== 0)\n            return false;\n    }\n    return true;\n};\n/** Taken from the WebCodecs spec. */\nconst ComputeLayoutAndAllocationSize = (parsedRect, format, layout) => {\n    const planes = getPlaneConfigs(format);\n    // 1. Let numPlanes be the number of planes as defined by format.\n    const numPlanes = planes.length;\n    // 2. If layout is not undefined and its length does not equal numPlanes, throw a TypeError.\n    if (layout !== undefined && layout.length !== numPlanes) {\n        throw new TypeError(`Layout must have ${numPlanes} planes.`);\n    }\n    // 3. Let minAllocationSize be 0.\n    let minAllocationSize = 0;\n    // 4. Let computedLayouts be a new list.\n    const computedLayouts = [];\n    // 5. Let endOffsets be a new list.\n    const endOffsets = [];\n    // 6. Let planeIndex be 0.\n    // 7. While planeIndex < numPlanes:\n    for (let planeIndex = 0; planeIndex < numPlanes; planeIndex++) {\n        const plane = planes[planeIndex];\n        const sampleBytes = plane.sampleBytes;\n        const sampleWidth = plane.widthDivisor;\n        const sampleHeight = plane.heightDivisor;\n        // Let computedLayout be a new computed plane layout.\n        const computedLayout = {\n            destinationOffset: 0,\n            destinationStride: 0,\n            sourceTop: 0,\n            sourceHeight: 0,\n            sourceLeftBytes: 0,\n            sourceWidthBytes: 0,\n        };\n        // Set computedLayout’s sourceTop...\n        computedLayout.sourceTop = Math.ceil(Math.trunc(parsedRect.y || 0) / sampleHeight);\n        // Set computedLayout’s sourceHeight...\n        computedLayout.sourceHeight = Math.ceil(Math.trunc(parsedRect.height || 0) / sampleHeight);\n        // Set computedLayout’s sourceLeftBytes...\n        computedLayout.sourceLeftBytes = Math.floor(Math.trunc(parsedRect.x || 0) / sampleWidth) * sampleBytes;\n        // Set computedLayout’s sourceWidthBytes...\n        computedLayout.sourceWidthBytes = Math.floor(Math.trunc(parsedRect.width || 0) / sampleWidth) * sampleBytes;\n        // If layout is not undefined:\n        if (layout !== undefined) {\n            const planeLayout = layout[planeIndex];\n            // If planeLayout.stride is less than computedLayout’s sourceWidthBytes, return a TypeError.\n            if (planeLayout.stride < computedLayout.sourceWidthBytes) {\n                throw new TypeError(`Stride for plane ${planeIndex} is too small.`);\n            }\n            // Assign planeLayout.offset to computedLayout’s destinationOffset.\n            computedLayout.destinationOffset = planeLayout.offset;\n            // Assign planeLayout.stride to computedLayout’s destinationStride.\n            computedLayout.destinationStride = planeLayout.stride;\n        }\n        else {\n            // Otherwise:\n            // Assign minAllocationSize to computedLayout’s destinationOffset.\n            computedLayout.destinationOffset = minAllocationSize;\n            // Assign computedLayout’s sourceWidthBytes to computedLayout’s destinationStride.\n            computedLayout.destinationStride = computedLayout.sourceWidthBytes;\n        }\n        // Let planeSize be the product of multiplying computedLayout’s destinationStride and sourceHeight.\n        const planeSize = computedLayout.destinationStride * computedLayout.sourceHeight;\n        // Let planeEnd be the sum of planeSize and computedLayout’s destinationOffset.\n        const planeEnd = planeSize + computedLayout.destinationOffset;\n        // If planeSize or planeEnd is greater than maximum range of unsigned long, return a TypeError.\n        if (planeEnd > 4294967295) {\n            throw new TypeError('Allocation size exceeds limit.');\n        }\n        // Append planeEnd to endOffsets.\n        endOffsets.push(planeEnd);\n        // Assign the maximum of minAllocationSize and planeEnd to minAllocationSize.\n        minAllocationSize = Math.max(minAllocationSize, planeEnd);\n        // Check for overlap\n        for (let earlierPlaneIndex = 0; earlierPlaneIndex < planeIndex; earlierPlaneIndex++) {\n            const earlierLayout = computedLayouts[earlierPlaneIndex];\n            // If plane A ends before plane B starts, they do not overlap.\n            if (endOffsets[planeIndex] <= earlierLayout.destinationOffset\n                || endOffsets[earlierPlaneIndex] <= computedLayout.destinationOffset) {\n                continue;\n            }\n            throw new TypeError('Planes overlap.');\n        }\n        computedLayouts.push(computedLayout);\n    }\n    // 12. Return combinedLayout.\n    return {\n        allocationSize: minAllocationSize,\n        computedLayouts: computedLayouts,\n    };\n};\nconst AUDIO_SAMPLE_FORMATS = new Set(['f32', 'f32-planar', 's16', 's16-planar', 's32', 's32-planar', 'u8', 'u8-planar']);\n/**\n * Abstract base class for custom audio sample resources. Implement this class to provide custom backing\n * for AudioSample instances.\n * @group Samples\n * @public\n */\nexport class AudioSampleResource {\n    constructor() {\n        /** @internal */\n        this._referenceCount = 0;\n    }\n}\n/**\n * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's\n * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData), but can also be used standalone.\n * @group Samples\n * @public\n */\nexport class AudioSample {\n    /** The presentation timestamp of the sample in microseconds. */\n    get microsecondTimestamp() {\n        return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.timestamp);\n    }\n    /** The duration of the sample in microseconds. */\n    get microsecondDuration() {\n        return Math.trunc(SECOND_TO_MICROSECOND_FACTOR * this.duration);\n    }\n    constructor(init) {\n        /** @internal */\n        this._closed = false;\n        if (isAudioData(init)) {\n            if (init.format === null) {\n                throw new TypeError('AudioData with null format is not supported.');\n            }\n            this._data = init;\n            this.format = init.format;\n            this.sampleRate = init.sampleRate;\n            this.numberOfFrames = init.numberOfFrames;\n            this.numberOfChannels = init.numberOfChannels;\n            this.timestamp = init.timestamp / 1e6;\n            this.duration = init.numberOfFrames / init.sampleRate;\n        }\n        else if (init instanceof AudioSampleResource) {\n            this._data = init;\n            init._referenceCount++;\n            this.format = init.getFormat();\n            if (!AUDIO_SAMPLE_FORMATS.has(this.format)) {\n                throw new TypeError('getFormat() must return an AudioSampleFormat.');\n            }\n            this.sampleRate = init.getSampleRate();\n            if (!Number.isInteger(this.sampleRate) || this.sampleRate <= 0) {\n                throw new TypeError('getSampleRate() must return a positive integer.');\n            }\n            this.numberOfFrames = init.getNumberOfFrames();\n            if (!Number.isInteger(this.numberOfFrames) || this.numberOfFrames < 0) {\n                throw new TypeError('getNumberOfFrames() must return a non-negative integer.');\n            }\n            this.numberOfChannels = init.getNumberOfChannels();\n            if (!Number.isInteger(this.numberOfChannels) || this.numberOfChannels <= 0) {\n                throw new TypeError('getNumberOfChannels() must return a positive integer.');\n            }\n            this.timestamp = init.getTimestamp();\n            if (!Number.isFinite(this.timestamp)) {\n                throw new TypeError('getTimestamp() must return a finite number.');\n            }\n            this.duration = this.numberOfFrames / this.sampleRate;\n        }\n        else {\n            if (!init || typeof init !== 'object') {\n                throw new TypeError('Invalid AudioDataInit: must be an object.');\n            }\n            if (!AUDIO_SAMPLE_FORMATS.has(init.format)) {\n                throw new TypeError('Invalid AudioDataInit: invalid format.');\n            }\n            if (!Number.isFinite(init.sampleRate) || init.sampleRate <= 0) {\n                throw new TypeError('Invalid AudioDataInit: sampleRate must be > 0.');\n            }\n            if (!Number.isInteger(init.numberOfChannels) || init.numberOfChannels === 0) {\n                throw new TypeError('Invalid AudioDataInit: numberOfChannels must be an integer > 0.');\n            }\n            if (!Number.isFinite(init?.timestamp)) {\n                throw new TypeError('init.timestamp must be a number.');\n            }\n            const numberOfFrames = init.data.byteLength / (getBytesPerSample(init.format) * init.numberOfChannels);\n            if (!Number.isInteger(numberOfFrames)) {\n                throw new TypeError('Invalid AudioDataInit: data size is not a multiple of frame size.');\n            }\n            this.format = init.format;\n            this.sampleRate = init.sampleRate;\n            this.numberOfFrames = numberOfFrames;\n            this.numberOfChannels = init.numberOfChannels;\n            this.timestamp = init.timestamp;\n            this.duration = numberOfFrames / init.sampleRate;\n            let dataBuffer;\n            if (init.data instanceof ArrayBuffer) {\n                dataBuffer = new Uint8Array(init.data);\n            }\n            else if (ArrayBuffer.isView(init.data)) {\n                dataBuffer = new Uint8Array(init.data.buffer, init.data.byteOffset, init.data.byteLength);\n            }\n            else {\n                throw new TypeError('Invalid AudioDataInit: data is not a BufferSource.');\n            }\n            const expectedSize = this.numberOfFrames * this.numberOfChannels * getBytesPerSample(this.format);\n            if (dataBuffer.byteLength < expectedSize) {\n                throw new TypeError('Invalid AudioDataInit: insufficient data size.');\n            }\n            this._data = dataBuffer;\n        }\n        finalizationRegistry?.register(this, { type: 'audio', data: this._data }, this);\n    }\n    /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */\n    allocationSize(options) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n            throw new TypeError('planeIndex must be a non-negative integer.');\n        }\n        if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n            throw new TypeError('Invalid format.');\n        }\n        if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n            throw new TypeError('frameOffset must be a non-negative integer.');\n        }\n        if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n            throw new TypeError('frameCount must be a non-negative integer.');\n        }\n        if (this._closed) {\n            throw new Error('AudioSample is closed.');\n        }\n        const destFormat = options.format ?? this.format;\n        const frameOffset = options.frameOffset ?? 0;\n        if (frameOffset >= this.numberOfFrames) {\n            throw new RangeError('frameOffset out of range');\n        }\n        const copyFrameCount = options.frameCount !== undefined ? options.frameCount : (this.numberOfFrames - frameOffset);\n        if (copyFrameCount > (this.numberOfFrames - frameOffset)) {\n            throw new RangeError('frameCount out of range');\n        }\n        const bytesPerSample = getBytesPerSample(destFormat);\n        const isPlanar = formatIsPlanar(destFormat);\n        if (isPlanar && options.planeIndex >= this.numberOfChannels) {\n            throw new RangeError('planeIndex out of range');\n        }\n        if (!isPlanar && options.planeIndex !== 0) {\n            throw new RangeError('planeIndex out of range');\n        }\n        const elementCount = isPlanar ? copyFrameCount : copyFrameCount * this.numberOfChannels;\n        return elementCount * bytesPerSample;\n    }\n    /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */\n    copyTo(destination, options) {\n        if (!isAllowSharedBufferSource(destination)) {\n            throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n        }\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (!Number.isInteger(options.planeIndex) || options.planeIndex < 0) {\n            throw new TypeError('planeIndex must be a non-negative integer.');\n        }\n        if (options.format !== undefined && !AUDIO_SAMPLE_FORMATS.has(options.format)) {\n            throw new TypeError('Invalid format.');\n        }\n        if (options.frameOffset !== undefined && (!Number.isInteger(options.frameOffset) || options.frameOffset < 0)) {\n            throw new TypeError('frameOffset must be a non-negative integer.');\n        }\n        if (options.frameCount !== undefined && (!Number.isInteger(options.frameCount) || options.frameCount < 0)) {\n            throw new TypeError('frameCount must be a non-negative integer.');\n        }\n        if (this._closed) {\n            throw new Error('AudioSample is closed.');\n        }\n        const { format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options;\n        let { planeIndex } = options;\n        const srcFormat = this.format;\n        const destFormat = format ?? this.format;\n        if (!destFormat)\n            throw new Error('Destination format not determined');\n        const numFrames = this.numberOfFrames;\n        const numChannels = this.numberOfChannels;\n        const frameOffset = optFrameOffset ?? 0;\n        if (frameOffset >= numFrames) {\n            throw new RangeError('frameOffset out of range');\n        }\n        const copyFrameCount = optFrameCount !== undefined ? optFrameCount : (numFrames - frameOffset);\n        if (copyFrameCount > (numFrames - frameOffset)) {\n            throw new RangeError('frameCount out of range');\n        }\n        const destBytesPerSample = getBytesPerSample(destFormat);\n        const destIsPlanar = formatIsPlanar(destFormat);\n        if (destIsPlanar && planeIndex >= numChannels) {\n            throw new RangeError('planeIndex out of range');\n        }\n        if (!destIsPlanar && planeIndex !== 0) {\n            throw new RangeError('planeIndex out of range');\n        }\n        const destElementCount = destIsPlanar ? copyFrameCount : copyFrameCount * numChannels;\n        const requiredSize = destElementCount * destBytesPerSample;\n        if (destination.byteLength < requiredSize) {\n            throw new RangeError('Destination buffer is too small');\n        }\n        const destView = toDataView(destination);\n        const writeFn = getWriteFunction(destFormat);\n        if (isAudioData(this._data)) {\n            if (isWebKit() && numChannels > 2 && destFormat !== srcFormat) {\n                // WebKit bug workaround\n                doAudioDataCopyToWebKitWorkaround(this._data, destView, srcFormat, destFormat, numChannels, planeIndex, frameOffset, copyFrameCount);\n            }\n            else {\n                // Per spec, only f32-planar conversion must be supported, but in practice, all browsers support all\n                // destination formats, so let's just delegate here:\n                this._data.copyTo(destination, {\n                    planeIndex,\n                    frameOffset,\n                    frameCount: copyFrameCount,\n                    format: destFormat,\n                });\n            }\n        }\n        else {\n            const readFn = getReadFunction(srcFormat);\n            const srcBytesPerSample = getBytesPerSample(srcFormat);\n            const srcIsPlanar = formatIsPlanar(srcFormat);\n            let uint8Data;\n            if (this._data instanceof AudioSampleResource) {\n                const getDataPlaneValidated = (index) => {\n                    const result = this._data.getDataPlane(index);\n                    if (!(result instanceof Uint8Array)) {\n                        throw new TypeError('getDataPlane() must return a Uint8Array.');\n                    }\n                    const expectedSize = numFrames * srcBytesPerSample * (srcIsPlanar ? 1 : numChannels);\n                    if (result.byteLength !== expectedSize) {\n                        throw new TypeError(`Data plane ${index} has invalid size. Expected exactly ${expectedSize} bytes, got`\n                            + ` ${result.byteLength} bytes.`);\n                    }\n                    return result;\n                };\n                if (srcIsPlanar) {\n                    if (destIsPlanar) {\n                        // Only one source plane will be extracted, so let's fetch only that one\n                        uint8Data = getDataPlaneValidated(planeIndex);\n                        planeIndex = 0; // To fix the subsequent access\n                    }\n                    else {\n                        // Pack all planes tightly together\n                        uint8Data = new Uint8Array(numFrames * srcBytesPerSample * numChannels);\n                        for (let ch = 0; ch < numChannels; ch++) {\n                            const planeData = getDataPlaneValidated(ch);\n                            uint8Data.set(planeData, ch * numFrames * srcBytesPerSample);\n                        }\n                    }\n                }\n                else {\n                    uint8Data = getDataPlaneValidated(0); // That's the only plane there is\n                }\n            }\n            else {\n                uint8Data = this._data;\n            }\n            const srcView = toDataView(uint8Data);\n            for (let i = 0; i < copyFrameCount; i++) {\n                if (destIsPlanar) {\n                    const destOffset = i * destBytesPerSample;\n                    let srcOffset;\n                    if (srcIsPlanar) {\n                        srcOffset = (planeIndex * numFrames + (i + frameOffset)) * srcBytesPerSample;\n                    }\n                    else {\n                        srcOffset = (((i + frameOffset) * numChannels) + planeIndex) * srcBytesPerSample;\n                    }\n                    const normalized = readFn(srcView, srcOffset);\n                    writeFn(destView, destOffset, normalized);\n                }\n                else {\n                    for (let ch = 0; ch < numChannels; ch++) {\n                        const destIndex = i * numChannels + ch;\n                        const destOffset = destIndex * destBytesPerSample;\n                        let srcOffset;\n                        if (srcIsPlanar) {\n                            srcOffset = (ch * numFrames + (i + frameOffset)) * srcBytesPerSample;\n                        }\n                        else {\n                            srcOffset = (((i + frameOffset) * numChannels) + ch) * srcBytesPerSample;\n                        }\n                        const normalized = readFn(srcView, srcOffset);\n                        writeFn(destView, destOffset, normalized);\n                    }\n                }\n            }\n        }\n    }\n    /** Clones this audio sample. */\n    clone() {\n        if (this._closed) {\n            throw new Error('AudioSample is closed.');\n        }\n        if (this._data instanceof AudioSampleResource) {\n            const sample = new AudioSample(this._data);\n            sample.setTimestamp(this.timestamp); // Make sure the timestamp is correct\n            return sample;\n        }\n        else if (isAudioData(this._data)) {\n            const sample = new AudioSample(this._data.clone());\n            sample.setTimestamp(this.timestamp);\n            return sample;\n        }\n        else {\n            return new AudioSample({\n                format: this.format,\n                sampleRate: this.sampleRate,\n                numberOfFrames: this.numberOfFrames,\n                numberOfChannels: this.numberOfChannels,\n                timestamp: this.timestamp,\n                data: this._data,\n            });\n        }\n    }\n    /**\n     * Returns a new {@link AudioSample} containing only the frames in the range [startSample, endSample). Both bounds\n     * must lie within this sample's range of frames. The returned sample's timestamp is shifted to match the start of\n     * the trimmed section.\n     */\n    trim(startSample, endSample = this.numberOfFrames) {\n        if (!Number.isInteger(startSample) || startSample < 0) {\n            throw new TypeError('startSample must be a non-negative integer.');\n        }\n        if (!Number.isInteger(endSample) || endSample < 0) {\n            throw new TypeError('endSample must be a non-negative integer.');\n        }\n        if (startSample > this.numberOfFrames) {\n            throw new RangeError('startSample out of range.');\n        }\n        if (endSample > this.numberOfFrames) {\n            throw new RangeError('endSample out of range.');\n        }\n        if (endSample < startSample) {\n            throw new RangeError('endSample must not be less than startSample.');\n        }\n        if (this._closed) {\n            throw new Error('AudioSample is closed.');\n        }\n        const frameCount = endSample - startSample;\n        const bytesPerSample = getBytesPerSample(this.format);\n        let data;\n        if (formatIsPlanar(this.format)) {\n            const planeSize = frameCount * bytesPerSample;\n            data = new Uint8Array(planeSize * this.numberOfChannels);\n            if (frameCount > 0) {\n                // Copy plane-by-plane\n                for (let i = 0; i < this.numberOfChannels; i++) {\n                    this.copyTo(data.subarray(i * planeSize, (i + 1) * planeSize), {\n                        planeIndex: i,\n                        format: this.format,\n                        frameOffset: startSample,\n                        frameCount,\n                    });\n                }\n            }\n        }\n        else {\n            // Trivial\n            data = new Uint8Array(frameCount * this.numberOfChannels * bytesPerSample);\n            if (frameCount > 0) {\n                this.copyTo(data, {\n                    planeIndex: 0,\n                    format: this.format,\n                    frameOffset: startSample,\n                    frameCount,\n                });\n            }\n        }\n        return new AudioSample({\n            data,\n            format: this.format,\n            sampleRate: this.sampleRate,\n            numberOfChannels: this.numberOfChannels,\n            timestamp: this.timestamp + startSample / this.sampleRate,\n        });\n    }\n    /**\n     * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not\n     * needed anymore.\n     */\n    close() {\n        if (this._closed) {\n            return;\n        }\n        finalizationRegistry?.unregister(this);\n        if (this._data instanceof AudioSampleResource) {\n            this._data._referenceCount--;\n            if (this._data._referenceCount === 0) {\n                this._data.close();\n            }\n        }\n        else if (isAudioData(this._data)) {\n            this._data.close();\n        }\n        else {\n            this._data = new Uint8Array(0);\n        }\n        this._closed = true;\n    }\n    /**\n     * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this\n     * method *must* be closed separately from this audio sample.\n     */\n    toAudioData() {\n        if (this._closed) {\n            throw new Error('AudioSample is closed.');\n        }\n        if (this._data instanceof AudioSampleResource) {\n            return this._createAudioDataFromData();\n        }\n        else if (isAudioData(this._data)) {\n            if (this._data.timestamp === this.microsecondTimestamp) {\n                // Timestamp matches, let's just return the data (but cloned)\n                return this._data.clone();\n            }\n            else {\n                // It's impossible to simply change an AudioData's timestamp, so we'll need to create a new one\n                return this._createAudioDataFromData();\n            }\n        }\n        else {\n            return new AudioData({\n                format: this.format,\n                sampleRate: this.sampleRate,\n                numberOfFrames: this.numberOfFrames,\n                numberOfChannels: this.numberOfChannels,\n                timestamp: this.microsecondTimestamp,\n                data: this._data.buffer instanceof ArrayBuffer\n                    ? this._data.buffer\n                    : this._data.slice(), // In the case of SharedArrayBuffer, convert to ArrayBuffer\n            });\n        }\n    }\n    /** @internal */\n    _createAudioDataFromData() {\n        if (formatIsPlanar(this.format)) {\n            const size = this.allocationSize({ planeIndex: 0, format: this.format });\n            const data = new ArrayBuffer(size * this.numberOfChannels);\n            // We gotta read out each plane individually\n            for (let i = 0; i < this.numberOfChannels; i++) {\n                this.copyTo(new Uint8Array(data, i * size, size), { planeIndex: i, format: this.format });\n            }\n            return new AudioData({\n                format: this.format,\n                sampleRate: this.sampleRate,\n                numberOfFrames: this.numberOfFrames,\n                numberOfChannels: this.numberOfChannels,\n                timestamp: this.microsecondTimestamp,\n                data,\n            });\n        }\n        else {\n            const data = new ArrayBuffer(this.allocationSize({ planeIndex: 0, format: this.format }));\n            this.copyTo(data, { planeIndex: 0, format: this.format });\n            return new AudioData({\n                format: this.format,\n                sampleRate: this.sampleRate,\n                numberOfFrames: this.numberOfFrames,\n                numberOfChannels: this.numberOfChannels,\n                timestamp: this.microsecondTimestamp,\n                data,\n            });\n        }\n    }\n    /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */\n    toAudioBuffer() {\n        if (this._closed) {\n            throw new Error('AudioSample is closed.');\n        }\n        const audioBuffer = new AudioBuffer({\n            numberOfChannels: this.numberOfChannels,\n            length: this.numberOfFrames,\n            sampleRate: this.sampleRate,\n        });\n        const dataBytes = new Float32Array(this.allocationSize({ planeIndex: 0, format: 'f32-planar' }) / 4);\n        for (let i = 0; i < this.numberOfChannels; i++) {\n            this.copyTo(dataBytes, { planeIndex: i, format: 'f32-planar' });\n            audioBuffer.copyToChannel(dataBytes, i);\n        }\n        return audioBuffer;\n    }\n    /** Sets the presentation timestamp of this audio sample, in seconds. */\n    setTimestamp(newTimestamp) {\n        if (!Number.isFinite(newTimestamp)) {\n            throw new TypeError('newTimestamp must be a number.');\n        }\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n        this.timestamp = newTimestamp;\n    }\n    /** Calls `.close()`. */\n    [Symbol.dispose]() {\n        this.close();\n    }\n    /** @internal */\n    static *_fromAudioBuffer(audioBuffer, timestamp) {\n        if (!(audioBuffer instanceof AudioBuffer)) {\n            throw new TypeError('audioBuffer must be an AudioBuffer.');\n        }\n        const MAX_FLOAT_COUNT = 48000 * 5; // 5 seconds of mono 48 kHz audio per sample\n        const numberOfChannels = audioBuffer.numberOfChannels;\n        const sampleRate = audioBuffer.sampleRate;\n        const totalFrames = audioBuffer.length;\n        const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels);\n        let currentRelativeFrame = 0;\n        let remainingFrames = totalFrames;\n        // Create AudioSamples in a chunked fashion so we don't create huge Float32Arrays\n        while (remainingFrames > 0) {\n            const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames);\n            const chunkData = new Float32Array(numberOfChannels * framesToCopy);\n            for (let channel = 0; channel < numberOfChannels; channel++) {\n                audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, (channel + 1) * framesToCopy), channel, currentRelativeFrame);\n            }\n            yield new AudioSample({\n                format: 'f32-planar',\n                sampleRate,\n                numberOfFrames: framesToCopy,\n                numberOfChannels,\n                timestamp: timestamp + currentRelativeFrame / sampleRate,\n                data: chunkData,\n            });\n            currentRelativeFrame += framesToCopy;\n            remainingFrames -= framesToCopy;\n        }\n    }\n    /**\n     * Creates AudioSamples from an AudioBuffer, starting at the given timestamp in seconds. Typically creates exactly\n     * one sample, but may create multiple if the AudioBuffer is exceedingly large.\n     */\n    static fromAudioBuffer(audioBuffer, timestamp) {\n        if (!(audioBuffer instanceof AudioBuffer)) {\n            throw new TypeError('audioBuffer must be an AudioBuffer.');\n        }\n        const MAX_FLOAT_COUNT = 48000 * 5; // 5 seconds of mono 48 kHz audio per sample\n        const numberOfChannels = audioBuffer.numberOfChannels;\n        const sampleRate = audioBuffer.sampleRate;\n        const totalFrames = audioBuffer.length;\n        const maxFramesPerChunk = Math.floor(MAX_FLOAT_COUNT / numberOfChannels);\n        let currentRelativeFrame = 0;\n        let remainingFrames = totalFrames;\n        const result = [];\n        // Create AudioSamples in a chunked fashion so we don't create huge Float32Arrays\n        while (remainingFrames > 0) {\n            const framesToCopy = Math.min(maxFramesPerChunk, remainingFrames);\n            const chunkData = new Float32Array(numberOfChannels * framesToCopy);\n            for (let channel = 0; channel < numberOfChannels; channel++) {\n                audioBuffer.copyFromChannel(chunkData.subarray(channel * framesToCopy, (channel + 1) * framesToCopy), channel, currentRelativeFrame);\n            }\n            const audioSample = new AudioSample({\n                format: 'f32-planar',\n                sampleRate,\n                numberOfFrames: framesToCopy,\n                numberOfChannels,\n                timestamp: timestamp + currentRelativeFrame / sampleRate,\n                data: chunkData,\n            });\n            result.push(audioSample);\n            currentRelativeFrame += framesToCopy;\n            remainingFrames -= framesToCopy;\n        }\n        return result;\n    }\n}\nconst getBytesPerSample = (format) => {\n    switch (format) {\n        case 'u8':\n        case 'u8-planar':\n            return 1;\n        case 's16':\n        case 's16-planar':\n            return 2;\n        case 's32':\n        case 's32-planar':\n            return 4;\n        case 'f32':\n        case 'f32-planar':\n            return 4;\n        default:\n            throw new Error('Unknown AudioSampleFormat');\n    }\n};\nconst formatIsPlanar = (format) => {\n    switch (format) {\n        case 'u8-planar':\n        case 's16-planar':\n        case 's32-planar':\n        case 'f32-planar':\n            return true;\n        default:\n            return false;\n    }\n};\nconst getReadFunction = (format) => {\n    switch (format) {\n        case 'u8':\n        case 'u8-planar':\n            return (view, offset) => (view.getUint8(offset) - 128) / 128;\n        case 's16':\n        case 's16-planar':\n            return (view, offset) => view.getInt16(offset, true) / 32768;\n        case 's32':\n        case 's32-planar':\n            return (view, offset) => view.getInt32(offset, true) / 2147483648;\n        case 'f32':\n        case 'f32-planar':\n            return (view, offset) => view.getFloat32(offset, true);\n    }\n};\nconst getWriteFunction = (format) => {\n    switch (format) {\n        case 'u8':\n        case 'u8-planar':\n            return (view, offset, value) => view.setUint8(offset, clamp((value + 1) * 127.5, 0, 255));\n        case 's16':\n        case 's16-planar':\n            return (view, offset, value) => view.setInt16(offset, clamp(Math.round(value * 32767), -32768, 32767), true);\n        case 's32':\n        case 's32-planar':\n            return (view, offset, value) => view.setInt32(offset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), true);\n        case 'f32':\n        case 'f32-planar':\n            return (view, offset, value) => view.setFloat32(offset, value, true);\n    }\n};\nconst isAudioData = (x) => {\n    return typeof AudioData !== 'undefined' && x instanceof AudioData;\n};\nexport const toInterleavedAudioFormat = (format) => {\n    switch (format) {\n        case 'u8-planar':\n            return 'u8';\n        case 's16-planar':\n            return 's16';\n        case 's32-planar':\n            return 's32';\n        case 'f32-planar':\n            return 'f32';\n        default:\n            return format;\n    }\n};\n/**\n * WebKit has a bug where calling AudioData.copyTo with a format different from the source format\n * crashes the tab when there are more than 2 channels. This function works around that by always\n * copying with the source format and then manually converting to the destination format.\n *\n * See https://bugs.webkit.org/show_bug.cgi?id=302521.\n */\nconst doAudioDataCopyToWebKitWorkaround = (audioData, destView, srcFormat, destFormat, numChannels, planeIndex, frameOffset, copyFrameCount) => {\n    const readFn = getReadFunction(srcFormat);\n    const writeFn = getWriteFunction(destFormat);\n    const srcBytesPerSample = getBytesPerSample(srcFormat);\n    const destBytesPerSample = getBytesPerSample(destFormat);\n    const srcIsPlanar = formatIsPlanar(srcFormat);\n    const destIsPlanar = formatIsPlanar(destFormat);\n    if (destIsPlanar) {\n        if (srcIsPlanar) {\n            // src planar -> dest planar: copy single plane and convert\n            const data = new ArrayBuffer(copyFrameCount * srcBytesPerSample);\n            const dataView = toDataView(data);\n            audioData.copyTo(data, {\n                planeIndex,\n                frameOffset,\n                frameCount: copyFrameCount,\n                format: srcFormat,\n            });\n            for (let i = 0; i < copyFrameCount; i++) {\n                const srcOffset = i * srcBytesPerSample;\n                const destOffset = i * destBytesPerSample;\n                const sample = readFn(dataView, srcOffset);\n                writeFn(destView, destOffset, sample);\n            }\n        }\n        else {\n            // src interleaved -> dest planar: copy all interleaved data, extract one channel\n            const data = new ArrayBuffer(copyFrameCount * numChannels * srcBytesPerSample);\n            const dataView = toDataView(data);\n            audioData.copyTo(data, {\n                planeIndex: 0,\n                frameOffset,\n                frameCount: copyFrameCount,\n                format: srcFormat,\n            });\n            for (let i = 0; i < copyFrameCount; i++) {\n                const srcOffset = (i * numChannels + planeIndex) * srcBytesPerSample;\n                const destOffset = i * destBytesPerSample;\n                const sample = readFn(dataView, srcOffset);\n                writeFn(destView, destOffset, sample);\n            }\n        }\n    }\n    else {\n        if (srcIsPlanar) {\n            // src planar -> dest interleaved: copy each plane and interleave\n            const planeSize = copyFrameCount * srcBytesPerSample;\n            const data = new ArrayBuffer(planeSize);\n            const dataView = toDataView(data);\n            for (let ch = 0; ch < numChannels; ch++) {\n                audioData.copyTo(data, {\n                    planeIndex: ch,\n                    frameOffset,\n                    frameCount: copyFrameCount,\n                    format: srcFormat,\n                });\n                for (let i = 0; i < copyFrameCount; i++) {\n                    const srcOffset = i * srcBytesPerSample;\n                    const destOffset = (i * numChannels + ch) * destBytesPerSample;\n                    const sample = readFn(dataView, srcOffset);\n                    writeFn(destView, destOffset, sample);\n                }\n            }\n        }\n        else {\n            // src interleaved -> dest interleaved: copy all and convert\n            const data = new ArrayBuffer(copyFrameCount * numChannels * srcBytesPerSample);\n            const dataView = toDataView(data);\n            audioData.copyTo(data, {\n                planeIndex: 0,\n                frameOffset,\n                frameCount: copyFrameCount,\n                format: srcFormat,\n            });\n            for (let i = 0; i < copyFrameCount; i++) {\n                for (let ch = 0; ch < numChannels; ch++) {\n                    const idx = i * numChannels + ch;\n                    const srcOffset = idx * srcBytesPerSample;\n                    const destOffset = idx * destBytesPerSample;\n                    const sample = readFn(dataView, srcOffset);\n                    writeFn(destView, destOffset, sample);\n                }\n            }\n        }\n    }\n};\nexport const audioSampleToInterleavedFormat = (sample, format) => {\n    const size = sample.allocationSize({ format, planeIndex: 0 });\n    const buffer = new ArrayBuffer(size);\n    sample.copyTo(buffer, { format, planeIndex: 0 });\n    return new AudioSample({\n        data: buffer,\n        format,\n        numberOfChannels: sample.numberOfChannels,\n        sampleRate: sample.sampleRate,\n        timestamp: sample.timestamp,\n        duration: sample.duration,\n    });\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { AUDIO_CODECS, buildAudioCodecString, buildVideoCodecString, getAudioEncoderConfigExtension, getVideoEncoderConfigExtension, inferCodecFromCodecString, PCM_AUDIO_CODECS, SUBTITLE_CODECS, VIDEO_CODECS, } from './codec.js';\nimport { customAudioEncoders, customVideoEncoders } from './custom-coder.js';\nimport { isFirefox } from './misc.js';\nimport { validateCropRectangle } from './sample.js';\nexport const canEncodeVideoMemo = new Map();\nexport const canEncodeAudioMemo = new Map();\nexport const validateVideoEncodingConfig = (config) => {\n    if (!config || typeof config !== 'object') {\n        throw new TypeError('Encoding config must be an object.');\n    }\n    if (!VIDEO_CODECS.includes(config.codec)) {\n        throw new TypeError(`Invalid video codec '${config.codec}'. Must be one of: ${VIDEO_CODECS.join(', ')}.`);\n    }\n    if (!(config.bitrate instanceof Quality) && (!Number.isInteger(config.bitrate) || config.bitrate <= 0)) {\n        throw new TypeError('config.bitrate must be a positive integer or a quality.');\n    }\n    if (config.keyFrameInterval !== undefined\n        && (!Number.isFinite(config.keyFrameInterval) || config.keyFrameInterval < 0)) {\n        throw new TypeError('config.keyFrameInterval, when provided, must be a non-negative number.');\n    }\n    if (config.sizeChangeBehavior !== undefined\n        && !['deny', 'passThrough', 'fill', 'contain', 'cover'].includes(config.sizeChangeBehavior)) {\n        throw new TypeError('config.sizeChangeBehavior, when provided, must be \\'deny\\', \\'passThrough\\', \\'fill\\', \\'contain\\''\n            + ' or \\'cover\\'.');\n    }\n    if (config.transform !== undefined) {\n        if (typeof config.transform !== 'object' || !config.transform) {\n            throw new TypeError('config.transform, when provided, must be an object.');\n        }\n        if (config.transform.width !== undefined\n            && (!Number.isInteger(config.transform.width) || config.transform.width <= 0)) {\n            throw new TypeError('config.transform.width, when provided, must be a positive integer.');\n        }\n        if (config.transform.height !== undefined\n            && (!Number.isInteger(config.transform.height) || config.transform.height <= 0)) {\n            throw new TypeError('config.transform.height, when provided, must be a positive integer.');\n        }\n        if (config.transform.fit !== undefined && !['fill', 'contain', 'cover'].includes(config.transform.fit)) {\n            throw new TypeError('config.transform.fit, when provided, must be one of \"fill\", \"contain\", or \"cover\".');\n        }\n        if (config.transform.width !== undefined\n            && config.transform.height !== undefined\n            && config.transform.fit === undefined\n            && !['fill', 'contain', 'cover'].includes(config.sizeChangeBehavior)) {\n            throw new TypeError('When both config.transform.width and config.transform.height are provided, config.transform.fit'\n                + ' must also be provided.');\n        }\n        if (config.transform.fit !== undefined\n            && ['fill', 'contain', 'cover'].includes(config.sizeChangeBehavior)\n            && config.transform.fit !== config.sizeChangeBehavior) {\n            throw new TypeError('config.transform.fit, when provided, cannot differ from config.sizeChangeBehavior when'\n                + ' config.sizeChangeBehavior is \\'fill\\', \\'contain\\' or \\'cover\\', as sizeChangeBehavior already'\n                + ' determines the fitting algorithm.');\n        }\n        if (config.transform.rotate !== undefined && ![0, 90, 180, 270].includes(config.transform.rotate)) {\n            throw new TypeError('config.transform.rotate, when provided, must be 0, 90, 180 or 270.');\n        }\n        if (config.transform.crop !== undefined) {\n            validateCropRectangle(config.transform.crop, 'config.transform.');\n        }\n        if (config.transform.process !== undefined && typeof config.transform.process !== 'function') {\n            throw new TypeError('config.transform.process, when provided, must be a function.');\n        }\n        if (config.transform.frameRate !== undefined\n            && (!Number.isFinite(config.transform.frameRate) || config.transform.frameRate <= 0)) {\n            throw new TypeError('config.transform.frameRate, when provided, must be a finite positive number.');\n        }\n        if (config.transform.force !== undefined && typeof config.transform.force !== 'boolean') {\n            throw new TypeError('config.transform.force, when provided, must be a boolean.');\n        }\n    }\n    if (config.onEncodedPacket !== undefined && typeof config.onEncodedPacket !== 'function') {\n        throw new TypeError('config.onEncodedPacket, when provided, must be a function.');\n    }\n    if (config.onEncoderConfig !== undefined && typeof config.onEncoderConfig !== 'function') {\n        throw new TypeError('config.onEncoderConfig, when provided, must be a function.');\n    }\n    if (config.onEncodedSample !== undefined && typeof config.onEncodedSample !== 'function') {\n        throw new TypeError('config.onEncodedSample, when provided, must be a function.');\n    }\n    validateVideoEncodingAdditionalOptions(config.codec, config);\n};\nexport const validateVideoEncodingAdditionalOptions = (codec, options) => {\n    if (!options || typeof options !== 'object') {\n        throw new TypeError('Encoding options must be an object.');\n    }\n    if (options.alpha !== undefined && !['discard', 'keep'].includes(options.alpha)) {\n        throw new TypeError('options.alpha, when provided, must be \\'discard\\' or \\'keep\\'.');\n    }\n    if (options.bitrateMode !== undefined && !['constant', 'variable'].includes(options.bitrateMode)) {\n        throw new TypeError('bitrateMode, when provided, must be \\'constant\\' or \\'variable\\'.');\n    }\n    if (options.latencyMode !== undefined && !['quality', 'realtime'].includes(options.latencyMode)) {\n        throw new TypeError('latencyMode, when provided, must be \\'quality\\' or \\'realtime\\'.');\n    }\n    if (options.fullCodecString !== undefined && typeof options.fullCodecString !== 'string') {\n        throw new TypeError('fullCodecString, when provided, must be a string.');\n    }\n    if (options.fullCodecString !== undefined && inferCodecFromCodecString(options.fullCodecString) !== codec) {\n        throw new TypeError(`fullCodecString, when provided, must be a string that matches the specified codec (${codec}).`);\n    }\n    if (options.hardwareAcceleration !== undefined\n        && !['no-preference', 'prefer-hardware', 'prefer-software'].includes(options.hardwareAcceleration)) {\n        throw new TypeError('hardwareAcceleration, when provided, must be \\'no-preference\\', \\'prefer-hardware\\' or'\n            + ' \\'prefer-software\\'.');\n    }\n    if (options.scalabilityMode !== undefined && typeof options.scalabilityMode !== 'string') {\n        throw new TypeError('scalabilityMode, when provided, must be a string.');\n    }\n    if (options.contentHint !== undefined && typeof options.contentHint !== 'string') {\n        throw new TypeError('contentHint, when provided, must be a string.');\n    }\n};\nexport const buildVideoEncoderConfig = (options) => {\n    const resolvedBitrate = options.bitrate instanceof Quality\n        ? options.bitrate._toVideoBitrate(options.codec, options.width, options.height)\n        : options.bitrate;\n    return {\n        codec: options.fullCodecString ?? buildVideoCodecString(options.codec, options.width, options.height, resolvedBitrate),\n        width: options.width,\n        height: options.height,\n        displayWidth: options.squarePixelWidth,\n        displayHeight: options.squarePixelHeight,\n        bitrate: resolvedBitrate,\n        bitrateMode: options.bitrateMode,\n        alpha: options.alpha ?? 'discard',\n        framerate: options.framerate,\n        latencyMode: options.latencyMode,\n        hardwareAcceleration: options.hardwareAcceleration,\n        scalabilityMode: options.scalabilityMode,\n        contentHint: options.contentHint,\n        ...getVideoEncoderConfigExtension(options.codec),\n    };\n};\nexport const validateAudioEncodingConfig = (config) => {\n    if (!config || typeof config !== 'object') {\n        throw new TypeError('Encoding config must be an object.');\n    }\n    if (!AUDIO_CODECS.includes(config.codec)) {\n        throw new TypeError(`Invalid audio codec '${config.codec}'. Must be one of: ${AUDIO_CODECS.join(', ')}.`);\n    }\n    if (config.bitrate === undefined\n        && !(PCM_AUDIO_CODECS.includes(config.codec) || config.codec === 'flac')) {\n        throw new TypeError('config.bitrate must be provided for compressed audio codecs.');\n    }\n    if (config.bitrate !== undefined\n        && !(config.bitrate instanceof Quality)\n        && (!Number.isInteger(config.bitrate) || config.bitrate <= 0)) {\n        throw new TypeError('config.bitrate, when provided, must be a positive integer or a quality.');\n    }\n    if (config.transform !== undefined) {\n        if (typeof config.transform !== 'object' || !config.transform) {\n            throw new TypeError('config.transform, when provided, must be an object.');\n        }\n        if (config.transform.numberOfChannels !== undefined\n            && (!Number.isInteger(config.transform.numberOfChannels) || config.transform.numberOfChannels <= 0)) {\n            throw new TypeError('config.transform.numberOfChannels, when provided, must be a positive integer.');\n        }\n        if (config.transform.sampleRate !== undefined\n            && (!Number.isInteger(config.transform.sampleRate) || config.transform.sampleRate <= 0)) {\n            throw new TypeError('config.transform.sampleRate, when provided, must be a positive integer.');\n        }\n        if (config.transform.sampleFormat !== undefined\n            && !['u8', 's16', 's32', 'f32'].includes(config.transform.sampleFormat)) {\n            throw new TypeError('config.transform.sampleFormat, when provided, must be one of: u8, s16, s32, f32.');\n        }\n        if (config.transform.process !== undefined && typeof config.transform.process !== 'function') {\n            throw new TypeError('config.transform.process, when provided, must be a function.');\n        }\n    }\n    if (config.onEncodedPacket !== undefined && typeof config.onEncodedPacket !== 'function') {\n        throw new TypeError('config.onEncodedPacket, when provided, must be a function.');\n    }\n    if (config.onEncoderConfig !== undefined && typeof config.onEncoderConfig !== 'function') {\n        throw new TypeError('config.onEncoderConfig, when provided, must be a function.');\n    }\n    if (config.onEncodedSample !== undefined && typeof config.onEncodedSample !== 'function') {\n        throw new TypeError('config.onEncodedSample, when provided, must be a function.');\n    }\n    validateAudioEncodingAdditionalOptions(config.codec, config);\n};\nexport const validateAudioEncodingAdditionalOptions = (codec, options) => {\n    if (!options || typeof options !== 'object') {\n        throw new TypeError('Encoding options must be an object.');\n    }\n    if (options.bitrateMode !== undefined && !['constant', 'variable'].includes(options.bitrateMode)) {\n        throw new TypeError('bitrateMode, when provided, must be \\'constant\\' or \\'variable\\'.');\n    }\n    if (options.fullCodecString !== undefined && typeof options.fullCodecString !== 'string') {\n        throw new TypeError('fullCodecString, when provided, must be a string.');\n    }\n    if (options.fullCodecString !== undefined && inferCodecFromCodecString(options.fullCodecString) !== codec) {\n        throw new TypeError(`fullCodecString, when provided, must be a string that matches the specified codec (${codec}).`);\n    }\n};\nexport const buildAudioEncoderConfig = (options) => {\n    const resolvedBitrate = options.bitrate instanceof Quality\n        ? options.bitrate._toAudioBitrate(options.codec)\n        : options.bitrate;\n    return {\n        codec: options.fullCodecString ?? buildAudioCodecString(options.codec, options.numberOfChannels, options.sampleRate),\n        numberOfChannels: options.numberOfChannels,\n        sampleRate: options.sampleRate,\n        bitrate: resolvedBitrate,\n        bitrateMode: options.bitrateMode,\n        ...getAudioEncoderConfigExtension(options.codec),\n    };\n};\n/**\n * Represents a subjective media quality level.\n * @group Encoding\n * @public\n */\nexport class Quality {\n    /** @internal */\n    constructor(factor) {\n        this._factor = factor;\n    }\n    /** @internal */\n    _toVideoBitrate(codec, width, height) {\n        const pixels = width * height;\n        const codecEfficiencyFactors = {\n            avc: 1.0, // H.264/AVC (baseline)\n            hevc: 0.6, // H.265/HEVC (~40% more efficient than AVC)\n            vp9: 0.6, // Similar to HEVC\n            av1: 0.4, // ~60% more efficient than AVC\n            vp8: 1.2, // Slightly less efficient than AVC\n        };\n        const referencePixels = 1920 * 1080;\n        const referenceBitrate = 3000000;\n        const scaleFactor = Math.pow(pixels / referencePixels, 0.95); // Slight non-linear scaling\n        const baseBitrate = referenceBitrate * scaleFactor;\n        const codecAdjustedBitrate = baseBitrate * codecEfficiencyFactors[codec];\n        const finalBitrate = codecAdjustedBitrate * this._factor;\n        return Math.ceil(finalBitrate / 1000) * 1000;\n    }\n    /** @internal */\n    _toAudioBitrate(codec) {\n        if (PCM_AUDIO_CODECS.includes(codec) || codec === 'flac') {\n            return undefined;\n        }\n        const baseRates = {\n            aac: 128000, // 128kbps base for AAC\n            opus: 64000, // 64kbps base for Opus\n            mp3: 160000, // 160kbps base for MP3\n            vorbis: 64000, // 64kbps base for Vorbis\n            ac3: 384000, // 384kbps base for AC-3\n            eac3: 192000, // 192kbps base for E-AC-3\n        };\n        const baseBitrate = baseRates[codec];\n        if (!baseBitrate) {\n            throw new Error(`Unhandled codec: ${codec}`);\n        }\n        let finalBitrate = baseBitrate * this._factor;\n        if (codec === 'aac') {\n            // AAC only works with specific bitrates, let's find the closest\n            const validRates = [96000, 128000, 160000, 192000];\n            finalBitrate = validRates.reduce((prev, curr) => Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev);\n        }\n        else if (codec === 'opus' || codec === 'vorbis') {\n            finalBitrate = Math.max(6000, finalBitrate);\n        }\n        else if (codec === 'mp3') {\n            const validRates = [\n                8000, 16000, 24000, 32000, 40000, 48000, 64000, 80000,\n                96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000,\n            ];\n            finalBitrate = validRates.reduce((prev, curr) => Math.abs(curr - finalBitrate) < Math.abs(prev - finalBitrate) ? curr : prev);\n        }\n        return Math.round(finalBitrate / 1000) * 1000;\n    }\n}\n/**\n * Represents a very low media quality.\n * @group Encoding\n * @public\n */\nexport const QUALITY_VERY_LOW = /* #__PURE__ */ new Quality(0.3);\n/**\n * Represents a low media quality.\n * @group Encoding\n * @public\n */\nexport const QUALITY_LOW = /* #__PURE__ */ new Quality(0.6);\n/**\n * Represents a medium media quality.\n * @group Encoding\n * @public\n */\nexport const QUALITY_MEDIUM = /* #__PURE__ */ new Quality(1);\n/**\n * Represents a high media quality.\n * @group Encoding\n * @public\n */\nexport const QUALITY_HIGH = /* #__PURE__ */ new Quality(2);\n/**\n * Represents a very high media quality.\n * @group Encoding\n * @public\n */\nexport const QUALITY_VERY_HIGH = /* #__PURE__ */ new Quality(4);\n/**\n * Checks if the browser is able to encode the given codec.\n * @group Encoding\n * @public\n */\nexport const canEncode = (codec) => {\n    if (VIDEO_CODECS.includes(codec)) {\n        return canEncodeVideo(codec);\n    }\n    else if (AUDIO_CODECS.includes(codec)) {\n        return canEncodeAudio(codec);\n    }\n    else if (SUBTITLE_CODECS.includes(codec)) {\n        return canEncodeSubtitles(codec);\n    }\n    throw new TypeError(`Unknown codec '${codec}'.`);\n};\n/**\n * Checks if the browser is able to encode the given video codec with the given parameters.\n * @group Encoding\n * @public\n */\nexport const canEncodeVideo = async (codec, options = {}) => {\n    const { width = 1280, height = 720, bitrate = 1e6, ...restOptions } = options;\n    if (!VIDEO_CODECS.includes(codec)) {\n        return false;\n    }\n    if (!Number.isInteger(width) || width <= 0) {\n        throw new TypeError('width must be a positive integer.');\n    }\n    if (!Number.isInteger(height) || height <= 0) {\n        throw new TypeError('height must be a positive integer.');\n    }\n    if (!(bitrate instanceof Quality) && (!Number.isInteger(bitrate) || bitrate <= 0)) {\n        throw new TypeError('bitrate must be a positive integer or a quality.');\n    }\n    validateVideoEncodingAdditionalOptions(codec, restOptions);\n    const encoderConfig = buildVideoEncoderConfig({\n        codec,\n        width,\n        height,\n        bitrate,\n        framerate: undefined,\n        ...restOptions,\n        alpha: 'discard', // Since we handle alpha ourselves\n    });\n    const key = JSON.stringify(encoderConfig);\n    const memoized = canEncodeVideoMemo.get(key);\n    if (memoized) {\n        return memoized;\n    }\n    const promise = (async () => {\n        if (customVideoEncoders.some(x => x.supports(codec, encoderConfig))) {\n            // There's a custom encoder\n            return true;\n        }\n        if (typeof VideoEncoder === 'undefined') {\n            return false;\n        }\n        const hasOddDimension = width % 2 === 1 || height % 2 === 1;\n        if (hasOddDimension\n            && (codec === 'avc' || codec === 'hevc')) {\n            // Disallow odd dimensions for certain codecs\n            return false;\n        }\n        const support = await VideoEncoder.isConfigSupported(encoderConfig);\n        if (!support.supported) {\n            return false;\n        }\n        if (isFirefox()) {\n            // isConfigSupported on Firefox appears to unreliably indicate if encoding will actually succeed. Therefore,\n            // we just try encoding a frame to see if it actually works.\n            // https://github.com/Vanilagy/mediabunny/issues/222\n            // eslint-disable-next-line @typescript-eslint/no-misused-promises, no-async-promise-executor\n            return new Promise(async (resolve) => {\n                try {\n                    const encoder = new VideoEncoder({\n                        output: () => { },\n                        error: () => resolve(false),\n                    });\n                    encoder.configure(encoderConfig);\n                    const frameData = new Uint8Array(width * height * 4);\n                    const frame = new VideoFrame(frameData, {\n                        format: 'RGBA',\n                        codedWidth: width,\n                        codedHeight: height,\n                        timestamp: 0,\n                    });\n                    encoder.encode(frame);\n                    frame.close();\n                    await encoder.flush();\n                    resolve(true);\n                }\n                catch {\n                    resolve(false);\n                }\n            });\n        }\n        return true;\n    })();\n    canEncodeVideoMemo.set(key, promise);\n    return promise;\n};\n/**\n * Checks if the browser is able to encode the given audio codec with the given parameters.\n * @group Encoding\n * @public\n */\nexport const canEncodeAudio = async (codec, options = {}) => {\n    const { numberOfChannels = 2, sampleRate = 48000, bitrate = 128e3, ...restOptions } = options;\n    if (!AUDIO_CODECS.includes(codec)) {\n        return false;\n    }\n    if (!Number.isInteger(numberOfChannels) || numberOfChannels <= 0) {\n        throw new TypeError('numberOfChannels must be a positive integer.');\n    }\n    if (!Number.isInteger(sampleRate) || sampleRate <= 0) {\n        throw new TypeError('sampleRate must be a positive integer.');\n    }\n    if (!(bitrate instanceof Quality) && (!Number.isInteger(bitrate) || bitrate <= 0)) {\n        throw new TypeError('bitrate must be a positive integer.');\n    }\n    validateAudioEncodingAdditionalOptions(codec, restOptions);\n    const encoderConfig = buildAudioEncoderConfig({\n        codec,\n        numberOfChannels,\n        sampleRate,\n        bitrate,\n        ...restOptions,\n    });\n    const key = JSON.stringify(encoderConfig);\n    const memoized = canEncodeAudioMemo.get(key);\n    if (memoized) {\n        return memoized;\n    }\n    const promise = (async () => {\n        if (customAudioEncoders.some(x => x.supports(codec, encoderConfig))) {\n            // There's a custom encoder\n            return true;\n        }\n        if (PCM_AUDIO_CODECS.includes(codec)) {\n            return true; // Because we encode these ourselves\n        }\n        if (typeof AudioEncoder === 'undefined') {\n            return false;\n        }\n        const support = await AudioEncoder.isConfigSupported(encoderConfig);\n        return support.supported === true;\n    })();\n    canEncodeAudioMemo.set(key, promise);\n    return promise;\n};\n/**\n * Checks if the browser is able to encode the given subtitle codec.\n * @group Encoding\n * @public\n */\nexport const canEncodeSubtitles = async (codec) => {\n    if (!SUBTITLE_CODECS.includes(codec)) {\n        return false;\n    }\n    return true;\n};\n/**\n * Returns the list of all media codecs that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getEncodableCodecs = async () => {\n    const [videoCodecs, audioCodecs, subtitleCodecs] = await Promise.all([\n        getEncodableVideoCodecs(),\n        getEncodableAudioCodecs(),\n        getEncodableSubtitleCodecs(),\n    ]);\n    return [...videoCodecs, ...audioCodecs, ...subtitleCodecs];\n};\n/**\n * Returns the list of all video codecs that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getEncodableVideoCodecs = async (checkedCodecs = VIDEO_CODECS, options) => {\n    const bools = await Promise.all(checkedCodecs.map(codec => canEncodeVideo(codec, options)));\n    return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the list of all audio codecs that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getEncodableAudioCodecs = async (checkedCodecs = AUDIO_CODECS, options) => {\n    const bools = await Promise.all(checkedCodecs.map(codec => canEncodeAudio(codec, options)));\n    return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the list of all subtitle codecs that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getEncodableSubtitleCodecs = async (checkedCodecs = SUBTITLE_CODECS) => {\n    const bools = await Promise.all(checkedCodecs.map(canEncodeSubtitles));\n    return checkedCodecs.filter((_, i) => bools[i]);\n};\n/**\n * Returns the first video codec from the given list that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getFirstEncodableVideoCodec = async (checkedCodecs, options) => {\n    for (const codec of checkedCodecs) {\n        if (await canEncodeVideo(codec, options)) {\n            return codec;\n        }\n    }\n    return null;\n};\n/**\n * Returns the first audio codec from the given list that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getFirstEncodableAudioCodec = async (checkedCodecs, options) => {\n    for (const codec of checkedCodecs) {\n        if (await canEncodeAudio(codec, options)) {\n            return codec;\n        }\n    }\n    return null;\n};\n/**\n * Returns the first subtitle codec from the given list that can be encoded by the browser.\n * @group Encoding\n * @public\n */\nexport const getFirstEncodableSubtitleCodec = async (checkedCodecs) => {\n    for (const codec of checkedCodecs) {\n        if (await canEncodeSubtitles(codec)) {\n            return codec;\n        }\n    }\n    return null;\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { canDecodeAudioMemo, canDecodeVideoMemo } from './decode.js';\nimport { canEncodeAudioMemo, canEncodeVideoMemo } from './encode.js';\nimport { Logging } from './logging.js';\n/**\n * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomVideoDecoder {\n    /** Returns true if and only if the decoder can decode the given codec configuration. */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    static supports(codec, config) {\n        return false;\n    }\n}\n/**\n * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomAudioDecoder {\n    /** Returns true if and only if the decoder can decode the given codec configuration. */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    static supports(codec, config) {\n        return false;\n    }\n}\n/**\n * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomVideoEncoder {\n    /** Returns true if and only if the encoder can encode the given codec configuration. */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    static supports(codec, config) {\n        return false;\n    }\n}\n/**\n * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the\n * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}.\n * @group Custom coders\n * @public\n */\nexport class CustomAudioEncoder {\n    /** Returns true if and only if the encoder can encode the given codec configuration. */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    static supports(codec, config) {\n        return false;\n    }\n}\nexport const customVideoDecoders = [];\nexport const customAudioDecoders = [];\nexport const customVideoEncoders = [];\nexport const customAudioEncoders = [];\n/**\n * Registers a custom video or audio decoder. Registered decoders will automatically be used for decoding whenever\n * possible.\n * @group Custom coders\n * @public\n */\nexport const registerDecoder = (decoder) => {\n    if (decoder.prototype instanceof CustomVideoDecoder) {\n        const casted = decoder;\n        if (customVideoDecoders.includes(casted)) {\n            Logging._warn('Video decoder already registered.');\n            return;\n        }\n        customVideoDecoders.push(casted);\n        canDecodeVideoMemo.clear();\n    }\n    else if (decoder.prototype instanceof CustomAudioDecoder) {\n        const casted = decoder;\n        if (customAudioDecoders.includes(casted)) {\n            Logging._warn('Audio decoder already registered.');\n            return;\n        }\n        customAudioDecoders.push(casted);\n        canDecodeAudioMemo.clear();\n    }\n    else {\n        throw new TypeError('Decoder must be a CustomVideoDecoder or CustomAudioDecoder.');\n    }\n};\n/**\n * Registers a custom video or audio encoder. Registered encoders will automatically be used for encoding whenever\n * possible.\n * @group Custom coders\n * @public\n */\nexport const registerEncoder = (encoder) => {\n    if (encoder.prototype instanceof CustomVideoEncoder) {\n        const casted = encoder;\n        if (customVideoEncoders.includes(casted)) {\n            Logging._warn('Video encoder already registered.');\n            return;\n        }\n        customVideoEncoders.push(casted);\n        canEncodeVideoMemo.clear();\n    }\n    else if (encoder.prototype instanceof CustomAudioEncoder) {\n        const casted = encoder;\n        if (customAudioEncoders.includes(casted)) {\n            Logging._warn('Audio encoder already registered.');\n            return;\n        }\n        customAudioEncoders.push(casted);\n        canEncodeAudioMemo.clear();\n    }\n    else {\n        throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.');\n    }\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { InputDisposedError } from './input.js';\nimport { assert, clamp, getUint24, textDecoder, toDataView } from './misc.js';\nimport { DEFAULT_MAX_READ_POSITION, DEFAULT_MIN_READ_POSITION } from './source.js';\nexport class Reader {\n    constructor(source) {\n        this.source = source;\n    }\n    get fileSize() {\n        const size = this.source._getFileSize();\n        if (size === undefined) {\n            throw new Error('Reading file size too early; read required first.');\n        }\n        return size;\n    }\n    get fileSizeNonStrict() {\n        return this.source._getFileSize() ?? null;\n    }\n    requestSlice(start, length) {\n        if (this.source._disposed) {\n            throw new InputDisposedError();\n        }\n        if (start < 0) {\n            return null;\n        }\n        if (this.fileSizeNonStrict !== null && start + length > this.fileSizeNonStrict) {\n            return null;\n        }\n        if (length === 0) {\n            const buffer = new Uint8Array(0);\n            return new FileSlice(buffer, toDataView(buffer), 0, start, start);\n        }\n        const end = start + length;\n        const result = this.source._read(start, end, DEFAULT_MIN_READ_POSITION, DEFAULT_MAX_READ_POSITION);\n        if (result instanceof Promise) {\n            return result.then((x) => {\n                if (!x) {\n                    return null;\n                }\n                return new FileSlice(x.bytes, x.view, x.offset, start, end);\n            });\n        }\n        else {\n            if (!result) {\n                return null;\n            }\n            return new FileSlice(result.bytes, result.view, result.offset, start, end);\n        }\n    }\n    requestSliceRange(start, minLength, maxLength) {\n        if (this.source._disposed) {\n            throw new InputDisposedError();\n        }\n        if (start < 0) {\n            return null;\n        }\n        if (this.fileSizeNonStrict !== null) {\n            return this.requestSlice(start, clamp(this.fileSizeNonStrict - start, minLength, maxLength));\n        }\n        else {\n            const promisedAttempt = this.requestSlice(start, maxLength);\n            const handleAttempt = (attempt) => {\n                if (attempt) {\n                    return attempt;\n                }\n                // The slice couldn't fit, meaning we must know the file size now\n                assert(this.fileSizeNonStrict !== null);\n                return this.requestSlice(start, clamp(this.fileSizeNonStrict - start, minLength, maxLength));\n            };\n            if (promisedAttempt instanceof Promise) {\n                return promisedAttempt.then(handleAttempt);\n            }\n            else {\n                return handleAttempt(promisedAttempt);\n            }\n        }\n    }\n    requestEntireFile() {\n        if (this.fileSizeNonStrict !== null) {\n            return this.requestSlice(0, this.fileSizeNonStrict);\n        }\n        const CHUNK_SIZE = 1024;\n        return (async () => {\n            const chunks = [];\n            let currentSize = 0;\n            while (true) {\n                if (chunks.length === 1 && this.fileSizeNonStrict !== null) {\n                    // It only took one read to get to know the whole file size\n                    return this.requestSlice(0, this.fileSizeNonStrict);\n                }\n                let slice = this.requestSliceRange(currentSize, 0, CHUNK_SIZE);\n                if (slice instanceof Promise)\n                    slice = await slice;\n                if (!slice || slice.length === 0) {\n                    break;\n                }\n                const chunk = readBytes(slice, slice.length);\n                chunks.push(chunk);\n                currentSize += slice.length;\n            }\n            const joined = new Uint8Array(currentSize);\n            let offset = 0;\n            for (const chunk of chunks) {\n                joined.set(chunk, offset);\n                offset += chunk.length;\n            }\n            return new FileSlice(joined, toDataView(joined), 0, 0, currentSize);\n        })();\n    }\n}\nexport class FileSlice {\n    constructor(\n    /** The underlying bytes backing this slice. Avoid using this directly and prefer reader functions instead. */\n    bytes, \n    /** A view into the bytes backing this slice. Avoid using this directly and prefer reader functions instead. */\n    view, \n    /** The offset in \"file bytes\" at which `bytes` begins in the file. */\n    offset, \n    /** The offset in \"file bytes\" where this slice begins. */\n    start, \n    /** The offset in \"file bytes\" where this slice ends (exclusive). */\n    end) {\n        this.bytes = bytes;\n        this.view = view;\n        this.offset = offset;\n        this.start = start;\n        this.end = end;\n        this.bufferPos = start - offset;\n    }\n    static tempFromBytes(bytes) {\n        return new FileSlice(bytes, toDataView(bytes), 0, 0, bytes.length);\n    }\n    get length() {\n        return this.end - this.start;\n    }\n    get filePos() {\n        return this.offset + this.bufferPos;\n    }\n    set filePos(value) {\n        this.bufferPos = value - this.offset;\n    }\n    /** The number of bytes left from the current pos to the end of the slice. */\n    get remainingLength() {\n        return Math.max(this.end - this.filePos, 0);\n    }\n    skip(byteCount) {\n        this.bufferPos += byteCount;\n    }\n    /** Creates a new subslice of this slice whose byte range must be contained within this slice. */\n    slice(filePos, length = this.end - filePos) {\n        if (filePos < this.start || filePos + length > this.end) {\n            throw new RangeError('Slicing outside of original slice.');\n        }\n        return new FileSlice(this.bytes, this.view, this.offset, filePos, filePos + length);\n    }\n}\nconst checkIsInRange = (slice, bytesToRead) => {\n    if (slice.filePos < slice.start || slice.filePos + bytesToRead > slice.end) {\n        throw new RangeError(`Tried reading [${slice.filePos}, ${slice.filePos + bytesToRead}), but slice is`\n            + ` [${slice.start}, ${slice.end}). This is likely an internal error, please report it alongside the file`\n            + ` that caused it.`);\n    }\n};\nexport const readBytes = (slice, length) => {\n    checkIsInRange(slice, length);\n    const bytes = slice.bytes.subarray(slice.bufferPos, slice.bufferPos + length);\n    slice.bufferPos += length;\n    return bytes;\n};\nexport const readU8 = (slice) => {\n    checkIsInRange(slice, 1);\n    return slice.view.getUint8(slice.bufferPos++);\n};\nexport const readU16 = (slice, littleEndian) => {\n    checkIsInRange(slice, 2);\n    const value = slice.view.getUint16(slice.bufferPos, littleEndian);\n    slice.bufferPos += 2;\n    return value;\n};\nexport const readU16Be = (slice) => {\n    checkIsInRange(slice, 2);\n    const value = slice.view.getUint16(slice.bufferPos, false);\n    slice.bufferPos += 2;\n    return value;\n};\nexport const readU24Be = (slice) => {\n    checkIsInRange(slice, 3);\n    const value = getUint24(slice.view, slice.bufferPos, false);\n    slice.bufferPos += 3;\n    return value;\n};\nexport const readI16Be = (slice) => {\n    checkIsInRange(slice, 2);\n    const value = slice.view.getInt16(slice.bufferPos, false);\n    slice.bufferPos += 2;\n    return value;\n};\nexport const readU32 = (slice, littleEndian) => {\n    checkIsInRange(slice, 4);\n    const value = slice.view.getUint32(slice.bufferPos, littleEndian);\n    slice.bufferPos += 4;\n    return value;\n};\nexport const readU32Be = (slice) => {\n    checkIsInRange(slice, 4);\n    const value = slice.view.getUint32(slice.bufferPos, false);\n    slice.bufferPos += 4;\n    return value;\n};\nexport const readU32Le = (slice) => {\n    checkIsInRange(slice, 4);\n    const value = slice.view.getUint32(slice.bufferPos, true);\n    slice.bufferPos += 4;\n    return value;\n};\nexport const readI32Be = (slice) => {\n    checkIsInRange(slice, 4);\n    const value = slice.view.getInt32(slice.bufferPos, false);\n    slice.bufferPos += 4;\n    return value;\n};\nexport const readI32Le = (slice) => {\n    checkIsInRange(slice, 4);\n    const value = slice.view.getInt32(slice.bufferPos, true);\n    slice.bufferPos += 4;\n    return value;\n};\nexport const readU64 = (slice, littleEndian) => {\n    let low;\n    let high;\n    if (littleEndian) {\n        low = readU32(slice, true);\n        high = readU32(slice, true);\n    }\n    else {\n        high = readU32(slice, false);\n        low = readU32(slice, false);\n    }\n    return high * 0x100000000 + low;\n};\nexport const readU64Be = (slice) => {\n    const high = readU32Be(slice);\n    const low = readU32Be(slice);\n    return high * 0x100000000 + low;\n};\nexport const readI64Be = (slice) => {\n    const high = readI32Be(slice);\n    const low = readU32Be(slice);\n    return high * 0x100000000 + low;\n};\nexport const readI64Le = (slice) => {\n    const low = readU32Le(slice);\n    const high = readI32Le(slice);\n    return high * 0x100000000 + low;\n};\nexport const readF32Be = (slice) => {\n    checkIsInRange(slice, 4);\n    const value = slice.view.getFloat32(slice.bufferPos, false);\n    slice.bufferPos += 4;\n    return value;\n};\nexport const readF64Be = (slice) => {\n    checkIsInRange(slice, 8);\n    const value = slice.view.getFloat64(slice.bufferPos, false);\n    slice.bufferPos += 8;\n    return value;\n};\nexport const readAscii = (slice, length) => {\n    checkIsInRange(slice, length);\n    let str = '';\n    for (let i = 0; i < length; i++) {\n        str += String.fromCharCode(slice.bytes[slice.bufferPos++]);\n    }\n    return str;\n};\nexport const readAllLines = (slice, length, options) => {\n    const text = textDecoder.decode(readBytes(slice, length));\n    const lines = text.split('\\n')\n        .map(x => x.trim())\n        .filter(x => x.length > 0 && !options?.ignore?.(x));\n    return lines;\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { AsyncMutex } from './misc.js';\nexport class Muxer {\n    constructor(output) {\n        this.mutex = new AsyncMutex();\n        this.trackTimestampInfo = new WeakMap();\n        this.output = output;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    onTrackClose(track) { }\n    validateTimestamp(track, timestampInSeconds, isKeyPacket) {\n        if (timestampInSeconds < 0) {\n            throw new Error(`Timestamps must be non-negative (got ${timestampInSeconds}s).`);\n        }\n        let timestampInfo = this.trackTimestampInfo.get(track);\n        if (!timestampInfo) {\n            if (!isKeyPacket) {\n                throw new Error('First packet must be a key packet.');\n            }\n            timestampInfo = {\n                maxTimestamp: timestampInSeconds,\n                maxTimestampBeforeLastKeyPacket: null,\n            };\n            this.trackTimestampInfo.set(track, timestampInfo);\n        }\n        else {\n            if (isKeyPacket) {\n                timestampInfo.maxTimestampBeforeLastKeyPacket = timestampInfo.maxTimestamp;\n            }\n            if (timestampInfo.maxTimestampBeforeLastKeyPacket !== null\n                && timestampInSeconds < timestampInfo.maxTimestampBeforeLastKeyPacket) {\n                throw new Error(`Timestamps cannot be smaller than the largest timestamp of the previous GOP (a GOP begins with a`\n                    + ` key packet and ends right before the next key packet). Got ${timestampInSeconds}s, but largest`\n                    + ` timestamp is ${timestampInfo.maxTimestampBeforeLastKeyPacket}s.`);\n            }\n            timestampInfo.maxTimestamp = Math.max(timestampInfo.maxTimestamp, timestampInSeconds);\n        }\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nconst cueBlockHeaderRegex = /(?:(.+?)\\n)?((?:\\d{2}:)?\\d{2}:\\d{2}.\\d{3})\\s+-->\\s+((?:\\d{2}:)?\\d{2}:\\d{2}.\\d{3})/g;\nconst preambleStartRegex = /^WEBVTT(.|\\n)*?\\n{2}/;\nexport const inlineTimestampRegex = /<(?:(\\d{2}):)?(\\d{2}):(\\d{2}).(\\d{3})>/g;\nexport class SubtitleParser {\n    constructor(options) {\n        this.preambleText = null;\n        this.preambleEmitted = false;\n        this.options = options;\n    }\n    parse(text) {\n        text = text.replaceAll('\\r\\n', '\\n').replaceAll('\\r', '\\n');\n        cueBlockHeaderRegex.lastIndex = 0;\n        let match;\n        if (!this.preambleText) {\n            if (!preambleStartRegex.test(text)) {\n                throw new Error('WebVTT preamble incorrect.');\n            }\n            match = cueBlockHeaderRegex.exec(text);\n            const preamble = text.slice(0, match?.index ?? text.length).trimEnd();\n            if (!preamble) {\n                throw new Error('No WebVTT preamble provided.');\n            }\n            this.preambleText = preamble;\n            if (match) {\n                text = text.slice(match.index);\n                cueBlockHeaderRegex.lastIndex = 0;\n            }\n        }\n        while ((match = cueBlockHeaderRegex.exec(text))) {\n            const notes = text.slice(0, match.index);\n            const cueIdentifier = match[1];\n            const matchEnd = match.index + match[0].length;\n            const bodyStart = text.indexOf('\\n', matchEnd) + 1;\n            const cueSettings = text.slice(matchEnd, bodyStart).trim();\n            let bodyEnd = text.indexOf('\\n\\n', matchEnd);\n            if (bodyEnd === -1)\n                bodyEnd = text.length;\n            const startTime = parseSubtitleTimestamp(match[2]);\n            const endTime = parseSubtitleTimestamp(match[3]);\n            const duration = endTime - startTime;\n            const body = text.slice(bodyStart, bodyEnd).trim();\n            text = text.slice(bodyEnd).trimStart();\n            cueBlockHeaderRegex.lastIndex = 0;\n            const cue = {\n                timestamp: startTime / 1000,\n                duration: duration / 1000,\n                text: body,\n                identifier: cueIdentifier,\n                settings: cueSettings,\n                notes,\n            };\n            const meta = {};\n            if (!this.preambleEmitted) {\n                meta.config = {\n                    description: this.preambleText,\n                };\n                this.preambleEmitted = true;\n            }\n            this.options.output(cue, meta);\n        }\n    }\n}\nconst timestampRegex = /(?:(\\d{2}):)?(\\d{2}):(\\d{2}).(\\d{3})/;\nexport const parseSubtitleTimestamp = (string) => {\n    const match = timestampRegex.exec(string);\n    if (!match)\n        throw new Error('Expected match.');\n    return 60 * 60 * 1000 * Number(match[1] || '0')\n        + 60 * 1000 * Number(match[2])\n        + 1000 * Number(match[3])\n        + Number(match[4]);\n};\nexport const formatSubtitleTimestamp = (timestamp) => {\n    const hours = Math.floor(timestamp / (60 * 60 * 1000));\n    const minutes = Math.floor((timestamp % (60 * 60 * 1000)) / (60 * 1000));\n    const seconds = Math.floor((timestamp % (60 * 1000)) / 1000);\n    const milliseconds = timestamp % 1000;\n    return hours.toString().padStart(2, '0') + ':'\n        + minutes.toString().padStart(2, '0') + ':'\n        + seconds.toString().padStart(2, '0') + '.'\n        + milliseconds.toString().padStart(3, '0');\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { toUint8Array, assert, isU32, last, textEncoder, COLOR_PRIMARIES_MAP, TRANSFER_CHARACTERISTICS_MAP, MATRIX_COEFFICIENTS_MAP, colorSpaceIsComplete, UNDETERMINED_LANGUAGE, assertNever, keyValueIterator, } from '../misc.js';\nimport { generateAv1CodecConfigurationFromCodecString, parsePcmCodec, PCM_AUDIO_CODECS, } from '../codec.js';\nimport { formatSubtitleTimestamp } from '../subtitles.js';\nimport { getTrackMetadata, GLOBAL_TIMESCALE, intoTimescale, } from './isobmff-muxer.js';\nimport { parseAc3SyncFrame, parseEac3SyncFrame, parseOpusIdentificationHeader } from '../codec-data.js';\nimport { RichImageData } from '../metadata.js';\nimport { Bitstream } from '../../shared/bitstream.js';\nexport class IsobmffBoxWriter {\n    constructor(writer) {\n        this.writer = writer;\n        this.helper = new Uint8Array(8);\n        this.helperView = new DataView(this.helper.buffer);\n        /**\n         * Stores the position from the start of the file to where boxes elements have been written. This is used to\n         * rewrite/edit elements that were already added before, and to measure sizes of things.\n         */\n        this.offsets = new WeakMap();\n    }\n    writeU32(value) {\n        this.helperView.setUint32(0, value, false);\n        this.writer.write(this.helper.subarray(0, 4));\n    }\n    writeU64(value) {\n        this.helperView.setUint32(0, Math.floor(value / 2 ** 32), false);\n        this.helperView.setUint32(4, value, false);\n        this.writer.write(this.helper.subarray(0, 8));\n    }\n    writeAscii(text) {\n        for (let i = 0; i < text.length; i++) {\n            this.helperView.setUint8(i % 8, text.charCodeAt(i));\n            if (i % 8 === 7)\n                this.writer.write(this.helper);\n        }\n        if (text.length % 8 !== 0) {\n            this.writer.write(this.helper.subarray(0, text.length % 8));\n        }\n    }\n    writeBox(box) {\n        this.offsets.set(box, this.writer.getPos());\n        if (box.contents && !box.children) {\n            this.writeBoxHeader(box, box.size ?? box.contents.byteLength + 8);\n            this.writer.write(box.contents);\n        }\n        else {\n            const startPos = this.writer.getPos();\n            this.writeBoxHeader(box, 0);\n            if (box.contents)\n                this.writer.write(box.contents);\n            if (box.children)\n                for (const child of box.children)\n                    if (child)\n                        this.writeBox(child);\n            const endPos = this.writer.getPos();\n            const size = box.size ?? endPos - startPos;\n            this.writer.seek(startPos);\n            this.writeBoxHeader(box, size);\n            this.writer.seek(endPos);\n        }\n    }\n    writeBoxHeader(box, size) {\n        this.writeU32(box.largeSize ? 1 : size);\n        this.writeAscii(box.type);\n        if (box.largeSize)\n            this.writeU64(size);\n    }\n    measureBoxHeader(box) {\n        return 8 + (box.largeSize ? 8 : 0);\n    }\n    patchBox(box) {\n        const boxOffset = this.offsets.get(box);\n        assert(boxOffset !== undefined);\n        const endPos = this.writer.getPos();\n        this.writer.seek(boxOffset);\n        this.writeBox(box);\n        this.writer.seek(endPos);\n    }\n    measureBox(box) {\n        if (box.contents && !box.children) {\n            const headerSize = this.measureBoxHeader(box);\n            return headerSize + box.contents.byteLength;\n        }\n        else {\n            let result = this.measureBoxHeader(box);\n            if (box.contents)\n                result += box.contents.byteLength;\n            if (box.children)\n                for (const child of box.children)\n                    if (child)\n                        result += this.measureBox(child);\n            return result;\n        }\n    }\n}\nconst bytes = /* #__PURE__ */ new Uint8Array(8);\nconst view = /* #__PURE__ */ new DataView(bytes.buffer);\nconst u8 = (value) => {\n    return [(value % 0x100 + 0x100) % 0x100];\n};\nconst u16 = (value) => {\n    view.setUint16(0, value, false);\n    return [bytes[0], bytes[1]];\n};\nconst i16 = (value) => {\n    view.setInt16(0, value, false);\n    return [bytes[0], bytes[1]];\n};\nconst u24 = (value) => {\n    view.setUint32(0, value, false);\n    return [bytes[1], bytes[2], bytes[3]];\n};\nconst u32 = (value) => {\n    view.setUint32(0, value, false);\n    return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nconst i32 = (value) => {\n    view.setInt32(0, value, false);\n    return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nconst u64 = (value) => {\n    view.setUint32(0, Math.floor(value / 2 ** 32), false);\n    view.setUint32(4, value, false);\n    return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nconst i64 = (value) => {\n    view.setInt32(0, Math.floor(value / 2 ** 32), false);\n    view.setUint32(4, value, false);\n    return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nconst fixed_8_8 = (value) => {\n    view.setInt16(0, 2 ** 8 * value, false);\n    return [bytes[0], bytes[1]];\n};\nconst fixed_16_16 = (value) => {\n    view.setInt32(0, 2 ** 16 * value, false);\n    return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nconst fixed_2_30 = (value) => {\n    view.setInt32(0, 2 ** 30 * value, false);\n    return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nconst variableUnsignedInt = (value, byteLength) => {\n    const bytes = [];\n    let remaining = value;\n    do {\n        let byte = remaining & 0x7f;\n        remaining >>= 7;\n        // If this isn't the first byte we're adding (meaning there will be more bytes after it\n        // when we reverse the array), set the continuation bit\n        if (bytes.length > 0) {\n            byte |= 0x80;\n        }\n        bytes.push(byte);\n        if (byteLength !== undefined) {\n            byteLength--;\n        }\n    } while (remaining > 0 || byteLength);\n    // Reverse the array since we built it backwards\n    return bytes.reverse();\n};\nconst ascii = (text, nullTerminated = false) => {\n    const bytes = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n    if (nullTerminated)\n        bytes.push(0x00);\n    return bytes;\n};\nconst rotationMatrix = (rotationInDegrees) => {\n    const theta = rotationInDegrees * (Math.PI / 180);\n    const cosTheta = Math.round(Math.cos(theta));\n    const sinTheta = Math.round(Math.sin(theta));\n    // Matrices are post-multiplied in ISOBMFF, meaning this is the transpose of your typical rotation matrix\n    return [\n        cosTheta, sinTheta, 0,\n        -sinTheta, cosTheta, 0,\n        0, 0, 1,\n    ];\n};\nconst IDENTITY_MATRIX = /* #__PURE__ */ rotationMatrix(0);\nconst matrixToBytes = (matrix) => {\n    return [\n        fixed_16_16(matrix[0]), fixed_16_16(matrix[1]), fixed_2_30(matrix[2]),\n        fixed_16_16(matrix[3]), fixed_16_16(matrix[4]), fixed_2_30(matrix[5]),\n        fixed_16_16(matrix[6]), fixed_16_16(matrix[7]), fixed_2_30(matrix[8]),\n    ];\n};\nexport const box = (type, contents, children) => ({\n    type,\n    contents: contents && new Uint8Array(contents.flat(10)),\n    children,\n});\n/** A FullBox always starts with a version byte, followed by three flag bytes. */\nexport const fullBox = (type, version, flags, contents, children) => box(type, [u8(version), u24(flags), contents ?? []], children);\n/**\n * File Type Compatibility Box: Allows the reader to determine whether this is a type of file that the\n * reader understands.\n */\nexport const ftyp = (details) => {\n    // You can find the full logic for this at\n    // https://github.com/FFmpeg/FFmpeg/blob/de2fb43e785773738c660cdafb9309b1ef1bc80d/libavformat/movenc.c#L5518\n    // Obviously, this lib only needs a small subset of that logic.\n    const minorVersion = 0x200;\n    if (details.isQuickTime) {\n        return box('ftyp', [\n            ascii('qt  '), // Major brand\n            u32(minorVersion), // Minor version\n            // Compatible brands\n            ascii('qt  '),\n        ]);\n    }\n    if (details.fragmented) {\n        if (details.cmaf) {\n            return box('ftyp', [\n                ascii('iso5'), // Major brand\n                u32(minorVersion), // Minor version\n                // Compatible brands\n                ascii('iso5'),\n                ascii('iso6'),\n                ascii('mp41'),\n                ascii('cmfc'),\n                ascii('dash'),\n            ]);\n        }\n        else {\n            return box('ftyp', [\n                ascii('iso5'), // Major brand\n                u32(minorVersion), // Minor version\n                // Compatible brands\n                ascii('iso5'),\n                ascii('iso6'),\n                ascii('mp41'),\n            ]);\n        }\n    }\n    return box('ftyp', [\n        ascii('isom'), // Major brand\n        u32(minorVersion), // Minor version\n        // Compatible brands\n        ascii('isom'),\n        details.holdsAvc ? ascii('avc1') : [],\n        ascii('mp41'),\n    ]);\n};\n/** Segment Type Box */\nexport const styp = () => box('styp', [\n    ascii('iso5'), // Major brand\n    u32(0), // Minor version\n    // Compatible brands\n    ascii('iso5'),\n    ascii('iso6'),\n    ascii('mp41'),\n    ascii('cmfc'),\n    ascii('dash'),\n]);\n/** Segment Index Box */\nexport const sidx = (muxer, referencedSize) => {\n    let duration = muxer.maxWrittenEndTimestamp - muxer.minWrittenTimestamp;\n    if (!Number.isFinite(duration)) {\n        duration = 0;\n    }\n    return fullBox('sidx', 1, 0, [\n        u32(1), // Reference ID\n        u32(GLOBAL_TIMESCALE), // Timescale\n        u64(intoTimescale(muxer.minWrittenTimestamp, GLOBAL_TIMESCALE)), // Earliest presentation time\n        u64(0), // First offset\n        u16(0), // Reserved\n        u16(1), // Reference count\n        u32(referencedSize & 0x7fffffff), // Reference type (0) + referenced size\n        u32(intoTimescale(duration, GLOBAL_TIMESCALE)), // Subsegment duration\n        u32(0), // Starts with SAP + SAP type + SAP delta time (no information provided)\n    ]);\n};\n/** Movie Sample Data Box. Contains the actual frames/samples of the media. */\nexport const mdat = (reserveLargeSize) => ({ type: 'mdat', largeSize: reserveLargeSize });\n/** Free Space Box: A box that designates unused space in the movie data file. */\nexport const free = (size) => ({ type: 'free', size });\n/**\n * Movie Box: Used to specify the information that defines a movie - that is, the information that allows\n * an application to interpret the sample data that is stored elsewhere.\n */\nexport const moov = (muxer) => {\n    return box('moov', undefined, [\n        mvhd(muxer.creationTime, muxer.trackDatas),\n        ...muxer.trackDatas.map(x => trak(x, muxer.creationTime)),\n        muxer.isFragmented ? mvex(muxer.trackDatas) : null,\n        udta(muxer),\n    ]);\n};\n/** Movie Header Box: Used to specify the characteristics of the entire movie, such as timescale and duration. */\nexport const mvhd = (creationTime, trackDatas) => {\n    const duration = Math.max(0, ...trackDatas\n        .map(trackData => (intoTimescale(presentationSpan(trackData), GLOBAL_TIMESCALE)\n        + intoTimescale(trackData.startTimestampOffset ?? 0, GLOBAL_TIMESCALE))));\n    const nextTrackId = Math.max(0, ...trackDatas.map(x => x.track.id)) + 1;\n    // Conditionally use u64 if u32 isn't enough\n    const needsU64 = !isU32(creationTime) || !isU32(duration);\n    const u32OrU64 = needsU64 ? u64 : u32;\n    return fullBox('mvhd', +needsU64, 0, [\n        u32OrU64(creationTime), // Creation time\n        u32OrU64(creationTime), // Modification time\n        u32(GLOBAL_TIMESCALE), // Timescale\n        u32OrU64(duration), // Duration\n        fixed_16_16(1), // Preferred rate\n        fixed_8_8(1), // Preferred volume\n        Array(10).fill(0), // Reserved\n        matrixToBytes(IDENTITY_MATRIX), // Matrix\n        Array(24).fill(0), // Pre-defined\n        u32(nextTrackId), // Next track ID\n    ]);\n};\nconst presentationSpan = (trackData) => {\n    if (trackData.samples.length === 0) {\n        return 0;\n    }\n    let minTimestamp = Infinity;\n    let maxEndTimestamp = -Infinity;\n    for (let i = 0; i < trackData.samples.length; i++) {\n        const sample = trackData.samples[i];\n        if (sample.timestamp < minTimestamp) {\n            minTimestamp = sample.timestamp;\n        }\n        if (sample.timestamp + sample.duration > maxEndTimestamp) {\n            maxEndTimestamp = sample.timestamp + sample.duration;\n        }\n    }\n    if (minTimestamp === Infinity) {\n        return 0;\n    }\n    return maxEndTimestamp - minTimestamp;\n};\n/**\n * Track Box: Defines a single track of a movie. A movie may consist of one or more tracks. Each track is\n * independent of the other tracks in the movie and carries its own temporal and spatial information. Each Track Box\n * contains its associated Media Box.\n */\nexport const trak = (trackData, creationTime) => {\n    const trackMetadata = getTrackMetadata(trackData);\n    const needsEditList = trackData.startTimestampOffset !== null && trackData.startTimestampOffset > 0;\n    return box('trak', undefined, [\n        tkhd(trackData, creationTime),\n        needsEditList ? edts(trackData, trackData.startTimestampOffset) : null,\n        mdia(trackData, creationTime),\n        trackMetadata.name !== undefined\n            ? box('udta', undefined, [\n                box('name', [\n                    ...textEncoder.encode(trackMetadata.name),\n                ]),\n            ])\n            : null,\n    ]);\n};\n/** Track Header Box: Specifies the characteristics of a single track within a movie. */\nexport const tkhd = (trackData, creationTime) => {\n    const durationInGlobalTimescale = intoTimescale(presentationSpan(trackData), GLOBAL_TIMESCALE)\n        + intoTimescale(trackData.startTimestampOffset ?? 0, GLOBAL_TIMESCALE);\n    const needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n    const u32OrU64 = needsU64 ? u64 : u32;\n    let matrix;\n    if (trackData.type === 'video') {\n        const rotation = trackData.track.metadata.rotation;\n        matrix = rotationMatrix(rotation ?? 0);\n    }\n    else {\n        matrix = IDENTITY_MATRIX;\n    }\n    let flags = 0x2; // Track in movie\n    if (trackData.track.metadata.disposition?.default !== false) {\n        flags |= 0x1; // Track enabled\n    }\n    return fullBox('tkhd', +needsU64, flags, [\n        u32OrU64(creationTime), // Creation time\n        u32OrU64(creationTime), // Modification time\n        u32(trackData.track.id), // Track ID\n        u32(0), // Reserved\n        u32OrU64(durationInGlobalTimescale), // Duration\n        Array(8).fill(0), // Reserved\n        u16(0), // Layer\n        u16(trackData.track.id), // Alternate group\n        fixed_8_8(trackData.type === 'audio' ? 1 : 0), // Volume\n        u16(0), // Reserved\n        matrixToBytes(matrix), // Matrix\n        fixed_16_16(trackData.type === 'video' ? trackData.info.width : 0), // Track width\n        fixed_16_16(trackData.type === 'video' ? trackData.info.height : 0), // Track height\n    ]);\n};\n/** Edit Box: Specifies edits to the track's media. */\nexport const edts = (trackData, offset) => {\n    const startOffset = intoTimescale(offset, GLOBAL_TIMESCALE);\n    const mediaDuration = intoTimescale(presentationSpan(trackData), GLOBAL_TIMESCALE);\n    const needs64Bits = !isU32(startOffset) || !isU32(mediaDuration);\n    const u32OrU64 = needs64Bits ? u64 : u32;\n    const i32OrI64 = needs64Bits ? i64 : i32;\n    return box('edts', undefined, [\n        fullBox('elst', needs64Bits ? 1 : 0, 0, [\n            u32(2), // Entry count\n            // #1\n            u32OrU64(startOffset), // Segment duration\n            i32OrI64(-1), // Media time\n            fixed_16_16(1), // Media rate\n            // #2\n            u32OrU64(mediaDuration), // Segment duration\n            i32OrI64(0), // Media time\n            fixed_16_16(1), // Media rate\n        ]),\n    ]);\n};\n/** Media Box: Describes and define a track's media type and sample data. */\nexport const mdia = (trackData, creationTime) => box('mdia', undefined, [\n    mdhd(trackData, creationTime),\n    hdlr(true, TRACK_TYPE_TO_COMPONENT_SUBTYPE[trackData.type], TRACK_TYPE_TO_HANDLER_NAME[trackData.type]),\n    minf(trackData),\n]);\n/** Media Header Box: Specifies the characteristics of a media, including timescale and duration. */\nexport const mdhd = (trackData, creationTime) => {\n    // Since the duration represents the raw media duration, edit list offsets are not taken into account here\n    const localDuration = intoTimescale(presentationSpan(trackData), trackData.timescale);\n    const needsU64 = !isU32(creationTime) || !isU32(localDuration);\n    const u32OrU64 = needsU64 ? u64 : u32;\n    return fullBox('mdhd', +needsU64, 0, [\n        u32OrU64(creationTime), // Creation time\n        u32OrU64(creationTime), // Modification time\n        u32(trackData.timescale), // Timescale\n        u32OrU64(localDuration), // Duration\n        u16(getLanguageCodeInt(trackData.track.metadata.languageCode ?? UNDETERMINED_LANGUAGE)), // Language\n        u16(0), // Quality\n    ]);\n};\nconst TRACK_TYPE_TO_COMPONENT_SUBTYPE = {\n    video: 'vide',\n    audio: 'soun',\n    subtitle: 'text',\n};\nconst TRACK_TYPE_TO_HANDLER_NAME = {\n    video: 'MediabunnyVideoHandler',\n    audio: 'MediabunnySoundHandler',\n    subtitle: 'MediabunnyTextHandler',\n};\n/** Handler Reference Box. */\nexport const hdlr = (hasComponentType, handlerType, name, manufacturer = '\\0\\0\\0\\0') => fullBox('hdlr', 0, 0, [\n    hasComponentType ? ascii('mhlr') : u32(0), // Component type\n    ascii(handlerType), // Component subtype\n    ascii(manufacturer), // Component manufacturer\n    u32(0), // Component flags\n    u32(0), // Component flags mask\n    ascii(name, true), // Component name\n]);\n/**\n * Media Information Box: Stores handler-specific information for a track's media data. The media handler uses this\n * information to map from media time to media data and to process the media data.\n */\nexport const minf = (trackData) => box('minf', undefined, [\n    TRACK_TYPE_TO_HEADER_BOX[trackData.type](),\n    dinf(),\n    stbl(trackData),\n]);\n/** Video Media Information Header Box: Defines specific color and graphics mode information. */\nexport const vmhd = () => fullBox('vmhd', 0, 1, [\n    u16(0), // Graphics mode\n    u16(0), // Opcolor R\n    u16(0), // Opcolor G\n    u16(0), // Opcolor B\n]);\n/** Sound Media Information Header Box: Stores the sound media's control information, such as balance. */\nexport const smhd = () => fullBox('smhd', 0, 0, [\n    u16(0), // Balance\n    u16(0), // Reserved\n]);\n/** Null Media Header Box. */\nexport const nmhd = () => fullBox('nmhd', 0, 0);\nconst TRACK_TYPE_TO_HEADER_BOX = {\n    video: vmhd,\n    audio: smhd,\n    subtitle: nmhd,\n};\n/**\n * Data Information Box: Contains information specifying the data handler component that provides access to the\n * media data. The data handler component uses the Data Information Box to interpret the media's data.\n */\nexport const dinf = () => box('dinf', undefined, [\n    dref(),\n]);\n/**\n * Data Reference Box: Contains tabular data that instructs the data handler component how to access the media's data.\n */\nexport const dref = () => fullBox('dref', 0, 0, [\n    u32(1), // Entry count\n], [\n    url(),\n]);\nexport const url = () => fullBox('url ', 0, 1); // Self-reference flag enabled\n/**\n * Sample Table Box: Contains information for converting from media time to sample number to sample location. This box\n * also indicates how to interpret the sample (for example, whether to decompress the video data and, if so, how).\n */\nexport const stbl = (trackData) => {\n    const needsCtts = trackData.compositionTimeOffsetTable.length > 1\n        || trackData.compositionTimeOffsetTable.some(x => x.sampleCompositionTimeOffset !== 0);\n    return box('stbl', undefined, [\n        stsd(trackData),\n        stts(trackData),\n        needsCtts ? ctts(trackData) : null,\n        needsCtts ? cslg(trackData) : null,\n        stsc(trackData),\n        stsz(trackData),\n        stco(trackData),\n        stss(trackData),\n    ]);\n};\n/**\n * Sample Description Box: Stores information that allows you to decode samples in the media. The data stored in the\n * sample description varies, depending on the media type.\n */\nexport const stsd = (trackData) => {\n    let sampleDescription;\n    if (trackData.type === 'video') {\n        sampleDescription = videoSampleDescription(videoCodecToBoxName(trackData.track.source._codec, trackData.info.decoderConfig.codec), trackData);\n    }\n    else if (trackData.type === 'audio') {\n        const boxName = audioCodecToBoxName(trackData.track.source._codec, trackData.muxer.isQuickTime);\n        assert(boxName);\n        sampleDescription = soundSampleDescription(boxName, trackData);\n    }\n    else if (trackData.type === 'subtitle') {\n        sampleDescription = subtitleSampleDescription(SUBTITLE_CODEC_TO_BOX_NAME[trackData.track.source._codec], trackData);\n    }\n    assert(sampleDescription);\n    return fullBox('stsd', 0, 0, [\n        u32(1), // Entry count\n    ], [\n        sampleDescription,\n    ]);\n};\n/** Video Sample Description Box: Contains information that defines how to interpret video media data. */\nexport const videoSampleDescription = (compressionType, trackData) => box(compressionType, [\n    Array(6).fill(0), // Reserved\n    u16(1), // Data reference index\n    u16(0), // Pre-defined\n    u16(0), // Reserved\n    Array(12).fill(0), // Pre-defined\n    u16(trackData.info.width), // Width\n    u16(trackData.info.height), // Height\n    u32(0x00480000), // Horizontal resolution\n    u32(0x00480000), // Vertical resolution\n    u32(0), // Reserved\n    u16(1), // Frame count\n    Array(32).fill(0), // Compressor name\n    u16(0x0018), // Depth\n    i16(0xffff), // Pre-defined\n], [\n    VIDEO_CODEC_TO_CONFIGURATION_BOX[trackData.track.source._codec](trackData),\n    pasp(trackData),\n    colorSpaceIsComplete(trackData.info.decoderConfig.colorSpace) ? colr(trackData) : null,\n]);\n/** Pixel Aspect Ratio Box: Specifies pixel width:height spacing for non-square pixels. */\nexport const pasp = (trackData) => {\n    if (trackData.info.pixelAspectRatio.num === trackData.info.pixelAspectRatio.den) {\n        return null;\n    }\n    return box('pasp', [\n        u32(trackData.info.pixelAspectRatio.num),\n        u32(trackData.info.pixelAspectRatio.den),\n    ]);\n};\n/** Colour Information Box: Specifies the color space of the video. */\nexport const colr = (trackData) => box('colr', [\n    ascii(trackData.muxer.isQuickTime ? 'nclc' : 'nclx'), // Colour type\n    u16(COLOR_PRIMARIES_MAP[trackData.info.decoderConfig.colorSpace.primaries]), // Colour primaries\n    u16(TRANSFER_CHARACTERISTICS_MAP[trackData.info.decoderConfig.colorSpace.transfer]), // Transfer characteristics\n    u16(MATRIX_COEFFICIENTS_MAP[trackData.info.decoderConfig.colorSpace.matrix]), // Matrix coefficients\n    trackData.muxer.isQuickTime\n        ? [] // Doesn't have it\n        : u8((trackData.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7), // Full range flag\n]);\n/** AVC Configuration Box: Provides additional information to the decoder. */\nexport const avcC = (trackData) => trackData.info.decoderConfig && box('avcC', [\n    // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n    ...toUint8Array(trackData.info.decoderConfig.description),\n]);\n/** HEVC Configuration Box: Provides additional information to the decoder. */\nexport const hvcC = (trackData) => trackData.info.decoderConfig && box('hvcC', [\n    // For HEVC, description is an HEVCDecoderConfigurationRecord, so nothing else to do here\n    ...toUint8Array(trackData.info.decoderConfig.description),\n]);\n/** VP Configuration Box: Provides additional information to the decoder. */\nexport const vpcC = (trackData) => {\n    // Reference: https://www.webmproject.org/vp9/mp4/\n    if (!trackData.info.decoderConfig) {\n        return null;\n    }\n    const decoderConfig = trackData.info.decoderConfig;\n    const parts = decoderConfig.codec.split('.'); // We can derive the required values from the codec string\n    const profile = Number(parts[1]);\n    const level = Number(parts[2]);\n    const bitDepth = Number(parts[3]);\n    const chromaSubsampling = parts[4] ? Number(parts[4]) : 1; // 4:2:0 colocated with luma (0,0)\n    const videoFullRangeFlag = parts[8] ? Number(parts[8]) : Number(decoderConfig.colorSpace?.fullRange ?? 0);\n    const thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + videoFullRangeFlag;\n    const colourPrimaries = parts[5]\n        ? Number(parts[5])\n        : decoderConfig.colorSpace?.primaries\n            ? COLOR_PRIMARIES_MAP[decoderConfig.colorSpace.primaries]\n            : 2; // Default to undetermined\n    const transferCharacteristics = parts[6]\n        ? Number(parts[6])\n        : decoderConfig.colorSpace?.transfer\n            ? TRANSFER_CHARACTERISTICS_MAP[decoderConfig.colorSpace.transfer]\n            : 2;\n    const matrixCoefficients = parts[7]\n        ? Number(parts[7])\n        : decoderConfig.colorSpace?.matrix\n            ? MATRIX_COEFFICIENTS_MAP[decoderConfig.colorSpace.matrix]\n            : 2;\n    return fullBox('vpcC', 1, 0, [\n        u8(profile), // Profile\n        u8(level), // Level\n        u8(thirdByte), // Bit depth, chroma subsampling, full range\n        u8(colourPrimaries), // Colour primaries\n        u8(transferCharacteristics), // Transfer characteristics\n        u8(matrixCoefficients), // Matrix coefficients\n        u16(0), // Codec initialization data size\n    ]);\n};\n/** AV1 Configuration Box: Provides additional information to the decoder. */\nexport const av1C = (trackData) => {\n    return box('av1C', generateAv1CodecConfigurationFromCodecString(trackData.info.decoderConfig.codec));\n};\n/** Sound Sample Description Box: Contains information that defines how to interpret sound media data. */\nexport const soundSampleDescription = (compressionType, trackData) => {\n    let version = 0;\n    let contents;\n    let sampleSizeInBits = 16;\n    const isPcmCodec = PCM_AUDIO_CODECS.includes(trackData.track.source._codec);\n    if (isPcmCodec) {\n        const codec = trackData.track.source._codec;\n        const { sampleSize } = parsePcmCodec(codec);\n        sampleSizeInBits = 8 * sampleSize;\n        if (sampleSizeInBits > 16) {\n            version = 1;\n        }\n    }\n    if (trackData.muxer.isQuickTime) {\n        version = 1;\n    }\n    if (version === 0) {\n        contents = [\n            Array(6).fill(0), // Reserved\n            u16(1), // Data reference index\n            u16(version), // Version\n            u16(0), // Revision level\n            u32(0), // Vendor\n            u16(trackData.info.numberOfChannels), // Number of channels\n            u16(sampleSizeInBits), // Sample size (bits)\n            u16(0), // Compression ID\n            u16(0), // Packet size\n            u16(trackData.info.sampleRate < 2 ** 16 ? trackData.info.sampleRate : 0), // Sample rate (upper)\n            u16(0), // Sample rate (lower)\n        ];\n    }\n    else {\n        const compressionId = isPcmCodec ? 0 : -2;\n        contents = [\n            Array(6).fill(0), // Reserved\n            u16(1), // Data reference index\n            u16(version), // Version\n            u16(0), // Revision level\n            u32(0), // Vendor\n            u16(trackData.info.numberOfChannels), // Number of channels\n            u16(Math.min(sampleSizeInBits, 16)), // Sample size (bits)\n            i16(compressionId), // Compression ID\n            u16(0), // Packet size\n            u16(trackData.info.sampleRate < 2 ** 16 ? trackData.info.sampleRate : 0), // Sample rate (upper)\n            u16(0), // Sample rate (lower)\n            isPcmCodec\n                ? [\n                    u32(1), // Samples per packet (must be 1 for uncompressed formats)\n                    u32(sampleSizeInBits / 8), // Bytes per packet\n                    u32(trackData.info.numberOfChannels * sampleSizeInBits / 8), // Bytes per frame\n                ]\n                : [\n                    u32(0), // Samples per packet (don't bother, still works with 0)\n                    u32(0), // Bytes per packet (variable)\n                    u32(0), // Bytes per frame (variable)\n                ],\n            u32(2), // Bytes per sample (constant in FFmpeg)\n        ];\n    }\n    return box(compressionType, contents, [\n        audioCodecToConfigurationBox(trackData.track.source._codec, trackData.muxer.isQuickTime)?.(trackData) ?? null,\n    ]);\n};\n/** MPEG-4 Elementary Stream Descriptor Box. */\nexport const esds = (trackData) => {\n    // We build up the bytes in a layered way which reflects the nested structure\n    let objectTypeIndication;\n    switch (trackData.track.source._codec) {\n        case 'aac':\n            {\n                objectTypeIndication = 0x40;\n            }\n            ;\n            break;\n        case 'mp3':\n            {\n                objectTypeIndication = 0x6b;\n            }\n            ;\n            break;\n        case 'vorbis':\n            {\n                objectTypeIndication = 0xdd;\n            }\n            ;\n            break;\n        default: throw new Error(`Unhandled audio codec: ${trackData.track.source._codec}`);\n    }\n    let bytes = [\n        ...u8(objectTypeIndication), // Object type indication\n        ...u8(0x15), // stream type(6bits)=5 audio, flags(2bits)=1\n        ...u24(0), // 24bit buffer size\n        ...u32(0), // max bitrate\n        ...u32(0), // avg bitrate\n    ];\n    if (trackData.info.decoderConfig.description) {\n        const description = toUint8Array(trackData.info.decoderConfig.description);\n        // Add the decoder description to the end\n        bytes = [\n            ...bytes,\n            ...u8(0x05), // TAG(5) = DecoderSpecificInfo\n            ...variableUnsignedInt(description.byteLength),\n            ...description,\n        ];\n    }\n    bytes = [\n        ...u16(1), // ES_ID = 1\n        ...u8(0x00), // flags etc = 0\n        ...u8(0x04), // TAG(4) = ES Descriptor\n        ...variableUnsignedInt(bytes.length),\n        ...bytes,\n        ...u8(0x06), // TAG(6)\n        ...u8(0x01), // length\n        ...u8(0x02), // data\n    ];\n    bytes = [\n        ...u8(0x03), // TAG(3) = Object Descriptor\n        ...variableUnsignedInt(bytes.length),\n        ...bytes,\n    ];\n    return fullBox('esds', 0, 0, bytes);\n};\nexport const wave = (trackData) => {\n    return box('wave', undefined, [\n        frma(trackData),\n        enda(trackData),\n        box('\\x00\\x00\\x00\\x00'), // NULL tag at the end\n    ]);\n};\nexport const frma = (trackData) => {\n    return box('frma', [\n        ascii(audioCodecToBoxName(trackData.track.source._codec, trackData.muxer.isQuickTime)),\n    ]);\n};\n// This box specifies PCM endianness\nexport const enda = (trackData) => {\n    const { littleEndian } = parsePcmCodec(trackData.track.source._codec);\n    return box('enda', [\n        u16(+littleEndian),\n    ]);\n};\n/** Opus Specific Box. */\nexport const dOps = (trackData) => {\n    let outputChannelCount = trackData.info.numberOfChannels;\n    // Default PreSkip, should be at least 80 milliseconds worth of playback, measured in 48000 Hz samples\n    let preSkip = 3840;\n    let inputSampleRate = trackData.info.sampleRate;\n    let outputGain = 0;\n    let channelMappingFamily = 0;\n    let channelMappingTable = new Uint8Array(0);\n    // Read preskip and from codec private data from the encoder\n    // https://www.rfc-editor.org/rfc/rfc7845#section-5\n    const description = trackData.info.decoderConfig?.description;\n    if (description) {\n        assert(description.byteLength >= 18);\n        const bytes = toUint8Array(description);\n        const header = parseOpusIdentificationHeader(bytes);\n        outputChannelCount = header.outputChannelCount;\n        preSkip = header.preSkip;\n        inputSampleRate = header.inputSampleRate;\n        outputGain = header.outputGain;\n        channelMappingFamily = header.channelMappingFamily;\n        if (header.channelMappingTable) {\n            channelMappingTable = header.channelMappingTable;\n        }\n    }\n    // https://www.opus-codec.org/docs/opus_in_isobmff.html\n    return box('dOps', [\n        u8(0), // Version\n        u8(outputChannelCount), // OutputChannelCount\n        u16(preSkip), // PreSkip\n        u32(inputSampleRate), // InputSampleRate\n        i16(outputGain), // OutputGain\n        u8(channelMappingFamily), // ChannelMappingFamily\n        ...channelMappingTable,\n    ]);\n};\n/** FLAC specific box. */\nexport const dfLa = (trackData) => {\n    const description = trackData.info.decoderConfig?.description;\n    assert(description);\n    const bytes = toUint8Array(description);\n    return fullBox('dfLa', 0, 0, [\n        ...bytes.subarray(4),\n    ]);\n};\n/** PCM Configuration Box, ISO/IEC 23003-5. */\nconst pcmC = (trackData) => {\n    const { littleEndian, sampleSize } = parsePcmCodec(trackData.track.source._codec);\n    const formatFlags = +littleEndian;\n    return fullBox('pcmC', 0, 0, [\n        u8(formatFlags),\n        u8(8 * sampleSize),\n    ]);\n};\n/** AC3SpecificBox */\nconst dac3 = (trackData) => {\n    const frameInfo = parseAc3SyncFrame(trackData.info.firstPacket.data);\n    if (!frameInfo) {\n        throw new Error('Couldn\\'t extract AC-3 frame info from the audio packet. '\n            + 'Ensure the packets contain valid AC-3 sync frames (as specified in ETSI TS 102 366).');\n    }\n    const bytes = new Uint8Array(3);\n    const bitstream = new Bitstream(bytes);\n    bitstream.writeBits(2, frameInfo.fscod);\n    bitstream.writeBits(5, frameInfo.bsid);\n    bitstream.writeBits(3, frameInfo.bsmod);\n    bitstream.writeBits(3, frameInfo.acmod);\n    bitstream.writeBits(1, frameInfo.lfeon);\n    bitstream.writeBits(5, frameInfo.bitRateCode);\n    bitstream.writeBits(5, 0); // reserved\n    return box('dac3', [...bytes]);\n};\n/** EC3SpecificBox */\nconst dec3 = (trackData) => {\n    const frameInfo = parseEac3SyncFrame(trackData.info.firstPacket.data);\n    if (!frameInfo) {\n        throw new Error('Couldn\\'t extract E-AC-3 frame info from the audio packet. '\n            + 'Ensure the packets contain valid E-AC-3 sync frames (as specified in ETSI TS 102 366).');\n    }\n    // Calculate size\n    let totalBits = 16; // header: data_rate (13) + num_ind_sub (3)\n    for (const sub of frameInfo.substreams) {\n        totalBits += 23; // fixed fields per substream\n        if (sub.numDepSub > 0) {\n            totalBits += 9; // chan_loc\n        }\n        else {\n            totalBits += 1; // reserved\n        }\n    }\n    const size = Math.ceil(totalBits / 8);\n    const bytes = new Uint8Array(size);\n    const bitstream = new Bitstream(bytes);\n    bitstream.writeBits(13, frameInfo.dataRate);\n    bitstream.writeBits(3, frameInfo.substreams.length - 1); // num_ind_sub\n    for (const sub of frameInfo.substreams) {\n        bitstream.writeBits(2, sub.fscod);\n        bitstream.writeBits(5, sub.bsid);\n        bitstream.writeBits(1, 0); // reserved\n        bitstream.writeBits(1, 0); // asvc = 0\n        bitstream.writeBits(3, sub.bsmod);\n        bitstream.writeBits(3, sub.acmod);\n        bitstream.writeBits(1, sub.lfeon);\n        bitstream.writeBits(3, 0); // reserved\n        bitstream.writeBits(4, sub.numDepSub);\n        if (sub.numDepSub > 0) {\n            bitstream.writeBits(9, sub.chanLoc);\n        }\n        else {\n            bitstream.writeBits(1, 0); // reserved\n        }\n    }\n    return box('dec3', [...bytes]);\n};\nexport const subtitleSampleDescription = (compressionType, trackData) => box(compressionType, [\n    Array(6).fill(0), // Reserved\n    u16(1), // Data reference index\n], [\n    SUBTITLE_CODEC_TO_CONFIGURATION_BOX[trackData.track.source._codec](trackData),\n]);\nexport const vttC = (trackData) => box('vttC', [\n    ...textEncoder.encode(trackData.info.config.description),\n]);\nexport const txtC = (textConfig) => fullBox('txtC', 0, 0, [\n    ...textConfig, 0, // Text config (null-terminated)\n]);\n/**\n * Time-To-Sample Box: Stores duration information for a media's samples, providing a mapping from a time in a media\n * to the corresponding data sample. The table is compact, meaning that consecutive samples with the same time delta\n * will be grouped.\n */\nexport const stts = (trackData) => {\n    return fullBox('stts', 0, 0, [\n        u32(trackData.timeToSampleTable.length), // Number of entries\n        trackData.timeToSampleTable.map(x => [\n            u32(x.sampleCount), // Sample count\n            u32(x.sampleDelta), // Sample duration\n        ]),\n    ]);\n};\n/** Sync Sample Box: Identifies the key frames in the media, marking the random access points within a stream. */\nexport const stss = (trackData) => {\n    if (trackData.samples.every(x => x.type === 'key'))\n        return null; // No stss box -> every frame is a key frame\n    const keySamples = [...trackData.samples.entries()].filter(([, sample]) => sample.type === 'key');\n    return fullBox('stss', 0, 0, [\n        u32(keySamples.length), // Number of entries\n        keySamples.map(([index]) => u32(index + 1)), // Sync sample table\n    ]);\n};\n/**\n * Sample-To-Chunk Box: As samples are added to a media, they are collected into chunks that allow optimized data\n * access. A chunk contains one or more samples. Chunks in a media may have different sizes, and the samples within a\n * chunk may have different sizes. The Sample-To-Chunk Box stores chunk information for the samples in a media, stored\n * in a compactly-coded fashion.\n */\nexport const stsc = (trackData) => {\n    return fullBox('stsc', 0, 0, [\n        u32(trackData.compactlyCodedChunkTable.length), // Number of entries\n        trackData.compactlyCodedChunkTable.map(x => [\n            u32(x.firstChunk), // First chunk\n            u32(x.samplesPerChunk), // Samples per chunk\n            u32(1), // Sample description index\n        ]),\n    ]);\n};\n/** Sample Size Box: Specifies the byte size of each sample in the media. */\nexport const stsz = (trackData) => {\n    if (trackData.type === 'audio' && trackData.info.requiresPcmTransformation) {\n        const { sampleSize } = parsePcmCodec(trackData.track.source._codec);\n        // With PCM, every sample has the same size\n        return fullBox('stsz', 0, 0, [\n            u32(sampleSize * trackData.info.numberOfChannels), // Sample size\n            u32(trackData.samples.reduce((acc, x) => acc + intoTimescale(x.duration, trackData.timescale), 0)),\n        ]);\n    }\n    return fullBox('stsz', 0, 0, [\n        u32(0), // Sample size (0 means non-constant size)\n        u32(trackData.samples.length), // Number of entries\n        trackData.samples.map(x => u32(x.size)), // Sample size table\n    ]);\n};\n/** Chunk Offset Box: Identifies the location of each chunk of data in the media's data stream, relative to the file. */\nexport const stco = (trackData) => {\n    if (trackData.finalizedChunks.length > 0 && last(trackData.finalizedChunks).offset >= 2 ** 32) {\n        // If the file is large, use the co64 box\n        return fullBox('co64', 0, 0, [\n            u32(trackData.finalizedChunks.length), // Number of entries\n            trackData.finalizedChunks.map(x => u64(x.offset)), // Chunk offset table\n        ]);\n    }\n    return fullBox('stco', 0, 0, [\n        u32(trackData.finalizedChunks.length), // Number of entries\n        trackData.finalizedChunks.map(x => u32(x.offset)), // Chunk offset table\n    ]);\n};\n/**\n * Composition Time to Sample Box: Stores composition time offset information (PTS-DTS) for a\n * media's samples. The table is compact, meaning that consecutive samples with the same time\n * composition time offset will be grouped.\n */\nexport const ctts = (trackData) => {\n    return fullBox('ctts', 1, 0, [\n        u32(trackData.compositionTimeOffsetTable.length), // Number of entries\n        trackData.compositionTimeOffsetTable.map(x => [\n            u32(x.sampleCount), // Sample count\n            i32(x.sampleCompositionTimeOffset), // Sample offset\n        ]),\n    ]);\n};\n/**\n * Composition to Decode Box: Stores information about the composition and display times of the media samples.\n */\nexport const cslg = (trackData) => {\n    let leastDecodeToDisplayDelta = Infinity;\n    let greatestDecodeToDisplayDelta = -Infinity;\n    let compositionStartTime = Infinity;\n    let compositionEndTime = -Infinity;\n    assert(trackData.compositionTimeOffsetTable.length > 0);\n    assert(trackData.samples.length > 0);\n    for (let i = 0; i < trackData.compositionTimeOffsetTable.length; i++) {\n        const entry = trackData.compositionTimeOffsetTable[i];\n        leastDecodeToDisplayDelta = Math.min(leastDecodeToDisplayDelta, entry.sampleCompositionTimeOffset);\n        greatestDecodeToDisplayDelta = Math.max(greatestDecodeToDisplayDelta, entry.sampleCompositionTimeOffset);\n    }\n    for (let i = 0; i < trackData.samples.length; i++) {\n        const sample = trackData.samples[i];\n        compositionStartTime = Math.min(compositionStartTime, intoTimescale(sample.timestamp, trackData.timescale));\n        compositionEndTime = Math.max(compositionEndTime, intoTimescale(sample.timestamp + sample.duration, trackData.timescale));\n    }\n    const compositionToDtsShift = Math.max(-leastDecodeToDisplayDelta, 0);\n    if (compositionEndTime >= 2 ** 31) {\n        // For very large files, the composition end time can't be represented in i32, so let's just scrap the box in\n        // that case. QuickTime fails to read the file if there's a cslg box with version 1, so that's sadly not an\n        // option.\n        return null;\n    }\n    return fullBox('cslg', 0, 0, [\n        i32(compositionToDtsShift), // Composition to DTS shift\n        i32(leastDecodeToDisplayDelta), // Least decode to display delta\n        i32(greatestDecodeToDisplayDelta), // Greatest decode to display delta\n        i32(compositionStartTime), // Composition start time\n        i32(compositionEndTime), // Composition end time\n    ]);\n};\n/**\n * Movie Extends Box: This box signals to readers that the file is fragmented. Contains a single Track Extends Box\n * for each track in the movie.\n */\nexport const mvex = (trackDatas) => {\n    return box('mvex', undefined, trackDatas.map(trex));\n};\n/** Track Extends Box: Contains the default values used by the movie fragments. */\nexport const trex = (trackData) => {\n    return fullBox('trex', 0, 0, [\n        u32(trackData.track.id), // Track ID\n        u32(1), // Default sample description index\n        u32(0), // Default sample duration\n        u32(0), // Default sample size\n        u32(0), // Default sample flags\n    ]);\n};\n/**\n * Movie Fragment Box: The movie fragments extend the presentation in time. They provide the information that would\n * previously have been\tin the Movie Box.\n */\nexport const moof = (sequenceNumber, trackDatas) => {\n    return box('moof', undefined, [\n        mfhd(sequenceNumber),\n        ...trackDatas.map(traf),\n    ]);\n};\n/** Movie Fragment Header Box: Contains a sequence number as a safety check. */\nexport const mfhd = (sequenceNumber) => {\n    return fullBox('mfhd', 0, 0, [\n        u32(sequenceNumber), // Sequence number\n    ]);\n};\nconst fragmentSampleFlags = (sample) => {\n    let byte1 = 0;\n    let byte2 = 0;\n    const byte3 = 0;\n    const byte4 = 0;\n    const sampleIsDifferenceSample = sample.type === 'delta';\n    byte2 |= +sampleIsDifferenceSample;\n    if (sampleIsDifferenceSample) {\n        byte1 |= 1; // There is redundant coding in this sample\n    }\n    else {\n        byte1 |= 2; // There is no redundant coding in this sample\n    }\n    // Note that there are a lot of other flags to potentially set here, but most are irrelevant / non-necessary\n    return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\n/** Track Fragment Box */\nexport const traf = (trackData) => {\n    return box('traf', undefined, [\n        tfhd(trackData),\n        tfdt(trackData),\n        trun(trackData),\n    ]);\n};\n/** Track Fragment Header Box: Provides a reference to the extended track, and flags. */\nexport const tfhd = (trackData) => {\n    assert(trackData.currentChunk);\n    let tfFlags = 0;\n    tfFlags |= 0x00008; // Default sample duration present\n    tfFlags |= 0x00010; // Default sample size present\n    tfFlags |= 0x00020; // Default sample flags present\n    tfFlags |= 0x20000; // Default base is moof\n    // Prefer the second sample over the first one, as the first one is a sync sample and therefore the \"odd one out\"\n    const referenceSample = trackData.currentChunk.samples[1] ?? trackData.currentChunk.samples[0];\n    const referenceSampleInfo = {\n        duration: referenceSample.timescaleUnitsToNextSample,\n        size: referenceSample.size,\n        flags: fragmentSampleFlags(referenceSample),\n    };\n    return fullBox('tfhd', 0, tfFlags, [\n        u32(trackData.track.id), // Track ID\n        u32(referenceSampleInfo.duration), // Default sample duration\n        u32(referenceSampleInfo.size), // Default sample size\n        u32(referenceSampleInfo.flags), // Default sample flags\n    ]);\n};\n/**\n * Track Fragment Decode Time Box: Provides the absolute decode time of the first sample of the fragment. This is\n * useful for performing random access on the media file.\n */\nexport const tfdt = (trackData) => {\n    assert(trackData.currentChunk);\n    return fullBox('tfdt', 1, 0, [\n        u64(intoTimescale(trackData.currentChunk.startTimestamp, trackData.timescale)), // Base Media Decode Time\n    ]);\n};\n/** Track Run Box: Specifies a run of contiguous samples for a given track. */\nexport const trun = (trackData) => {\n    assert(trackData.currentChunk);\n    const allSampleDurations = trackData.currentChunk.samples.map(x => x.timescaleUnitsToNextSample);\n    const allSampleSizes = trackData.currentChunk.samples.map(x => x.size);\n    const allSampleFlags = trackData.currentChunk.samples.map(fragmentSampleFlags);\n    const allSampleCompositionTimeOffsets = trackData.currentChunk.samples\n        .map(x => intoTimescale(x.timestamp - x.decodeTimestamp, trackData.timescale));\n    const uniqueSampleDurations = new Set(allSampleDurations);\n    const uniqueSampleSizes = new Set(allSampleSizes);\n    const uniqueSampleFlags = new Set(allSampleFlags);\n    const uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n    const firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n    const sampleDurationPresent = uniqueSampleDurations.size > 1;\n    const sampleSizePresent = uniqueSampleSizes.size > 1;\n    const sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n    const sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some(x => x !== 0);\n    let flags = 0;\n    flags |= 0x0001; // Data offset present\n    flags |= 0x0004 * +firstSampleFlagsPresent; // First sample flags present\n    flags |= 0x0100 * +sampleDurationPresent; // Sample duration present\n    flags |= 0x0200 * +sampleSizePresent; // Sample size present\n    flags |= 0x0400 * +sampleFlagsPresent; // Sample flags present\n    flags |= 0x0800 * +sampleCompositionTimeOffsetsPresent; // Sample composition time offsets present\n    return fullBox('trun', 1, flags, [\n        u32(trackData.currentChunk.samples.length), // Sample count\n        u32(trackData.currentChunk.offset - trackData.currentChunk.moofOffset || 0), // Data offset\n        firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n        trackData.currentChunk.samples.map((_, i) => [\n            sampleDurationPresent ? u32(allSampleDurations[i]) : [], // Sample duration\n            sampleSizePresent ? u32(allSampleSizes[i]) : [], // Sample size\n            sampleFlagsPresent ? u32(allSampleFlags[i]) : [], // Sample flags\n            // Sample composition time offsets\n            sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : [],\n        ]),\n    ]);\n};\n/**\n * Movie Fragment Random Access Box: For each track, provides pointers to sync samples within the file\n * for random access.\n */\nexport const mfra = (trackDatas) => {\n    return box('mfra', undefined, [\n        ...trackDatas.map(tfra),\n        mfro(),\n    ]);\n};\n/** Track Fragment Random Access Box: Provides pointers to sync samples within the file for random access. */\nexport const tfra = (trackData, trackIndex) => {\n    const version = 1; // Using this version allows us to use 64-bit time and offset values\n    return fullBox('tfra', version, 0, [\n        u32(trackData.track.id), // Track ID\n        u32(0b111111), // This specifies that traf number, trun number and sample number are 32-bit ints\n        u32(trackData.finalizedChunks.length), // Number of entries\n        trackData.finalizedChunks.map(chunk => [\n            u64(intoTimescale(chunk.samples[0].timestamp, trackData.timescale)), // Time (in presentation time)\n            u64(chunk.moofOffset), // moof offset\n            u32(trackIndex + 1), // traf number\n            u32(1), // trun number\n            u32(1), // Sample number\n        ]),\n    ]);\n};\n/**\n * Movie Fragment Random Access Offset Box: Provides the size of the enclosing mfra box. This box can be used by readers\n * to quickly locate the mfra box by searching from the end of the file.\n */\nexport const mfro = () => {\n    return fullBox('mfro', 0, 0, [\n        // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n        // is known\n        u32(0), // Size\n    ]);\n};\n/** VTT Empty Cue Box */\nexport const vtte = () => box('vtte');\n/** VTT Cue Box */\nexport const vttc = (payload, timestamp, identifier, settings, sourceId) => box('vttc', undefined, [\n    sourceId !== null ? box('vsid', [i32(sourceId)]) : null,\n    identifier !== null ? box('iden', [...textEncoder.encode(identifier)]) : null,\n    timestamp !== null ? box('ctim', [...textEncoder.encode(formatSubtitleTimestamp(timestamp))]) : null,\n    settings !== null ? box('sttg', [...textEncoder.encode(settings)]) : null,\n    box('payl', [...textEncoder.encode(payload)]),\n]);\n/** VTT Additional Text Box */\nexport const vtta = (notes) => box('vtta', [...textEncoder.encode(notes)]);\n/** User Data Box */\nconst udta = (muxer) => {\n    const boxes = [];\n    const metadataFormat = muxer.format._options.metadataFormat ?? 'auto';\n    const metadataTags = muxer.output._metadataTags;\n    // Depending on the format, metadata tags are written differently\n    if (metadataFormat === 'mdir' || (metadataFormat === 'auto' && !muxer.isQuickTime)) {\n        const metaBox = metaMdir(metadataTags);\n        if (metaBox)\n            boxes.push(metaBox);\n    }\n    else if (metadataFormat === 'mdta') {\n        const metaBox = metaMdta(metadataTags);\n        if (metaBox)\n            boxes.push(metaBox);\n    }\n    else if (metadataFormat === 'udta' || (metadataFormat === 'auto' && muxer.isQuickTime)) {\n        addQuickTimeMetadataTagBoxes(boxes, muxer.output._metadataTags);\n    }\n    if (boxes.length === 0) {\n        return null;\n    }\n    return box('udta', undefined, boxes);\n};\nconst addQuickTimeMetadataTagBoxes = (boxes, tags) => {\n    // https://exiftool.org/TagNames/QuickTime.html (QuickTime UserData Tags)\n    // For QuickTime files, metadata tags are dumped into the udta box\n    for (const { key, value } of keyValueIterator(tags)) {\n        switch (key) {\n            case 'title':\n                {\n                    boxes.push(metadataTagStringBoxShort('©nam', value));\n                }\n                ;\n                break;\n            case 'description':\n                {\n                    boxes.push(metadataTagStringBoxShort('©des', value));\n                }\n                ;\n                break;\n            case 'artist':\n                {\n                    boxes.push(metadataTagStringBoxShort('©ART', value));\n                }\n                ;\n                break;\n            case 'album':\n                {\n                    boxes.push(metadataTagStringBoxShort('©alb', value));\n                }\n                ;\n                break;\n            case 'albumArtist':\n                {\n                    boxes.push(metadataTagStringBoxShort('albr', value));\n                }\n                ;\n                break;\n            case 'genre':\n                {\n                    boxes.push(metadataTagStringBoxShort('©gen', value));\n                }\n                ;\n                break;\n            case 'date':\n                {\n                    boxes.push(metadataTagStringBoxShort('©day', value.toISOString().slice(0, 10)));\n                }\n                ;\n                break;\n            case 'comment':\n                {\n                    boxes.push(metadataTagStringBoxShort('©cmt', value));\n                }\n                ;\n                break;\n            case 'lyrics':\n                {\n                    boxes.push(metadataTagStringBoxShort('©lyr', value));\n                }\n                ;\n                break;\n            case 'raw':\n                {\n                    // Handled later\n                }\n                ;\n                break;\n            case 'discNumber':\n            case 'discsTotal':\n            case 'trackNumber':\n            case 'tracksTotal':\n            case 'images':\n                {\n                    // Not written for QuickTime (common Apple L)\n                }\n                ;\n                break;\n            default: assertNever(key);\n        }\n    }\n    if (tags.raw) {\n        for (const key in tags.raw) {\n            const value = tags.raw[key];\n            if (value == null || key.length !== 4 || boxes.some(x => x.type === key)) {\n                continue;\n            }\n            if (typeof value === 'string') {\n                boxes.push(metadataTagStringBoxShort(key, value));\n            }\n            else if (value instanceof Uint8Array) {\n                boxes.push(box(key, Array.from(value)));\n            }\n        }\n    }\n};\nconst metadataTagStringBoxShort = (name, value) => {\n    const encoded = textEncoder.encode(value);\n    return box(name, [\n        u16(encoded.length),\n        u16(getLanguageCodeInt('und')),\n        Array.from(encoded),\n    ]);\n};\nconst DATA_BOX_MIME_TYPE_MAP = {\n    'image/jpeg': 13,\n    'image/png': 14,\n    'image/bmp': 27,\n};\n/**\n * Generates key-value metadata for inclusion in the \"meta\" box.\n */\nconst generateMetadataPairs = (tags, isMdta) => {\n    const pairs = [];\n    // https://exiftool.org/TagNames/QuickTime.html (QuickTime ItemList Tags)\n    // This is the metadata format used for MP4 files\n    for (const { key, value } of keyValueIterator(tags)) {\n        switch (key) {\n            case 'title':\n                {\n                    pairs.push({ key: isMdta ? 'title' : '©nam', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'description':\n                {\n                    pairs.push({ key: isMdta ? 'description' : '©des', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'artist':\n                {\n                    pairs.push({ key: isMdta ? 'artist' : '©ART', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'album':\n                {\n                    pairs.push({ key: isMdta ? 'album' : '©alb', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'albumArtist':\n                {\n                    pairs.push({ key: isMdta ? 'album_artist' : 'aART', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'comment':\n                {\n                    pairs.push({ key: isMdta ? 'comment' : '©cmt', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'genre':\n                {\n                    pairs.push({ key: isMdta ? 'genre' : '©gen', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'lyrics':\n                {\n                    pairs.push({ key: isMdta ? 'lyrics' : '©lyr', value: dataStringBoxLong(value) });\n                }\n                ;\n                break;\n            case 'date':\n                {\n                    pairs.push({\n                        key: isMdta ? 'date' : '©day',\n                        value: dataStringBoxLong(value.toISOString().slice(0, 10)),\n                    });\n                }\n                ;\n                break;\n            case 'images':\n                {\n                    for (const image of value) {\n                        if (image.kind !== 'coverFront') {\n                            continue;\n                        }\n                        pairs.push({ key: 'covr', value: box('data', [\n                                u32(DATA_BOX_MIME_TYPE_MAP[image.mimeType] ?? 0), // Type indicator\n                                u32(0), // Locale indicator\n                                Array.from(image.data), // Kinda slow, hopefully temp\n                            ]) });\n                    }\n                }\n                ;\n                break;\n            case 'trackNumber':\n                {\n                    if (isMdta) {\n                        const string = tags.tracksTotal !== undefined\n                            ? `${value}/${tags.tracksTotal}`\n                            : value.toString();\n                        pairs.push({ key: 'track', value: dataStringBoxLong(string) });\n                    }\n                    else {\n                        pairs.push({ key: 'trkn', value: box('data', [\n                                u32(0), // 8 bytes empty\n                                u32(0),\n                                u16(0), // Empty\n                                u16(value),\n                                u16(tags.tracksTotal ?? 0),\n                                u16(0), // Empty\n                            ]) });\n                    }\n                }\n                ;\n                break;\n            case 'discNumber':\n                {\n                    if (!isMdta) {\n                        // Only written for mdir\n                        pairs.push({ key: 'disc', value: box('data', [\n                                u32(0), // 8 bytes empty\n                                u32(0),\n                                u16(0), // Empty\n                                u16(value),\n                                u16(tags.discsTotal ?? 0),\n                                u16(0), // Empty\n                            ]) });\n                    }\n                }\n                ;\n                break;\n            case 'tracksTotal':\n            case 'discsTotal':\n                {\n                    // These are included with 'trackNumber' and 'discNumber' respectively\n                }\n                ;\n                break;\n            case 'raw':\n                {\n                    // Handled later\n                }\n                ;\n                break;\n            default: assertNever(key);\n        }\n    }\n    if (tags.raw) {\n        for (const key in tags.raw) {\n            const value = tags.raw[key];\n            if (value == null || (!isMdta && key.length !== 4) || pairs.some(x => x.key === key)) {\n                continue;\n            }\n            if (typeof value === 'string') {\n                pairs.push({ key, value: dataStringBoxLong(value) });\n            }\n            else if (value instanceof Uint8Array) {\n                pairs.push({ key, value: box('data', [\n                        u32(0), // Type indicator\n                        u32(0), // Locale indicator\n                        Array.from(value),\n                    ]) });\n            }\n            else if (value instanceof RichImageData) {\n                pairs.push({ key, value: box('data', [\n                        u32(DATA_BOX_MIME_TYPE_MAP[value.mimeType] ?? 0), // Type indicator\n                        u32(0), // Locale indicator\n                        Array.from(value.data), // Kinda slow, hopefully temp\n                    ]) });\n            }\n        }\n    }\n    return pairs;\n};\n/** Metadata Box (mdir format) */\nconst metaMdir = (tags) => {\n    const pairs = generateMetadataPairs(tags, false);\n    if (pairs.length === 0) {\n        return null;\n    }\n    // fullBox format\n    return fullBox('meta', 0, 0, undefined, [\n        hdlr(false, 'mdir', '', 'appl'), // mdir handler\n        box('ilst', undefined, pairs.map(pair => box(pair.key, undefined, [pair.value]))), // Item list without keys box\n    ]);\n};\n/** Metadata Box (mdta format with keys box) */\nconst metaMdta = (tags) => {\n    const pairs = generateMetadataPairs(tags, true);\n    if (pairs.length === 0) {\n        return null;\n    }\n    // box without version and flags\n    return box('meta', undefined, [\n        hdlr(false, 'mdta', ''), // mdta handler\n        fullBox('keys', 0, 0, [\n            u32(pairs.length),\n        ], pairs.map(pair => box('mdta', [\n            ...textEncoder.encode(pair.key),\n        ]))),\n        box('ilst', undefined, pairs.map((pair, i) => {\n            const boxName = String.fromCharCode(...u32(i + 1));\n            return box(boxName, undefined, [pair.value]);\n        })),\n    ]);\n};\nconst dataStringBoxLong = (value) => {\n    return box('data', [\n        u32(1), // Type indicator (UTF-8)\n        u32(0), // Locale indicator\n        ...textEncoder.encode(value),\n    ]);\n};\nconst videoCodecToBoxName = (codec, fullCodecString) => {\n    switch (codec) {\n        case 'avc': return fullCodecString.startsWith('avc3') ? 'avc3' : 'avc1';\n        case 'hevc': return 'hvc1';\n        case 'vp8': return 'vp08';\n        case 'vp9': return 'vp09';\n        case 'av1': return 'av01';\n    }\n};\nconst VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n    avc: avcC,\n    hevc: hvcC,\n    vp8: vpcC,\n    vp9: vpcC,\n    av1: av1C,\n};\nconst audioCodecToBoxName = (codec, isQuickTime) => {\n    switch (codec) {\n        case 'aac': return 'mp4a';\n        case 'mp3': return 'mp4a';\n        case 'opus': return 'Opus';\n        case 'vorbis': return 'mp4a';\n        case 'flac': return 'fLaC';\n        case 'ulaw': return 'ulaw';\n        case 'alaw': return 'alaw';\n        case 'pcm-u8': return 'raw ';\n        case 'pcm-s8': return 'sowt';\n        case 'ac3': return 'ac-3';\n        case 'eac3': return 'ec-3';\n    }\n    // Logic diverges here\n    if (isQuickTime) {\n        switch (codec) {\n            case 'pcm-s16': return 'sowt';\n            case 'pcm-s16be': return 'twos';\n            case 'pcm-s24': return 'in24';\n            case 'pcm-s24be': return 'in24';\n            case 'pcm-s32': return 'in32';\n            case 'pcm-s32be': return 'in32';\n            case 'pcm-f32': return 'fl32';\n            case 'pcm-f32be': return 'fl32';\n            case 'pcm-f64': return 'fl64';\n            case 'pcm-f64be': return 'fl64';\n        }\n    }\n    else {\n        switch (codec) {\n            case 'pcm-s16': return 'ipcm';\n            case 'pcm-s16be': return 'ipcm';\n            case 'pcm-s24': return 'ipcm';\n            case 'pcm-s24be': return 'ipcm';\n            case 'pcm-s32': return 'ipcm';\n            case 'pcm-s32be': return 'ipcm';\n            case 'pcm-f32': return 'fpcm';\n            case 'pcm-f32be': return 'fpcm';\n            case 'pcm-f64': return 'fpcm';\n            case 'pcm-f64be': return 'fpcm';\n        }\n    }\n};\nconst audioCodecToConfigurationBox = (codec, isQuickTime) => {\n    switch (codec) {\n        case 'aac': return esds;\n        case 'mp3': return esds;\n        case 'opus': return dOps;\n        case 'vorbis': return esds;\n        case 'flac': return dfLa;\n        case 'ac3': return dac3;\n        case 'eac3': return dec3;\n    }\n    // Logic diverges here\n    if (isQuickTime) {\n        switch (codec) {\n            case 'pcm-s24': return wave;\n            case 'pcm-s24be': return wave;\n            case 'pcm-s32': return wave;\n            case 'pcm-s32be': return wave;\n            case 'pcm-f32': return wave;\n            case 'pcm-f32be': return wave;\n            case 'pcm-f64': return wave;\n            case 'pcm-f64be': return wave;\n        }\n    }\n    else {\n        switch (codec) {\n            case 'pcm-s16': return pcmC;\n            case 'pcm-s16be': return pcmC;\n            case 'pcm-s24': return pcmC;\n            case 'pcm-s24be': return pcmC;\n            case 'pcm-s32': return pcmC;\n            case 'pcm-s32be': return pcmC;\n            case 'pcm-f32': return pcmC;\n            case 'pcm-f32be': return pcmC;\n            case 'pcm-f64': return pcmC;\n            case 'pcm-f64be': return pcmC;\n        }\n    }\n    return null;\n};\nconst SUBTITLE_CODEC_TO_BOX_NAME = {\n    webvtt: 'wvtt',\n};\nconst SUBTITLE_CODEC_TO_CONFIGURATION_BOX = {\n    webvtt: vttC,\n};\nconst getLanguageCodeInt = (code) => {\n    assert(code.length === 3);\n    ;\n    let language = 0;\n    for (let i = 0; i < 3; i++) {\n        language <<= 5;\n        language += code.charCodeAt(i) - 0x60;\n    }\n    return language;\n};\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert } from './misc.js';\nexport class Writer {\n    constructor(target, isMonotonic) {\n        this.finalized = false;\n        this.started = false;\n        this.pos = 0;\n        this.trackedWrites = null;\n        this.trackedStart = -1;\n        this.trackedEnd = -1;\n        if (target._writerAcquired) {\n            throw new Error('Can\\'t have multiple Writers for the same Target.');\n        }\n        this.target = target;\n        target._setMonotonicity(isMonotonic);\n        target._writerAcquired = true;\n    }\n    start() {\n        assert(!this.started);\n        this.target._start();\n        this.started = true;\n    }\n    /** Writes the given data to the target, at the current position. */\n    write(data) {\n        assert(this.started && !this.finalized);\n        this.maybeTrackWrites(data);\n        this.target._write(data, this.pos);\n        this.pos += data.byteLength;\n    }\n    /** Sets the current position for future writes to a new one. */\n    seek(newPos) {\n        this.pos = newPos;\n    }\n    /** Returns the current position. */\n    getPos() {\n        return this.pos;\n    }\n    /** Signals to the writer that it may be time to flush. */\n    async flush() {\n        assert(this.started && !this.finalized);\n        return this.target._flush();\n    }\n    /** Called after muxing has finished. */\n    async finalize() {\n        assert(this.started && !this.finalized);\n        await this.target._finalize();\n        this.finalized = true;\n    }\n    maybeTrackWrites(data) {\n        if (!this.trackedWrites) {\n            return;\n        }\n        // Handle negative relative write positions\n        let pos = this.getPos();\n        if (pos < this.trackedStart) {\n            if (pos + data.byteLength <= this.trackedStart) {\n                return;\n            }\n            data = data.subarray(this.trackedStart - pos);\n            pos = 0;\n        }\n        const neededSize = pos + data.byteLength - this.trackedStart;\n        let newLength = this.trackedWrites.byteLength;\n        while (newLength < neededSize) {\n            newLength *= 2;\n        }\n        // Check if we need to resize the buffer\n        if (newLength !== this.trackedWrites.byteLength) {\n            const copy = new Uint8Array(newLength);\n            copy.set(this.trackedWrites, 0);\n            this.trackedWrites = copy;\n        }\n        this.trackedWrites.set(data, pos - this.trackedStart);\n        this.trackedEnd = Math.max(this.trackedEnd, pos + data.byteLength);\n    }\n    startTrackingWrites() {\n        this.trackedWrites = new Uint8Array(2 ** 10);\n        this.trackedStart = this.getPos();\n        this.trackedEnd = this.trackedStart;\n    }\n    stopTrackingWrites() {\n        if (!this.trackedWrites) {\n            throw new Error('Internal error: Can\\'t get tracked writes since nothing was tracked.');\n        }\n        const slice = this.trackedWrites.subarray(0, this.trackedEnd - this.trackedStart);\n        const result = {\n            data: slice,\n            start: this.trackedStart,\n            end: this.trackedEnd,\n        };\n        this.trackedWrites = null;\n        return result;\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport * as nodeAlias from './node.js';\nimport { assert, EventEmitter } from './misc.js';\nconst node = typeof nodeAlias !== 'undefined'\n    ? nodeAlias // Aliasing it prevents some bundler warnings\n    : undefined;\n/**\n * Base class for targets, specifying where output files are written.\n * @group Output targets\n * @public\n */\nexport class Target extends EventEmitter {\n    constructor() {\n        super(...arguments);\n        /** @internal */\n        this._writerAcquired = false;\n        /** @internal */\n        this._monotonicity = null; // null = unknown\n        /**\n         * Called each time data is written to the target. Will be called with the byte range into which data was written.\n         *\n         * Use this callback to track the size of the output file as it grows. But be warned, this function is chatty and\n         * gets called *extremely* often.\n         *\n         * @deprecated Use `target.on('write', ({ start, end }) => ...)` instead.\n         */\n        this.onwrite = null;\n    }\n    /** @internal */\n    _setMonotonicity(monotonicity) {\n        if (this._monotonicity !== false) {\n            this._monotonicity = monotonicity;\n        }\n        else {\n            // Once false, it's locked\n        }\n    }\n    /** @internal */\n    _dispatchWrite(start, end) {\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        this.onwrite?.(start, end);\n        this._emit('write', { start, end });\n    }\n    /**\n     * Returns a new {@link RangedTarget} that writes data to this target using the given offset.\n     *\n     * Useful for writing a file into a section of a larger file.\n     */\n    slice(offset) {\n        if (!Number.isInteger(offset) || offset < 0) {\n            throw new TypeError('offset must be a non-negative integer.');\n        }\n        return new RangedTarget(this, offset);\n    }\n}\nconst ARRAY_BUFFER_INITIAL_SIZE = 2 ** 16;\nconst ARRAY_BUFFER_MAX_SIZE = 2 ** 32;\n/**\n * A target that writes data directly into an ArrayBuffer in memory. Great for performance, but not suitable for very\n * large files. The buffer will be available once the output has been finalized.\n * @group Output targets\n * @public\n */\nexport class BufferTarget extends Target {\n    /** Creates a new {@link BufferTarget}. The buffer holding the data will be created and managed internally. */\n    constructor(options = {}) {\n        super();\n        /** Stores the final output buffer. Until the output is finalized, this will be `null`. */\n        this.buffer = null;\n        /** @internal */\n        this._maxPos = 0;\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('BufferTarget options, when provided, must be an object.');\n        }\n        if (options.onFinalize !== undefined && typeof options.onFinalize !== 'function') {\n            throw new TypeError('options.onFinalize, when provided, must be a function.');\n        }\n        this._options = options;\n        this._supportsResize = 'resize' in new ArrayBuffer(0);\n        if (this._supportsResize) {\n            try {\n                // @ts-expect-error Don't want to bump \"lib\" in tsconfig\n                this._buffer = new ArrayBuffer(ARRAY_BUFFER_INITIAL_SIZE, { maxByteLength: ARRAY_BUFFER_MAX_SIZE });\n            }\n            catch {\n                this._buffer = new ArrayBuffer(ARRAY_BUFFER_INITIAL_SIZE);\n                this._supportsResize = false;\n            }\n        }\n        else {\n            this._buffer = new ArrayBuffer(ARRAY_BUFFER_INITIAL_SIZE);\n        }\n        this._bytes = new Uint8Array(this._buffer);\n    }\n    /** @internal */\n    _ensureSize(size) {\n        let newLength = this._buffer.byteLength;\n        while (newLength < size)\n            newLength *= 2;\n        if (newLength === this._buffer.byteLength)\n            return;\n        if (newLength > ARRAY_BUFFER_MAX_SIZE) {\n            throw new Error(`ArrayBuffer exceeded maximum size of ${ARRAY_BUFFER_MAX_SIZE} bytes. Please consider using another`\n                + ` target.`);\n        }\n        if (this._supportsResize) {\n            // Use resize if it exists\n            // @ts-expect-error Don't want to bump \"lib\" in tsconfig\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n            this._buffer.resize(newLength);\n            // The Uint8Array scales automatically\n        }\n        else {\n            const newBuffer = new ArrayBuffer(newLength);\n            const newBytes = new Uint8Array(newBuffer);\n            newBytes.set(this._bytes, 0);\n            this._buffer = newBuffer;\n            this._bytes = newBytes;\n        }\n    }\n    /** @internal */\n    _start() { }\n    /** @internal */\n    _write(data, pos) {\n        this._ensureSize(pos + data.byteLength);\n        this._bytes.set(data, pos);\n        this._maxPos = Math.max(this._maxPos, pos + data.byteLength);\n        this._dispatchWrite(pos, pos + data.byteLength);\n    }\n    /** @internal */\n    async _flush() { }\n    /** @internal */\n    async _finalize() {\n        this.buffer = this._buffer.slice(0, this._maxPos);\n        if (this._options.onFinalize) {\n            await this._options.onFinalize(this.buffer);\n        }\n        this._emit('finalized');\n    }\n    /** @internal */\n    async _close() { }\n    /** @internal */\n    _getSlice(start, end) {\n        return this._bytes.slice(start, end);\n    }\n}\nconst DEFAULT_CHUNK_SIZE = 2 ** 24;\nconst MAX_CHUNKS_AT_ONCE = 2;\n/**\n * This target writes data to a [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream),\n * making it a general-purpose target for writing data anywhere. It is also compatible with\n * [`FileSystemWritableFileStream`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemWritableFileStream) for\n * use with the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API). The\n * `WritableStream` can also apply backpressure, which will propagate to the output and throttle the encoders.\n * @group Output targets\n * @public\n */\nexport class StreamTarget extends Target {\n    /** Creates a new {@link StreamTarget} which writes to the specified `writable`. */\n    constructor(writable, options = {}) {\n        super();\n        /** @internal */\n        this._sections = [];\n        /** @internal */\n        this._lastWriteEnd = 0;\n        /** @internal */\n        this._lastFlushEnd = 0;\n        /** @internal */\n        this._streamWriter = null;\n        /** @internal */\n        this._writeError = null;\n        /**\n         * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n         * A chunk is flushed if all of its contents have been written.\n         */\n        /** @internal */\n        this._chunks = [];\n        if (!(writable instanceof WritableStream)) {\n            throw new TypeError('StreamTarget requires a WritableStream instance.');\n        }\n        if (options != null && typeof options !== 'object') {\n            throw new TypeError('StreamTarget options, when provided, must be an object.');\n        }\n        if (options.chunked !== undefined && typeof options.chunked !== 'boolean') {\n            throw new TypeError('options.chunked, when provided, must be a boolean.');\n        }\n        if (options.chunkSize !== undefined && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n            throw new TypeError('options.chunkSize, when provided, must be an integer and not smaller than 1024.');\n        }\n        this._writable = writable;\n        this._options = options;\n        this._chunked = options.chunked ?? false;\n        this._chunkSize = options.chunkSize ?? DEFAULT_CHUNK_SIZE;\n    }\n    /** @internal */\n    _start() {\n        this._streamWriter = this._writable.getWriter();\n    }\n    /** @internal */\n    _write(data, pos) {\n        if (pos > this._lastWriteEnd) {\n            const paddingBytesNeeded = pos - this._lastWriteEnd;\n            this._write(new Uint8Array(paddingBytesNeeded), this._lastWriteEnd);\n        }\n        this._sections.push({\n            data: data.slice(),\n            start: pos,\n        });\n        this._lastWriteEnd = Math.max(this._lastWriteEnd, pos + data.byteLength);\n        this._dispatchWrite(pos, pos + data.byteLength);\n    }\n    /** @internal */\n    async _flush() {\n        if (this._writeError !== null) {\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw this._writeError;\n        }\n        assert(this._streamWriter);\n        if (this._sections.length === 0) {\n            return;\n        }\n        const chunks = [];\n        const sorted = [...this._sections].sort((a, b) => a.start - b.start);\n        chunks.push({\n            start: sorted[0].start,\n            size: sorted[0].data.byteLength,\n        });\n        // Figure out how many contiguous chunks we have\n        for (let i = 1; i < sorted.length; i++) {\n            const lastChunk = chunks[chunks.length - 1];\n            const section = sorted[i];\n            if (section.start <= lastChunk.start + lastChunk.size) {\n                lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n            }\n            else {\n                chunks.push({\n                    start: section.start,\n                    size: section.data.byteLength,\n                });\n            }\n        }\n        for (const chunk of chunks) {\n            chunk.data = new Uint8Array(chunk.size);\n            // Make sure to write the data in the correct order for correct overwriting\n            for (const section of this._sections) {\n                // Check if the section is in the chunk\n                if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n                    chunk.data.set(section.data, section.start - chunk.start);\n                }\n            }\n            if (this._streamWriter.desiredSize !== null && this._streamWriter.desiredSize <= 0) {\n                await this._streamWriter.ready; // Allow the writer to apply backpressure\n            }\n            if (this._chunked) {\n                // Let's first gather the data into bigger chunks before writing it\n                this._writeDataIntoChunks(chunk.data, chunk.start);\n                this._tryToFlushChunks();\n            }\n            else {\n                if (this._monotonicity === true && chunk.start !== this._lastFlushEnd) {\n                    throw new Error('Internal error: Monotonicity violation.');\n                }\n                void this._streamWriter.write({\n                    type: 'write',\n                    data: chunk.data,\n                    position: chunk.start,\n                }).catch((error) => {\n                    this._writeError ??= error;\n                });\n                this._lastFlushEnd = chunk.start + chunk.data.byteLength;\n            }\n        }\n        this._sections.length = 0;\n    }\n    /** @internal */\n    _writeDataIntoChunks(data, position) {\n        // First, find the chunk to write the data into, or create one if none exists\n        let chunkIndex = this._chunks.findIndex(x => x.start <= position && position < x.start + this._chunkSize);\n        if (chunkIndex === -1)\n            chunkIndex = this._createChunk(position);\n        const chunk = this._chunks[chunkIndex];\n        // Figure out how much to write to the chunk, and then write to the chunk\n        const relativePosition = position - chunk.start;\n        const toWrite = data.subarray(0, Math.min(this._chunkSize - relativePosition, data.byteLength));\n        chunk.data.set(toWrite, relativePosition);\n        // Create a section describing the region of data that was just written to\n        const section = {\n            start: relativePosition,\n            end: relativePosition + toWrite.byteLength,\n        };\n        this._insertSectionIntoChunk(chunk, section);\n        // Queue chunk for flushing to target if it has been fully written to\n        if (chunk.written[0].start === 0 && chunk.written[0].end === this._chunkSize) {\n            chunk.shouldFlush = true;\n        }\n        // Make sure we don't hold too many chunks in memory at once to keep memory usage down\n        if (this._chunks.length > MAX_CHUNKS_AT_ONCE) {\n            // Flush all but the last chunk\n            for (let i = 0; i < this._chunks.length - 1; i++) {\n                this._chunks[i].shouldFlush = true;\n            }\n            this._tryToFlushChunks();\n        }\n        // If the data didn't fit in one chunk, recurse with the remaining data\n        if (toWrite.byteLength < data.byteLength) {\n            this._writeDataIntoChunks(data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n        }\n    }\n    /** @internal */\n    _insertSectionIntoChunk(chunk, section) {\n        let low = 0;\n        let high = chunk.written.length - 1;\n        let index = -1;\n        // Do a binary search to find the last section with a start not larger than `section`'s start\n        while (low <= high) {\n            const mid = Math.floor(low + (high - low + 1) / 2);\n            if (chunk.written[mid].start <= section.start) {\n                low = mid + 1;\n                index = mid;\n            }\n            else {\n                high = mid - 1;\n            }\n        }\n        // Insert the new section\n        chunk.written.splice(index + 1, 0, section);\n        if (index === -1 || chunk.written[index].end < section.start)\n            index++;\n        // Merge overlapping sections\n        while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n            chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n            chunk.written.splice(index + 1, 1);\n        }\n    }\n    /** @internal */\n    _createChunk(includesPosition) {\n        const start = Math.floor(includesPosition / this._chunkSize) * this._chunkSize;\n        const chunk = {\n            start,\n            data: new Uint8Array(this._chunkSize),\n            written: [],\n            shouldFlush: false,\n        };\n        this._chunks.push(chunk);\n        this._chunks.sort((a, b) => a.start - b.start);\n        return this._chunks.indexOf(chunk);\n    }\n    /** @internal */\n    _tryToFlushChunks(force = false) {\n        assert(this._streamWriter);\n        for (let i = 0; i < this._chunks.length; i++) {\n            const chunk = this._chunks[i];\n            if (!chunk.shouldFlush && !force)\n                continue;\n            for (const section of chunk.written) {\n                const position = chunk.start + section.start;\n                if (this._monotonicity === true && position !== this._lastFlushEnd) {\n                    throw new Error('Internal error: Monotonicity violation.');\n                }\n                void this._streamWriter.write({\n                    type: 'write',\n                    data: chunk.data.subarray(section.start, section.end),\n                    position,\n                }).catch((error) => {\n                    this._writeError ??= error;\n                });\n                this._lastFlushEnd = chunk.start + section.end;\n            }\n            this._chunks.splice(i--, 1);\n        }\n    }\n    /** @internal */\n    async _finalize() {\n        if (this._chunked) {\n            this._tryToFlushChunks(true);\n        }\n        if (this._writeError !== null) {\n            // eslint-disable-next-line @typescript-eslint/only-throw-error\n            throw this._writeError;\n        }\n        assert(this._streamWriter);\n        await this._streamWriter.ready;\n        await this._streamWriter.close();\n        this._emit('finalized');\n    }\n    /** @internal */\n    async _close() {\n        return this._streamWriter?.close();\n    }\n}\n/**\n * This target writes to a `WritableStream<Uint8Array>`, meaning all writes are necessarily append-only and involve no\n * seeking. Great for streaming data to a source that can only accept sequential data, like an HTTP server processing\n * an incoming upload.\n *\n * Note that using this target *requires* that the underlying format write data sequentially. Not all formats do this,\n * and this target will throw for the formats that don't. Check the guide for more.\n *\n * @group Output targets\n * @public\n */\nexport class AppendOnlyStreamTarget extends Target {\n    constructor(writable) {\n        super();\n        /** @internal */\n        this._writer = null;\n        /** @internal */\n        this._nextWritePos = 0;\n        this._writable = writable;\n        this._streamTarget = new StreamTarget(new WritableStream({\n            start: () => {\n                this._writer = this._writable.getWriter();\n            },\n            write: (chunk) => {\n                if (this._monotonicity !== true) {\n                    throw new Error('AppendOnlyStreamTarget requires that data be written monotonically (always appended to the'\n                        + ' end). You must use a format that guarantees this behavior.');\n                }\n                assert(chunk.position === this._nextWritePos);\n                this._nextWritePos += chunk.data.byteLength;\n                assert(this._writer);\n                return this._writer.write(chunk.data);\n            },\n            close: () => {\n                return this._writer?.close();\n            },\n        }));\n    }\n    /** @internal */\n    _start() {\n        this._streamTarget._start();\n    }\n    /** @internal */\n    _write(data, pos) {\n        this._streamTarget._write(data, pos);\n    }\n    /** @internal */\n    _flush() {\n        return this._streamTarget._flush();\n    }\n    /** @internal */\n    _finalize() {\n        return this._streamTarget._finalize();\n    }\n    /** @internal */\n    _close() {\n        return this._streamTarget._close();\n    }\n    /** @internal */\n    _setMonotonicity(monotonicity) {\n        super._setMonotonicity(monotonicity);\n        this._streamTarget._setMonotonicity(monotonicity);\n    }\n}\n/**\n * A target that writes to a file at the specified path. Intended for server-side usage in Node, Bun, or Deno.\n *\n * Writing is chunked by default. The internally held file handle will be closed when `.finalize()` or `.cancel()` are\n * called on the corresponding {@link Output}.\n * @group Output targets\n * @public\n */\nexport class FilePathTarget extends Target {\n    /** Creates a new {@link FilePathTarget} that writes to the file at the specified file path. */\n    constructor(filePath, options = {}) {\n        if (typeof filePath !== 'string') {\n            throw new TypeError('filePath must be a string.');\n        }\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (!node.fs) {\n            throw new Error('FilePathTarget is only available in server-side environments (Node.js, Bun, Deno).');\n        }\n        super();\n        /** @internal */\n        this._fileHandle = null;\n        // Let's back this target with a StreamTarget, makes the implementation very simple\n        const writable = new WritableStream({\n            start: async () => {\n                this._fileHandle = await node.fs.open(filePath, 'w');\n            },\n            write: async (chunk) => {\n                assert(this._fileHandle);\n                await this._fileHandle.write(chunk.data, 0, chunk.data.byteLength, chunk.position);\n            },\n            close: async () => {\n                if (this._fileHandle) {\n                    await this._fileHandle.close();\n                    this._fileHandle = null;\n                }\n            },\n        });\n        this._streamTarget = new StreamTarget(writable, {\n            chunked: true,\n            ...options,\n        });\n    }\n    /** @internal */\n    _start() {\n        this._streamTarget._start();\n    }\n    /** @internal */\n    _write(data, pos) {\n        this._streamTarget._write(data, pos);\n        this._dispatchWrite(pos, pos + data.byteLength);\n    }\n    /** @internal */\n    async _flush() {\n        return this._streamTarget._flush();\n    }\n    /** @internal */\n    async _finalize() {\n        await this._streamTarget._finalize();\n        this._emit('finalized');\n    }\n    /** @internal */\n    async _close() {\n        return this._streamTarget._close();\n    }\n    /** @internal */\n    _setMonotonicity(monotonicity) {\n        super._setMonotonicity(monotonicity);\n        this._streamTarget._setMonotonicity(monotonicity);\n    }\n}\n/**\n * This target just discards all incoming data. It is useful for when you need an {@link Output} but extract data from\n * it differently, for example through format-specific callbacks (`onMoof`, `onMdat`, ...) or encoder events.\n * @group Output targets\n * @public\n */\nexport class NullTarget extends Target {\n    /** @internal */\n    _start() { }\n    /** @internal */\n    _write(data, pos) {\n        this._dispatchWrite(pos, pos + data.byteLength);\n    }\n    /** @internal */\n    async _flush() { }\n    /** @internal */\n    async _finalize() {\n        this._emit('finalized');\n    }\n    /** @internal */\n    async _close() { }\n}\n/**\n * A target that writes to a subrange (defined by an offset) of another, underlying target. Useful for writing a file\n * into a section of a larger file.\n * @group Output targets\n * @public\n */\nexport class RangedTarget extends Target {\n    /** @internal */\n    constructor(baseTarget, offset) {\n        super();\n        this._baseTarget = baseTarget;\n        this._offset = offset;\n    }\n    /** @internal */\n    _start() { }\n    /** @internal */\n    _write(data, pos) {\n        this._baseTarget._write(data, this._offset + pos);\n        this._dispatchWrite(pos, pos + data.byteLength);\n    }\n    /** @internal */\n    _flush() {\n        return this._baseTarget._flush();\n    }\n    /** @internal */\n    async _finalize() {\n        this._emit('finalized');\n    }\n    /** @internal */\n    async _close() { }\n    /** @internal */\n    _setMonotonicity(monotonicity) {\n        super._setMonotonicity(monotonicity);\n        this._baseTarget._setMonotonicity(monotonicity);\n    }\n}\n/**\n * A special target for writing multi-file media where each file is uniquely identified by a path.\n * @group Output targets\n * @public\n */\nexport class PathedTarget {\n    /** Creates a new {@link PathedTarget} from a root path and a callback. */\n    constructor(\n    /** The path that points to the root file; the entry file of the media. */\n    rootPath, \n    /** The callback that is called for each file that needs to be written; must return a {@link Target}. */\n    getTarget) {\n        this.rootPath = rootPath;\n        this.getTarget = getTarget;\n        if (typeof rootPath !== 'string') {\n            throw new TypeError('rootPath must be a string.');\n        }\n        if (typeof getTarget !== 'function') {\n            throw new TypeError('getTarget must be a function.');\n        }\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { free, ftyp, IsobmffBoxWriter, mdat, mfra, moof, moov, sidx, styp, vtta, vttc, vtte, } from './isobmff-boxes.js';\nimport { Muxer } from '../muxer.js';\nimport { Writer } from '../writer.js';\nimport { BufferTarget } from '../target.js';\nimport { assert, computeRationalApproximation, last, promiseWithResolvers, simplifyRational } from '../misc.js';\nimport { MovOutputFormat, CmafOutputFormat } from '../output-format.js';\nimport { inlineTimestampRegex } from '../subtitles.js';\nimport { aacChannelMap, aacFrequencyTable, buildAacAudioSpecificConfig } from '../../shared/aac-misc.js';\nimport { parsePcmCodec, PCM_AUDIO_CODECS, validateAudioChunkMetadata, validateSubtitleMetadata, validateVideoChunkMetadata, } from '../codec.js';\nimport { MAX_ADTS_FRAME_HEADER_SIZE, MIN_ADTS_FRAME_HEADER_SIZE, readAdtsFrameHeader } from '../adts/adts-reader.js';\nimport { FileSlice } from '../reader.js';\nimport { concatNalUnitsInLengthPrefixed, extractAvcDecoderConfigurationRecord, extractHevcDecoderConfigurationRecord, iterateNalUnitsInAnnexB, serializeAvcDecoderConfigurationRecord, serializeHevcDecoderConfigurationRecord, } from '../codec-data.js';\nimport { buildIsobmffMimeType } from './isobmff-misc.js';\nimport { MAX_BOX_HEADER_SIZE, MIN_BOX_HEADER_SIZE } from './isobmff-reader.js';\nexport const GLOBAL_TIMESCALE = 57600; // LCM of a bunch of common frame rates (24, 25, 30, 60, 144, ...)\nconst TIMESTAMP_OFFSET = 2_082_844_800; // Seconds between Jan 1 1904 and Jan 1 1970\nexport const getTrackMetadata = (trackData) => {\n    const metadata = {};\n    const track = trackData.track;\n    if (track.metadata.name !== undefined) {\n        metadata.name = track.metadata.name;\n    }\n    return metadata;\n};\nexport const intoTimescale = (timeInSeconds, timescale, round = true) => {\n    const value = timeInSeconds * timescale;\n    return round ? Math.round(value) : value;\n};\nexport class IsobmffMuxer extends Muxer {\n    constructor(output, format) {\n        super(output);\n        this.writer = null;\n        this.boxWriter = null;\n        this.initWriter = null;\n        this.initBoxWriter = null;\n        this.auxTarget = new BufferTarget();\n        this.auxWriter = new Writer(this.auxTarget, false);\n        this.auxBoxWriter = new IsobmffBoxWriter(this.auxWriter);\n        this.mdat = null;\n        this.ftypSize = null;\n        this.trackDatas = [];\n        this.allTracksKnown = promiseWithResolvers();\n        this.creationTime = Math.floor(Date.now() / 1000) + TIMESTAMP_OFFSET;\n        this.finalizedChunks = [];\n        this.nextFragmentNumber = 1;\n        // Only relevant for fragmented files, to make sure new fragments start with the highest timestamp seen so far\n        this.maxWrittenTimestamp = -Infinity;\n        this.minWrittenTimestamp = Infinity;\n        this.maxWrittenEndTimestamp = -Infinity;\n        this.segmentHeaderSize = null;\n        this.format = format;\n        this.isQuickTime = format instanceof MovOutputFormat;\n        this.isCmaf = format instanceof CmafOutputFormat;\n        this.minimumFragmentDuration = format._options.minimumFragmentDuration\n            ?? (format instanceof CmafOutputFormat ? Infinity : 1);\n    }\n    async start() {\n        const release = await this.mutex.acquire();\n        if (!this.isCmaf) {\n            this.writer = await this.output._getRootWriter(target => (this.format._options.fastStart !== undefined\n                ? this.format._options.fastStart === 'fragmented'\n                : target instanceof BufferTarget // Since if this is the case we'll use 'in-memory'\n            ));\n            this.boxWriter = new IsobmffBoxWriter(this.writer);\n            // If the fastStart option isn't defined, enable in-memory fast start if the target is an ArrayBuffer, as\n            // the memory usage remains identical\n            this.fastStart = this.format._options.fastStart\n                ?? (this.writer.target instanceof BufferTarget ? 'in-memory' : false);\n            this.isFragmented = this.fastStart === 'fragmented';\n        }\n        else {\n            this.fastStart = 'fragmented';\n            this.isFragmented = true;\n        }\n        if (this.isCmaf) {\n            if (!this.output._hasInitTarget()) {\n                throw new Error(`CMAF outputs require the initTarget field in OutputOptions to be set; the init segment`\n                    + ` will be written to it.`);\n            }\n            // Set up the init writer to which we'll write the init segment\n            const initTarget = await this.output._getInitTarget();\n            const initWriter = new Writer(initTarget, true);\n            initWriter.start();\n            this.initWriter = initWriter;\n            this.initBoxWriter = new IsobmffBoxWriter(initWriter);\n        }\n        const holdsAvc = this.output._tracks.some(x => x.isVideoTrack() && x.source._codec === 'avc');\n        // Write the header\n        {\n            const boxWriter = this.initBoxWriter ?? this.boxWriter;\n            assert(boxWriter);\n            if (this.format._options.onFtyp) {\n                boxWriter.writer.startTrackingWrites();\n            }\n            boxWriter.writeBox(ftyp({\n                isQuickTime: this.isQuickTime,\n                holdsAvc: holdsAvc,\n                fragmented: this.isFragmented,\n                cmaf: this.isCmaf,\n            }));\n            if (this.format._options.onFtyp) {\n                const { data, start } = boxWriter.writer.stopTrackingWrites();\n                this.format._options.onFtyp(data, start);\n            }\n            this.ftypSize = boxWriter.writer.getPos();\n            if (this.isCmaf) {\n                await this.initWriter.flush();\n            }\n        }\n        if (this.fastStart === 'in-memory') {\n            // We're write at finalization\n        }\n        else if (this.fastStart === 'reserve') {\n            // Validate that all tracks have set maximumPacketCount\n            for (const track of this.output._tracks) {\n                if (track.metadata.maximumPacketCount === undefined) {\n                    throw new Error('All tracks must specify maximumPacketCount in their metadata when using'\n                        + ' fastStart: \\'reserve\\'.');\n                }\n            }\n            // We'll start writing once we know all tracks\n        }\n        else if (this.isFragmented) {\n            // We write the moov box once we write out the first fragment to make sure we get the decoder configs\n        }\n        else {\n            assert(this.writer);\n            assert(this.boxWriter);\n            if (this.format._options.onMdat) {\n                this.writer.startTrackingWrites();\n            }\n            this.mdat = mdat(true); // Reserve large size by default, can refine this when finalizing.\n            this.boxWriter.writeBox(this.mdat);\n        }\n        await this.writer?.flush();\n        release();\n    }\n    allTracksAreKnown() {\n        for (const track of this.output._tracks) {\n            if (!track.source._closed && !this.trackDatas.some(x => x.track === track)) {\n                return false; // We haven't seen a sample from this open track yet\n            }\n        }\n        return true;\n    }\n    async getMimeType() {\n        await this.allTracksKnown.promise;\n        const codecStrings = this.trackDatas.map((trackData) => {\n            if (trackData.type === 'video') {\n                return trackData.info.decoderConfig.codec;\n            }\n            else if (trackData.type === 'audio') {\n                return trackData.info.decoderConfig.codec;\n            }\n            else {\n                const map = {\n                    webvtt: 'wvtt',\n                };\n                return map[trackData.track.source._codec];\n            }\n        });\n        return buildIsobmffMimeType({\n            isQuickTime: this.isQuickTime,\n            hasVideo: this.trackDatas.some(x => x.type === 'video'),\n            hasAudio: this.trackDatas.some(x => x.type === 'audio'),\n            codecStrings,\n        });\n    }\n    getVideoTrackData(track, packet, meta) {\n        const existingTrackData = this.trackDatas.find(x => x.track === track);\n        if (existingTrackData) {\n            return existingTrackData;\n        }\n        validateVideoChunkMetadata(meta);\n        assert(meta);\n        assert(meta.decoderConfig);\n        const decoderConfig = { ...meta.decoderConfig };\n        assert(decoderConfig.codedWidth !== undefined);\n        assert(decoderConfig.codedHeight !== undefined);\n        let requiresAnnexBTransformation = false;\n        if (track.source._codec === 'avc' && !decoderConfig.description) {\n            // ISOBMFF can only hold AVC in the AVCC format, not in Annex B, but the missing description indicates\n            // Annex B. This means we'll need to do some converterino.\n            const decoderConfigurationRecord = extractAvcDecoderConfigurationRecord(packet.data);\n            if (!decoderConfigurationRecord) {\n                throw new Error('Couldn\\'t extract an AVCDecoderConfigurationRecord from the AVC packet. Make sure the packets are'\n                    + ' in Annex B format (as specified in ITU-T-REC-H.264) when not providing a description, or'\n                    + ' provide a description (must be an AVCDecoderConfigurationRecord as specified in ISO 14496-15)'\n                    + ' and ensure the packets are in AVCC format.');\n            }\n            decoderConfig.description = serializeAvcDecoderConfigurationRecord(decoderConfigurationRecord);\n            requiresAnnexBTransformation = true;\n        }\n        else if (track.source._codec === 'hevc' && !decoderConfig.description) {\n            // ISOBMFF can only hold HEVC in the HEVC format, not in Annex B, but the missing description indicates\n            // Annex B. This means we'll need to do some converterino.\n            const decoderConfigurationRecord = extractHevcDecoderConfigurationRecord(packet.data);\n            if (!decoderConfigurationRecord) {\n                throw new Error('Couldn\\'t extract an HEVCDecoderConfigurationRecord from the HEVC packet. Make sure the packets'\n                    + ' are in Annex B format (as specified in ITU-T-REC-H.265) when not providing a description, or'\n                    + ' provide a description (must be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15)'\n                    + ' and ensure the packets are in HEVC format.');\n            }\n            decoderConfig.description = serializeHevcDecoderConfigurationRecord(decoderConfigurationRecord);\n            requiresAnnexBTransformation = true;\n        }\n        // The frame rate set by the user may not be an integer. Since timescale is an integer, we'll approximate the\n        // frame time (inverse of frame rate) with a rational number, then use that approximation's denominator\n        // as the timescale.\n        const timescale = computeRationalApproximation(1 / (track.metadata.frameRate ?? GLOBAL_TIMESCALE), 1e6).den;\n        const displayAspectWidth = decoderConfig.displayAspectWidth;\n        const displayAspectHeight = decoderConfig.displayAspectHeight;\n        const pixelAspectRatio = displayAspectWidth === undefined || displayAspectHeight === undefined\n            ? { num: 1, den: 1 }\n            : simplifyRational({\n                num: displayAspectWidth * decoderConfig.codedHeight,\n                den: displayAspectHeight * decoderConfig.codedWidth,\n            });\n        const newTrackData = {\n            muxer: this,\n            track,\n            type: 'video',\n            info: {\n                width: decoderConfig.codedWidth,\n                height: decoderConfig.codedHeight,\n                pixelAspectRatio,\n                decoderConfig: decoderConfig,\n                requiresAnnexBTransformation,\n            },\n            timescale,\n            samples: [],\n            sampleQueue: [],\n            timestampProcessingQueue: [],\n            timeToSampleTable: [],\n            compositionTimeOffsetTable: [],\n            lastTimescaleUnits: null,\n            lastSample: null,\n            startTimestampOffset: null,\n            finalizedChunks: [],\n            currentChunk: null,\n            compactlyCodedChunkTable: [],\n            closed: false,\n        };\n        this.trackDatas.push(newTrackData);\n        this.trackDatas.sort((a, b) => a.track.id - b.track.id);\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        return newTrackData;\n    }\n    getAudioTrackData(track, packet, meta) {\n        const existingTrackData = this.trackDatas.find(x => x.track === track);\n        if (existingTrackData) {\n            return existingTrackData;\n        }\n        validateAudioChunkMetadata(meta);\n        assert(meta);\n        assert(meta.decoderConfig);\n        const decoderConfig = { ...meta.decoderConfig };\n        let requiresAdtsStripping = false;\n        if (track.source._codec === 'aac' && !decoderConfig.description) {\n            // ISOBMFF can only hold AAC in raw format, not ADTS, but the missing description indicates ADTS.\n            // Parse the first packet to extract the AudioSpecificConfig.\n            const adtsFrame = readAdtsFrameHeader(FileSlice.tempFromBytes(packet.data));\n            if (!adtsFrame) {\n                throw new Error('Couldn\\'t parse ADTS header from the AAC packet. Make sure the packets are in ADTS format'\n                    + ' (as specified in ISO 13818-7) when not providing a description, or provide a description'\n                    + ' (must be an AudioSpecificConfig as specified in ISO 14496-3) and ensure the packets'\n                    + ' are raw AAC data.');\n            }\n            const sampleRate = aacFrequencyTable[adtsFrame.samplingFrequencyIndex];\n            const numberOfChannels = aacChannelMap[adtsFrame.channelConfiguration];\n            if (sampleRate === undefined || numberOfChannels === undefined) {\n                throw new Error('Invalid ADTS frame header.');\n            }\n            decoderConfig.description = buildAacAudioSpecificConfig({\n                objectType: adtsFrame.objectType,\n                sampleRate,\n                numberOfChannels,\n            });\n            requiresAdtsStripping = true;\n        }\n        const newTrackData = {\n            muxer: this,\n            track,\n            type: 'audio',\n            info: {\n                numberOfChannels: meta.decoderConfig.numberOfChannels,\n                sampleRate: meta.decoderConfig.sampleRate,\n                decoderConfig,\n                requiresPcmTransformation: !this.isFragmented\n                    && PCM_AUDIO_CODECS.includes(track.source._codec),\n                expectedNextPcmPacketTimestamp: null,\n                requiresAdtsStripping,\n                firstPacket: packet,\n            },\n            timescale: decoderConfig.sampleRate,\n            samples: [],\n            sampleQueue: [],\n            timestampProcessingQueue: [],\n            timeToSampleTable: [],\n            compositionTimeOffsetTable: [],\n            lastTimescaleUnits: null,\n            lastSample: null,\n            startTimestampOffset: null,\n            finalizedChunks: [],\n            currentChunk: null,\n            compactlyCodedChunkTable: [],\n            closed: false,\n        };\n        this.trackDatas.push(newTrackData);\n        this.trackDatas.sort((a, b) => a.track.id - b.track.id);\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        return newTrackData;\n    }\n    getSubtitleTrackData(track, meta) {\n        const existingTrackData = this.trackDatas.find(x => x.track === track);\n        if (existingTrackData) {\n            return existingTrackData;\n        }\n        validateSubtitleMetadata(meta);\n        assert(meta);\n        assert(meta.config);\n        const newTrackData = {\n            muxer: this,\n            track,\n            type: 'subtitle',\n            info: {\n                config: meta.config,\n            },\n            timescale: 1000, // Reasonable\n            samples: [],\n            sampleQueue: [],\n            timestampProcessingQueue: [],\n            timeToSampleTable: [],\n            compositionTimeOffsetTable: [],\n            lastTimescaleUnits: null,\n            lastSample: null,\n            startTimestampOffset: null,\n            finalizedChunks: [],\n            currentChunk: null,\n            compactlyCodedChunkTable: [],\n            closed: false,\n            lastCueEndTimestamp: 0,\n            cueQueue: [],\n            nextSourceId: 0,\n            cueToSourceId: new WeakMap(),\n        };\n        this.trackDatas.push(newTrackData);\n        this.trackDatas.sort((a, b) => a.track.id - b.track.id);\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        return newTrackData;\n    }\n    async addEncodedVideoPacket(track, packet, meta) {\n        const release = await this.mutex.acquire();\n        try {\n            const trackData = this.getVideoTrackData(track, packet, meta);\n            let packetData = packet.data;\n            if (trackData.info.requiresAnnexBTransformation) {\n                const nalUnits = [...iterateNalUnitsInAnnexB(packetData)]\n                    .map(loc => packetData.subarray(loc.offset, loc.offset + loc.length));\n                if (nalUnits.length === 0) {\n                    // It's not valid Annex B data\n                    throw new Error('Failed to transform packet data. Make sure all packets are provided in Annex B format, as'\n                        + ' specified in ITU-T-REC-H.264 and ITU-T-REC-H.265.');\n                }\n                // We don't strip things like SPS or PPS NALUs here, mainly because they can also appear in the middle\n                // of a stream and potentially modify the parameters of it. So, let's just leave them in to be sure.\n                packetData = concatNalUnitsInLengthPrefixed(nalUnits, 4);\n            }\n            this.validateTimestamp(trackData.track, packet.timestamp, packet.type === 'key');\n            const internalSample = this.createSampleForTrack(trackData, packetData, packet.timestamp, packet.duration, packet.type);\n            await this.registerSample(trackData, internalSample);\n        }\n        finally {\n            release();\n        }\n    }\n    async addEncodedAudioPacket(track, packet, meta) {\n        const release = await this.mutex.acquire();\n        try {\n            const trackData = this.getAudioTrackData(track, packet, meta);\n            let packetData = packet.data;\n            if (trackData.info.requiresAdtsStripping) {\n                const adtsFrame = readAdtsFrameHeader(FileSlice.tempFromBytes(packetData));\n                if (!adtsFrame) {\n                    throw new Error('Expected ADTS frame, didn\\'t get one.');\n                }\n                const headerLength = adtsFrame.crcCheck === null\n                    ? MIN_ADTS_FRAME_HEADER_SIZE\n                    : MAX_ADTS_FRAME_HEADER_SIZE;\n                packetData = packetData.subarray(headerLength);\n            }\n            this.validateTimestamp(trackData.track, packet.timestamp, packet.type === 'key');\n            let timestamp = packet.timestamp;\n            let duration = packet.duration;\n            if (trackData.info.requiresPcmTransformation) {\n                // Packets may have only approximate timestamp/duration information, but for our PCM logic, we need it\n                // to be precise. So here, we refine the values.\n                const pcmInfo = parsePcmCodec(trackData.info.decoderConfig.codec);\n                const frameSize = pcmInfo.sampleSize * trackData.info.numberOfChannels;\n                // Compute the precise duration\n                duration = packetData.byteLength / frameSize / trackData.info.sampleRate;\n                if (trackData.info.expectedNextPcmPacketTimestamp !== null) {\n                    const diff = timestamp - trackData.info.expectedNextPcmPacketTimestamp;\n                    if (diff < 0.01) {\n                        timestamp = trackData.info.expectedNextPcmPacketTimestamp;\n                    }\n                    else {\n                        const paddedDuration = await this.padWithSilence(trackData, trackData.info.expectedNextPcmPacketTimestamp, diff);\n                        timestamp = trackData.info.expectedNextPcmPacketTimestamp + paddedDuration;\n                    }\n                }\n                trackData.info.expectedNextPcmPacketTimestamp = timestamp + duration;\n            }\n            const internalSample = this.createSampleForTrack(trackData, packetData, timestamp, duration, packet.type);\n            await this.registerSample(trackData, internalSample);\n        }\n        finally {\n            release();\n        }\n    }\n    async padWithSilence(trackData, timestamp, duration) {\n        const deltaInTimescale = intoTimescale(duration, trackData.timescale);\n        duration = deltaInTimescale / trackData.timescale;\n        if (deltaInTimescale > 0) {\n            const { sampleSize, silentValue } = parsePcmCodec(trackData.info.decoderConfig.codec);\n            const samplesNeeded = deltaInTimescale * trackData.info.numberOfChannels;\n            const data = new Uint8Array(sampleSize * samplesNeeded).fill(silentValue);\n            const paddingSample = this.createSampleForTrack(trackData, new Uint8Array(data.buffer), timestamp, duration, 'key');\n            await this.registerSample(trackData, paddingSample);\n        }\n        return duration;\n    }\n    async addSubtitleCue(track, cue, meta) {\n        const release = await this.mutex.acquire();\n        try {\n            const trackData = this.getSubtitleTrackData(track, meta);\n            this.validateTimestamp(trackData.track, cue.timestamp, true);\n            if (track.source._codec === 'webvtt') {\n                trackData.cueQueue.push(cue);\n                await this.processWebVTTCues(trackData, cue.timestamp);\n            }\n            else {\n                // TODO\n            }\n        }\n        finally {\n            release();\n        }\n    }\n    async processWebVTTCues(trackData, until) {\n        // WebVTT cues need to undergo special processing as empty sections need to be padded out with samples, and\n        // overlapping samples require special logic. The algorithm produces the format specified in ISO 14496-30.\n        while (trackData.cueQueue.length > 0) {\n            const timestamps = new Set([]);\n            for (const cue of trackData.cueQueue) {\n                assert(cue.timestamp <= until);\n                assert(trackData.lastCueEndTimestamp <= cue.timestamp + cue.duration);\n                timestamps.add(Math.max(cue.timestamp, trackData.lastCueEndTimestamp)); // Start timestamp\n                timestamps.add(cue.timestamp + cue.duration); // End timestamp\n            }\n            const sortedTimestamps = [...timestamps].sort((a, b) => a - b);\n            // These are the timestamps of the next sample we'll create:\n            const sampleStart = sortedTimestamps[0];\n            const sampleEnd = sortedTimestamps[1] ?? sampleStart;\n            if (until < sampleEnd) {\n                break;\n            }\n            // We may need to pad out empty space with an vtte box\n            if (trackData.lastCueEndTimestamp < sampleStart) {\n                this.auxWriter.seek(0);\n                const box = vtte();\n                this.auxBoxWriter.writeBox(box);\n                const body = this.auxTarget._getSlice(0, this.auxWriter.getPos());\n                const sample = this.createSampleForTrack(trackData, body, trackData.lastCueEndTimestamp, sampleStart - trackData.lastCueEndTimestamp, 'key');\n                await this.registerSample(trackData, sample);\n                trackData.lastCueEndTimestamp = sampleStart;\n            }\n            this.auxWriter.seek(0);\n            for (let i = 0; i < trackData.cueQueue.length; i++) {\n                const cue = trackData.cueQueue[i];\n                if (cue.timestamp >= sampleEnd) {\n                    break;\n                }\n                inlineTimestampRegex.lastIndex = 0;\n                const containsTimestamp = inlineTimestampRegex.test(cue.text);\n                const endTimestamp = cue.timestamp + cue.duration;\n                let sourceId = trackData.cueToSourceId.get(cue);\n                if (sourceId === undefined && sampleEnd < endTimestamp) {\n                    // We know this cue will appear in more than one sample, therefore we need to mark it with a\n                    // unique ID\n                    sourceId = trackData.nextSourceId++;\n                    trackData.cueToSourceId.set(cue, sourceId);\n                }\n                if (cue.notes) {\n                    // Any notes/comments are included in a special vtta box\n                    const box = vtta(cue.notes);\n                    this.auxBoxWriter.writeBox(box);\n                }\n                const box = vttc(cue.text, containsTimestamp ? sampleStart : null, cue.identifier ?? null, cue.settings ?? null, sourceId ?? null);\n                this.auxBoxWriter.writeBox(box);\n                if (endTimestamp === sampleEnd) {\n                    // The cue won't appear in any future sample, so we're done with it\n                    trackData.cueQueue.splice(i--, 1);\n                }\n            }\n            const body = this.auxTarget._getSlice(0, this.auxWriter.getPos());\n            const sample = this.createSampleForTrack(trackData, body, sampleStart, sampleEnd - sampleStart, 'key');\n            await this.registerSample(trackData, sample);\n            trackData.lastCueEndTimestamp = sampleEnd;\n        }\n    }\n    createSampleForTrack(trackData, data, timestamp, duration, type) {\n        const sample = {\n            timestamp,\n            decodeTimestamp: timestamp, // This may be refined later\n            duration,\n            data,\n            size: data.byteLength,\n            type,\n            timescaleUnitsToNextSample: intoTimescale(duration, trackData.timescale), // Will be refined\n        };\n        return sample;\n    }\n    processTimestamps(trackData, nextSample) {\n        if (trackData.timestampProcessingQueue.length === 0) {\n            return;\n        }\n        if (trackData.type === 'audio' && trackData.info.requiresPcmTransformation) {\n            if (!this.isFragmented) {\n                // The first timestamp is the lowest\n                trackData.startTimestampOffset ??= trackData.timestampProcessingQueue[0].timestamp;\n            }\n            let totalDuration = 0;\n            // Compute the total duration in the track timescale (which is equal to the amount of PCM audio samples)\n            // and simply say that's how many new samples there are.\n            for (let i = 0; i < trackData.timestampProcessingQueue.length; i++) {\n                const sample = trackData.timestampProcessingQueue[i];\n                const duration = intoTimescale(sample.duration, trackData.timescale);\n                totalDuration += duration;\n            }\n            if (trackData.timeToSampleTable.length === 0) {\n                trackData.timeToSampleTable.push({\n                    sampleCount: totalDuration,\n                    sampleDelta: 1,\n                });\n            }\n            else {\n                const lastEntry = last(trackData.timeToSampleTable);\n                lastEntry.sampleCount += totalDuration;\n            }\n            trackData.timestampProcessingQueue.length = 0;\n            return;\n        }\n        const sortedTimestamps = trackData.timestampProcessingQueue.map(x => x.timestamp).sort((a, b) => a - b);\n        if (!this.isFragmented) {\n            trackData.startTimestampOffset ??= sortedTimestamps[0];\n        }\n        for (let i = 0; i < trackData.timestampProcessingQueue.length; i++) {\n            const sample = trackData.timestampProcessingQueue[i];\n            // Since the user only supplies presentation time, but these may be out of order, we reverse-engineer from\n            // that a sensible decode timestamp. The notion of a decode timestamp doesn't really make sense\n            // (presentation timestamp & decode order are all you need), but it is a concept in ISOBMFF so we need to\n            // model it.\n            sample.decodeTimestamp = sortedTimestamps[i];\n            const sampleCompositionTimeOffset = intoTimescale(sample.timestamp - sample.decodeTimestamp, trackData.timescale);\n            const durationInTimescale = intoTimescale(sample.duration, trackData.timescale);\n            if (trackData.lastTimescaleUnits !== null) {\n                assert(trackData.lastSample);\n                const timescaleUnits = intoTimescale(sample.decodeTimestamp, trackData.timescale, false);\n                const delta = Math.round(timescaleUnits - trackData.lastTimescaleUnits);\n                assert(delta >= 0);\n                trackData.lastTimescaleUnits += delta;\n                trackData.lastSample.timescaleUnitsToNextSample = delta;\n                if (!this.isFragmented) {\n                    let lastTableEntry = last(trackData.timeToSampleTable);\n                    assert(lastTableEntry);\n                    if (lastTableEntry.sampleCount === 1) {\n                        lastTableEntry.sampleDelta = delta;\n                        const entryBefore = trackData.timeToSampleTable[trackData.timeToSampleTable.length - 2];\n                        if (entryBefore && entryBefore.sampleDelta === delta) {\n                            // If the delta is the same as the previous one, merge the two entries\n                            entryBefore.sampleCount++;\n                            trackData.timeToSampleTable.pop();\n                            lastTableEntry = entryBefore;\n                        }\n                    }\n                    else if (lastTableEntry.sampleDelta !== delta) {\n                        // The delta has changed, so we need a new entry to reach the current sample\n                        lastTableEntry.sampleCount--;\n                        trackData.timeToSampleTable.push(lastTableEntry = {\n                            sampleCount: 1,\n                            sampleDelta: delta,\n                        });\n                    }\n                    if (lastTableEntry.sampleDelta === durationInTimescale) {\n                        // The sample's duration matches the delta, so we can increment the count\n                        lastTableEntry.sampleCount++;\n                    }\n                    else {\n                        // Add a new entry in order to maintain the last sample's true duration\n                        trackData.timeToSampleTable.push({\n                            sampleCount: 1,\n                            sampleDelta: durationInTimescale,\n                        });\n                    }\n                    const lastCompositionTimeOffsetTableEntry = last(trackData.compositionTimeOffsetTable);\n                    assert(lastCompositionTimeOffsetTableEntry);\n                    if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n                        // Simply increment the count\n                        lastCompositionTimeOffsetTableEntry.sampleCount++;\n                    }\n                    else {\n                        // The composition time offset has changed, so create a new entry with the new composition time\n                        // offset\n                        trackData.compositionTimeOffsetTable.push({\n                            sampleCount: 1,\n                            sampleCompositionTimeOffset: sampleCompositionTimeOffset,\n                        });\n                    }\n                }\n            }\n            else {\n                // Decode timestamp of the first sample\n                trackData.lastTimescaleUnits = intoTimescale(sample.decodeTimestamp, trackData.timescale, false);\n                if (!this.isFragmented) {\n                    trackData.timeToSampleTable.push({\n                        sampleCount: 1,\n                        sampleDelta: durationInTimescale,\n                    });\n                    trackData.compositionTimeOffsetTable.push({\n                        sampleCount: 1,\n                        sampleCompositionTimeOffset: sampleCompositionTimeOffset,\n                    });\n                }\n            }\n            trackData.lastSample = sample;\n        }\n        trackData.timestampProcessingQueue.length = 0;\n        assert(trackData.lastSample);\n        assert(trackData.lastTimescaleUnits !== null);\n        if (nextSample !== undefined && trackData.lastSample.timescaleUnitsToNextSample === 0) {\n            assert(nextSample.type === 'key');\n            // Given the next sample, we can make a guess about the duration of the last sample. This avoids having\n            // the last sample's duration in each fragment be \"0\" for fragmented files. The guess we make here is\n            // actually correct most of the time, since typically, no delta frame with a lower timestamp follows the key\n            // frame (although it can happen).\n            const timescaleUnits = intoTimescale(nextSample.timestamp, trackData.timescale, false);\n            const delta = Math.round(timescaleUnits - trackData.lastTimescaleUnits);\n            trackData.lastSample.timescaleUnitsToNextSample = delta;\n        }\n    }\n    async registerSample(trackData, sample) {\n        if (sample.type === 'key') {\n            this.processTimestamps(trackData, sample);\n        }\n        trackData.timestampProcessingQueue.push(sample);\n        if (this.isFragmented) {\n            trackData.sampleQueue.push(sample);\n            await this.interleaveSamples();\n        }\n        else if (this.fastStart === 'reserve') {\n            await this.registerSampleFastStartReserve(trackData, sample);\n        }\n        else {\n            await this.addSampleToTrack(trackData, sample);\n        }\n    }\n    async addSampleToTrack(trackData, sample) {\n        if (!this.isFragmented) {\n            trackData.samples.push(sample);\n            if (this.fastStart === 'reserve') {\n                const maximumPacketCount = trackData.track.metadata.maximumPacketCount;\n                assert(maximumPacketCount !== undefined);\n                if (trackData.samples.length > maximumPacketCount) {\n                    throw new Error(`Track #${trackData.track.id} has already reached the maximum packet count`\n                        + ` (${maximumPacketCount}). Either add less packets or increase the maximum packet count.`);\n                }\n            }\n        }\n        let beginNewChunk = false;\n        if (!trackData.currentChunk) {\n            beginNewChunk = true;\n        }\n        else {\n            // Timestamp don't need to be monotonic (think B-frames), so we may need to update the start timestamp of\n            // the chunk\n            trackData.currentChunk.startTimestamp = Math.min(trackData.currentChunk.startTimestamp, sample.timestamp);\n            const currentChunkDuration = sample.timestamp - trackData.currentChunk.startTimestamp;\n            if (this.isFragmented) {\n                // We can only finalize this fragment (and begin a new one) if we know that each track will be able to\n                // start the new one with a key frame.\n                const keyFrameQueuedEverywhere = this.trackDatas.every((otherTrackData) => {\n                    if (trackData === otherTrackData) {\n                        return sample.type === 'key';\n                    }\n                    const firstQueuedSample = otherTrackData.sampleQueue[0];\n                    if (firstQueuedSample) {\n                        return firstQueuedSample.type === 'key';\n                    }\n                    return otherTrackData.closed;\n                });\n                if (currentChunkDuration >= this.minimumFragmentDuration\n                    && keyFrameQueuedEverywhere\n                    && sample.timestamp > this.maxWrittenTimestamp) {\n                    beginNewChunk = true;\n                    await this.finalizeFragment();\n                }\n            }\n            else {\n                beginNewChunk = currentChunkDuration >= 0.5; // Chunk is long enough, we need a new one\n            }\n        }\n        if (beginNewChunk) {\n            if (trackData.currentChunk) {\n                await this.finalizeCurrentChunk(trackData);\n            }\n            trackData.currentChunk = {\n                startTimestamp: sample.timestamp,\n                samples: [],\n                offset: null,\n                moofOffset: null,\n            };\n        }\n        assert(trackData.currentChunk);\n        trackData.currentChunk.samples.push(sample);\n        if (this.isFragmented) {\n            this.maxWrittenTimestamp = Math.max(this.maxWrittenTimestamp, sample.timestamp);\n            this.maxWrittenEndTimestamp = Math.max(this.maxWrittenEndTimestamp, sample.timestamp + sample.duration);\n            this.minWrittenTimestamp = Math.min(this.minWrittenTimestamp, sample.timestamp);\n        }\n    }\n    async finalizeCurrentChunk(trackData) {\n        assert(!this.isFragmented);\n        assert(this.writer);\n        if (!trackData.currentChunk)\n            return;\n        trackData.finalizedChunks.push(trackData.currentChunk);\n        this.finalizedChunks.push(trackData.currentChunk);\n        let sampleCount = trackData.currentChunk.samples.length;\n        if (trackData.type === 'audio' && trackData.info.requiresPcmTransformation) {\n            sampleCount = trackData.currentChunk.samples\n                .reduce((acc, sample) => acc + intoTimescale(sample.duration, trackData.timescale), 0);\n        }\n        if (trackData.compactlyCodedChunkTable.length === 0\n            || last(trackData.compactlyCodedChunkTable).samplesPerChunk !== sampleCount) {\n            trackData.compactlyCodedChunkTable.push({\n                firstChunk: trackData.finalizedChunks.length, // 1-indexed\n                samplesPerChunk: sampleCount,\n            });\n        }\n        if (this.fastStart === 'in-memory') {\n            trackData.currentChunk.offset = 0; // We'll compute the proper offset when finalizing\n            return;\n        }\n        // Write out the data\n        trackData.currentChunk.offset = this.writer.getPos();\n        for (const sample of trackData.currentChunk.samples) {\n            assert(sample.data);\n            this.writer.write(sample.data);\n            sample.data = null; // Can be GC'd\n        }\n        await this.writer.flush();\n    }\n    async interleaveSamples(isFinalCall = false) {\n        assert(this.isFragmented);\n        if (!isFinalCall && !this.allTracksAreKnown()) {\n            return; // We can't interleave yet as we don't yet know how many tracks we'll truly have\n        }\n        outer: while (true) {\n            let trackWithMinTimestamp = null;\n            let minTimestamp = Infinity;\n            for (const trackData of this.trackDatas) {\n                if (!isFinalCall && trackData.sampleQueue.length === 0 && !trackData.closed) {\n                    break outer;\n                }\n                if (trackData.sampleQueue.length > 0 && trackData.sampleQueue[0].timestamp < minTimestamp) {\n                    trackWithMinTimestamp = trackData;\n                    minTimestamp = trackData.sampleQueue[0].timestamp;\n                }\n            }\n            if (!trackWithMinTimestamp) {\n                break;\n            }\n            const sample = trackWithMinTimestamp.sampleQueue.shift();\n            await this.addSampleToTrack(trackWithMinTimestamp, sample);\n        }\n    }\n    async finalizeFragment(flushWriter = !this.isCmaf) {\n        assert(this.isFragmented);\n        const fragmentNumber = this.nextFragmentNumber++;\n        if (fragmentNumber === 1) {\n            const boxWriter = this.initBoxWriter ?? this.boxWriter;\n            assert(boxWriter);\n            if (this.format._options.onMoov) {\n                boxWriter.writer.startTrackingWrites();\n            }\n            this.ensureOneEnabledTrack();\n            // Write the moov box now that we have all decoder configs\n            const movieBox = moov(this);\n            boxWriter.writeBox(movieBox);\n            if (this.format._options.onMoov) {\n                const { data, start } = boxWriter.writer.stopTrackingWrites();\n                this.format._options.onMoov(data, start);\n            }\n            if (this.isCmaf) {\n                assert(this.initWriter);\n                await this.initWriter.flush();\n                await this.initWriter.finalize(); // Init segment is done\n                // Only now, init the main writer; this way the init writer is fully done before the main writer is\n                // even acquired\n                this.writer = await this.output._getRootWriter(true);\n                this.boxWriter = new IsobmffBoxWriter(this.writer);\n                const stypSize = this.boxWriter.measureBox(styp());\n                const sidxSize = this.boxWriter.measureBox(sidx(this, 0));\n                this.segmentHeaderSize = stypSize + sidxSize;\n                this.writer.seek(this.segmentHeaderSize); // Make room for the header to be written later\n            }\n        }\n        assert(this.writer);\n        assert(this.boxWriter);\n        // Not all tracks need to be present in every fragment\n        const tracksInFragment = this.trackDatas.filter(x => x.currentChunk);\n        // Create an initial moof box and measure it; we need this to know where the following mdat box will begin\n        const moofBox = moof(fragmentNumber, tracksInFragment);\n        const moofOffset = this.writer.getPos();\n        const mdatStartPos = moofOffset + this.boxWriter.measureBox(moofBox);\n        let currentPos = mdatStartPos + MIN_BOX_HEADER_SIZE;\n        let fragmentStartTimestamp = Infinity;\n        for (const trackData of tracksInFragment) {\n            trackData.currentChunk.offset = currentPos;\n            trackData.currentChunk.moofOffset = moofOffset;\n            for (const sample of trackData.currentChunk.samples) {\n                currentPos += sample.size;\n            }\n            fragmentStartTimestamp = Math.min(fragmentStartTimestamp, trackData.currentChunk.startTimestamp);\n        }\n        const mdatSize = currentPos - mdatStartPos;\n        const needsLargeMdatSize = mdatSize >= 2 ** 32;\n        if (needsLargeMdatSize) {\n            // Shift all offsets by 8. Previously, all chunks were shifted assuming the large box size, but due to what\n            // I suspect is a bug in WebKit, it failed in Safari (when livestreaming with MSE, not for static playback).\n            for (const trackData of tracksInFragment) {\n                trackData.currentChunk.offset += MAX_BOX_HEADER_SIZE - MIN_BOX_HEADER_SIZE;\n            }\n        }\n        if (this.format._options.onMoof) {\n            this.writer.startTrackingWrites();\n        }\n        const newMoofBox = moof(fragmentNumber, tracksInFragment);\n        this.boxWriter.writeBox(newMoofBox);\n        if (this.format._options.onMoof) {\n            const { data, start } = this.writer.stopTrackingWrites();\n            this.format._options.onMoof(data, start, fragmentStartTimestamp);\n        }\n        assert(this.writer.getPos() === mdatStartPos);\n        if (this.format._options.onMdat) {\n            this.writer.startTrackingWrites();\n        }\n        const mdatBox = mdat(needsLargeMdatSize);\n        mdatBox.size = mdatSize;\n        this.boxWriter.writeBox(mdatBox);\n        this.writer.seek(mdatStartPos + (needsLargeMdatSize ? MAX_BOX_HEADER_SIZE : MIN_BOX_HEADER_SIZE));\n        // Write sample data\n        for (const trackData of tracksInFragment) {\n            for (const sample of trackData.currentChunk.samples) {\n                this.writer.write(sample.data);\n                sample.data = null; // Can be GC'd\n            }\n        }\n        if (this.format._options.onMdat) {\n            const { data, start } = this.writer.stopTrackingWrites();\n            this.format._options.onMdat(data, start);\n        }\n        for (const trackData of tracksInFragment) {\n            trackData.finalizedChunks.push(trackData.currentChunk);\n            this.finalizedChunks.push(trackData.currentChunk);\n            trackData.currentChunk = null;\n        }\n        if (flushWriter) {\n            await this.writer.flush();\n        }\n    }\n    async registerSampleFastStartReserve(trackData, sample) {\n        assert(this.writer);\n        assert(this.boxWriter);\n        if (this.allTracksAreKnown()) {\n            if (!this.mdat) {\n                this.ensureOneEnabledTrack();\n                // We finally know all tracks, let's reserve space for the moov box\n                const moovBox = moov(this);\n                const moovSize = this.boxWriter.measureBox(moovBox);\n                const reservedSize = moovSize\n                    + this.computeSampleTableSizeUpperBound()\n                    + 4096; // Just a little extra headroom\n                assert(this.ftypSize !== null);\n                this.writer.seek(this.ftypSize + reservedSize);\n                if (this.format._options.onMdat) {\n                    this.writer.startTrackingWrites();\n                }\n                this.mdat = mdat(true);\n                this.boxWriter.writeBox(this.mdat);\n                // Now write everything that was queued\n                for (const trackData of this.trackDatas) {\n                    for (const sample of trackData.sampleQueue) {\n                        await this.addSampleToTrack(trackData, sample);\n                    }\n                    trackData.sampleQueue.length = 0;\n                }\n            }\n            await this.addSampleToTrack(trackData, sample);\n        }\n        else {\n            // Queue it for when we know all tracks\n            trackData.sampleQueue.push(sample);\n        }\n    }\n    computeSampleTableSizeUpperBound() {\n        assert(this.fastStart === 'reserve');\n        let upperBound = 0;\n        for (const trackData of this.trackDatas) {\n            const n = trackData.track.metadata.maximumPacketCount;\n            assert(n !== undefined); // We validated this earlier\n            // Given the max allowed packet count, compute the space they'll take up in the Sample Table Box, assuming\n            // the worst case for each individual box:\n            // stts box - since it is compactly coded, the maximum length of this table will be 2/3n\n            upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n            // stss box - 1 entry per sample\n            upperBound += 4 * n;\n            // ctts box - since it is compactly coded, the maximum length of this table will be 2/3n\n            upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n            // stsc box - since it is compactly coded, the maximum length of this table will be 2/3n\n            upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n            // stsz box - 1 entry per sample\n            upperBound += 4 * n;\n            // co64 box - we assume 1 sample per chunk and 64-bit chunk offsets (co64 instead of stco)\n            upperBound += 8 * n;\n        }\n        return upperBound;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    async onTrackClose(track) {\n        const release = await this.mutex.acquire();\n        const trackData = this.trackDatas.find(x => x.track === track);\n        if (trackData) {\n            trackData.closed = true;\n            if (trackData.type === 'subtitle' && track.source._codec === 'webvtt') {\n                await this.processWebVTTCues(trackData, Infinity);\n            }\n            this.processTimestamps(trackData);\n        }\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        if (this.isFragmented) {\n            // Since a track is now closed, we may be able to write out chunks that were previously waiting\n            await this.interleaveSamples();\n        }\n        release();\n    }\n    ensureOneEnabledTrack() {\n        // If no track of a given type is enabled, force the first one to be enabled. Otherwise the video won't play in\n        // players like QuickTime.\n        // https://github.com/Vanilagy/mediabunny/pull/391\n        for (const type of ['video', 'audio', 'subtitle']) {\n            const tracks = this.trackDatas.filter(t => t.type === type);\n            if (tracks.length === 0) {\n                continue;\n            }\n            const hasEnabled = tracks.some(t => t.track.metadata.disposition?.default !== false);\n            if (!hasEnabled) {\n                const firstTrack = tracks[0];\n                firstTrack.track.metadata.disposition = {\n                    ...firstTrack.track.metadata.disposition,\n                    default: true,\n                };\n            }\n        }\n    }\n    /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n    async finalize() {\n        const release = await this.mutex.acquire();\n        this.allTracksKnown.resolve();\n        this.ensureOneEnabledTrack();\n        for (const trackData of this.trackDatas) {\n            trackData.closed = true;\n            if (trackData.type === 'subtitle' && trackData.track.source._codec === 'webvtt') {\n                await this.processWebVTTCues(trackData, Infinity);\n            }\n            this.processTimestamps(trackData);\n        }\n        if (this.isFragmented) {\n            await this.interleaveSamples(true);\n            await this.finalizeFragment(false); // Don't flush the last fragment as we will flush it with the mfra box\n        }\n        else {\n            for (const trackData of this.trackDatas) {\n                await this.finalizeCurrentChunk(trackData);\n                // Must hold because we will have processed at least one sample\n                assert(trackData.startTimestampOffset !== null);\n                // Shift all of the samples by the start offset. We'll then write out an edit list that will shift them\n                // back to their proper spot in the composition.\n                for (let i = 0; i < trackData.samples.length; i++) {\n                    const sample = trackData.samples[i];\n                    sample.timestamp -= trackData.startTimestampOffset;\n                    sample.decodeTimestamp -= trackData.startTimestampOffset;\n                }\n            }\n        }\n        assert(this.writer);\n        assert(this.boxWriter);\n        if (this.fastStart === 'in-memory') {\n            this.mdat = mdat(false);\n            let mdatSize;\n            // We know how many chunks there are, but computing the chunk positions requires an iterative approach:\n            // In order to know where the first chunk should go, we first need to know the size of the moov box. But we\n            // cannot write a proper moov box without first knowing all chunk positions. So, we generate a tentative\n            // moov box with placeholder values (0) for the chunk offsets to be able to compute its size. If it then\n            // turns out that appending all chunks exceeds 4 GiB, we need to repeat this process, now with the co64 box\n            // being used in the moov box instead, which will make it larger. After that, we definitely know the final\n            // size of the moov box and can compute the proper chunk positions.\n            for (let i = 0; i < 2; i++) {\n                const movieBox = moov(this);\n                const movieBoxSize = this.boxWriter.measureBox(movieBox);\n                mdatSize = this.boxWriter.measureBox(this.mdat);\n                let currentChunkPos = this.writer.getPos() + movieBoxSize + mdatSize;\n                for (const chunk of this.finalizedChunks) {\n                    chunk.offset = currentChunkPos;\n                    for (const { data } of chunk.samples) {\n                        assert(data);\n                        currentChunkPos += data.byteLength;\n                        mdatSize += data.byteLength;\n                    }\n                }\n                if (currentChunkPos < 2 ** 32)\n                    break;\n                if (mdatSize >= 2 ** 32)\n                    this.mdat.largeSize = true;\n            }\n            if (this.format._options.onMoov) {\n                this.writer.startTrackingWrites();\n            }\n            const movieBox = moov(this);\n            this.boxWriter.writeBox(movieBox);\n            if (this.format._options.onMoov) {\n                const { data, start } = this.writer.stopTrackingWrites();\n                this.format._options.onMoov(data, start);\n            }\n            if (this.format._options.onMdat) {\n                this.writer.startTrackingWrites();\n            }\n            this.mdat.size = mdatSize;\n            this.boxWriter.writeBox(this.mdat);\n            for (const chunk of this.finalizedChunks) {\n                for (const sample of chunk.samples) {\n                    assert(sample.data);\n                    this.writer.write(sample.data);\n                    sample.data = null;\n                }\n            }\n            if (this.format._options.onMdat) {\n                const { data, start } = this.writer.stopTrackingWrites();\n                this.format._options.onMdat(data, start);\n            }\n        }\n        else if (this.isFragmented) {\n            if (this.isCmaf) {\n                const contentSize = this.segmentHeaderSize !== null\n                    ? this.writer.getPos() - this.segmentHeaderSize\n                    : 0;\n                this.writer.seek(0);\n                // Write styp and sidx to the start; we recently made space for these\n                this.boxWriter.writeBox(styp());\n                this.boxWriter.writeBox(sidx(this, contentSize));\n            }\n            else {\n                // Append the mfra box to the end of the file for better random access\n                const startPos = this.writer.getPos();\n                const mfraBox = mfra(this.trackDatas);\n                this.boxWriter.writeBox(mfraBox);\n                // Patch the 'size' field of the mfro box at the end of the mfra box now that we know its actual size\n                const mfraBoxSize = this.writer.getPos() - startPos;\n                this.writer.seek(this.writer.getPos() - 4);\n                this.boxWriter.writeU32(mfraBoxSize);\n            }\n        }\n        else {\n            assert(this.mdat);\n            const mdatPos = this.boxWriter.offsets.get(this.mdat);\n            assert(mdatPos !== undefined);\n            const mdatSize = this.writer.getPos() - mdatPos;\n            this.mdat.size = mdatSize;\n            this.mdat.largeSize = mdatSize >= 2 ** 32; // Only use the large size if we need it\n            this.boxWriter.patchBox(this.mdat);\n            if (this.format._options.onMdat) {\n                const { data, start } = this.writer.stopTrackingWrites();\n                this.format._options.onMdat(data, start);\n            }\n            const movieBox = moov(this);\n            if (this.fastStart === 'reserve') {\n                assert(this.ftypSize !== null);\n                this.writer.seek(this.ftypSize);\n                if (this.format._options.onMoov) {\n                    this.writer.startTrackingWrites();\n                }\n                this.boxWriter.writeBox(movieBox);\n                // Fill the remaining space with a free box. If there are less than 8 bytes left, sucks I guess\n                const remainingSpace = this.boxWriter.offsets.get(this.mdat) - this.writer.getPos();\n                this.boxWriter.writeBox(free(remainingSpace));\n            }\n            else {\n                if (this.format._options.onMoov) {\n                    this.writer.startTrackingWrites();\n                }\n                this.boxWriter.writeBox(movieBox);\n            }\n            if (this.format._options.onMoov) {\n                const { data, start } = this.writer.stopTrackingWrites();\n                this.format._options.onMoov(data, start);\n            }\n        }\n        release();\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { Bitstream } from '../../shared/bitstream.js';\nimport { COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, UNDETERMINED_LANGUAGE, assert, assertNever, colorSpaceIsComplete, imageMimeTypeToExtension, keyValueIterator, normalizeRotation, promiseWithResolvers, simplifyRational, textEncoder, toUint8Array, uint8ArraysAreEqual, writeBits, roundToDivisor, } from '../misc.js';\nimport { CODEC_STRING_MAP, EBMLFloat32, EBMLFloat64, EBMLId, EBMLSignedInt, EBMLUnicodeString, EBMLWriter, } from './ebml.js';\nimport { buildMatroskaMimeType } from './matroska-misc.js';\nimport { WebMOutputFormat } from '../output-format.js';\nimport { formatSubtitleTimestamp, inlineTimestampRegex, parseSubtitleTimestamp, } from '../subtitles.js';\nimport { aacChannelMap, aacFrequencyTable, buildAacAudioSpecificConfig } from '../../shared/aac-misc.js';\nimport { OPUS_SAMPLE_RATE, PCM_AUDIO_CODECS, generateAv1CodecConfigurationFromCodecString, generateVp9CodecConfigurationFromCodecString, parsePcmCodec, validateAudioChunkMetadata, validateSubtitleMetadata, validateVideoChunkMetadata, } from '../codec.js';\nimport { MAX_ADTS_FRAME_HEADER_SIZE, MIN_ADTS_FRAME_HEADER_SIZE, readAdtsFrameHeader } from '../adts/adts-reader.js';\nimport { FileSlice } from '../reader.js';\nimport { Muxer } from '../muxer.js';\nimport { parseOpusIdentificationHeader } from '../codec-data.js';\nimport { AttachedFile } from '../metadata.js';\nconst MIN_CLUSTER_TIMESTAMP_MS = -(2 ** 15);\nconst MAX_CLUSTER_TIMESTAMP_MS = 2 ** 15 - 1;\nconst APP_NAME = 'Mediabunny';\nconst SEGMENT_SIZE_BYTES = 6;\nconst CLUSTER_SIZE_BYTES = 5;\nconst TRACK_TYPE_MAP = {\n    video: 1,\n    audio: 2,\n    subtitle: 17,\n};\nexport class MatroskaMuxer extends Muxer {\n    constructor(output, format) {\n        super(output);\n        this.trackDatas = [];\n        this.allTracksKnown = promiseWithResolvers();\n        this.segment = null;\n        this.segmentInfo = null;\n        this.seekHead = null;\n        this.tracksElement = null;\n        this.tagsElement = null;\n        this.attachmentsElement = null;\n        this.segmentDuration = null;\n        this.cues = null;\n        this.currentCluster = null;\n        this.currentClusterStartMsTimestamp = null;\n        this.currentClusterMaxMsTimestamp = null;\n        this.trackDatasInCurrentCluster = new Map();\n        this.startTimestamp = Infinity;\n        this.endTimestamp = -Infinity;\n        this.format = format;\n    }\n    async start() {\n        const release = await this.mutex.acquire();\n        this.writer = await this.output._getRootWriter(!!this.format._options.appendOnly);\n        this.ebmlWriter = new EBMLWriter(this.writer);\n        this.writeEBMLHeader();\n        this.createSegmentInfo();\n        this.createCues();\n        await this.writer.flush();\n        release();\n    }\n    writeEBMLHeader() {\n        if (this.format._options.onEbmlHeader) {\n            this.writer.startTrackingWrites();\n        }\n        const ebmlHeader = { id: EBMLId.EBML, data: [\n                { id: EBMLId.EBMLVersion, data: 1 },\n                { id: EBMLId.EBMLReadVersion, data: 1 },\n                { id: EBMLId.EBMLMaxIDLength, data: 4 },\n                { id: EBMLId.EBMLMaxSizeLength, data: 8 },\n                { id: EBMLId.DocType, data: this.format instanceof WebMOutputFormat ? 'webm' : 'matroska' },\n                { id: EBMLId.DocTypeVersion, data: 2 },\n                { id: EBMLId.DocTypeReadVersion, data: 2 },\n            ] };\n        this.ebmlWriter.writeEBML(ebmlHeader);\n        if (this.format._options.onEbmlHeader) {\n            const { data, start } = this.writer.stopTrackingWrites(); // start should be 0\n            this.format._options.onEbmlHeader(data, start);\n        }\n    }\n    /**\n     * Creates a SeekHead element which is positioned near the start of the file and allows the media player to seek to\n     * relevant sections more easily. Since we don't know the positions of those sections yet, we'll set them later.\n     */\n    maybeCreateSeekHead(writeOffsets) {\n        if (this.format._options.appendOnly) {\n            return;\n        }\n        const kaxCues = new Uint8Array([0x1c, 0x53, 0xbb, 0x6b]);\n        const kaxInfo = new Uint8Array([0x15, 0x49, 0xa9, 0x66]);\n        const kaxTracks = new Uint8Array([0x16, 0x54, 0xae, 0x6b]);\n        const kaxAttachments = new Uint8Array([0x19, 0x41, 0xa4, 0x69]);\n        const kaxTags = new Uint8Array([0x12, 0x54, 0xc3, 0x67]);\n        const seekHead = { id: EBMLId.SeekHead, data: [\n                { id: EBMLId.Seek, data: [\n                        { id: EBMLId.SeekID, data: kaxCues },\n                        {\n                            id: EBMLId.SeekPosition,\n                            size: 5,\n                            data: writeOffsets\n                                ? this.ebmlWriter.offsets.get(this.cues) - this.segmentDataOffset\n                                : 0,\n                        },\n                    ] },\n                { id: EBMLId.Seek, data: [\n                        { id: EBMLId.SeekID, data: kaxInfo },\n                        {\n                            id: EBMLId.SeekPosition,\n                            size: 5,\n                            data: writeOffsets\n                                ? this.ebmlWriter.offsets.get(this.segmentInfo) - this.segmentDataOffset\n                                : 0,\n                        },\n                    ] },\n                { id: EBMLId.Seek, data: [\n                        { id: EBMLId.SeekID, data: kaxTracks },\n                        {\n                            id: EBMLId.SeekPosition,\n                            size: 5,\n                            data: writeOffsets\n                                ? this.ebmlWriter.offsets.get(this.tracksElement) - this.segmentDataOffset\n                                : 0,\n                        },\n                    ] },\n                this.attachmentsElement\n                    ? { id: EBMLId.Seek, data: [\n                            { id: EBMLId.SeekID, data: kaxAttachments },\n                            {\n                                id: EBMLId.SeekPosition,\n                                size: 5,\n                                data: writeOffsets\n                                    ? this.ebmlWriter.offsets.get(this.attachmentsElement) - this.segmentDataOffset\n                                    : 0,\n                            },\n                        ] }\n                    : null,\n                this.tagsElement\n                    ? { id: EBMLId.Seek, data: [\n                            { id: EBMLId.SeekID, data: kaxTags },\n                            {\n                                id: EBMLId.SeekPosition,\n                                size: 5,\n                                data: writeOffsets\n                                    ? this.ebmlWriter.offsets.get(this.tagsElement) - this.segmentDataOffset\n                                    : 0,\n                            },\n                        ] }\n                    : null,\n            ] };\n        this.seekHead = seekHead;\n    }\n    createSegmentInfo() {\n        const segmentDuration = { id: EBMLId.Duration, data: new EBMLFloat64(0) };\n        this.segmentDuration = segmentDuration;\n        const segmentInfo = { id: EBMLId.Info, data: [\n                { id: EBMLId.TimestampScale, data: 1e6 },\n                { id: EBMLId.MuxingApp, data: APP_NAME },\n                { id: EBMLId.WritingApp, data: APP_NAME },\n                !this.format._options.appendOnly ? segmentDuration : null,\n            ] };\n        this.segmentInfo = segmentInfo;\n    }\n    createTracks() {\n        const tracksElement = { id: EBMLId.Tracks, data: [] };\n        this.tracksElement = tracksElement;\n        for (const trackData of this.trackDatas) {\n            const codecId = CODEC_STRING_MAP[trackData.track.source._codec];\n            assert(codecId);\n            let seekPreRollNs = 0;\n            if (trackData.type === 'audio' && trackData.track.source._codec === 'opus') {\n                seekPreRollNs = 1e6 * 80; // In \"Matroska ticks\" (nanoseconds)\n                const description = trackData.info.decoderConfig.description;\n                if (description) {\n                    const bytes = toUint8Array(description);\n                    const header = parseOpusIdentificationHeader(bytes);\n                    // Use the preSkip value from the header\n                    seekPreRollNs = Math.round(1e9 * (header.preSkip / OPUS_SAMPLE_RATE));\n                }\n            }\n            tracksElement.data.push({ id: EBMLId.TrackEntry, data: [\n                    { id: EBMLId.TrackNumber, data: trackData.track.id },\n                    { id: EBMLId.TrackUID, data: trackData.track.id },\n                    { id: EBMLId.TrackType, data: TRACK_TYPE_MAP[trackData.type] },\n                    trackData.track.metadata.disposition?.default === false\n                        ? { id: EBMLId.FlagDefault, data: 0 }\n                        : null,\n                    trackData.track.metadata.disposition?.forced\n                        ? { id: EBMLId.FlagForced, data: 1 }\n                        : null,\n                    trackData.track.metadata.disposition?.hearingImpaired\n                        ? { id: EBMLId.FlagHearingImpaired, data: 1 }\n                        : null,\n                    trackData.track.metadata.disposition?.visuallyImpaired\n                        ? { id: EBMLId.FlagVisualImpaired, data: 1 }\n                        : null,\n                    trackData.track.metadata.disposition?.original\n                        ? { id: EBMLId.FlagOriginal, data: 1 }\n                        : null,\n                    trackData.track.metadata.disposition?.commentary\n                        ? { id: EBMLId.FlagCommentary, data: 1 }\n                        : null,\n                    { id: EBMLId.FlagLacing, data: 0 },\n                    { id: EBMLId.Language, data: trackData.track.metadata.languageCode ?? UNDETERMINED_LANGUAGE },\n                    { id: EBMLId.CodecID, data: codecId },\n                    { id: EBMLId.CodecDelay, data: 0 },\n                    { id: EBMLId.SeekPreRoll, data: seekPreRollNs },\n                    trackData.track.metadata.name !== undefined\n                        ? { id: EBMLId.Name, data: new EBMLUnicodeString(trackData.track.metadata.name) }\n                        : null,\n                    (trackData.type === 'video' ? this.videoSpecificTrackInfo(trackData) : null),\n                    (trackData.type === 'audio' ? this.audioSpecificTrackInfo(trackData) : null),\n                    (trackData.type === 'subtitle' ? this.subtitleSpecificTrackInfo(trackData) : null),\n                ] });\n        }\n    }\n    videoSpecificTrackInfo(trackData) {\n        const { frameRate, rotation } = trackData.track.metadata;\n        const elements = [\n            (trackData.info.decoderConfig.description\n                ? {\n                    id: EBMLId.CodecPrivate,\n                    data: toUint8Array(trackData.info.decoderConfig.description),\n                }\n                : null),\n            (frameRate\n                ? {\n                    id: EBMLId.DefaultDuration,\n                    data: 1e9 / frameRate,\n                }\n                : null),\n        ];\n        // Convert from clockwise to counter-clockwise\n        const flippedRotation = rotation ? normalizeRotation(-rotation) : 0;\n        const hasNonSquarePixelAspectRatio = !!trackData.info.aspectRatio && (trackData.info.aspectRatio.num * trackData.info.height\n            !== trackData.info.aspectRatio.den * trackData.info.width);\n        const colorSpace = trackData.info.decoderConfig.colorSpace;\n        const videoElement = { id: EBMLId.Video, data: [\n                { id: EBMLId.PixelWidth, data: trackData.info.width },\n                { id: EBMLId.PixelHeight, data: trackData.info.height },\n                (hasNonSquarePixelAspectRatio ? { id: EBMLId.DisplayWidth, data: trackData.info.aspectRatio.num } : null),\n                (hasNonSquarePixelAspectRatio ? { id: EBMLId.DisplayHeight, data: trackData.info.aspectRatio.den } : null),\n                (hasNonSquarePixelAspectRatio ? { id: EBMLId.DisplayUnit, data: 3 } : null), // 3 = display aspect ratio\n                trackData.info.alphaMode ? { id: EBMLId.AlphaMode, data: 1 } : null,\n                (colorSpaceIsComplete(colorSpace)\n                    ? {\n                        id: EBMLId.Colour,\n                        data: [\n                            {\n                                id: EBMLId.MatrixCoefficients,\n                                data: MATRIX_COEFFICIENTS_MAP[colorSpace.matrix],\n                            },\n                            {\n                                id: EBMLId.TransferCharacteristics,\n                                data: TRANSFER_CHARACTERISTICS_MAP[colorSpace.transfer],\n                            },\n                            {\n                                id: EBMLId.Primaries,\n                                data: COLOR_PRIMARIES_MAP[colorSpace.primaries],\n                            },\n                            {\n                                id: EBMLId.Range,\n                                data: colorSpace.fullRange ? 2 : 1,\n                            },\n                        ],\n                    }\n                    : null),\n                (flippedRotation\n                    ? {\n                        id: EBMLId.Projection,\n                        data: [\n                            {\n                                id: EBMLId.ProjectionType,\n                                data: 0, // rectangular\n                            },\n                            {\n                                id: EBMLId.ProjectionPoseRoll,\n                                data: new EBMLFloat32((flippedRotation + 180) % 360 - 180), // [0, 270] -> [-180, 90]\n                            },\n                        ],\n                    }\n                    : null),\n            ] };\n        elements.push(videoElement);\n        return elements;\n    }\n    audioSpecificTrackInfo(trackData) {\n        const pcmInfo = PCM_AUDIO_CODECS.includes(trackData.track.source._codec)\n            ? parsePcmCodec(trackData.track.source._codec)\n            : null;\n        return [\n            (trackData.info.decoderConfig.description\n                ? {\n                    id: EBMLId.CodecPrivate,\n                    data: toUint8Array(trackData.info.decoderConfig.description),\n                }\n                : null),\n            { id: EBMLId.Audio, data: [\n                    { id: EBMLId.SamplingFrequency, data: new EBMLFloat32(trackData.info.sampleRate) },\n                    { id: EBMLId.Channels, data: trackData.info.numberOfChannels },\n                    pcmInfo ? { id: EBMLId.BitDepth, data: 8 * pcmInfo.sampleSize } : null,\n                ] },\n        ];\n    }\n    subtitleSpecificTrackInfo(trackData) {\n        return [\n            { id: EBMLId.CodecPrivate, data: textEncoder.encode(trackData.info.config.description) },\n        ];\n    }\n    maybeCreateTags() {\n        const simpleTags = [];\n        const addSimpleTag = (key, value) => {\n            simpleTags.push({ id: EBMLId.SimpleTag, data: [\n                    { id: EBMLId.TagName, data: new EBMLUnicodeString(key) },\n                    typeof value === 'string'\n                        ? { id: EBMLId.TagString, data: new EBMLUnicodeString(value) }\n                        : { id: EBMLId.TagBinary, data: value },\n                ] });\n        };\n        const metadataTags = this.output._metadataTags;\n        const writtenTags = new Set();\n        for (const { key, value } of keyValueIterator(metadataTags)) {\n            switch (key) {\n                case 'title':\n                    {\n                        addSimpleTag('TITLE', value);\n                        writtenTags.add('TITLE');\n                    }\n                    ;\n                    break;\n                case 'description':\n                    {\n                        addSimpleTag('DESCRIPTION', value);\n                        writtenTags.add('DESCRIPTION');\n                    }\n                    ;\n                    break;\n                case 'artist':\n                    {\n                        addSimpleTag('ARTIST', value);\n                        writtenTags.add('ARTIST');\n                    }\n                    ;\n                    break;\n                case 'album':\n                    {\n                        addSimpleTag('ALBUM', value);\n                        writtenTags.add('ALBUM');\n                    }\n                    ;\n                    break;\n                case 'albumArtist':\n                    {\n                        addSimpleTag('ALBUM_ARTIST', value);\n                        writtenTags.add('ALBUM_ARTIST');\n                    }\n                    ;\n                    break;\n                case 'genre':\n                    {\n                        addSimpleTag('GENRE', value);\n                        writtenTags.add('GENRE');\n                    }\n                    ;\n                    break;\n                case 'comment':\n                    {\n                        addSimpleTag('COMMENT', value);\n                        writtenTags.add('COMMENT');\n                    }\n                    ;\n                    break;\n                case 'lyrics':\n                    {\n                        addSimpleTag('LYRICS', value);\n                        writtenTags.add('LYRICS');\n                    }\n                    ;\n                    break;\n                case 'date':\n                    {\n                        addSimpleTag('DATE', value.toISOString().slice(0, 10));\n                        writtenTags.add('DATE');\n                    }\n                    ;\n                    break;\n                case 'trackNumber':\n                    {\n                        const string = metadataTags.tracksTotal !== undefined\n                            ? `${value}/${metadataTags.tracksTotal}`\n                            : value.toString();\n                        addSimpleTag('PART_NUMBER', string);\n                        writtenTags.add('PART_NUMBER');\n                    }\n                    ;\n                    break;\n                case 'discNumber':\n                    {\n                        const string = metadataTags.discsTotal !== undefined\n                            ? `${value}/${metadataTags.discsTotal}`\n                            : value.toString();\n                        addSimpleTag('DISC', string);\n                        writtenTags.add('DISC');\n                    }\n                    ;\n                    break;\n                case 'tracksTotal':\n                case 'discsTotal':\n                    {\n                        // Handled with trackNumber and discNumber respectively\n                    }\n                    ;\n                    break;\n                case 'images':\n                case 'raw':\n                    {\n                        // Handled elsewhere\n                    }\n                    ;\n                    break;\n                default: assertNever(key);\n            }\n        }\n        if (metadataTags.raw) {\n            for (const key in metadataTags.raw) {\n                const value = metadataTags.raw[key];\n                if (value == null || writtenTags.has(key)) {\n                    continue;\n                }\n                if (typeof value === 'string' || value instanceof Uint8Array) {\n                    addSimpleTag(key, value);\n                }\n            }\n        }\n        if (simpleTags.length === 0) {\n            return;\n        }\n        this.tagsElement = {\n            id: EBMLId.Tags,\n            data: [{ id: EBMLId.Tag, data: [\n                        { id: EBMLId.Targets, data: [\n                                { id: EBMLId.TargetTypeValue, data: 50 },\n                                { id: EBMLId.TargetType, data: 'MOVIE' },\n                            ] },\n                        ...simpleTags,\n                    ] }],\n        };\n    }\n    maybeCreateAttachments() {\n        const metadataTags = this.output._metadataTags;\n        const elements = [];\n        const existingFileUids = new Set();\n        const images = metadataTags.images ?? [];\n        for (const image of images) {\n            let imageName = image.name;\n            if (imageName === undefined) {\n                const baseName = image.kind === 'coverFront' ? 'cover' : image.kind === 'coverBack' ? 'back' : 'image';\n                imageName = baseName + (imageMimeTypeToExtension(image.mimeType) ?? '');\n            }\n            let fileUid;\n            while (true) {\n                // Generate a random 64-bit unsigned integer\n                fileUid = 0n;\n                for (let i = 0; i < 8; i++) {\n                    fileUid <<= 8n;\n                    fileUid |= BigInt(Math.floor(Math.random() * 256));\n                }\n                if (fileUid !== 0n && !existingFileUids.has(fileUid)) {\n                    break;\n                }\n            }\n            existingFileUids.add(fileUid);\n            elements.push({\n                id: EBMLId.AttachedFile,\n                data: [\n                    image.description !== undefined\n                        ? { id: EBMLId.FileDescription, data: new EBMLUnicodeString(image.description) }\n                        : null,\n                    { id: EBMLId.FileName, data: new EBMLUnicodeString(imageName) },\n                    { id: EBMLId.FileMediaType, data: image.mimeType },\n                    { id: EBMLId.FileData, data: image.data },\n                    { id: EBMLId.FileUID, data: fileUid },\n                ],\n            });\n        }\n        // Add all AttachedFiles from the raw metadata\n        for (const [key, value] of Object.entries(metadataTags.raw ?? {})) {\n            if (!(value instanceof AttachedFile)) {\n                continue;\n            }\n            const keyIsNumeric = /^\\d+$/.test(key);\n            if (!keyIsNumeric) {\n                continue;\n            }\n            if (images.find(x => x.mimeType === value.mimeType && uint8ArraysAreEqual(x.data, value.data))) {\n                // This attached file has very likely already been added as an image above\n                // (happens when remuxing Matroska)\n                continue;\n            }\n            elements.push({\n                id: EBMLId.AttachedFile,\n                data: [\n                    value.description !== undefined\n                        ? { id: EBMLId.FileDescription, data: new EBMLUnicodeString(value.description) }\n                        : null,\n                    { id: EBMLId.FileName, data: new EBMLUnicodeString(value.name ?? '') },\n                    { id: EBMLId.FileMediaType, data: value.mimeType ?? '' },\n                    { id: EBMLId.FileData, data: value.data },\n                    { id: EBMLId.FileUID, data: BigInt(key) },\n                ],\n            });\n        }\n        if (elements.length === 0) {\n            return;\n        }\n        this.attachmentsElement = { id: EBMLId.Attachments, data: elements };\n    }\n    createSegment() {\n        this.createTracks();\n        this.maybeCreateTags();\n        this.maybeCreateAttachments();\n        this.maybeCreateSeekHead(false);\n        const segment = {\n            id: EBMLId.Segment,\n            size: this.format._options.appendOnly ? -1 : SEGMENT_SIZE_BYTES,\n            data: [\n                this.seekHead, // null if append-only\n                this.segmentInfo,\n                this.tracksElement,\n                // Matroska spec says put this at the end of the file, but I think placing it before the first cluster\n                // makes more sense, and FFmpeg agrees (argumentum ad ffmpegum fallacy)\n                this.attachmentsElement,\n                this.tagsElement,\n            ],\n        };\n        this.segment = segment;\n        if (this.format._options.onSegmentHeader) {\n            this.writer.startTrackingWrites();\n        }\n        this.ebmlWriter.writeEBML(segment);\n        if (this.format._options.onSegmentHeader) {\n            const { data, start } = this.writer.stopTrackingWrites();\n            this.format._options.onSegmentHeader(data, start);\n        }\n    }\n    createCues() {\n        this.cues = { id: EBMLId.Cues, data: [] };\n    }\n    get segmentDataOffset() {\n        assert(this.segment);\n        return this.ebmlWriter.dataOffsets.get(this.segment);\n    }\n    allTracksAreKnown() {\n        for (const track of this.output._tracks) {\n            if (!track.source._closed && !this.trackDatas.some(x => x.track === track)) {\n                return false; // We haven't seen a sample from this open track yet\n            }\n        }\n        return true;\n    }\n    async getMimeType() {\n        await this.allTracksKnown.promise;\n        const codecStrings = this.trackDatas.map((trackData) => {\n            if (trackData.type === 'video') {\n                return trackData.info.decoderConfig.codec;\n            }\n            else if (trackData.type === 'audio') {\n                return trackData.info.decoderConfig.codec;\n            }\n            else {\n                const map = {\n                    webvtt: 'wvtt',\n                };\n                return map[trackData.track.source._codec];\n            }\n        });\n        return buildMatroskaMimeType({\n            isWebM: this.format instanceof WebMOutputFormat,\n            hasVideo: this.trackDatas.some(x => x.type === 'video'),\n            hasAudio: this.trackDatas.some(x => x.type === 'audio'),\n            codecStrings,\n        });\n    }\n    getVideoTrackData(track, packet, meta) {\n        const existingTrackData = this.trackDatas.find(x => x.track === track);\n        if (existingTrackData) {\n            return existingTrackData;\n        }\n        validateVideoChunkMetadata(meta);\n        assert(meta);\n        assert(meta.decoderConfig);\n        assert(meta.decoderConfig.codedWidth !== undefined);\n        assert(meta.decoderConfig.codedHeight !== undefined);\n        const displayAspectWidth = meta.decoderConfig.displayAspectWidth;\n        const displayAspectHeight = meta.decoderConfig.displayAspectHeight;\n        const aspectRatio = displayAspectWidth === undefined || displayAspectHeight === undefined\n            ? null\n            : simplifyRational({\n                num: displayAspectWidth,\n                den: displayAspectHeight,\n            });\n        const newTrackData = {\n            track,\n            type: 'video',\n            info: {\n                width: meta.decoderConfig.codedWidth,\n                height: meta.decoderConfig.codedHeight,\n                aspectRatio,\n                decoderConfig: meta.decoderConfig,\n                alphaMode: !!packet.sideData.alpha, // The first packet determines if this track has alpha or not\n            },\n            chunkQueue: [],\n            lastWrittenMsTimestamp: null,\n            closed: false,\n        };\n        if (track.source._codec === 'vp9') {\n            // https://www.webmproject.org/docs/container specifies that VP9 \"SHOULD\" make use of the CodecPrivate\n            // field. Since WebCodecs makes no use of the description field for VP9, we need to derive it ourselves:\n            newTrackData.info.decoderConfig = {\n                ...newTrackData.info.decoderConfig,\n                description: new Uint8Array(generateVp9CodecConfigurationFromCodecString(newTrackData.info.decoderConfig.codec)),\n            };\n        }\n        else if (track.source._codec === 'av1') {\n            // Per https://github.com/ietf-wg-cellar/matroska-specification/blob/master/codec/av1.md, AV1 requires\n            // CodecPrivate to be set, but WebCodecs makes no use of the description field for AV1. Thus, let's derive\n            // it ourselves:\n            newTrackData.info.decoderConfig = {\n                ...newTrackData.info.decoderConfig,\n                description: new Uint8Array(generateAv1CodecConfigurationFromCodecString(newTrackData.info.decoderConfig.codec)),\n            };\n        }\n        this.trackDatas.push(newTrackData);\n        this.trackDatas.sort((a, b) => a.track.id - b.track.id);\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        return newTrackData;\n    }\n    getAudioTrackData(track, packet, meta) {\n        const existingTrackData = this.trackDatas.find(x => x.track === track);\n        if (existingTrackData) {\n            return existingTrackData;\n        }\n        validateAudioChunkMetadata(meta);\n        assert(meta);\n        assert(meta.decoderConfig);\n        const decoderConfig = { ...meta.decoderConfig };\n        let requiresAdtsStripping = false;\n        if (track.source._codec === 'aac' && !decoderConfig.description) {\n            // Matroska stores raw AAC with AudioSpecificConfig in CodecPrivate, not ADTS-wrapped data.\n            // Parse the first packet to extract the AudioSpecificConfig.\n            const adtsFrame = readAdtsFrameHeader(FileSlice.tempFromBytes(packet.data));\n            if (!adtsFrame) {\n                throw new Error('Couldn\\'t parse ADTS header from the AAC packet. Make sure the packets are in ADTS format'\n                    + ' (as specified in ISO 13818-7) when not providing a description, or provide a description'\n                    + ' (must be an AudioSpecificConfig as specified in ISO 14496-3) and ensure the packets'\n                    + ' are raw AAC data.');\n            }\n            const sampleRate = aacFrequencyTable[adtsFrame.samplingFrequencyIndex];\n            const numberOfChannels = aacChannelMap[adtsFrame.channelConfiguration];\n            if (sampleRate === undefined || numberOfChannels === undefined) {\n                throw new Error('Invalid ADTS frame header.');\n            }\n            decoderConfig.description = buildAacAudioSpecificConfig({\n                objectType: adtsFrame.objectType,\n                sampleRate,\n                numberOfChannels,\n            });\n            requiresAdtsStripping = true;\n        }\n        const newTrackData = {\n            track,\n            type: 'audio',\n            info: {\n                numberOfChannels: meta.decoderConfig.numberOfChannels,\n                sampleRate: meta.decoderConfig.sampleRate,\n                decoderConfig,\n                requiresAdtsStripping,\n            },\n            chunkQueue: [],\n            lastWrittenMsTimestamp: null,\n            closed: false,\n        };\n        this.trackDatas.push(newTrackData);\n        this.trackDatas.sort((a, b) => a.track.id - b.track.id);\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        return newTrackData;\n    }\n    getSubtitleTrackData(track, meta) {\n        const existingTrackData = this.trackDatas.find(x => x.track === track);\n        if (existingTrackData) {\n            return existingTrackData;\n        }\n        validateSubtitleMetadata(meta);\n        assert(meta);\n        assert(meta.config);\n        const newTrackData = {\n            track,\n            type: 'subtitle',\n            info: {\n                config: meta.config,\n            },\n            chunkQueue: [],\n            lastWrittenMsTimestamp: null,\n            closed: false,\n        };\n        this.trackDatas.push(newTrackData);\n        this.trackDatas.sort((a, b) => a.track.id - b.track.id);\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        return newTrackData;\n    }\n    async addEncodedVideoPacket(track, packet, meta) {\n        const release = await this.mutex.acquire();\n        try {\n            const trackData = this.getVideoTrackData(track, packet, meta);\n            const isKeyFrame = packet.type === 'key';\n            this.validateTimestamp(trackData.track, packet.timestamp, isKeyFrame);\n            let timestamp = packet.timestamp;\n            let duration = packet.duration;\n            if (track.metadata.frameRate !== undefined) {\n                // Constrain the time values to the frame rate\n                timestamp = roundToDivisor(timestamp, track.metadata.frameRate);\n                duration = roundToDivisor(duration, track.metadata.frameRate);\n            }\n            const additions = trackData.info.alphaMode\n                ? packet.sideData.alpha ?? null\n                : null;\n            const videoChunk = this.createInternalChunk(packet.data, timestamp, duration, packet.type, additions);\n            if (track.source._codec === 'vp9')\n                this.fixVP9ColorSpace(trackData, videoChunk);\n            trackData.chunkQueue.push(videoChunk);\n            await this.interleaveChunks();\n        }\n        finally {\n            release();\n        }\n    }\n    async addEncodedAudioPacket(track, packet, meta) {\n        const release = await this.mutex.acquire();\n        try {\n            const trackData = this.getAudioTrackData(track, packet, meta);\n            let packetData = packet.data;\n            if (trackData.info.requiresAdtsStripping) {\n                const adtsFrame = readAdtsFrameHeader(FileSlice.tempFromBytes(packetData));\n                if (!adtsFrame) {\n                    throw new Error('Expected ADTS frame, didn\\'t get one.');\n                }\n                const headerLength = adtsFrame.crcCheck === null\n                    ? MIN_ADTS_FRAME_HEADER_SIZE\n                    : MAX_ADTS_FRAME_HEADER_SIZE;\n                packetData = packetData.subarray(headerLength);\n            }\n            const isKeyFrame = packet.type === 'key';\n            this.validateTimestamp(trackData.track, packet.timestamp, isKeyFrame);\n            const audioChunk = this.createInternalChunk(packetData, packet.timestamp, packet.duration, packet.type);\n            trackData.chunkQueue.push(audioChunk);\n            await this.interleaveChunks();\n        }\n        finally {\n            release();\n        }\n    }\n    async addSubtitleCue(track, cue, meta) {\n        const release = await this.mutex.acquire();\n        try {\n            const trackData = this.getSubtitleTrackData(track, meta);\n            this.validateTimestamp(trackData.track, cue.timestamp, true);\n            let bodyText = cue.text;\n            const timestampMs = Math.round(cue.timestamp * 1000);\n            // Replace in-body timestamps so that they're relative to the cue start time\n            inlineTimestampRegex.lastIndex = 0;\n            bodyText = bodyText.replace(inlineTimestampRegex, (match) => {\n                const time = parseSubtitleTimestamp(match.slice(1, -1));\n                const offsetTime = time - timestampMs;\n                return `<${formatSubtitleTimestamp(offsetTime)}>`;\n            });\n            const body = textEncoder.encode(bodyText);\n            const additions = `${cue.settings ?? ''}\\n${cue.identifier ?? ''}\\n${cue.notes ?? ''}`;\n            const subtitleChunk = this.createInternalChunk(body, cue.timestamp, cue.duration, 'key', additions.trim() ? textEncoder.encode(additions) : null);\n            trackData.chunkQueue.push(subtitleChunk);\n            await this.interleaveChunks();\n        }\n        finally {\n            release();\n        }\n    }\n    async interleaveChunks(isFinalCall = false) {\n        if (!isFinalCall && !this.allTracksAreKnown()) {\n            return; // We can't interleave yet as we don't yet know how many tracks we'll truly have\n        }\n        outer: while (true) {\n            let trackWithMinTimestamp = null;\n            let minTimestamp = Infinity;\n            for (const trackData of this.trackDatas) {\n                if (!isFinalCall && trackData.chunkQueue.length === 0 && !trackData.closed) {\n                    break outer;\n                }\n                if (trackData.chunkQueue.length > 0 && trackData.chunkQueue[0].timestamp < minTimestamp) {\n                    trackWithMinTimestamp = trackData;\n                    minTimestamp = trackData.chunkQueue[0].timestamp;\n                }\n            }\n            if (!trackWithMinTimestamp) {\n                break;\n            }\n            const chunk = trackWithMinTimestamp.chunkQueue.shift();\n            this.writeBlock(trackWithMinTimestamp, chunk);\n        }\n        if (!isFinalCall) {\n            await this.writer.flush();\n        }\n    }\n    /**\n     * Due to [a bug in Chromium](https://bugs.chromium.org/p/chromium/issues/detail?id=1377842), VP9 streams often\n     * lack color space information. This method patches in that information.\n     */\n    fixVP9ColorSpace(trackData, chunk) {\n        // http://downloads.webmproject.org/docs/vp9/vp9-bitstream_superframe-and-uncompressed-header_v1.0.pdf\n        if (chunk.type !== 'key')\n            return;\n        if (!trackData.info.decoderConfig.colorSpace || !trackData.info.decoderConfig.colorSpace.matrix)\n            return;\n        const bitstream = new Bitstream(chunk.data);\n        bitstream.skipBits(2);\n        const profileLowBit = bitstream.readBits(1);\n        const profileHighBit = bitstream.readBits(1);\n        const profile = (profileHighBit << 1) + profileLowBit;\n        if (profile === 3)\n            bitstream.skipBits(1);\n        const showExistingFrame = bitstream.readBits(1);\n        if (showExistingFrame)\n            return;\n        const frameType = bitstream.readBits(1);\n        if (frameType !== 0)\n            return; // Just to be sure\n        bitstream.skipBits(2);\n        const syncCode = bitstream.readBits(24);\n        if (syncCode !== 0x498342)\n            return;\n        if (profile >= 2)\n            bitstream.skipBits(1);\n        const colorSpaceID = {\n            rgb: 7,\n            bt709: 2,\n            bt470bg: 1,\n            smpte170m: 3,\n        }[trackData.info.decoderConfig.colorSpace.matrix];\n        // The bitstream position is now at the start of the color space bits.\n        // We can use the global writeBits function here as requested.\n        writeBits(chunk.data, bitstream.pos, bitstream.pos + 3, colorSpaceID);\n    }\n    /** Converts a read-only external chunk into an internal one for easier use. */\n    createInternalChunk(data, timestamp, duration, type, additions = null) {\n        const internalChunk = {\n            data,\n            type,\n            timestamp,\n            duration,\n            additions,\n        };\n        return internalChunk;\n    }\n    /** Writes a block containing media data to the file. */\n    writeBlock(trackData, chunk) {\n        // Due to the interlacing algorithm, this code will be run once we've seen one chunk from every media track.\n        if (!this.segment) {\n            this.createSegment();\n        }\n        const msTimestamp = Math.round(1000 * chunk.timestamp);\n        // We wanna only finalize this cluster (and begin a new one) if we know that each track will be able to\n        // start the new one with a key frame.\n        const keyFrameQueuedEverywhere = this.trackDatas.every((otherTrackData) => {\n            if (trackData === otherTrackData) {\n                return chunk.type === 'key';\n            }\n            const firstQueuedSample = otherTrackData.chunkQueue[0];\n            if (firstQueuedSample) {\n                return firstQueuedSample.type === 'key';\n            }\n            return otherTrackData.closed;\n        });\n        let shouldCreateNewCluster = false;\n        if (!this.currentCluster) {\n            shouldCreateNewCluster = true;\n        }\n        else {\n            assert(this.currentClusterStartMsTimestamp !== null);\n            assert(this.currentClusterMaxMsTimestamp !== null);\n            const relativeTimestamp = msTimestamp - this.currentClusterStartMsTimestamp;\n            shouldCreateNewCluster = (keyFrameQueuedEverywhere\n                // This check is required because that means there is already a block with this timestamp in the\n                // CURRENT chunk, meaning that starting the next cluster at the same timestamp is forbidden (since\n                // the already-written block would belong into it instead).\n                && msTimestamp > this.currentClusterMaxMsTimestamp\n                && relativeTimestamp >= 1000 * (this.format._options.minimumClusterDuration ?? 1))\n                // The cluster would exceed its maximum allowed length. This puts us in an unfortunate position and forces\n                // us to begin the next cluster with a delta frame. Although this is undesirable, it is not forbidden by the\n                // spec and is supported by players.\n                || relativeTimestamp > MAX_CLUSTER_TIMESTAMP_MS;\n        }\n        if (shouldCreateNewCluster) {\n            this.createNewCluster(msTimestamp);\n        }\n        const relativeTimestamp = msTimestamp - this.currentClusterStartMsTimestamp;\n        if (relativeTimestamp < MIN_CLUSTER_TIMESTAMP_MS) {\n            // The block lies too far in the past, it's not representable within this cluster\n            return;\n        }\n        const prelude = new Uint8Array(4);\n        const view = new DataView(prelude.buffer);\n        // 0x80 to indicate it's the last byte of a multi-byte number\n        view.setUint8(0, 0x80 | trackData.track.id);\n        view.setInt16(1, relativeTimestamp, false);\n        const msDuration = Math.round(1000 * chunk.duration);\n        if (!chunk.additions) {\n            // No additions, we can write out a SimpleBlock\n            view.setUint8(3, Number(chunk.type === 'key') << 7); // Flags (keyframe flag only present for SimpleBlock)\n            const simpleBlock = { id: EBMLId.SimpleBlock, data: [\n                    prelude,\n                    chunk.data,\n                ] };\n            this.ebmlWriter.writeEBML(simpleBlock);\n        }\n        else {\n            const blockGroup = { id: EBMLId.BlockGroup, data: [\n                    { id: EBMLId.Block, data: [\n                            prelude,\n                            chunk.data,\n                        ] },\n                    chunk.type === 'delta'\n                        ? {\n                            id: EBMLId.ReferenceBlock,\n                            data: new EBMLSignedInt(trackData.lastWrittenMsTimestamp - msTimestamp),\n                        }\n                        : null,\n                    chunk.additions\n                        ? { id: EBMLId.BlockAdditions, data: [\n                                { id: EBMLId.BlockMore, data: [\n                                        { id: EBMLId.BlockAddID, data: 1 }, // Some players expect BlockAddID to come first\n                                        { id: EBMLId.BlockAdditional, data: chunk.additions },\n                                    ] },\n                            ] }\n                        : null,\n                    msDuration > 0 ? { id: EBMLId.BlockDuration, data: msDuration } : null,\n                ] };\n            this.ebmlWriter.writeEBML(blockGroup);\n        }\n        this.startTimestamp = Math.min(this.startTimestamp, msTimestamp);\n        this.endTimestamp = Math.max(this.endTimestamp, msTimestamp + msDuration);\n        trackData.lastWrittenMsTimestamp = msTimestamp;\n        if (!this.trackDatasInCurrentCluster.has(trackData)) {\n            this.trackDatasInCurrentCluster.set(trackData, {\n                firstMsTimestamp: msTimestamp,\n            });\n        }\n        this.currentClusterMaxMsTimestamp = Math.max(this.currentClusterMaxMsTimestamp, msTimestamp);\n    }\n    /** Creates a new Cluster element to contain media chunks. */\n    createNewCluster(msTimestamp) {\n        if (this.currentCluster) {\n            this.finalizeCurrentCluster();\n        }\n        if (this.format._options.onCluster) {\n            this.writer.startTrackingWrites();\n        }\n        this.currentCluster = {\n            id: EBMLId.Cluster,\n            size: this.format._options.appendOnly ? -1 : CLUSTER_SIZE_BYTES,\n            data: [\n                { id: EBMLId.Timestamp, data: msTimestamp },\n            ],\n        };\n        this.ebmlWriter.writeEBML(this.currentCluster);\n        this.currentClusterStartMsTimestamp = msTimestamp;\n        this.currentClusterMaxMsTimestamp = msTimestamp;\n        this.trackDatasInCurrentCluster.clear();\n    }\n    finalizeCurrentCluster() {\n        assert(this.currentCluster);\n        if (!this.format._options.appendOnly) {\n            const clusterSize = this.writer.getPos() - this.ebmlWriter.dataOffsets.get(this.currentCluster);\n            const endPos = this.writer.getPos();\n            // Write the size now that we know it\n            this.writer.seek(this.ebmlWriter.offsets.get(this.currentCluster) + 4);\n            this.ebmlWriter.writeVarInt(clusterSize, CLUSTER_SIZE_BYTES);\n            this.writer.seek(endPos);\n        }\n        if (this.format._options.onCluster) {\n            assert(this.currentClusterStartMsTimestamp !== null);\n            const { data, start } = this.writer.stopTrackingWrites();\n            this.format._options.onCluster(data, start, this.currentClusterStartMsTimestamp / 1000);\n        }\n        const clusterOffsetFromSegment = this.ebmlWriter.offsets.get(this.currentCluster) - this.segmentDataOffset;\n        // Group tracks by their first timestamp and create a CuePoint for each unique timestamp\n        const groupedByTimestamp = new Map();\n        for (const [trackData, { firstMsTimestamp }] of this.trackDatasInCurrentCluster) {\n            if (!groupedByTimestamp.has(firstMsTimestamp)) {\n                groupedByTimestamp.set(firstMsTimestamp, []);\n            }\n            groupedByTimestamp.get(firstMsTimestamp).push(trackData);\n        }\n        const groupedAndSortedByTimestamp = [...groupedByTimestamp.entries()].sort((a, b) => a[0] - b[0]);\n        // Add CuePoints to the Cues element for better seeking\n        for (const [msTimestamp, trackDatas] of groupedAndSortedByTimestamp) {\n            assert(this.cues);\n            this.cues.data.push({ id: EBMLId.CuePoint, data: [\n                    { id: EBMLId.CueTime, data: msTimestamp },\n                    // Create CueTrackPositions for each track that starts at this timestamp\n                    ...trackDatas.map((trackData) => {\n                        return { id: EBMLId.CueTrackPositions, data: [\n                                { id: EBMLId.CueTrack, data: trackData.track.id },\n                                { id: EBMLId.CueClusterPosition, data: clusterOffsetFromSegment },\n                            ] };\n                    }),\n                ] });\n        }\n    }\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    async onTrackClose(track) {\n        const release = await this.mutex.acquire();\n        const trackData = this.trackDatas.find(x => x.track === track);\n        if (trackData) {\n            trackData.closed = true;\n        }\n        if (this.allTracksAreKnown()) {\n            this.allTracksKnown.resolve();\n        }\n        // Since a track is now closed, we may be able to write out chunks that were previously waiting\n        await this.interleaveChunks();\n        release();\n    }\n    /** Finalizes the file, making it ready for use. Must be called after all media chunks have been added. */\n    async finalize() {\n        const release = await this.mutex.acquire();\n        this.allTracksKnown.resolve();\n        for (const trackData of this.trackDatas) {\n            trackData.closed = true;\n        }\n        if (!this.segment) {\n            this.createSegment();\n        }\n        // Flush any remaining queued chunks to the file\n        await this.interleaveChunks(true);\n        if (this.currentCluster) {\n            this.finalizeCurrentCluster();\n        }\n        assert(this.cues);\n        this.ebmlWriter.writeEBML(this.cues);\n        if (!this.format._options.appendOnly) {\n            // Write the Segment size\n            const segmentSize = this.writer.getPos() - this.segmentDataOffset;\n            this.writer.seek(this.ebmlWriter.offsets.get(this.segment) + 4);\n            this.ebmlWriter.writeVarInt(segmentSize, SEGMENT_SIZE_BYTES);\n            // Write the duration of the media to the Segment\n            const duration = this.startTimestamp === Infinity\n                ? 0\n                : this.endTimestamp - this.startTimestamp;\n            this.segmentDuration.data = new EBMLFloat64(duration);\n            this.writer.seek(this.ebmlWriter.offsets.get(this.segmentDuration));\n            this.ebmlWriter.writeEBML(this.segmentDuration);\n            // Fill in SeekHead position data and write it again\n            assert(this.seekHead);\n            this.writer.seek(this.ebmlWriter.offsets.get(this.seekHead));\n            this.maybeCreateSeekHead(true);\n            this.ebmlWriter.writeEBML(this.seekHead);\n        }\n        release();\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { buildAacAudioSpecificConfig, parseAacAudioSpecificConfig } from '../shared/aac-misc.js';\nimport { AUDIO_CODECS, parsePcmCodec, PCM_AUDIO_CODECS, SUBTITLE_CODECS, VIDEO_CODECS, } from './codec.js';\nimport { assert, assertNever, binarySearchLessOrEqual, CallSerializer, clamp, clearIntervalUnthrottled, floorToDivisor, last, promiseWithResolvers, roundToDivisor, setInt24, setIntervalUnthrottled, setUint24, toUint8Array, } from './misc.js';\nimport { SubtitleParser } from './subtitles.js';\nimport { toAlaw, toUlaw } from './pcm.js';\nimport { customVideoEncoders, customAudioEncoders, } from './custom-coder.js';\nimport { EncodedPacket } from './packet.js';\nimport { AudioSample, audioSampleToInterleavedFormat, toInterleavedAudioFormat, VideoSample, } from './sample.js';\nimport { buildAudioEncoderConfig, buildVideoEncoderConfig, validateAudioEncodingConfig, validateVideoEncodingConfig, } from './encode.js';\nimport { AudioResampler } from './resample.js';\nimport { determineVideoPacketType } from './codec-data.js';\nimport { Logging } from './logging.js';\n/**\n * Base class for media sources. Media sources are used to add media samples to an output file.\n * @group Media sources\n * @public\n */\nexport class MediaSource {\n    constructor() {\n        /** @internal */\n        this._connectedTrack = null;\n        /** @internal */\n        this._closingPromise = null;\n        /** @internal */\n        this._closed = false;\n    }\n    /** @internal */\n    _ensureValidAdd() {\n        if (!this._connectedTrack) {\n            throw new Error('Source is not connected to an output track.');\n        }\n        if (this._connectedTrack.output.state === 'canceled') {\n            throw new Error('Output has been canceled.');\n        }\n        if (this._connectedTrack.output.state === 'finalizing' || this._connectedTrack.output.state === 'finalized') {\n            throw new Error('Output has been finalized.');\n        }\n        if (this._connectedTrack.output.state === 'pending') {\n            throw new Error('Output has not started.');\n        }\n        if (this._closed) {\n            throw new Error('Source is closed.');\n        }\n    }\n    /** @internal */\n    async _start() { }\n    /** @internal */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    async _flushAndClose(forceClose) { }\n    /**\n     * Closes this source. This prevents future samples from being added and signals to the output file that no further\n     * samples will come in for this track. Calling `.close()` is optional but recommended after adding the\n     * last sample - for improved performance and reduced memory usage.\n     */\n    close() {\n        if (this._closingPromise) {\n            return;\n        }\n        const connectedTrack = this._connectedTrack;\n        if (!connectedTrack) {\n            throw new Error('Cannot call close without connecting the source to an output track.');\n        }\n        if (connectedTrack.output.state === 'pending') {\n            throw new Error('Cannot call close before output has been started.');\n        }\n        this._closingPromise = (async () => {\n            await this._flushAndClose(false);\n            this._closed = true;\n            if (connectedTrack.output.state === 'finalizing' || connectedTrack.output.state === 'finalized') {\n                return;\n            }\n            connectedTrack.output._muxer.onTrackClose(connectedTrack);\n        })();\n    }\n    /** @internal */\n    async _flushOrWaitForOngoingClose(forceClose) {\n        return this._closingPromise ??= (async () => {\n            await this._flushAndClose(forceClose);\n            this._closed = true;\n        })();\n    }\n}\n/**\n * Base class for video sources - sources for video tracks.\n * @group Media sources\n * @public\n */\nexport class VideoSource extends MediaSource {\n    /** Internal constructor. */\n    constructor(codec) {\n        super();\n        /** @internal */\n        this._connectedTrack = null;\n        if (!VIDEO_CODECS.includes(codec)) {\n            throw new TypeError(`Invalid video codec '${codec}'. Must be one of: ${VIDEO_CODECS.join(', ')}.`);\n        }\n        this._codec = codec;\n    }\n}\nconst maybeEnsureIsKeyPacket = (track, packet) => {\n    if (track.metadata.hasOnlyKeyPackets && packet.type !== 'key') {\n        throw new Error('Cannot add non-key packets to a hasOnlyKeyPackets video track.');\n    }\n};\n/**\n * The most basic video source; can be used to directly pipe encoded packets into the output file.\n * @group Media sources\n * @public\n */\nexport class EncodedVideoPacketSource extends VideoSource {\n    /** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */\n    constructor(codec) {\n        super(codec);\n    }\n    /**\n     * Adds an encoded packet to the output video track. Packets must be added in *decode order*, while a packet's\n     * timestamp must be its *presentation timestamp*. B-frames are handled automatically.\n     *\n     * @param meta - Additional metadata from the encoder. You should pass this for the first call, including a valid\n     * decoder config.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    add(packet, meta) {\n        if (!(packet instanceof EncodedPacket)) {\n            throw new TypeError('packet must be an EncodedPacket.');\n        }\n        if (packet.isMetadataOnly) {\n            throw new TypeError('Metadata-only packets cannot be added.');\n        }\n        if (meta !== undefined && (!meta || typeof meta !== 'object')) {\n            throw new TypeError('meta, when provided, must be an object.');\n        }\n        this._ensureValidAdd();\n        maybeEnsureIsKeyPacket(this._connectedTrack, packet);\n        return this._connectedTrack.output._muxer.addEncodedVideoPacket(this._connectedTrack, packet, meta);\n    }\n}\nclass VideoEncoderWrapper {\n    constructor(source, encodingConfig) {\n        this.source = source;\n        this.encodingConfig = encodingConfig;\n        this.ensureEncoderPromise = null;\n        this.encoderInitialized = false;\n        this.encoder = null;\n        this.muxer = null;\n        this.lastMultipleOfKeyFrameInterval = -1;\n        this.emittedEncoderPackets = 0;\n        // Tracks the input dimensions of the first frame\n        this.codedWidth = null;\n        this.codedHeight = null;\n        // Tracks the output dimensions of the first frame (used to lock dimensions for fill/contain/cover)\n        this.outputWidth = null;\n        this.outputHeight = null;\n        // Frame rate normalization state\n        this.frameRateLastSample = null;\n        this.frameRateLastTimestamp = null;\n        this.frameRateLastEndTimestamp = null;\n        // VideoEncoder converts everything to microseconds, so we need to do some bookkeeping to restore the original\n        // timing information\n        this.preciseTimings = [];\n        this.customEncoder = null;\n        this.customEncoderCallSerializer = new CallSerializer();\n        this.customEncoderQueueSize = 0;\n        // Alpha stuff\n        this.alphaEncoder = null;\n        this.splitter = null;\n        this.splitterCreationFailed = false;\n        this.alphaFrameQueue = [];\n        /**\n         * Encoders typically throw their errors \"out of band\", meaning asynchronously in some other execution context.\n         * However, we want to surface these errors to the user within the normal control flow, so they don't go uncaught.\n         * So, we keep track of the encoder error and throw it as soon as we get the chance.\n         */\n        this.error = null;\n        this.closed = false;\n        this.lastMuxerPromise = Promise.resolve();\n    }\n    async add(videoSample, shouldClose, encodeOptions) {\n        const originalSample = videoSample;\n        try {\n            this.checkForEncoderError();\n            this.source._ensureValidAdd();\n            const config = this.encodingConfig;\n            const sizeChangeBehavior = config.sizeChangeBehavior ?? 'deny';\n            let isSizeChange = false;\n            // Ensure video sample size remains constant or handle the change\n            if (this.codedWidth !== null && this.codedHeight !== null) {\n                if (videoSample.codedWidth !== this.codedWidth || videoSample.codedHeight !== this.codedHeight) {\n                    isSizeChange = true;\n                    if (sizeChangeBehavior === 'deny') {\n                        throw new Error(`Video sample size must remain constant. Expected ${this.codedWidth}x${this.codedHeight},`\n                            + ` got ${videoSample.codedWidth}x${videoSample.codedHeight}. To allow the sample size to`\n                            + ` change over time, set \\`sizeChangeBehavior\\` to a value other than 'deny' in the`\n                            + ` encoding options.`);\n                    }\n                }\n            }\n            else {\n                this.codedWidth = videoSample.codedWidth;\n                this.codedHeight = videoSample.codedHeight;\n            }\n            // Determine if we need to apply transformations via canvas\n            const hasTransformConfig = config.transform?.width !== undefined\n                || config.transform?.height !== undefined\n                || config.transform?.rotate !== undefined\n                || config.transform?.crop !== undefined\n                || config.transform?.force === true;\n            const needsTransform = hasTransformConfig || (isSizeChange && sizeChangeBehavior !== 'passThrough');\n            if (needsTransform) {\n                let targetWidth = config.transform?.width;\n                let targetHeight = config.transform?.height;\n                let appliedFit = config.transform?.fit ?? 'fill';\n                // If the size changed and behavior is fill/contain/cover, lock to the original output dimensions\n                if (isSizeChange && sizeChangeBehavior !== 'passThrough') {\n                    assert(this.outputWidth);\n                    assert(this.outputHeight);\n                    assert(sizeChangeBehavior !== 'deny');\n                    targetWidth = this.outputWidth;\n                    targetHeight = this.outputHeight;\n                    appliedFit = sizeChangeBehavior;\n                }\n                const transformed = await videoSample.transform({\n                    width: targetWidth,\n                    height: targetHeight,\n                    roundDimensionsTo: 2,\n                    crop: config.transform?.crop,\n                    rotate: config.transform?.rotate,\n                    fit: appliedFit,\n                    alpha: config.alpha,\n                });\n                // Save the output dimensions of the first frame\n                if (this.outputWidth === null || this.outputHeight === null) {\n                    this.outputWidth = transformed.displayWidth;\n                    this.outputHeight = transformed.displayHeight;\n                }\n                if (shouldClose) {\n                    videoSample.close();\n                }\n                videoSample = transformed;\n                shouldClose = true;\n            }\n            else {\n                // If no canvas is needed, we still need to record the output dimensions for the first frame\n                if (this.outputWidth === null || this.outputHeight === null) {\n                    this.outputWidth = videoSample.codedWidth;\n                    this.outputHeight = videoSample.codedHeight;\n                }\n            }\n            const frameRate = config.transform?.frameRate;\n            if (frameRate !== undefined) {\n                // Apply frame rate normalization\n                const originalEndTimestamp = videoSample.timestamp + videoSample.duration;\n                const alignedTimestamp = floorToDivisor(videoSample.timestamp, frameRate);\n                if (this.frameRateLastSample !== null) {\n                    if (alignedTimestamp <= this.frameRateLastTimestamp) {\n                        // Same frame rate slot, replace stored sample with the newer one\n                        this.frameRateLastSample.close();\n                        this.frameRateLastSample = videoSample.clone();\n                        this.frameRateLastEndTimestamp = originalEndTimestamp;\n                        return;\n                    }\n                    else {\n                        // Pad the gap by repeating the previous frame\n                        await this.padFrameRate(alignedTimestamp, encodeOptions);\n                    }\n                }\n                // Clone if the sample is still the user's, to avoid mutating externally-owned data\n                if (videoSample === originalSample) {\n                    videoSample = videoSample.clone();\n                    shouldClose = true;\n                }\n                videoSample.setTimestamp(alignedTimestamp);\n                videoSample.setDuration(1 / frameRate);\n                this.frameRateLastSample?.close();\n                this.frameRateLastSample = videoSample.clone();\n                this.frameRateLastTimestamp = alignedTimestamp;\n                this.frameRateLastEndTimestamp = originalEndTimestamp;\n            }\n            await this.processAndEncode(videoSample, encodeOptions);\n        }\n        finally {\n            if (shouldClose) {\n                videoSample.close();\n            }\n        }\n    }\n    /**\n     * Runs the process function (if any) and encodes the resulting samples.\n     */\n    async processAndEncode(videoSample, encodeOptions) {\n        const config = this.encodingConfig;\n        let samplesToEncode;\n        // Apply the user-defined process function, if any\n        if (config.transform?.process) {\n            let processed = config.transform.process(videoSample);\n            if (processed instanceof Promise) {\n                processed = await processed;\n            }\n            if (processed === null) {\n                return;\n            }\n            if (!Array.isArray(processed)) {\n                processed = [processed];\n            }\n            samplesToEncode = processed.map((x) => {\n                if (x instanceof VideoSample) {\n                    return x;\n                }\n                if (typeof VideoFrame !== 'undefined' && x instanceof VideoFrame) {\n                    return new VideoSample(x);\n                }\n                // Calling the VideoSample constructor here will automatically handle input validation for us\n                // (it throws for any non-legal argument).\n                return new VideoSample(x, {\n                    timestamp: videoSample.timestamp,\n                    duration: videoSample.duration,\n                });\n            });\n        }\n        else {\n            samplesToEncode = [videoSample];\n        }\n        try {\n            for (const sampleToEncode of samplesToEncode) {\n                if (!this.encoderInitialized) {\n                    if (!this.ensureEncoderPromise) {\n                        this.ensureEncoder(sampleToEncode);\n                    }\n                    // No, this \"if\" statement is not useless. Sometimes, the above call to\n                    // `ensureEncoder` might have synchronously completed and the encoder is\n                    // already initialized. In this case, we don't need to await the promise\n                    // anymore. This also fixes nasty async race condition bugs when multiple\n                    // code paths are calling this method: It's important that the call that\n                    // initialized the encoder go through this code first.\n                    if (!this.encoderInitialized) {\n                        await this.ensureEncoderPromise;\n                    }\n                }\n                assert(this.encoderInitialized);\n                if (this.closed) {\n                    break;\n                }\n                const keyFrameInterval = this.encodingConfig.keyFrameInterval ?? 2;\n                const multipleOfKeyFrameInterval = Math.floor(sampleToEncode.timestamp / keyFrameInterval);\n                const mergedEncodeOptions = { ...sampleToEncode.encodeOptions, ...encodeOptions };\n                const finalEncodeOptions = {\n                    ...mergedEncodeOptions,\n                    keyFrame: mergedEncodeOptions.keyFrame !== undefined\n                        ? mergedEncodeOptions.keyFrame\n                        // Ensure a key frame every keyFrameInterval seconds. It is important that all video tracks\n                        // follow the same \"key frame\" rhythm, because aligned key frames are required to start new\n                        // fragments in ISOBMFF or clusters in Matroska (or at least desirable).\n                        : keyFrameInterval === 0\n                            || multipleOfKeyFrameInterval !== this.lastMultipleOfKeyFrameInterval,\n                };\n                this.lastMultipleOfKeyFrameInterval = multipleOfKeyFrameInterval;\n                this.encodingConfig.onEncodedSample?.(sampleToEncode);\n                if (this.customEncoder) {\n                    this.customEncoderQueueSize++;\n                    // We clone the sample so it cannot be closed on us from the outside before it reaches the encoder\n                    const clonedSample = sampleToEncode.clone();\n                    const promise = this.customEncoderCallSerializer\n                        .call(() => this.customEncoder.encode(clonedSample, finalEncodeOptions))\n                        .then(() => this.customEncoderQueueSize--)\n                        .catch((error) => this.error ??= error)\n                        .finally(() => {\n                        clonedSample.close();\n                    });\n                    if (this.customEncoderQueueSize >= 4) {\n                        await promise;\n                    }\n                }\n                else {\n                    assert(this.encoder);\n                    const videoFrame = sampleToEncode.toVideoFrame();\n                    const preciseTimingIndex = binarySearchLessOrEqual(this.preciseTimings, videoFrame.timestamp, x => x.microsecondTimestamp);\n                    const existingEntry = preciseTimingIndex !== -1\n                        ? this.preciseTimings[preciseTimingIndex]\n                        : null;\n                    if (existingEntry && existingEntry.microsecondTimestamp === videoFrame.timestamp) {\n                        if (existingEntry.timestamp !== sampleToEncode.timestamp) {\n                            // Mapping isn't unique, can't use the timestamp\n                            existingEntry.timestampIsValid = false;\n                        }\n                        if (existingEntry.duration !== sampleToEncode.duration) {\n                            // Mapping isn't unique, can't use the duration\n                            existingEntry.durationIsValid = false;\n                        }\n                    }\n                    else {\n                        this.preciseTimings.splice(preciseTimingIndex + 1, 0, {\n                            microsecondTimestamp: videoFrame.timestamp,\n                            timestamp: sampleToEncode.timestamp,\n                            duration: sampleToEncode.duration,\n                            timestampIsValid: true,\n                            durationIsValid: true,\n                        });\n                        // Make sure it doesn't grow indefinitely\n                        if (this.preciseTimings.length > 128) {\n                            this.preciseTimings.shift();\n                        }\n                    }\n                    if (!this.alphaEncoder) {\n                        // No alpha encoder, simple case\n                        this.encoder.encode(videoFrame, finalEncodeOptions);\n                        videoFrame.close();\n                    }\n                    else {\n                        // We're expected to encode alpha as well\n                        const frameDefinitelyHasNoAlpha = !!videoFrame.format && !videoFrame.format.includes('A');\n                        if (frameDefinitelyHasNoAlpha || this.splitterCreationFailed) {\n                            this.alphaFrameQueue.push(null);\n                            this.encoder.encode(videoFrame, finalEncodeOptions);\n                            videoFrame.close();\n                        }\n                        else {\n                            const width = videoFrame.displayWidth;\n                            const height = videoFrame.displayHeight;\n                            if (!this.splitter) {\n                                this.splitter = new ColorAlphaSplitter(width, height);\n                            }\n                            // The splitter takes ownership, so no need to close the frames ourselves\n                            const { colorFrame, alphaFrame } = await this.splitter.update(videoFrame);\n                            this.alphaFrameQueue.push(alphaFrame);\n                            this.encoder.encode(colorFrame, finalEncodeOptions);\n                            colorFrame.close();\n                        }\n                    }\n                    // We need to do this after sending the frame to the encoder as the frame otherwise might be closed\n                    if (this.encoder.encodeQueueSize >= 4) {\n                        await new Promise(resolve => this.encoder.addEventListener('dequeue', resolve, { once: true }));\n                    }\n                }\n                await this.lastMuxerPromise; // Allow the writer to apply backpressure\n            }\n        }\n        finally {\n            for (const sample of samplesToEncode) {\n                if (sample !== videoSample) {\n                    sample.close();\n                }\n            }\n        }\n    }\n    /** Repeats the last frame rate sample to fill the gap up to the given timestamp. */\n    async padFrameRate(until, encodeOptions) {\n        const frameRate = this.encodingConfig.transform.frameRate;\n        assert(this.frameRateLastSample);\n        const frameDifference = Math.round((until - this.frameRateLastTimestamp) * frameRate);\n        for (let i = 1; i < frameDifference; i++) {\n            const sample = this.frameRateLastSample.clone();\n            sample.setTimestamp(this.frameRateLastTimestamp + i / frameRate);\n            sample.setDuration(1 / frameRate);\n            await this.processAndEncode(sample, encodeOptions);\n            sample.close();\n        }\n    }\n    ensureEncoder(videoSample) {\n        this.ensureEncoderPromise = (async () => {\n            const encoderConfig = buildVideoEncoderConfig({\n                ...this.encodingConfig,\n                width: videoSample.codedWidth,\n                height: videoSample.codedHeight,\n                squarePixelWidth: videoSample.squarePixelWidth,\n                squarePixelHeight: videoSample.squarePixelHeight,\n                framerate: this.source._connectedTrack?.metadata.frameRate,\n            });\n            this.encodingConfig.onEncoderConfig?.(encoderConfig);\n            const MatchingCustomEncoder = customVideoEncoders.find(x => x.supports(this.encodingConfig.codec, encoderConfig));\n            if (MatchingCustomEncoder) {\n                // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n                this.customEncoder = new MatchingCustomEncoder();\n                // @ts-expect-error It's technically readonly\n                this.customEncoder.codec = this.encodingConfig.codec;\n                // @ts-expect-error It's technically readonly\n                this.customEncoder.config = encoderConfig;\n                // @ts-expect-error It's technically readonly\n                this.customEncoder.onPacket = (packet, meta) => {\n                    if (!(packet instanceof EncodedPacket)) {\n                        throw new TypeError('The first argument passed to onPacket must be an EncodedPacket.');\n                    }\n                    if (meta !== undefined && (!meta || typeof meta !== 'object')) {\n                        throw new TypeError('The second argument passed to onPacket must be an object or undefined.');\n                    }\n                    maybeEnsureIsKeyPacket(this.source._connectedTrack, packet);\n                    this.encodingConfig.onEncodedPacket?.(packet, meta);\n                    this.lastMuxerPromise\n                        = this.muxer.addEncodedVideoPacket(this.source._connectedTrack, packet, meta)\n                            .catch((error) => {\n                            this.error ??= error;\n                        });\n                };\n                await this.customEncoder.init();\n            }\n            else {\n                if (typeof VideoEncoder === 'undefined') {\n                    throw new Error('VideoEncoder is not supported by this browser.');\n                }\n                encoderConfig.alpha = 'discard'; // Since we handle alpha ourselves\n                if (this.encodingConfig.alpha === 'keep') {\n                    // Encoding alpha requires using two parallel encoders, so we need to make sure they stay in sync\n                    // and that neither of them drops frames. Setting latencyMode to 'quality' achieves this, because\n                    // \"User Agents MUST not drop frames to achieve the target bitrate and/or framerate.\"\n                    encoderConfig.latencyMode = 'quality';\n                }\n                const hasOddDimension = encoderConfig.width % 2 === 1 || encoderConfig.height % 2 === 1;\n                if (hasOddDimension\n                    && (this.encodingConfig.codec === 'avc' || this.encodingConfig.codec === 'hevc')) {\n                    // Throw a special error for this case as it gets hit often\n                    throw new Error(`The dimensions ${encoderConfig.width}x${encoderConfig.height} are not supported for codec`\n                        + ` '${this.encodingConfig.codec}'; both width and height must be even numbers. Make sure to`\n                        + ` round your dimensions to the nearest even number.`);\n                }\n                const support = await VideoEncoder.isConfigSupported(encoderConfig);\n                if (!support.supported) {\n                    throw new Error(`This specific encoder configuration (${encoderConfig.codec}, ${encoderConfig.bitrate} bps,`\n                        + ` ${encoderConfig.width}x${encoderConfig.height}, hardware acceleration:`\n                        + ` ${encoderConfig.hardwareAcceleration ?? 'no-preference'}) is not supported by this browser.`\n                        + ` Consider using another codec or changing your video parameters.`);\n                }\n                /** Queue of color chunks waiting for their alpha counterpart. */\n                const colorChunkQueue = [];\n                /** Each value is the number of encoded alpha chunks at which a null alpha chunk should be added. */\n                const nullAlphaChunkQueue = [];\n                let encodedAlphaChunkCount = 0;\n                let alphaEncoderQueue = 0;\n                const addPacket = (colorChunk, alphaChunk, meta) => {\n                    const sideData = {};\n                    if (alphaChunk) {\n                        const alphaData = new Uint8Array(alphaChunk.byteLength);\n                        alphaChunk.copyTo(alphaData);\n                        sideData.alpha = alphaData;\n                    }\n                    let packet = EncodedPacket.fromEncodedChunk(colorChunk, sideData);\n                    // See if there's a relevant timing entry to refine the packet's timing data\n                    const preciseTimingIndex = binarySearchLessOrEqual(this.preciseTimings, colorChunk.timestamp, x => x.microsecondTimestamp);\n                    const entry = preciseTimingIndex !== -1\n                        ? this.preciseTimings[preciseTimingIndex]\n                        : null;\n                    let actualType = null;\n                    if (this.emittedEncoderPackets === 0 && packet.type === 'delta' && meta?.decoderConfig) {\n                        // https://github.com/Vanilagy/mediabunny/issues/365\n                        // We expect the first packet to be a key packet. If it's not, let's actually verify that it's\n                        // not by getting the actual type.\n                        actualType = determineVideoPacketType(this.encodingConfig.codec, meta.decoderConfig, packet.data);\n                    }\n                    // Define the packet\n                    if ((entry && entry.microsecondTimestamp === colorChunk.timestamp) || actualType !== null) {\n                        packet = packet.clone({\n                            timestamp: entry?.timestampIsValid ? entry.timestamp : undefined,\n                            duration: entry?.durationIsValid ? entry.duration : undefined,\n                            type: actualType ?? undefined,\n                        });\n                    }\n                    maybeEnsureIsKeyPacket(this.source._connectedTrack, packet);\n                    this.encodingConfig.onEncodedPacket?.(packet, meta);\n                    this.lastMuxerPromise\n                        = this.muxer.addEncodedVideoPacket(this.source._connectedTrack, packet, meta)\n                            .catch((error) => {\n                            this.error ??= error;\n                        });\n                    this.emittedEncoderPackets++;\n                };\n                const stack = new Error('Encoding error').stack;\n                this.encoder = new VideoEncoder({\n                    output: (chunk, meta) => {\n                        if (!this.alphaEncoder) {\n                            // We're done\n                            addPacket(chunk, null, meta);\n                            return;\n                        }\n                        const alphaFrame = this.alphaFrameQueue.shift();\n                        assert(alphaFrame !== undefined);\n                        if (alphaFrame) {\n                            this.alphaEncoder.encode(alphaFrame, {\n                                // Crucial: The alpha frame is forced to be a key frame whenever the color frame\n                                // also is. Without this, playback can glitch and even crash in some browsers.\n                                // This is the reason why the two encoders are wired in series and not in parallel.\n                                keyFrame: chunk.type === 'key',\n                            });\n                            alphaEncoderQueue++;\n                            alphaFrame.close();\n                            colorChunkQueue.push({ chunk, meta });\n                        }\n                        else {\n                            // There was no alpha component for this frame\n                            if (alphaEncoderQueue === 0) {\n                                // No pending alpha encodes either, so we're done\n                                addPacket(chunk, null, meta);\n                            }\n                            else {\n                                // There are still alpha encodes pending, so we can't add the packet immediately since\n                                // we'd end up with out-of-order packets. Instead, let's queue a null alpha chunk to be\n                                // added in the future, after the current encoder workload has completed:\n                                nullAlphaChunkQueue.push(encodedAlphaChunkCount + alphaEncoderQueue);\n                                colorChunkQueue.push({ chunk, meta });\n                            }\n                        }\n                    },\n                    error: (error) => {\n                        error.stack = stack; // Provide a more useful stack trace, the default one sucks\n                        this.error ??= error;\n                    },\n                });\n                this.encoder.configure(encoderConfig);\n                if (this.encodingConfig.alpha === 'keep') {\n                    const stack = new Error('Encoding error').stack;\n                    // We need to encode alpha as well, which we do with a separate encoder\n                    this.alphaEncoder = new VideoEncoder({\n                        // We ignore the alpha chunk's metadata\n                        // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                        output: (chunk, meta) => {\n                            alphaEncoderQueue--;\n                            // There has to be a color chunk because the encoders are wired in series\n                            const colorChunk = colorChunkQueue.shift();\n                            assert(colorChunk !== undefined);\n                            addPacket(colorChunk.chunk, chunk, colorChunk.meta);\n                            // See if there are any null alpha chunks queued up\n                            encodedAlphaChunkCount++;\n                            while (nullAlphaChunkQueue.length > 0\n                                && nullAlphaChunkQueue[0] === encodedAlphaChunkCount) {\n                                nullAlphaChunkQueue.shift();\n                                const colorChunk = colorChunkQueue.shift();\n                                assert(colorChunk !== undefined);\n                                addPacket(colorChunk.chunk, null, colorChunk.meta);\n                            }\n                        },\n                        error: (error) => {\n                            error.stack = stack; // Provide a more useful stack trace\n                            this.error ??= error;\n                        },\n                    });\n                    this.alphaEncoder.configure(encoderConfig);\n                }\n            }\n            assert(this.source._connectedTrack);\n            this.muxer = this.source._connectedTrack.output._muxer;\n            this.encoderInitialized = true;\n        })();\n    }\n    async flushAndClose(forceClose) {\n        if (!forceClose) {\n            this.checkForEncoderError();\n        }\n        // Final frame rate padding: fill remaining frames up to the last sample's original end timestamp\n        if (!forceClose && this.frameRateLastSample) {\n            const frameRate = this.encodingConfig.transform.frameRate;\n            const alignedEnd = floorToDivisor(this.frameRateLastEndTimestamp, frameRate);\n            await this.padFrameRate(alignedEnd);\n        }\n        this.closed = true;\n        this.frameRateLastSample?.close();\n        this.frameRateLastSample = null;\n        if (this.customEncoder) {\n            if (!forceClose) {\n                void this.customEncoderCallSerializer.call(() => this.customEncoder.flush());\n            }\n            await this.customEncoderCallSerializer.call(() => this.customEncoder.close());\n        }\n        else if (this.encoder) {\n            if (!forceClose) {\n                // These are wired in series, therefore they must also be flushed in series\n                await this.encoder.flush();\n                await this.alphaEncoder?.flush();\n            }\n            if (this.encoder.state !== 'closed') {\n                this.encoder.close();\n            }\n            if (this.alphaEncoder && this.alphaEncoder.state !== 'closed') {\n                this.alphaEncoder.close();\n            }\n            this.alphaFrameQueue.forEach(x => x?.close());\n            this.splitter?.close();\n        }\n        if (!forceClose) {\n            this.checkForEncoderError();\n        }\n    }\n    getQueueSize() {\n        if (this.customEncoder) {\n            return this.customEncoderQueueSize;\n        }\n        else {\n            // Because the color and alpha encoders are wired in series, there's no need to also include the alpha\n            // encoder's queue size here\n            return this.encoder?.encodeQueueSize ?? 0;\n        }\n    }\n    checkForEncoderError() {\n        if (this.error) {\n            throw this.error;\n        }\n    }\n}\nlet splitterGpuUnavailable = false;\n/** Utility class for splitting a composite frame into separate color and alpha components. */\nexport class ColorAlphaSplitter {\n    constructor(initialWidth, initialHeight) {\n        this.canvas = null;\n        this.gl = null;\n        this.colorProgram = null;\n        this.alphaProgram = null;\n        this.vao = null;\n        this.sourceTexture = null;\n        this.alphaResolutionLocation = null;\n        this.worker = null;\n        this.pendingRequests = new Map();\n        this.nextRequestId = 0;\n        const canMakeCanvas = typeof OffscreenCanvas !== 'undefined'\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            || (typeof document !== 'undefined' && typeof document.createElement === 'function');\n        if (!ColorAlphaSplitter.forceCpu && canMakeCanvas && !splitterGpuUnavailable) {\n            // Try the GPU path. If anything goes wrong, we silently fall back to the CPU path.\n            try {\n                if (typeof OffscreenCanvas !== 'undefined') {\n                    this.canvas = new OffscreenCanvas(initialWidth, initialHeight);\n                }\n                else {\n                    this.canvas = document.createElement('canvas');\n                    this.canvas.width = initialWidth;\n                    this.canvas.height = initialHeight;\n                }\n                const gl = this.canvas.getContext('webgl2', {\n                    alpha: true, // Needed due to the YUV thing we do for alpha\n                }); // Casting because of some TypeScript weirdness\n                if (!gl) {\n                    throw new Error('Couldn\\'t acquire WebGL 2 context.');\n                }\n                this.gl = gl;\n                this.colorProgram = this.createColorProgram();\n                this.alphaProgram = this.createAlphaProgram();\n                this.vao = this.createVAO();\n                this.sourceTexture = this.createTexture();\n                this.alphaResolutionLocation = this.gl.getUniformLocation(this.alphaProgram, 'u_resolution');\n                this.gl.useProgram(this.colorProgram);\n                this.gl.uniform1i(this.gl.getUniformLocation(this.colorProgram, 'u_sourceTexture'), 0);\n                this.gl.useProgram(this.alphaProgram);\n                this.gl.uniform1i(this.gl.getUniformLocation(this.alphaProgram, 'u_sourceTexture'), 0);\n            }\n            catch (error) {\n                this.gl = null;\n                this.canvas = null;\n                splitterGpuUnavailable = true;\n                Logging._warn('Falling back to CPU for color/alpha splitting.', error);\n            }\n        }\n    }\n    async update(sourceFrame) {\n        if (this.gl) {\n            return this.updateGpu(sourceFrame);\n        }\n        else {\n            return this.updateCpu(sourceFrame);\n        }\n    }\n    updateGpu(sourceFrame) {\n        assert(this.gl);\n        assert(this.canvas);\n        if (sourceFrame.displayWidth !== this.canvas.width || sourceFrame.displayHeight !== this.canvas.height) {\n            this.canvas.width = sourceFrame.displayWidth;\n            this.canvas.height = sourceFrame.displayHeight;\n        }\n        this.gl.activeTexture(this.gl.TEXTURE0);\n        this.gl.bindTexture(this.gl.TEXTURE_2D, this.sourceTexture);\n        this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, sourceFrame);\n        const colorFrame = this.runColorProgram(sourceFrame);\n        const alphaFrame = this.runAlphaProgram(sourceFrame);\n        sourceFrame.close();\n        return { colorFrame, alphaFrame };\n    }\n    createVertexShader() {\n        assert(this.gl);\n        return this.createShader(this.gl.VERTEX_SHADER, `#version 300 es\n\t\t\tin vec2 a_position;\n\t\t\tin vec2 a_texCoord;\n\t\t\tout vec2 v_texCoord;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tgl_Position = vec4(a_position, 0.0, 1.0);\n\t\t\t\tv_texCoord = a_texCoord;\n\t\t\t}\n\t\t`);\n    }\n    createColorProgram() {\n        assert(this.gl);\n        const vertexShader = this.createVertexShader();\n        // This shader is simple, simply copy the color information while setting alpha to 1\n        const fragmentShader = this.createShader(this.gl.FRAGMENT_SHADER, `#version 300 es\n\t\t\tprecision highp float;\n\t\t\t\n\t\t\tuniform sampler2D u_sourceTexture;\n\t\t\tin vec2 v_texCoord;\n\t\t\tout vec4 fragColor;\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\tvec4 source = texture(u_sourceTexture, v_texCoord);\n\t\t\t\tfragColor = vec4(source.rgb, 1.0);\n\t\t\t}\n\t\t`);\n        const program = this.gl.createProgram();\n        this.gl.attachShader(program, vertexShader);\n        this.gl.attachShader(program, fragmentShader);\n        this.gl.linkProgram(program);\n        return program;\n    }\n    createAlphaProgram() {\n        assert(this.gl);\n        const vertexShader = this.createVertexShader();\n        // This shader's more complex. The main reason is that this shader writes data in I420 (yuv420) pixel format\n        // instead of regular RGBA. In other words, we use the shader to write out I420 data into an RGBA canvas, which\n        // we then later read out with JavaScript. The reason being that browsers weirdly encode canvases and mess up\n        // the color spaces, and the only way to have full control over the color space is by outputting YUV data\n        // directly (avoiding the RGB conversion). Doing this conversion in JS is painfully slow, so let's utlize the\n        // GPU since we're already calling it anyway.\n        const fragmentShader = this.createShader(this.gl.FRAGMENT_SHADER, `#version 300 es\n\t\t\tprecision highp float;\n\t\t\t\n\t\t\tuniform sampler2D u_sourceTexture;\n\t\t\tuniform vec2 u_resolution; // The width and height of the canvas\n\t\t\tin vec2 v_texCoord;\n\t\t\tout vec4 fragColor;\n\n\t\t\t// This function determines the value for a single byte in the YUV stream\n\t\t\tfloat getByteValue(float byteOffset) {\n\t\t\t\tfloat width = u_resolution.x;\n\t\t\t\tfloat height = u_resolution.y;\n\n\t\t\t\tfloat yPlaneSize = width * height;\n\n\t\t\t\tif (byteOffset < yPlaneSize) {\n\t\t\t\t\t// This byte is in the luma plane. Find the corresponding pixel coordinates to sample from\n\t\t\t\t\tfloat y = floor(byteOffset / width);\n\t\t\t\t\tfloat x = mod(byteOffset, width);\n\t\t\t\t\t\n\t\t\t\t\t// Add 0.5 to sample the center of the texel\n\t\t\t\t\tvec2 sampleCoord = (vec2(x, y) + 0.5) / u_resolution;\n\t\t\t\t\t\n\t\t\t\t\t// The luma value is the alpha from the source texture\n\t\t\t\t\treturn texture(u_sourceTexture, sampleCoord).a;\n\t\t\t\t} else {\n\t\t\t\t\t// Write a fixed value for chroma and beyond\n\t\t\t\t\treturn 128.0 / 255.0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvoid main() {\n\t\t\t\t// Each fragment writes 4 bytes (R, G, B, A)\n\t\t\t\tfloat pixelIndex = floor(gl_FragCoord.y) * u_resolution.x + floor(gl_FragCoord.x);\n\t\t\t\tfloat baseByteOffset = pixelIndex * 4.0;\n\n\t\t\t\tvec4 result;\n\t\t\t\tfor (int i = 0; i < 4; i++) {\n\t\t\t\t\tfloat currentByteOffset = baseByteOffset + float(i);\n\t\t\t\t\tresult[i] = getByteValue(currentByteOffset);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfragColor = result;\n\t\t\t}\n\t\t`);\n        const program = this.gl.createProgram();\n        this.gl.attachShader(program, vertexShader);\n        this.gl.attachShader(program, fragmentShader);\n        this.gl.linkProgram(program);\n        return program;\n    }\n    createShader(type, source) {\n        assert(this.gl);\n        const shader = this.gl.createShader(type);\n        this.gl.shaderSource(shader, source);\n        this.gl.compileShader(shader);\n        if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {\n            Logging._error('Shader compile error:', this.gl.getShaderInfoLog(shader));\n        }\n        return shader;\n    }\n    createVAO() {\n        assert(this.gl);\n        assert(this.colorProgram);\n        const vao = this.gl.createVertexArray();\n        this.gl.bindVertexArray(vao);\n        const vertices = new Float32Array([\n            -1, -1, 0, 1,\n            1, -1, 1, 1,\n            -1, 1, 0, 0,\n            1, 1, 1, 0,\n        ]);\n        const buffer = this.gl.createBuffer();\n        this.gl.bindBuffer(this.gl.ARRAY_BUFFER, buffer);\n        this.gl.bufferData(this.gl.ARRAY_BUFFER, vertices, this.gl.STATIC_DRAW);\n        const positionLocation = this.gl.getAttribLocation(this.colorProgram, 'a_position');\n        const texCoordLocation = this.gl.getAttribLocation(this.colorProgram, 'a_texCoord');\n        this.gl.enableVertexAttribArray(positionLocation);\n        this.gl.vertexAttribPointer(positionLocation, 2, this.gl.FLOAT, false, 16, 0);\n        this.gl.enableVertexAttribArray(texCoordLocation);\n        this.gl.vertexAttribPointer(texCoordLocation, 2, this.gl.FLOAT, false, 16, 8);\n        return vao;\n    }\n    createTexture() {\n        assert(this.gl);\n        const texture = this.gl.createTexture();\n        this.gl.bindTexture(this.gl.TEXTURE_2D, texture);\n        this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);\n        this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);\n        this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);\n        this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n        return texture;\n    }\n    runColorProgram(sourceFrame) {\n        assert(this.gl);\n        assert(this.canvas);\n        this.gl.useProgram(this.colorProgram);\n        this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n        this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n        this.gl.bindVertexArray(this.vao);\n        this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n        return new VideoFrame(this.canvas, {\n            timestamp: sourceFrame.timestamp,\n            duration: sourceFrame.duration ?? undefined,\n            alpha: 'discard',\n        });\n    }\n    runAlphaProgram(sourceFrame) {\n        assert(this.gl);\n        assert(this.canvas);\n        this.gl.useProgram(this.alphaProgram);\n        this.gl.uniform2f(this.alphaResolutionLocation, this.canvas.width, this.canvas.height);\n        this.gl.viewport(0, 0, this.canvas.width, this.canvas.height);\n        this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n        this.gl.bindVertexArray(this.vao);\n        this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n        const { width, height } = this.canvas;\n        const chromaSamples = Math.ceil(width / 2) * Math.ceil(height / 2);\n        const yuvSize = width * height + chromaSamples * 2;\n        const requiredHeight = Math.ceil(yuvSize / (width * 4));\n        let yuv = new Uint8Array(4 * width * requiredHeight);\n        this.gl.readPixels(0, 0, width, requiredHeight, this.gl.RGBA, this.gl.UNSIGNED_BYTE, yuv);\n        yuv = yuv.subarray(0, yuvSize);\n        assert(yuv[width * height] === 128); // Where chroma data starts\n        assert(yuv[yuv.length - 1] === 128); // Assert the YUV data has been fully written\n        // Defining this separately because TypeScript doesn't know `transfer` and I can't be bothered to do declaration\n        // merging right now\n        const init = {\n            format: 'I420',\n            codedWidth: width,\n            codedHeight: height,\n            timestamp: sourceFrame.timestamp,\n            duration: sourceFrame.duration ?? undefined,\n            transfer: [yuv.buffer],\n        };\n        return new VideoFrame(yuv, init);\n    }\n    updateCpu(sourceFrame) {\n        if (!this.worker) {\n            const blob = new Blob([`(${colorAlphaSplitterWorkerCode.toString()})()`], { type: 'application/javascript' });\n            const url = URL.createObjectURL(blob);\n            this.worker = new Worker(url);\n            URL.revokeObjectURL(url);\n            this.worker.addEventListener('message', (event) => {\n                const data = event.data;\n                const pending = this.pendingRequests.get(data.id);\n                if (!pending) {\n                    return;\n                }\n                this.pendingRequests.delete(data.id);\n                if ('error' in data) {\n                    pending.reject(new Error(data.error));\n                }\n                else {\n                    pending.resolve({ colorFrame: data.colorFrame, alphaFrame: data.alphaFrame });\n                }\n            });\n            this.worker.addEventListener('error', (event) => {\n                const error = new Error(event.message || 'Color/alpha splitter worker error.');\n                for (const pending of this.pendingRequests.values()) {\n                    pending.reject(error);\n                }\n                this.pendingRequests.clear();\n            });\n        }\n        const id = this.nextRequestId++;\n        const pending = promiseWithResolvers();\n        this.pendingRequests.set(id, pending);\n        this.worker.postMessage({ id, sourceFrame }, { transfer: [sourceFrame] });\n        return pending.promise;\n    }\n    close() {\n        this.gl?.getExtension('WEBGL_lose_context')?.loseContext();\n        this.gl = null;\n        this.canvas = null;\n        this.worker?.terminate();\n        this.worker = null;\n        const error = new Error('Color/alpha splitter closed.');\n        for (const pending of this.pendingRequests.values()) {\n            pending.reject(error);\n        }\n        this.pendingRequests.clear();\n    }\n}\nColorAlphaSplitter.forceCpu = true;\nconst colorAlphaSplitterWorkerCode = () => {\n    // Reused across frames as long as the size matches, since consecutive frames usually share dimensions.\n    let cpuSourceBuffer = null;\n    // Serialize execution internally so concurrent requests don't race on the shared cpuSourceBuffer.\n    let chain = Promise.resolve();\n    self.addEventListener('message', (event) => {\n        const { id, sourceFrame } = event.data;\n        chain = chain.then(async () => {\n            try {\n                const { colorFrame, alphaFrame } = await split(sourceFrame);\n                self.postMessage({ id, colorFrame, alphaFrame }, { transfer: [colorFrame, alphaFrame] });\n            }\n            catch (error) {\n                self.postMessage({ id, error: error.message });\n            }\n            finally {\n                sourceFrame.close();\n            }\n        });\n    });\n    const split = async (sourceFrame) => {\n        const format = sourceFrame.format;\n        if (!format) {\n            throw new Error('CPU color/alpha splitting requires a known VideoFrame format.');\n        }\n        const width = sourceFrame.codedWidth;\n        const height = sourceFrame.codedHeight;\n        const sourceSize = sourceFrame.allocationSize();\n        if (!cpuSourceBuffer || cpuSourceBuffer.byteLength !== sourceSize) {\n            cpuSourceBuffer = new Uint8Array(sourceSize);\n        }\n        await sourceFrame.copyTo(cpuSourceBuffer);\n        if (format === 'RGBA' || format === 'BGRA') {\n            return splitInterleavedRgba(cpuSourceBuffer, width, height, format, sourceFrame);\n        }\n        else if (format === 'I420A' || format === 'I420AP10' || format === 'I420AP12'\n            || format === 'I422A' || format === 'I422AP10' || format === 'I422AP12'\n            || format === 'I444A' || format === 'I444AP10' || format === 'I444AP12') {\n            return splitPlanarYuvA(cpuSourceBuffer, width, height, format, sourceFrame);\n        }\n        throw new Error(`CPU color/alpha splitting does not support format '${format}'.`);\n    };\n    const splitInterleavedRgba = (source, width, height, format, sourceFrame) => {\n        const pixelCount = width * height;\n        const chromaW = Math.ceil(width / 2);\n        const chromaH = Math.ceil(height / 2);\n        const alphaSize = pixelCount + chromaW * chromaH * 2;\n        // Encode alpha as I420: Y = source A bytes, UV = 128\n        const alphaBuffer = new Uint8Array(alphaSize);\n        for (let i = 0, j = 3; i < pixelCount; i++, j += 4) {\n            alphaBuffer[i] = source[j];\n        }\n        alphaBuffer.fill(128, pixelCount);\n        // Hand the source buffer straight to VideoFrame as RGBX/BGRX so the A bytes are ignored\n        const colorFrame = new VideoFrame(source, {\n            format: format === 'RGBA' ? 'RGBX' : 'BGRX',\n            codedWidth: width,\n            codedHeight: height,\n            timestamp: sourceFrame.timestamp,\n            duration: sourceFrame.duration ?? undefined,\n            // No transfer!\n        });\n        const alphaInit = {\n            format: 'I420',\n            codedWidth: width,\n            codedHeight: height,\n            timestamp: sourceFrame.timestamp,\n            duration: sourceFrame.duration ?? undefined,\n            transfer: [alphaBuffer.buffer],\n        };\n        const alphaFrame = new VideoFrame(alphaBuffer, alphaInit);\n        return { colorFrame, alphaFrame };\n    };\n    const splitPlanarYuvA = (source, width, height, format, sourceFrame) => {\n        const is10 = format.includes('P10');\n        const is12 = format.includes('P12');\n        const bytesPerSample = (is10 || is12) ? 2 : 1;\n        let chromaW;\n        let chromaH;\n        if (format.startsWith('I420')) {\n            chromaW = Math.ceil(width / 2);\n            chromaH = Math.ceil(height / 2);\n        }\n        else if (format.startsWith('I422')) {\n            chromaW = Math.ceil(width / 2);\n            chromaH = height;\n        }\n        else {\n            chromaW = width;\n            chromaH = height;\n        }\n        const ySamples = width * height;\n        const uvSamples = chromaW * chromaH;\n        const yBytes = ySamples * bytesPerSample;\n        const uvBytes = uvSamples * bytesPerSample;\n        const aBytes = ySamples * bytesPerSample;\n        const colorBytes = yBytes + uvBytes * 2;\n        const colorFormat = format.replace('A', '');\n        const alphaChromaW = Math.ceil(width / 2);\n        const alphaChromaH = Math.ceil(height / 2);\n        const alphaUvSamples = alphaChromaW * alphaChromaH;\n        const alphaUvBytes = alphaUvSamples * bytesPerSample;\n        const alphaSize = aBytes + 2 * alphaUvBytes;\n        const alphaBuffer = new Uint8Array(alphaSize);\n        const aPlaneStart = colorBytes;\n        alphaBuffer.set(source.subarray(aPlaneStart, aPlaneStart + aBytes), 0);\n        // Fill UV planes with the neutral chroma value\n        const uvOffset = aBytes;\n        const neutralChroma = is10 ? 512 : (is12 ? 2048 : 128);\n        if (bytesPerSample === 1) {\n            alphaBuffer.fill(neutralChroma, uvOffset);\n        }\n        else {\n            const uvView = new Uint16Array(alphaBuffer.buffer, uvOffset, 2 * alphaUvSamples);\n            uvView.fill(neutralChroma);\n        }\n        const alphaFormat = (is10 ? 'I420P10' : (is12 ? 'I420P12' : 'I420'));\n        // Color frame is simply a prefix of the combined bytes\n        const colorFrame = new VideoFrame(source.subarray(0, colorBytes), {\n            format: colorFormat,\n            codedWidth: width,\n            codedHeight: height,\n            timestamp: sourceFrame.timestamp,\n            duration: sourceFrame.duration ?? undefined,\n        });\n        const alphaInit = {\n            format: alphaFormat,\n            codedWidth: width,\n            codedHeight: height,\n            timestamp: sourceFrame.timestamp,\n            duration: sourceFrame.duration ?? undefined,\n            transfer: [alphaBuffer.buffer],\n        };\n        const alphaFrame = new VideoFrame(alphaBuffer, alphaInit);\n        return { colorFrame, alphaFrame };\n    };\n};\n/**\n * This source can be used to add raw, unencoded video samples (frames) to an output video track. These frames will\n * automatically be encoded and then piped into the output.\n * @group Media sources\n * @public\n */\nexport class VideoSampleSource extends VideoSource {\n    /**\n     * Creates a new {@link VideoSampleSource} whose samples are encoded according to the specified\n     * {@link VideoEncodingConfig}.\n     */\n    constructor(encodingConfig) {\n        validateVideoEncodingConfig(encodingConfig);\n        super(encodingConfig.codec);\n        this._encoder = new VideoEncoderWrapper(this, encodingConfig);\n    }\n    /**\n     * Encodes a video sample (frame) and then adds it to the output.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    add(videoSample, encodeOptions) {\n        if (!(videoSample instanceof VideoSample)) {\n            throw new TypeError('videoSample must be a VideoSample.');\n        }\n        return this._encoder.add(videoSample, false, encodeOptions);\n    }\n    /** @internal */\n    _flushAndClose(forceClose) {\n        return this._encoder.flushAndClose(forceClose);\n    }\n}\n/**\n * This source can be used to add video frames to the output track from a fixed canvas element. Since canvases are often\n * used for rendering, this source provides a convenient wrapper around {@link VideoSampleSource}.\n * @group Media sources\n * @public\n */\nexport class CanvasSource extends VideoSource {\n    /**\n     * Creates a new {@link CanvasSource} from a canvas element or `OffscreenCanvas` whose samples are encoded\n     * according to the specified {@link VideoEncodingConfig}.\n     */\n    constructor(canvas, encodingConfig) {\n        if (!(typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement)\n            && !(typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n            throw new TypeError('canvas must be an HTMLCanvasElement or OffscreenCanvas.');\n        }\n        validateVideoEncodingConfig(encodingConfig);\n        super(encodingConfig.codec);\n        this._encoder = new VideoEncoderWrapper(this, encodingConfig);\n        this._canvas = canvas;\n    }\n    /**\n     * Captures the current canvas state as a video sample (frame), encodes it and adds it to the output.\n     *\n     * @param timestamp - The timestamp of the sample, in seconds.\n     * @param duration - The duration of the sample, in seconds.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    add(timestamp, duration = 0, encodeOptions) {\n        if (!Number.isFinite(timestamp) || timestamp < 0) {\n            throw new TypeError('timestamp must be a non-negative number.');\n        }\n        if (!Number.isFinite(duration) || duration < 0) {\n            throw new TypeError('duration must be a non-negative number.');\n        }\n        const sample = new VideoSample(this._canvas, { timestamp, duration });\n        return this._encoder.add(sample, true, encodeOptions);\n    }\n    /** @internal */\n    _flushAndClose(forceClose) {\n        return this._encoder.flushAndClose(forceClose);\n    }\n}\n/**\n * Video source that encodes the frames of a\n * [`MediaStreamVideoTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack) and pipes them into the\n * output. This is useful for capturing live or real-time data such as webcams or screen captures. Frames will\n * automatically start being captured once the connected {@link Output} is started, and will keep being captured until\n * the {@link Output} is finalized or this source is closed.\n * @group Media sources\n * @public\n */\nexport class MediaStreamVideoTrackSource extends VideoSource {\n    /** A promise that rejects upon any error within this source. This promise never resolves. */\n    get errorPromise() {\n        this._errorPromiseAccessed = true;\n        return this._promiseWithResolvers.promise;\n    }\n    /** Whether this source is currently paused as a result of calling `.pause()`. */\n    get paused() {\n        return this._paused;\n    }\n    /**\n     * Creates a new {@link MediaStreamVideoTrackSource} from a\n     * [`MediaStreamVideoTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack), which will pull\n     * video samples from the stream in real time and encode them according to {@link VideoEncodingConfig}.\n     */\n    constructor(track, encodingConfig, options = {}) {\n        if (!(track instanceof MediaStreamTrack) || track.kind !== 'video') {\n            throw new TypeError('track must be a video MediaStreamTrack.');\n        }\n        validateVideoEncodingConfig(encodingConfig);\n        if (typeof options !== 'object' || !options) {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.frameRate != null && (typeof options.frameRate !== 'number' || options.frameRate <= 0)) {\n            throw new TypeError('options.frameRate, when provided, must be either a positive number or null.');\n        }\n        if (options.timestampBase !== undefined\n            && options.timestampBase !== 'synced-zero'\n            && options.timestampBase !== 'zero'\n            && options.timestampBase !== 'unix') {\n            throw new TypeError('options.timestampBase, when provided, must be one of \\'synced-zero\\', \\'zero\\', or \\'unix\\'.');\n        }\n        encodingConfig = {\n            ...encodingConfig,\n            latencyMode: 'realtime',\n        };\n        super(encodingConfig.codec);\n        /** @internal */\n        this._abortController = null;\n        /** @internal */\n        this._workerTrackId = null;\n        /** @internal */\n        this._workerListener = null;\n        /** @internal */\n        this._promiseWithResolvers = promiseWithResolvers();\n        /** @internal */\n        this._errorPromiseAccessed = false;\n        /** @internal */\n        this._paused = false;\n        /** @internal */\n        this._lastVideoFrame = null;\n        /** @internal */\n        this._timerHandle = null;\n        /** @internal */\n        this._videoElement = null;\n        this._options = options;\n        this._encoder = new VideoEncoderWrapper(this, encodingConfig);\n        this._track = track;\n    }\n    /** @internal */\n    async _start() {\n        if (!this._errorPromiseAccessed) {\n            Logging._warn('Make sure not to ignore the `errorPromise` field on MediaStreamVideoTrackSource, so that any internal'\n                + ' errors get bubbled up properly.');\n        }\n        const frameRate = this._options.frameRate !== undefined\n            ? this._options.frameRate\n            : (this._track.getSettings().frameRate ?? null);\n        this._abortController = new AbortController();\n        let firstVideoFrameTimestamp = null;\n        let lastFrameTime = null;\n        let frameCount = 0;\n        let errored = false;\n        let lastSampleTimestamp = null;\n        let timestampOffset = 0;\n        const tick = () => {\n            assert(frameRate !== null);\n            if (!this._lastVideoFrame) {\n                return;\n            }\n            assert(lastFrameTime !== null);\n            assert(firstVideoFrameTimestamp !== null);\n            const now = performance.now();\n            // Add as many frames as warranted by the elapsed time.\n            // > instead of >= intentionally because tick() is called before the _lastVideoFrame is changed\n            while (now - lastFrameTime > 1000 / frameRate) {\n                lastFrameTime += 1000 / frameRate;\n                const timestamp = firstVideoFrameTimestamp + frameCount / frameRate;\n                const frame = new VideoFrame(this._videoElement ?? this._lastVideoFrame, {\n                    timestamp: 1e6 * timestamp,\n                    duration: 1e6 / frameRate,\n                });\n                addVideoFrame(frame, now);\n            }\n        };\n        if (frameRate !== null) {\n            this._timerHandle = setIntervalUnthrottled(tick, 4); // Run it at 250 Hz\n        }\n        const onVideoFrame = (videoFrame) => {\n            if (frameRate === null) {\n                addVideoFrame(videoFrame);\n            }\n            else {\n                const now = performance.now();\n                if (!this._lastVideoFrame) {\n                    addVideoFrame(videoFrame.clone(), now);\n                    lastFrameTime = now;\n                    this._lastVideoFrame = videoFrame;\n                }\n                else {\n                    tick();\n                    this._lastVideoFrame?.close();\n                    this._lastVideoFrame = videoFrame;\n                }\n            }\n        };\n        const addVideoFrame = (videoFrame, now = performance.now()) => {\n            if (errored) {\n                videoFrame.close();\n                return;\n            }\n            frameCount++;\n            const currentTimestamp = videoFrame.timestamp / 1e6;\n            if (this._paused) {\n                const frameSeen = firstVideoFrameTimestamp !== null;\n                if (frameSeen) {\n                    if (lastSampleTimestamp !== null && this._options.timestampBase !== 'unix') {\n                        // In addition to dropping this frame, let's also keep track of the time we have lost due to the\n                        // pause. Doing it like this instead of simply keeping track of the paused time is better since\n                        // it retains the frame rate of the underlying source.\n                        const timeDelta = currentTimestamp - lastSampleTimestamp;\n                        timestampOffset -= timeDelta;\n                    }\n                    lastSampleTimestamp = currentTimestamp;\n                }\n                videoFrame.close();\n                return;\n            }\n            if (firstVideoFrameTimestamp === null) {\n                firstVideoFrameTimestamp = currentTimestamp;\n                let target;\n                const timestampBase = this._options.timestampBase ?? 'synced-zero';\n                if (timestampBase === 'unix') {\n                    target = Date.now() / 1000;\n                }\n                else if (timestampBase === 'zero') {\n                    target = 0;\n                }\n                else {\n                    const output = this._connectedTrack.output;\n                    if (output._firstMediaStreamTimestamp === null) {\n                        output._firstMediaStreamTimestamp = now / 1000;\n                        target = 0;\n                    }\n                    else {\n                        target = now / 1000 - output._firstMediaStreamTimestamp;\n                    }\n                }\n                timestampOffset = target - firstVideoFrameTimestamp;\n            }\n            lastSampleTimestamp = currentTimestamp;\n            if (this._encoder.getQueueSize() >= 8) {\n                // Drop frames if the encoder is overloaded\n                videoFrame.close();\n                return;\n            }\n            const sample = new VideoSample(videoFrame, {\n                timestamp: currentTimestamp + timestampOffset,\n            });\n            void this._encoder.add(sample, true)\n                .catch((error) => {\n                errored = true;\n                this._abortController?.abort();\n                this._promiseWithResolvers.reject(error);\n                if (this._workerTrackId !== null) {\n                    // Tell the worker to stop the track\n                    sendMessageToMediaStreamTrackProcessorWorker({\n                        type: 'stopTrack',\n                        trackId: this._workerTrackId,\n                    });\n                }\n            });\n        };\n        if (typeof MediaStreamTrackProcessor !== 'undefined') {\n            // We can do it here directly, perfect\n            const processor = new MediaStreamTrackProcessor({ track: this._track });\n            const consumer = new WritableStream({ write: onVideoFrame });\n            processor.readable.pipeTo(consumer, {\n                signal: this._abortController.signal,\n            }).catch((error) => {\n                // Handle AbortError silently\n                if (error instanceof DOMException && error.name === 'AbortError')\n                    return;\n                this._promiseWithResolvers.reject(error);\n            });\n        }\n        else {\n            // It might still be supported in a worker, so let's check that\n            const supportedInWorker = await mediaStreamTrackProcessorIsSupportedInWorker();\n            if (supportedInWorker) {\n                this._workerTrackId = nextMediaStreamTrackProcessorWorkerId++;\n                sendMessageToMediaStreamTrackProcessorWorker({\n                    type: 'videoTrack',\n                    trackId: this._workerTrackId,\n                    track: this._track,\n                });\n                this._workerListener = (event) => {\n                    const message = event.data;\n                    if (message.type === 'videoFrame' && message.trackId === this._workerTrackId) {\n                        onVideoFrame(message.videoFrame);\n                    }\n                    else if (message.type === 'error' && message.trackId === this._workerTrackId) {\n                        this._promiseWithResolvers.reject(message.error);\n                    }\n                };\n                mediaStreamTrackProcessorWorker.addEventListener('message', this._workerListener);\n            }\n            else if (frameRate !== null) {\n                // No MediaStreamTrackProcessor support at all (e.g. Firefox), but we have a frame rate, so we can\n                // manually sample from a hidden <video> element instead.\n                const video = document.createElement('video');\n                video.style.position = 'fixed';\n                video.style.left = '-10000px';\n                video.style.top = '-10000px';\n                video.style.width = '1px';\n                video.style.height = '1px';\n                video.style.opacity = '0';\n                video.style.pointerEvents = 'none';\n                video.muted = true;\n                video.srcObject = new MediaStream([this._track]);\n                document.body.appendChild(video);\n                this._videoElement = video;\n                video.addEventListener('loadeddata', () => {\n                    if (errored || !this._videoElement) {\n                        return;\n                    }\n                    // This will be the first frame\n                    const frame = new VideoFrame(video, {\n                        timestamp: 1000 * performance.now(),\n                    });\n                    onVideoFrame(frame);\n                    frame.close();\n                }, { once: true });\n                void video.play().catch((error) => {\n                    errored = true;\n                    this._promiseWithResolvers.reject(error);\n                });\n            }\n            else {\n                throw new Error('When no explicit frame rate is set, MediaStreamTrackProcessor is required; but it\\'s not supported'\n                    + ' by this browser.');\n            }\n        }\n    }\n    /**\n     * Pauses the capture of video frames - any video frames emitted by the underlying media stream will be ignored\n     * while paused. This does *not* close the underlying `MediaStreamVideoTrack`, it just ignores its output.\n     */\n    pause() {\n        this._paused = true;\n    }\n    /** Resumes the capture of video frames after being paused. */\n    resume() {\n        this._paused = false;\n    }\n    /** @internal */\n    async _flushAndClose(forceClose) {\n        if (this._abortController) {\n            this._abortController.abort();\n            this._abortController = null;\n        }\n        if (this._timerHandle) {\n            clearIntervalUnthrottled(this._timerHandle);\n        }\n        this._lastVideoFrame?.close();\n        if (this._videoElement) {\n            this._videoElement.srcObject = null;\n            this._videoElement.remove();\n            this._videoElement = null;\n        }\n        if (this._workerTrackId !== null) {\n            assert(this._workerListener);\n            sendMessageToMediaStreamTrackProcessorWorker({\n                type: 'stopTrack',\n                trackId: this._workerTrackId,\n            });\n            // Wait for the worker to stop the track\n            await new Promise((resolve) => {\n                const listener = (event) => {\n                    const message = event.data;\n                    if (message.type === 'trackStopped' && message.trackId === this._workerTrackId) {\n                        assert(this._workerListener);\n                        mediaStreamTrackProcessorWorker.removeEventListener('message', this._workerListener);\n                        mediaStreamTrackProcessorWorker.removeEventListener('message', listener);\n                        resolve();\n                    }\n                };\n                mediaStreamTrackProcessorWorker.addEventListener('message', listener);\n            });\n        }\n        await this._encoder.flushAndClose(forceClose);\n    }\n}\n/**\n * Base class for audio sources - sources for audio tracks.\n * @group Media sources\n * @public\n */\nexport class AudioSource extends MediaSource {\n    /** Internal constructor. */\n    constructor(codec) {\n        super();\n        /** @internal */\n        this._connectedTrack = null;\n        if (!AUDIO_CODECS.includes(codec)) {\n            throw new TypeError(`Invalid audio codec '${codec}'. Must be one of: ${AUDIO_CODECS.join(', ')}.`);\n        }\n        this._codec = codec;\n    }\n}\n/**\n * The most basic audio source; can be used to directly pipe encoded packets into the output file.\n * @group Media sources\n * @public\n */\nexport class EncodedAudioPacketSource extends AudioSource {\n    /** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */\n    constructor(codec) {\n        super(codec);\n    }\n    /**\n     * Adds an encoded packet to the output audio track. Packets must be added in *decode order*.\n     *\n     * @param meta - Additional metadata from the encoder. You should pass this for the first call, including a valid\n     * decoder config.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    add(packet, meta) {\n        if (!(packet instanceof EncodedPacket)) {\n            throw new TypeError('packet must be an EncodedPacket.');\n        }\n        if (packet.isMetadataOnly) {\n            throw new TypeError('Metadata-only packets cannot be added.');\n        }\n        if (meta !== undefined && (!meta || typeof meta !== 'object')) {\n            throw new TypeError('meta, when provided, must be an object.');\n        }\n        this._ensureValidAdd();\n        return this._connectedTrack.output._muxer.addEncodedAudioPacket(this._connectedTrack, packet, meta);\n    }\n}\nclass AudioEncoderWrapper {\n    constructor(source, encodingConfig) {\n        this.source = source;\n        this.encodingConfig = encodingConfig;\n        this.ensureEncoderPromise = null;\n        this.encoderInitialized = false;\n        this.encoder = null;\n        this.muxer = null;\n        this.lastNumberOfChannels = null;\n        this.lastSampleRate = null;\n        this.isPcmEncoder = false;\n        this.outputSampleSize = null;\n        this.writeOutputValue = null;\n        this.customEncoder = null;\n        this.customEncoderCallSerializer = new CallSerializer();\n        this.customEncoderQueueSize = 0;\n        this.lastEndSampleIndex = null;\n        this.resampler = null;\n        /**\n         * Encoders typically throw their errors \"out of band\", meaning asynchronously in some other execution context.\n         * However, we want to surface these errors to the user within the normal control flow, so they don't go uncaught.\n         * So, we keep track of the encoder error and throw it as soon as we get the chance.\n         */\n        this.error = null;\n        this.lastMuxerPromise = Promise.resolve();\n        this.closed = false;\n    }\n    async add(audioSample, shouldClose) {\n        try {\n            this.checkForEncoderError();\n            this.source._ensureValidAdd();\n            // Ensure audio parameters remain constant\n            if (this.lastNumberOfChannels !== null && this.lastSampleRate !== null) {\n                if (audioSample.numberOfChannels !== this.lastNumberOfChannels\n                    || audioSample.sampleRate !== this.lastSampleRate) {\n                    throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at`\n                        + ` ${this.lastSampleRate} Hz, got ${audioSample.numberOfChannels} channels at`\n                        + ` ${audioSample.sampleRate} Hz.`);\n                }\n            }\n            else {\n                this.lastNumberOfChannels = audioSample.numberOfChannels;\n                this.lastSampleRate = audioSample.sampleRate;\n            }\n            const config = this.encodingConfig;\n            const needsResample = config.transform?.numberOfChannels !== undefined\n                || config.transform?.sampleRate !== undefined;\n            if (needsResample) {\n                if (!this.resampler) {\n                    // Initialize the resampler on first sample\n                    this.resampler = new AudioResampler({\n                        targetNumberOfChannels: config.transform.numberOfChannels\n                            ?? audioSample.numberOfChannels,\n                        targetSampleRate: config.transform.sampleRate\n                            ?? audioSample.sampleRate,\n                        onSample: async (sample) => {\n                            await this.processAndEncode(sample, true);\n                        },\n                    });\n                }\n                await this.resampler.add(audioSample);\n            }\n            else {\n                await this.processAndEncode(audioSample, shouldClose);\n            }\n        }\n        finally {\n            if (shouldClose) {\n                audioSample.close();\n            }\n        }\n    }\n    /**\n     * Runs the process function (if any) and encodes the resulting samples.\n     */\n    async processAndEncode(audioSample, shouldClose) {\n        const config = this.encodingConfig;\n        if (config.transform?.sampleFormat !== undefined\n            && toInterleavedAudioFormat(audioSample.format) !== config.transform.sampleFormat) {\n            // Do a sample format conversion\n            const newSample = audioSampleToInterleavedFormat(audioSample, config.transform.sampleFormat);\n            if (shouldClose) {\n                audioSample.close();\n            }\n            audioSample = newSample;\n            shouldClose = true;\n        }\n        if (config.transform?.process) {\n            let processed = config.transform.process(audioSample);\n            if (processed instanceof Promise) {\n                processed = await processed;\n            }\n            if (processed === null) {\n                return;\n            }\n            if (!Array.isArray(processed)) {\n                processed = [processed];\n            }\n            for (const sample of processed) {\n                if (!(sample instanceof AudioSample)) {\n                    throw new TypeError('The audio process function must return an AudioSample, null, or an array of AudioSamples.');\n                }\n                await this.encodeSample(sample, true);\n            }\n            if (shouldClose) {\n                audioSample.close();\n            }\n        }\n        else {\n            await this.encodeSample(audioSample, shouldClose);\n        }\n    }\n    /**\n     * Encodes a single audio sample, handling encoder init, gap padding, and backpressure.\n     */\n    async encodeSample(audioSample, shouldClose) {\n        try {\n            if (!this.encoderInitialized) {\n                if (!this.ensureEncoderPromise) {\n                    this.ensureEncoder(audioSample);\n                }\n                // No, this \"if\" statement is not useless. Sometimes, the above call to `ensureEncoder` might have\n                // synchronously completed and the encoder is already initialized. In this case, we don't need to await\n                // the promise anymore. This also fixes nasty async race condition bugs when multiple code paths are\n                // calling this method: It's important that the call that initialized the encoder go through this\n                // code first.\n                if (!this.encoderInitialized) {\n                    await this.ensureEncoderPromise;\n                }\n            }\n            assert(this.encoderInitialized);\n            if (this.closed) {\n                return;\n            }\n            // Handle padding of gaps with silence to avoid audio drift over time, like in\n            // https://github.com/Vanilagy/mediabunny/issues/176\n            // TODO An open question is how encoders deal with the first AudioData having a non-zero timestamp, and with\n            // AudioDatas that have an overlapping timestamp range.\n            {\n                const startSampleIndex = Math.round(audioSample.timestamp * audioSample.sampleRate);\n                const endSampleIndex = Math.round((audioSample.timestamp + audioSample.duration) * audioSample.sampleRate);\n                if (this.lastEndSampleIndex === null) {\n                    this.lastEndSampleIndex = endSampleIndex;\n                }\n                else {\n                    const sampleDiff = startSampleIndex - this.lastEndSampleIndex;\n                    if (sampleDiff >= 64) {\n                        // The gap is big enough, let's add a correction sample\n                        const fillSample = new AudioSample({\n                            data: new Float32Array(sampleDiff * audioSample.numberOfChannels),\n                            format: 'f32-planar',\n                            sampleRate: audioSample.sampleRate,\n                            numberOfChannels: audioSample.numberOfChannels,\n                            numberOfFrames: sampleDiff,\n                            timestamp: this.lastEndSampleIndex / audioSample.sampleRate,\n                        });\n                        await this.encodeSample(fillSample, true); // Recursive call\n                    }\n                    this.lastEndSampleIndex += audioSample.numberOfFrames;\n                }\n            }\n            this.encodingConfig.onEncodedSample?.(audioSample);\n            if (this.customEncoder) {\n                this.customEncoderQueueSize++;\n                // We clone the sample so it cannot be closed on us from the outside before it reaches the encoder\n                const clonedSample = audioSample.clone();\n                const promise = this.customEncoderCallSerializer\n                    .call(() => this.customEncoder.encode(clonedSample))\n                    .then(() => this.customEncoderQueueSize--)\n                    .catch((error) => this.error ??= error)\n                    .finally(() => {\n                    clonedSample.close();\n                });\n                if (this.customEncoderQueueSize >= 4) {\n                    await promise;\n                }\n                await this.lastMuxerPromise; // Allow the writer to apply backpressure\n            }\n            else if (this.isPcmEncoder) {\n                await this.doPcmEncoding(audioSample, shouldClose);\n            }\n            else {\n                assert(this.encoder);\n                const audioData = audioSample.toAudioData();\n                this.encoder.encode(audioData);\n                audioData.close();\n                if (shouldClose) {\n                    audioSample.close();\n                }\n                if (this.encoder.encodeQueueSize >= 4) {\n                    await new Promise(resolve => this.encoder.addEventListener('dequeue', resolve, { once: true }));\n                }\n                await this.lastMuxerPromise; // Allow the writer to apply backpressure\n            }\n        }\n        finally {\n            if (shouldClose) {\n                audioSample.close();\n            }\n        }\n    }\n    async doPcmEncoding(audioSample, shouldClose) {\n        assert(this.outputSampleSize);\n        assert(this.writeOutputValue);\n        // Need to extract data from the audio data before we close it\n        const { numberOfChannels, numberOfFrames, sampleRate, timestamp } = audioSample;\n        const CHUNK_SIZE = 2048;\n        const outputs = [];\n        // Prepare all of the output buffers, each being bounded by CHUNK_SIZE so we don't generate huge packets\n        for (let frame = 0; frame < numberOfFrames; frame += CHUNK_SIZE) {\n            const frameCount = Math.min(CHUNK_SIZE, audioSample.numberOfFrames - frame);\n            const outputSize = frameCount * numberOfChannels * this.outputSampleSize;\n            const outputBuffer = new ArrayBuffer(outputSize);\n            const outputView = new DataView(outputBuffer);\n            outputs.push({ frameCount, view: outputView });\n        }\n        const allocationSize = audioSample.allocationSize(({ planeIndex: 0, format: 'f32-planar' }));\n        const floats = new Float32Array(allocationSize / Float32Array.BYTES_PER_ELEMENT);\n        for (let i = 0; i < numberOfChannels; i++) {\n            audioSample.copyTo(floats, { planeIndex: i, format: 'f32-planar' });\n            for (let j = 0; j < outputs.length; j++) {\n                const { frameCount, view } = outputs[j];\n                for (let k = 0; k < frameCount; k++) {\n                    this.writeOutputValue(view, (k * numberOfChannels + i) * this.outputSampleSize, floats[j * CHUNK_SIZE + k]);\n                }\n            }\n        }\n        if (shouldClose) {\n            audioSample.close();\n        }\n        const meta = {\n            decoderConfig: {\n                codec: this.encodingConfig.codec,\n                numberOfChannels,\n                sampleRate,\n            },\n        };\n        for (let i = 0; i < outputs.length; i++) {\n            const { frameCount, view } = outputs[i];\n            const outputBuffer = view.buffer;\n            const startFrame = i * CHUNK_SIZE;\n            const packet = new EncodedPacket(new Uint8Array(outputBuffer), 'key', timestamp + startFrame / sampleRate, frameCount / sampleRate);\n            this.encodingConfig.onEncodedPacket?.(packet, meta);\n            await this.muxer.addEncodedAudioPacket(this.source._connectedTrack, packet, meta); // With backpressure\n        }\n    }\n    ensureEncoder(audioSample) {\n        this.ensureEncoderPromise = (async () => {\n            const { numberOfChannels, sampleRate } = audioSample;\n            const encoderConfig = buildAudioEncoderConfig({\n                numberOfChannels,\n                sampleRate,\n                ...this.encodingConfig,\n            });\n            this.encodingConfig.onEncoderConfig?.(encoderConfig);\n            const MatchingCustomEncoder = customAudioEncoders.find(x => x.supports(this.encodingConfig.codec, encoderConfig));\n            if (MatchingCustomEncoder) {\n                // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n                this.customEncoder = new MatchingCustomEncoder();\n                // @ts-expect-error It's technically readonly\n                this.customEncoder.codec = this.encodingConfig.codec;\n                // @ts-expect-error It's technically readonly\n                this.customEncoder.config = encoderConfig;\n                // @ts-expect-error It's technically readonly\n                this.customEncoder.onPacket = (packet, meta) => {\n                    if (!(packet instanceof EncodedPacket)) {\n                        throw new TypeError('The first argument passed to onPacket must be an EncodedPacket.');\n                    }\n                    if (meta !== undefined && (!meta || typeof meta !== 'object')) {\n                        throw new TypeError('The second argument passed to onPacket must be an object or undefined.');\n                    }\n                    this.encodingConfig.onEncodedPacket?.(packet, meta);\n                    this.lastMuxerPromise\n                        = this.muxer.addEncodedAudioPacket(this.source._connectedTrack, packet, meta)\n                            .catch((error) => {\n                            this.error ??= error;\n                        });\n                };\n                await this.customEncoder.init();\n            }\n            else if (PCM_AUDIO_CODECS.includes(this.encodingConfig.codec)) {\n                this.initPcmEncoder();\n            }\n            else {\n                if (typeof AudioEncoder === 'undefined') {\n                    throw new Error('AudioEncoder is not supported by this browser.');\n                }\n                const support = await AudioEncoder.isConfigSupported(encoderConfig);\n                if (!support.supported) {\n                    throw new Error(`This specific encoder configuration (${encoderConfig.codec}, ${encoderConfig.bitrate} bps,`\n                        + ` ${encoderConfig.numberOfChannels} channels, ${encoderConfig.sampleRate} Hz) is not`\n                        + ` supported by this browser. Consider using another codec or changing your audio parameters.`);\n                }\n                const stack = new Error('Encoding error').stack;\n                this.encoder = new AudioEncoder({\n                    output: (chunk, meta) => {\n                        // WebKit emits an invalid description for AAC (https://bugs.webkit.org/show_bug.cgi?id=302253),\n                        // which we try to detect here. If detected, we'll provide our own description instead, derived\n                        // from the codec string and audio parameters.\n                        if (this.encodingConfig.codec === 'aac' && meta?.decoderConfig) {\n                            let needsDescriptionOverwrite = false;\n                            if (!meta.decoderConfig.description || meta.decoderConfig.description.byteLength < 2) {\n                                needsDescriptionOverwrite = true;\n                            }\n                            else {\n                                const audioSpecificConfig = parseAacAudioSpecificConfig(toUint8Array(meta.decoderConfig.description));\n                                needsDescriptionOverwrite = audioSpecificConfig.objectType === 0;\n                            }\n                            if (needsDescriptionOverwrite) {\n                                const objectType = Number(last(encoderConfig.codec.split('.')));\n                                meta.decoderConfig.description = buildAacAudioSpecificConfig({\n                                    objectType,\n                                    numberOfChannels: meta.decoderConfig.numberOfChannels,\n                                    sampleRate: meta.decoderConfig.sampleRate,\n                                });\n                            }\n                        }\n                        let packet = EncodedPacket.fromEncodedChunk(chunk);\n                        // Snap the timing information to the sample rate to recover information lost in microsecond\n                        // conversion\n                        packet = packet.clone({\n                            timestamp: roundToDivisor(packet.timestamp, encoderConfig.sampleRate),\n                            duration: chunk.duration != null\n                                ? roundToDivisor(packet.duration, encoderConfig.sampleRate)\n                                : undefined,\n                        });\n                        this.encodingConfig.onEncodedPacket?.(packet, meta);\n                        this.lastMuxerPromise\n                            = this.muxer.addEncodedAudioPacket(this.source._connectedTrack, packet, meta)\n                                .catch((error) => {\n                                this.error ??= error;\n                            });\n                    },\n                    error: (error) => {\n                        error.stack = stack; // Provide a more useful stack trace\n                        this.error ??= error;\n                    },\n                });\n                this.encoder.configure(encoderConfig);\n            }\n            assert(this.source._connectedTrack);\n            this.muxer = this.source._connectedTrack.output._muxer;\n            this.encoderInitialized = true;\n        })();\n    }\n    initPcmEncoder() {\n        this.isPcmEncoder = true;\n        const codec = this.encodingConfig.codec;\n        const { dataType, sampleSize, littleEndian } = parsePcmCodec(codec);\n        this.outputSampleSize = sampleSize;\n        // All these functions receive a float sample as input and map it into the desired format\n        switch (sampleSize) {\n            case 1:\n                {\n                    if (dataType === 'unsigned') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setUint8(byteOffset, clamp((value + 1) * 127.5, 0, 255));\n                    }\n                    else if (dataType === 'signed') {\n                        this.writeOutputValue = (view, byteOffset, value) => {\n                            view.setInt8(byteOffset, clamp(Math.round(value * 128), -128, 127));\n                        };\n                    }\n                    else if (dataType === 'ulaw') {\n                        this.writeOutputValue = (view, byteOffset, value) => {\n                            const int16 = clamp(Math.floor(value * 32767), -32768, 32767);\n                            view.setUint8(byteOffset, toUlaw(int16));\n                        };\n                    }\n                    else if (dataType === 'alaw') {\n                        this.writeOutputValue = (view, byteOffset, value) => {\n                            const int16 = clamp(Math.floor(value * 32767), -32768, 32767);\n                            view.setUint8(byteOffset, toAlaw(int16));\n                        };\n                    }\n                    else {\n                        assert(false);\n                    }\n                }\n                ;\n                break;\n            case 2:\n                {\n                    if (dataType === 'unsigned') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setUint16(byteOffset, clamp((value + 1) * 32767.5, 0, 65535), littleEndian);\n                    }\n                    else if (dataType === 'signed') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, clamp(Math.round(value * 32767), -32768, 32767), littleEndian);\n                    }\n                    else {\n                        assert(false);\n                    }\n                }\n                ;\n                break;\n            case 3:\n                {\n                    if (dataType === 'unsigned') {\n                        this.writeOutputValue = (view, byteOffset, value) => setUint24(view, byteOffset, clamp((value + 1) * 8388607.5, 0, 16777215), littleEndian);\n                    }\n                    else if (dataType === 'signed') {\n                        this.writeOutputValue = (view, byteOffset, value) => setInt24(view, byteOffset, clamp(Math.round(value * 8388607), -8388608, 8388607), littleEndian);\n                    }\n                    else {\n                        assert(false);\n                    }\n                }\n                ;\n                break;\n            case 4:\n                {\n                    if (dataType === 'unsigned') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setUint32(byteOffset, clamp((value + 1) * 2147483647.5, 0, 4294967295), littleEndian);\n                    }\n                    else if (dataType === 'signed') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, clamp(Math.round(value * 2147483647), -2147483648, 2147483647), littleEndian);\n                    }\n                    else if (dataType === 'float') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, littleEndian);\n                    }\n                    else {\n                        assert(false);\n                    }\n                }\n                ;\n                break;\n            case 8:\n                {\n                    if (dataType === 'float') {\n                        this.writeOutputValue = (view, byteOffset, value) => view.setFloat64(byteOffset, value, littleEndian);\n                    }\n                    else {\n                        assert(false);\n                    }\n                }\n                ;\n                break;\n            default:\n                {\n                    assertNever(sampleSize);\n                    assert(false);\n                }\n                ;\n        }\n    }\n    async flushAndClose(forceClose) {\n        if (!forceClose) {\n            this.checkForEncoderError();\n        }\n        // Finalize the resampler to flush any buffered audio\n        if (!forceClose && this.resampler) {\n            await this.resampler.finalize();\n        }\n        this.resampler = null;\n        this.closed = true;\n        if (this.customEncoder) {\n            if (!forceClose) {\n                void this.customEncoderCallSerializer.call(() => this.customEncoder.flush());\n            }\n            await this.customEncoderCallSerializer.call(() => this.customEncoder.close());\n        }\n        else if (this.encoder) {\n            if (!forceClose) {\n                await this.encoder.flush();\n            }\n            if (this.encoder.state !== 'closed') {\n                this.encoder.close();\n            }\n        }\n        if (!forceClose) {\n            this.checkForEncoderError();\n        }\n    }\n    getQueueSize() {\n        if (this.customEncoder) {\n            return this.customEncoderQueueSize;\n        }\n        else if (this.isPcmEncoder) {\n            return 0;\n        }\n        else {\n            return this.encoder?.encodeQueueSize ?? 0;\n        }\n    }\n    checkForEncoderError() {\n        if (this.error) {\n            throw this.error;\n        }\n    }\n}\n/**\n * This source can be used to add raw, unencoded audio samples to an output audio track. These samples will\n * automatically be encoded and then piped into the output.\n * @group Media sources\n * @public\n */\nexport class AudioSampleSource extends AudioSource {\n    /**\n     * Creates a new {@link AudioSampleSource} whose samples are encoded according to the specified\n     * {@link AudioEncodingConfig}.\n     */\n    constructor(encodingConfig) {\n        validateAudioEncodingConfig(encodingConfig);\n        super(encodingConfig.codec);\n        this._encoder = new AudioEncoderWrapper(this, encodingConfig);\n    }\n    /**\n     * Encodes an audio sample and then adds it to the output.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    add(audioSample) {\n        if (!(audioSample instanceof AudioSample)) {\n            throw new TypeError('audioSample must be an AudioSample.');\n        }\n        return this._encoder.add(audioSample, false);\n    }\n    /** @internal */\n    _flushAndClose(forceClose) {\n        return this._encoder.flushAndClose(forceClose);\n    }\n}\n/**\n * This source can be used to add audio data from an AudioBuffer to the output track. This is useful when working with\n * the Web Audio API.\n * @group Media sources\n * @public\n */\nexport class AudioBufferSource extends AudioSource {\n    /**\n     * Creates a new {@link AudioBufferSource} whose `AudioBuffer` instances are encoded according to the specified\n     * {@link AudioEncodingConfig}.\n     */\n    constructor(encodingConfig) {\n        validateAudioEncodingConfig(encodingConfig);\n        super(encodingConfig.codec);\n        /** @internal */\n        this._accumulatedTime = 0;\n        this._encoder = new AudioEncoderWrapper(this, encodingConfig);\n    }\n    /**\n     * Converts an AudioBuffer to audio samples, encodes them and adds them to the output. The first AudioBuffer will\n     * be played at timestamp 0, and any subsequent AudioBuffer will have a timestamp equal to the total duration of\n     * all previous AudioBuffers.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    async add(audioBuffer) {\n        if (!(audioBuffer instanceof AudioBuffer)) {\n            throw new TypeError('audioBuffer must be an AudioBuffer.');\n        }\n        const iterator = AudioSample._fromAudioBuffer(audioBuffer, this._accumulatedTime);\n        this._accumulatedTime += audioBuffer.duration;\n        for (const audioSample of iterator) {\n            await this._encoder.add(audioSample, true);\n        }\n    }\n    /** @internal */\n    _flushAndClose(forceClose) {\n        return this._encoder.flushAndClose(forceClose);\n    }\n}\n/**\n * Audio source that encodes the data of a\n * [`MediaStreamAudioTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack) and pipes it into the\n * output. This is useful for capturing live or real-time audio such as microphones or audio from other media elements.\n * Audio will automatically start being captured once the connected {@link Output} is started, and will keep being\n * captured until the {@link Output} is finalized or this source is closed.\n * @group Media sources\n * @public\n */\nexport class MediaStreamAudioTrackSource extends AudioSource {\n    /** A promise that rejects upon any error within this source. This promise never resolves. */\n    get errorPromise() {\n        this._errorPromiseAccessed = true;\n        return this._promiseWithResolvers.promise;\n    }\n    /** Whether this source is currently paused as a result of calling `.pause()`. */\n    get paused() {\n        return this._paused;\n    }\n    /**\n     * Creates a new {@link MediaStreamAudioTrackSource} from a `MediaStreamAudioTrack`, which will pull audio samples\n     * from the stream in real time and encode them according to {@link AudioEncodingConfig}.\n     */\n    constructor(track, encodingConfig, options = {}) {\n        if (!(track instanceof MediaStreamTrack) || track.kind !== 'audio') {\n            throw new TypeError('track must be an audio MediaStreamTrack.');\n        }\n        validateAudioEncodingConfig(encodingConfig);\n        if (typeof options !== 'object' || !options) {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.timestampBase !== undefined\n            && options.timestampBase !== 'synced-zero'\n            && options.timestampBase !== 'zero'\n            && options.timestampBase !== 'unix') {\n            throw new TypeError('options.timestampBase, when provided, must be one of \\'synced-zero\\', \\'zero\\', or \\'unix\\'.');\n        }\n        super(encodingConfig.codec);\n        /** @internal */\n        this._abortController = null;\n        /** @internal */\n        this._audioContext = null;\n        /** @internal */\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        this._scriptProcessorNode = null; // Deprecated but goated\n        /** @internal */\n        this._promiseWithResolvers = promiseWithResolvers();\n        /** @internal */\n        this._errorPromiseAccessed = false;\n        /** @internal */\n        this._paused = false;\n        this._options = options;\n        this._encoder = new AudioEncoderWrapper(this, encodingConfig);\n        this._track = track;\n    }\n    /** @internal */\n    async _start() {\n        if (!this._errorPromiseAccessed) {\n            Logging._warn('Make sure not to ignore the `errorPromise` field on MediaStreamAudioTrackSource, so that any internal'\n                + ' errors get bubbled up properly.');\n        }\n        this._abortController = new AbortController();\n        let firstAudioDataTimestamp = null;\n        let errored = false;\n        let lastSampleTimestamp = null;\n        let timestampOffset = 0;\n        const onAudioSample = (audioSample) => {\n            if (errored) {\n                audioSample.close();\n                return;\n            }\n            const currentTimestamp = audioSample.timestamp;\n            if (this._paused) {\n                const dataSeen = firstAudioDataTimestamp !== null;\n                if (dataSeen) {\n                    if (lastSampleTimestamp !== null && this._options.timestampBase !== 'unix') {\n                        // In addition to dropping this sample, let's also keep track of the time we have lost due to\n                        // the pause. Doing it like this instead of simply keeping track of the paused time is better\n                        // since it retains the sample rate of the underlying source.\n                        const timeDelta = currentTimestamp - lastSampleTimestamp;\n                        timestampOffset -= timeDelta;\n                    }\n                    lastSampleTimestamp = currentTimestamp;\n                }\n                audioSample.close();\n                return;\n            }\n            if (firstAudioDataTimestamp === null) {\n                firstAudioDataTimestamp = audioSample.timestamp;\n                let target;\n                const timestampBase = this._options.timestampBase ?? 'synced-zero';\n                if (timestampBase === 'unix') {\n                    target = Date.now() / 1000;\n                }\n                else if (timestampBase === 'zero') {\n                    target = 0;\n                }\n                else {\n                    const output = this._connectedTrack.output;\n                    if (output._firstMediaStreamTimestamp === null) {\n                        output._firstMediaStreamTimestamp = performance.now() / 1000;\n                        target = 0;\n                    }\n                    else {\n                        target = performance.now() / 1000 - output._firstMediaStreamTimestamp;\n                    }\n                }\n                timestampOffset = target - firstAudioDataTimestamp;\n            }\n            lastSampleTimestamp = currentTimestamp;\n            if (this._encoder.getQueueSize() >= 8) {\n                // Drop data if the encoder is overloaded\n                audioSample.close();\n                return;\n            }\n            audioSample.setTimestamp(currentTimestamp + timestampOffset);\n            void this._encoder.add(audioSample, true)\n                .catch((error) => {\n                errored = true;\n                this._abortController?.abort();\n                this._promiseWithResolvers.reject(error);\n                void this._audioContext?.suspend();\n            });\n        };\n        if (typeof MediaStreamTrackProcessor !== 'undefined') {\n            // Great, MediaStreamTrackProcessor is supported, this is the preferred way of doing things\n            const processor = new MediaStreamTrackProcessor({ track: this._track });\n            const consumer = new WritableStream({\n                write: audioData => onAudioSample(new AudioSample(audioData)),\n            });\n            processor.readable.pipeTo(consumer, {\n                signal: this._abortController.signal,\n            }).catch((error) => {\n                // Handle AbortError silently\n                if (error instanceof DOMException && error.name === 'AbortError')\n                    return;\n                this._promiseWithResolvers.reject(error);\n            });\n        }\n        else {\n            // Let's fall back to an AudioContext approach\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n            const AudioContext = window.AudioContext || window.webkitAudioContext;\n            this._audioContext = new AudioContext({ sampleRate: this._track.getSettings().sampleRate });\n            const sourceNode = this._audioContext.createMediaStreamSource(new MediaStream([this._track]));\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            this._scriptProcessorNode = this._audioContext.createScriptProcessor(4096);\n            if (this._audioContext.state === 'suspended') {\n                await this._audioContext.resume();\n            }\n            sourceNode.connect(this._scriptProcessorNode);\n            this._scriptProcessorNode.connect(this._audioContext.destination);\n            let totalDuration = 0;\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            this._scriptProcessorNode.onaudioprocess = (event) => {\n                // eslint-disable-next-line @typescript-eslint/no-deprecated\n                const iterator = AudioSample._fromAudioBuffer(event.inputBuffer, totalDuration);\n                // eslint-disable-next-line @typescript-eslint/no-deprecated\n                totalDuration += event.inputBuffer.duration;\n                for (const audioSample of iterator) {\n                    onAudioSample(audioSample);\n                }\n            };\n        }\n    }\n    /**\n     * Pauses the capture of audio data - any audio data emitted by the underlying media stream will be ignored\n     * while paused. This does *not* close the underlying `MediaStreamAudioTrack`, it just ignores its output.\n     */\n    pause() {\n        this._paused = true;\n    }\n    /** Resumes the capture of audio data after being paused. */\n    resume() {\n        this._paused = false;\n    }\n    /** @internal */\n    async _flushAndClose(forceClose) {\n        if (this._abortController) {\n            this._abortController.abort();\n            this._abortController = null;\n        }\n        if (this._audioContext) {\n            assert(this._scriptProcessorNode);\n            this._scriptProcessorNode.disconnect();\n            await this._audioContext.suspend();\n        }\n        await this._encoder.flushAndClose(forceClose);\n    }\n}\nconst mediaStreamTrackProcessorWorkerCode = () => {\n    const sendMessage = (message, transfer) => {\n        if (transfer) {\n            self.postMessage(message, { transfer });\n        }\n        else {\n            self.postMessage(message);\n        }\n    };\n    // Immediately send a message to the main thread, letting them know of the support\n    sendMessage({\n        type: 'support',\n        supported: typeof MediaStreamTrackProcessor !== 'undefined',\n    });\n    const abortControllers = new Map();\n    const activeTracks = new Map();\n    self.addEventListener('message', (event) => {\n        const message = event.data;\n        switch (message.type) {\n            case 'videoTrack':\n                {\n                    activeTracks.set(message.trackId, message.track);\n                    const processor = new MediaStreamTrackProcessor({ track: message.track });\n                    const consumer = new WritableStream({\n                        write: (videoFrame) => {\n                            if (!activeTracks.has(message.trackId)) {\n                                videoFrame.close();\n                                return;\n                            }\n                            // Send it to the main thread\n                            sendMessage({\n                                type: 'videoFrame',\n                                trackId: message.trackId,\n                                videoFrame,\n                            }, [videoFrame]);\n                        },\n                    });\n                    const abortController = new AbortController();\n                    abortControllers.set(message.trackId, abortController);\n                    processor.readable.pipeTo(consumer, {\n                        signal: abortController.signal,\n                    }).catch((error) => {\n                        // Handle AbortError silently\n                        if (error instanceof DOMException && error.name === 'AbortError')\n                            return;\n                        sendMessage({\n                            type: 'error',\n                            trackId: message.trackId,\n                            error,\n                        });\n                    });\n                }\n                ;\n                break;\n            case 'stopTrack':\n                {\n                    const abortController = abortControllers.get(message.trackId);\n                    if (abortController) {\n                        abortController.abort();\n                        abortControllers.delete(message.trackId);\n                    }\n                    const track = activeTracks.get(message.trackId);\n                    track?.stop();\n                    activeTracks.delete(message.trackId);\n                    sendMessage({\n                        type: 'trackStopped',\n                        trackId: message.trackId,\n                    });\n                }\n                ;\n                break;\n            default: assertNever(message);\n        }\n    });\n};\nlet nextMediaStreamTrackProcessorWorkerId = 0;\nlet mediaStreamTrackProcessorWorker = null;\nconst initMediaStreamTrackProcessorWorker = () => {\n    const blob = new Blob([`(${mediaStreamTrackProcessorWorkerCode.toString()})()`], { type: 'application/javascript' });\n    const url = URL.createObjectURL(blob);\n    mediaStreamTrackProcessorWorker = new Worker(url);\n};\nlet mediaStreamTrackProcessorIsSupportedInWorkerCache = null;\nconst mediaStreamTrackProcessorIsSupportedInWorker = async () => {\n    if (mediaStreamTrackProcessorIsSupportedInWorkerCache !== null) {\n        return mediaStreamTrackProcessorIsSupportedInWorkerCache;\n    }\n    if (!mediaStreamTrackProcessorWorker) {\n        initMediaStreamTrackProcessorWorker();\n    }\n    return new Promise((resolve) => {\n        assert(mediaStreamTrackProcessorWorker);\n        const listener = (event) => {\n            const message = event.data;\n            if (message.type === 'support') {\n                mediaStreamTrackProcessorIsSupportedInWorkerCache = message.supported;\n                mediaStreamTrackProcessorWorker.removeEventListener('message', listener);\n                resolve(message.supported);\n            }\n        };\n        mediaStreamTrackProcessorWorker.addEventListener('message', listener);\n    });\n};\nconst sendMessageToMediaStreamTrackProcessorWorker = (message, transfer) => {\n    assert(mediaStreamTrackProcessorWorker);\n    if (transfer) {\n        mediaStreamTrackProcessorWorker.postMessage(message, transfer);\n    }\n    else {\n        mediaStreamTrackProcessorWorker.postMessage(message);\n    }\n};\n/**\n * Base class for subtitle sources - sources for subtitle tracks.\n * @group Media sources\n * @public\n */\nexport class SubtitleSource extends MediaSource {\n    /** Internal constructor. */\n    constructor(codec) {\n        super();\n        /** @internal */\n        this._connectedTrack = null;\n        if (!SUBTITLE_CODECS.includes(codec)) {\n            throw new TypeError(`Invalid subtitle codec '${codec}'. Must be one of: ${SUBTITLE_CODECS.join(', ')}.`);\n        }\n        this._codec = codec;\n    }\n}\n/**\n * This source can be used to add subtitles from a subtitle text file.\n * @group Media sources\n * @public\n */\nexport class TextSubtitleSource extends SubtitleSource {\n    /** Creates a new {@link TextSubtitleSource} where added text chunks are in the specified `codec`. */\n    constructor(codec) {\n        super(codec);\n        /** @internal */\n        this._error = null;\n        /** @internal */\n        this._lastMuxerPromise = Promise.resolve();\n        this._parser = new SubtitleParser({\n            codec,\n            output: (cue, metadata) => {\n                this._lastMuxerPromise\n                    = this._connectedTrack.output._muxer.addSubtitleCue(this._connectedTrack, cue, metadata)\n                        .catch((error) => {\n                        this._error ??= error;\n                    });\n            },\n        });\n    }\n    /**\n     * Parses the subtitle text according to the specified codec and adds it to the output track. You don't have to\n     * add the entire subtitle file at once here; you can provide it in chunks.\n     *\n     * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise\n     * to respect writer and encoder backpressure.\n     */\n    add(text) {\n        if (typeof text !== 'string') {\n            throw new TypeError('text must be a string.');\n        }\n        this._checkForError();\n        this._ensureValidAdd();\n        this._parser.parse(text);\n        return this._lastMuxerPromise; // Allow the writer to apply backpressure\n    }\n    /** @internal */\n    _checkForError() {\n        if (this._error) {\n            throw this._error;\n        }\n    }\n    /** @internal */\n    async _flushAndClose(forceClose) {\n        if (!forceClose) {\n            this._checkForError();\n        }\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { AdtsMuxer } from './adts/adts-muxer.js';\nimport { AUDIO_CODECS, NON_PCM_AUDIO_CODECS, PCM_AUDIO_CODECS, SUBTITLE_CODECS, VIDEO_CODECS, } from './codec.js';\nimport { FlacMuxer } from './flac/flac-muxer.js';\nimport { IsobmffMuxer } from './isobmff/isobmff-muxer.js';\nimport { MatroskaMuxer } from './matroska/matroska-muxer.js';\nimport { Mp3Muxer } from './mp3/mp3-muxer.js';\nimport { OggMuxer } from './ogg/ogg-muxer.js';\nimport { MpegTsMuxer } from './mpeg-ts/mpeg-ts-muxer.js';\nimport { WaveMuxer } from './wave/wave-muxer.js';\nimport { HlsMuxer } from './hls/hls-muxer.js';\nimport { HLS_MIME_TYPE } from './hls/hls-misc.js';\nimport { toArray } from './misc.js';\n/**\n * Base class representing an output media file format.\n * @group Output formats\n * @public\n */\nexport class OutputFormat {\n    /** Returns a list of video codecs that this output format can contain. */\n    getSupportedVideoCodecs() {\n        return this.getSupportedCodecs()\n            .filter(codec => VIDEO_CODECS.includes(codec));\n    }\n    /** Returns a list of audio codecs that this output format can contain. */\n    getSupportedAudioCodecs() {\n        return this.getSupportedCodecs()\n            .filter(codec => AUDIO_CODECS.includes(codec));\n    }\n    /** Returns a list of subtitle codecs that this output format can contain. */\n    getSupportedSubtitleCodecs() {\n        return this.getSupportedCodecs()\n            .filter(codec => SUBTITLE_CODECS.includes(codec));\n    }\n    /** @internal */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _codecUnsupportedHint(codec) {\n        return '';\n    }\n}\n/**\n * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files.\n * @group Output formats\n * @public\n */\nexport class IsobmffOutputFormat extends OutputFormat {\n    /** Internal constructor. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.fastStart !== undefined\n            && ![false, 'in-memory', 'reserve', 'fragmented'].includes(options.fastStart)) {\n            throw new TypeError('options.fastStart, when provided, must be false, \\'in-memory\\', \\'reserve\\', or \\'fragmented\\'.');\n        }\n        if (options.minimumFragmentDuration !== undefined\n            && (!Number.isFinite(options.minimumFragmentDuration) || options.minimumFragmentDuration < 0)) {\n            throw new TypeError('options.minimumFragmentDuration, when provided, must be a non-negative number.');\n        }\n        if (options.onFtyp !== undefined && typeof options.onFtyp !== 'function') {\n            throw new TypeError('options.onFtyp, when provided, must be a function.');\n        }\n        if (options.onMoov !== undefined && typeof options.onMoov !== 'function') {\n            throw new TypeError('options.onMoov, when provided, must be a function.');\n        }\n        if (options.onMdat !== undefined && typeof options.onMdat !== 'function') {\n            throw new TypeError('options.onMdat, when provided, must be a function.');\n        }\n        if (options.onMoof !== undefined && typeof options.onMoof !== 'function') {\n            throw new TypeError('options.onMoof, when provided, must be a function.');\n        }\n        if (options.metadataFormat !== undefined\n            && !['mdir', 'mdta', 'udta', 'auto'].includes(options.metadataFormat)) {\n            throw new TypeError('options.metadataFormat, when provided, must be either \\'auto\\', \\'mdir\\', \\'mdta\\', or \\'udta\\'.');\n        }\n        super();\n        this._options = options;\n    }\n    getSupportedTrackCounts() {\n        const max = 2 ** 32 - 1; // Have fun reaching this one\n        return {\n            video: { min: 0, max },\n            audio: { min: 0, max },\n            subtitle: { min: 0, max },\n            total: { min: 1, max },\n        };\n    }\n    get supportsVideoRotationMetadata() {\n        return true;\n    }\n    get supportsTimestampedMediaData() {\n        return true;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new IsobmffMuxer(output, this);\n    }\n}\n/**\n * MPEG-4 Part 14 (MP4) file format. Supports most codecs.\n * @group Output formats\n * @public\n */\nexport class Mp4OutputFormat extends IsobmffOutputFormat {\n    /** Creates a new {@link Mp4OutputFormat} configured with the specified `options`. */\n    constructor(options) {\n        super(options);\n    }\n    /** @internal */\n    get _name() {\n        return 'MP4';\n    }\n    get fileExtension() {\n        return '.mp4';\n    }\n    get mimeType() {\n        return 'video/mp4';\n    }\n    getSupportedCodecs() {\n        return [\n            ...VIDEO_CODECS,\n            ...NON_PCM_AUDIO_CODECS,\n            // These are supported via ISO/IEC 23003-5:\n            'pcm-s16',\n            'pcm-s16be',\n            'pcm-s24',\n            'pcm-s24be',\n            'pcm-s32',\n            'pcm-s32be',\n            'pcm-f32',\n            'pcm-f32be',\n            'pcm-f64',\n            'pcm-f64be',\n            ...SUBTITLE_CODECS,\n        ];\n    }\n    /** @internal */\n    _codecUnsupportedHint(codec) {\n        if (new MovOutputFormat().getSupportedCodecs().includes(codec)) {\n            return ' Switching to MOV will grant support for this codec.';\n        }\n        return '';\n    }\n}\n/**\n * Creates a single Common Media Application Format (CMAF) segment. An init segment will be written to the\n * {@link Target} specified in {@link OutputOptions.initTarget}. Supports most codecs.\n * @group Output formats\n * @public\n */\nexport class CmafOutputFormat extends IsobmffOutputFormat {\n    /** Creates a new {@link CmafOutputFormat} configured with the specified `options`. */\n    constructor(options) {\n        super(options);\n    }\n    /** @internal */\n    get _name() {\n        return 'CMAF';\n    }\n    get fileExtension() {\n        return '.m4s';\n    }\n    get mimeType() {\n        return 'video/mp4';\n    }\n    getSupportedCodecs() {\n        return [\n            ...VIDEO_CODECS,\n            ...NON_PCM_AUDIO_CODECS,\n            // These are supported via ISO/IEC 23003-5:\n            'pcm-s16',\n            'pcm-s16be',\n            'pcm-s24',\n            'pcm-s24be',\n            'pcm-s32',\n            'pcm-s32be',\n            'pcm-f32',\n            'pcm-f32be',\n            'pcm-f64',\n            'pcm-f64be',\n            ...SUBTITLE_CODECS,\n        ];\n    }\n}\n/**\n * QuickTime File Format (QTFF), often called MOV. Supports all video and audio codecs, but not subtitle codecs.\n * @group Output formats\n * @public\n */\nexport class MovOutputFormat extends IsobmffOutputFormat {\n    /** Creates a new {@link MovOutputFormat} configured with the specified `options`. */\n    constructor(options) {\n        super(options);\n    }\n    /** @internal */\n    get _name() {\n        return 'MOV';\n    }\n    get fileExtension() {\n        return '.mov';\n    }\n    get mimeType() {\n        return 'video/quicktime';\n    }\n    getSupportedCodecs() {\n        return [\n            ...VIDEO_CODECS,\n            ...AUDIO_CODECS,\n        ];\n    }\n    /** @internal */\n    _codecUnsupportedHint(codec) {\n        if (new Mp4OutputFormat().getSupportedCodecs().includes(codec)) {\n            return ' Switching to MP4 will grant support for this codec.';\n        }\n        return '';\n    }\n}\n/**\n * Matroska file format.\n *\n * Supports writing transparent video. For a video track to be marked as transparent, the first packet added must\n * contain alpha side data.\n *\n * @group Output formats\n * @public\n */\nexport class MkvOutputFormat extends OutputFormat {\n    /** Creates a new {@link MkvOutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.appendOnly !== undefined && typeof options.appendOnly !== 'boolean') {\n            throw new TypeError('options.appendOnly, when provided, must be a boolean.');\n        }\n        if (options.minimumClusterDuration !== undefined\n            && (!Number.isFinite(options.minimumClusterDuration) || options.minimumClusterDuration < 0)) {\n            throw new TypeError('options.minimumClusterDuration, when provided, must be a non-negative number.');\n        }\n        if (options.onEbmlHeader !== undefined && typeof options.onEbmlHeader !== 'function') {\n            throw new TypeError('options.onEbmlHeader, when provided, must be a function.');\n        }\n        if (options.onSegmentHeader !== undefined && typeof options.onSegmentHeader !== 'function') {\n            throw new TypeError('options.onHeader, when provided, must be a function.');\n        }\n        if (options.onCluster !== undefined && typeof options.onCluster !== 'function') {\n            throw new TypeError('options.onCluster, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new MatroskaMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'Matroska';\n    }\n    getSupportedTrackCounts() {\n        const max = 127;\n        return {\n            video: { min: 0, max },\n            audio: { min: 0, max },\n            subtitle: { min: 0, max },\n            total: { min: 1, max },\n        };\n    }\n    get fileExtension() {\n        return '.mkv';\n    }\n    get mimeType() {\n        return 'video/x-matroska';\n    }\n    getSupportedCodecs() {\n        return [\n            ...VIDEO_CODECS,\n            ...NON_PCM_AUDIO_CODECS,\n            ...PCM_AUDIO_CODECS.filter(codec => !['pcm-s8', 'pcm-f32be', 'pcm-f64be', 'ulaw', 'alaw'].includes(codec)),\n            ...SUBTITLE_CODECS,\n        ];\n    }\n    get supportsVideoRotationMetadata() {\n        // While it technically does support it with ProjectionPoseRoll, many players appear to ignore this value\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return true;\n    }\n}\n/**\n * WebM file format, based on Matroska.\n *\n * Supports writing transparent video. For a video track to be marked as transparent, the first packet added must\n * contain alpha side data.\n *\n * @group Output formats\n * @public\n */\nexport class WebMOutputFormat extends MkvOutputFormat {\n    /** Creates a new {@link WebMOutputFormat} configured with the specified `options`. */\n    constructor(options) {\n        super(options);\n    }\n    getSupportedCodecs() {\n        return [\n            ...VIDEO_CODECS.filter(codec => ['vp8', 'vp9', 'av1'].includes(codec)),\n            ...AUDIO_CODECS.filter(codec => ['opus', 'vorbis'].includes(codec)),\n            ...SUBTITLE_CODECS,\n        ];\n    }\n    /** @internal */\n    get _name() {\n        return 'WebM';\n    }\n    get fileExtension() {\n        return '.webm';\n    }\n    get mimeType() {\n        return 'video/webm';\n    }\n    /** @internal */\n    _codecUnsupportedHint(codec) {\n        if (new MkvOutputFormat().getSupportedCodecs().includes(codec)) {\n            return ' Switching to MKV will grant support for this codec.';\n        }\n        return '';\n    }\n}\n/**\n * MP3 file format.\n * @group Output formats\n * @public\n */\nexport class Mp3OutputFormat extends OutputFormat {\n    /** Creates a new {@link Mp3OutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.xingHeader !== undefined && typeof options.xingHeader !== 'boolean') {\n            throw new TypeError('options.xingHeader, when provided, must be a boolean.');\n        }\n        if (options.onXingFrame !== undefined && typeof options.onXingFrame !== 'function') {\n            throw new TypeError('options.onXingFrame, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new Mp3Muxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'MP3';\n    }\n    getSupportedTrackCounts() {\n        return {\n            video: { min: 0, max: 0 },\n            audio: { min: 1, max: 1 },\n            subtitle: { min: 0, max: 0 },\n            total: { min: 1, max: 1 },\n        };\n    }\n    get fileExtension() {\n        return '.mp3';\n    }\n    get mimeType() {\n        return 'audio/mpeg';\n    }\n    getSupportedCodecs() {\n        return ['mp3'];\n    }\n    get supportsVideoRotationMetadata() {\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return false;\n    }\n}\n/**\n * WAVE file format, based on RIFF.\n * @group Output formats\n * @public\n */\nexport class WavOutputFormat extends OutputFormat {\n    /** Creates a new {@link WavOutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.large !== undefined && typeof options.large !== 'boolean') {\n            throw new TypeError('options.large, when provided, must be a boolean.');\n        }\n        if (options.metadataFormat !== undefined && !['info', 'id3'].includes(options.metadataFormat)) {\n            throw new TypeError('options.metadataFormat, when provided, must be either \\'info\\' or \\'id3\\'.');\n        }\n        if (options.onHeader !== undefined && typeof options.onHeader !== 'function') {\n            throw new TypeError('options.onHeader, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new WaveMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'WAVE';\n    }\n    getSupportedTrackCounts() {\n        return {\n            video: { min: 0, max: 0 },\n            audio: { min: 1, max: 1 },\n            subtitle: { min: 0, max: 0 },\n            total: { min: 1, max: 1 },\n        };\n    }\n    get fileExtension() {\n        return '.wav';\n    }\n    get mimeType() {\n        return 'audio/wav';\n    }\n    getSupportedCodecs() {\n        return [\n            ...PCM_AUDIO_CODECS.filter(codec => ['pcm-s16', 'pcm-s24', 'pcm-s32', 'pcm-f32', 'pcm-u8', 'ulaw', 'alaw'].includes(codec)),\n        ];\n    }\n    get supportsVideoRotationMetadata() {\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return false;\n    }\n}\n/**\n * Ogg file format.\n * @group Output formats\n * @public\n */\nexport class OggOutputFormat extends OutputFormat {\n    /** Creates a new {@link OggOutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.maximumPageDuration !== undefined\n            && (!Number.isFinite(options.maximumPageDuration) || options.maximumPageDuration <= 0)) {\n            throw new TypeError('options.maximumPageDuration, when provided, must be a positive number.');\n        }\n        if (options.onPage !== undefined && typeof options.onPage !== 'function') {\n            throw new TypeError('options.onPage, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new OggMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'Ogg';\n    }\n    getSupportedTrackCounts() {\n        const max = 2 ** 32; // Have fun reaching this one\n        return {\n            video: { min: 0, max: 0 },\n            audio: { min: 0, max },\n            subtitle: { min: 0, max: 0 },\n            total: { min: 1, max },\n        };\n    }\n    get fileExtension() {\n        return '.ogg';\n    }\n    get mimeType() {\n        return 'application/ogg';\n    }\n    getSupportedCodecs() {\n        return [\n            ...AUDIO_CODECS.filter(codec => ['vorbis', 'opus'].includes(codec)),\n        ];\n    }\n    get supportsVideoRotationMetadata() {\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return false;\n    }\n}\n/**\n * ADTS file format.\n * @group Output formats\n * @public\n */\nexport class AdtsOutputFormat extends OutputFormat {\n    /** Creates a new {@link AdtsOutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.onFrame !== undefined && typeof options.onFrame !== 'function') {\n            throw new TypeError('options.onFrame, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new AdtsMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'ADTS';\n    }\n    getSupportedTrackCounts() {\n        return {\n            video: { min: 0, max: 0 },\n            audio: { min: 1, max: 1 },\n            subtitle: { min: 0, max: 0 },\n            total: { min: 1, max: 1 },\n        };\n    }\n    get fileExtension() {\n        return '.aac';\n    }\n    get mimeType() {\n        return 'audio/aac';\n    }\n    getSupportedCodecs() {\n        return ['aac'];\n    }\n    get supportsVideoRotationMetadata() {\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return false;\n    }\n}\n/**\n * FLAC file format.\n * @group Output formats\n * @public\n */\nexport class FlacOutputFormat extends OutputFormat {\n    /** Creates a new {@link FlacOutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.appendOnly !== undefined && typeof options.appendOnly !== 'boolean') {\n            throw new TypeError('options.appendOnly, when provided, must be a boolean.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new FlacMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'FLAC';\n    }\n    getSupportedTrackCounts() {\n        return {\n            video: { min: 0, max: 0 },\n            audio: { min: 1, max: 1 },\n            subtitle: { min: 0, max: 0 },\n            total: { min: 1, max: 1 },\n        };\n    }\n    get fileExtension() {\n        return '.flac';\n    }\n    get mimeType() {\n        return 'audio/flac';\n    }\n    getSupportedCodecs() {\n        return ['flac'];\n    }\n    get supportsVideoRotationMetadata() {\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return false;\n    }\n}\n/**\n * MPEG Transport Stream file format.\n * @group Output formats\n * @public\n */\nexport class MpegTsOutputFormat extends OutputFormat {\n    /** Creates a new {@link MpegTsOutputFormat} configured with the specified `options`. */\n    constructor(options = {}) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (options.onPacket !== undefined && typeof options.onPacket !== 'function') {\n            throw new TypeError('options.onPacket, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new MpegTsMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'MPEG-TS';\n    }\n    getSupportedTrackCounts() {\n        const maxVideo = 16; // Stream IDs 0xE0-0xEF\n        const maxAudio = 32;\n        const maxTotal = maxVideo + maxAudio;\n        return {\n            video: { min: 0, max: maxVideo },\n            audio: { min: 0, max: maxAudio },\n            subtitle: { min: 0, max: 0 },\n            total: { min: 1, max: maxTotal },\n        };\n    }\n    get fileExtension() {\n        return '.ts';\n    }\n    get mimeType() {\n        return 'video/MP2T';\n    }\n    getSupportedCodecs() {\n        return [\n            ...VIDEO_CODECS.filter(codec => ['avc', 'hevc'].includes(codec)),\n            ...AUDIO_CODECS.filter(codec => ['aac', 'mp3', 'ac3', 'eac3'].includes(codec)),\n        ];\n    }\n    get supportsVideoRotationMetadata() {\n        return false;\n    }\n    get supportsTimestampedMediaData() {\n        return true;\n    }\n}\n/**\n * HTTP Live Streaming (HLS) output format. HLS media is represented by a set of .m3u8 playlist files and media segment\n * files, meaning this format writes out multiple files, requiring the use of a _pathed Output_\n * ({@link OutputOptions.target} must be a {@link PathedTarget}).\n *\n * This output format creates the following files:\n * - A master playlist .m3u8 file, containing the list of available playlists. A master playlist is always emitted,\n * written to the root path.\n * - One .m3u8 file for each playlist, each containing a list of media segments.\n * - Many media segments, containing the actual media data.\n *\n * To emit media playlists that use the `#EXT-X-PROGRAM-DATE-TIME` tag to map segment timestamps to real-world time,\n * set {@link BaseTrackMetadata.isRelativeToUnixEpoch} to `true` for all tracks.\n *\n * @group Output formats\n * @public\n */\nexport class HlsOutputFormat extends OutputFormat {\n    /** Creates a new {@link HlsOutputFormat} configured with the specified `options`. */\n    constructor(options) {\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (!(options.segmentFormat instanceof OutputFormat)\n            && (!Array.isArray(options.segmentFormat)\n                || options.segmentFormat.length === 0\n                || !options.segmentFormat.every(format => format instanceof OutputFormat))) {\n            throw new TypeError('options.segmentFormat must be an OutputFormat or a non-empty array of OutputFormat instances.');\n        }\n        if (options.targetDuration !== undefined\n            && (typeof options.targetDuration !== 'number' || options.targetDuration <= 0)) {\n            throw new TypeError('options.targetDuration, when provided, must be a positive number.');\n        }\n        if (options.singleFilePerPlaylist !== undefined && typeof options.singleFilePerPlaylist !== 'boolean') {\n            throw new TypeError('options.singleFilePerPlaylist, when provided, must be a boolean.');\n        }\n        if (options.live !== undefined && typeof options.live !== 'boolean') {\n            throw new TypeError('options.live, when provided, must be a boolean.');\n        }\n        if (options.maxLiveSegmentCount !== undefined\n            && (typeof options.maxLiveSegmentCount !== 'number' || options.maxLiveSegmentCount < 1\n                || (Number.isFinite(options.maxLiveSegmentCount) && !Number.isInteger(options.maxLiveSegmentCount)))) {\n            throw new TypeError('options.maxLiveSegmentCount, when provided, must be a positive integer or Infinity.');\n        }\n        if (options.getPlaylistPath !== undefined && typeof options.getPlaylistPath !== 'function') {\n            throw new TypeError('options.getPlaylistPath, when provided, must be a function.');\n        }\n        if (options.getSegmentPath !== undefined && typeof options.getSegmentPath !== 'function') {\n            throw new TypeError('options.getSegmentPath, when provided, must be a function.');\n        }\n        if (options.getInitPath !== undefined && typeof options.getInitPath !== 'function') {\n            throw new TypeError('options.getInitPath, when provided, must be a function.');\n        }\n        if (options.onMaster !== undefined && typeof options.onMaster !== 'function') {\n            throw new TypeError('options.onMaster, when provided, must be a function.');\n        }\n        if (options.onPlaylist !== undefined && typeof options.onPlaylist !== 'function') {\n            throw new TypeError('options.onPlaylist, when provided, must be a function.');\n        }\n        if (options.onSegment !== undefined && typeof options.onSegment !== 'function') {\n            throw new TypeError('options.onSegment, when provided, must be a function.');\n        }\n        if (options.onInit !== undefined && typeof options.onInit !== 'function') {\n            throw new TypeError('options.onInit, when provided, must be a function.');\n        }\n        if (options.onSegmentPopped !== undefined && typeof options.onSegmentPopped !== 'function') {\n            throw new TypeError('options.onSegmentPopped, when provided, must be a function.');\n        }\n        super();\n        this._options = options;\n    }\n    /** @internal */\n    _createMuxer(output) {\n        return new HlsMuxer(output, this);\n    }\n    /** @internal */\n    get _name() {\n        return 'HTTP Live Streaming (HLS)';\n    }\n    get fileExtension() {\n        return '.m3u8';\n    }\n    get mimeType() {\n        return HLS_MIME_TYPE;\n    }\n    getSupportedCodecs() {\n        const uniqueCodecs = new Set(toArray(this._options.segmentFormat).flatMap(x => x.getSupportedCodecs()));\n        return [...uniqueCodecs];\n    }\n    getSupportedTrackCounts() {\n        let supportsVideo = false;\n        let supportsAudio = false;\n        let supportsSubtitle = false;\n        for (const format of toArray(this._options.segmentFormat)) {\n            const trackCounts = format.getSupportedTrackCounts();\n            supportsVideo ||= trackCounts.video.max > 0;\n            supportsAudio ||= trackCounts.audio.max > 0;\n            supportsSubtitle ||= trackCounts.subtitle.max > 0;\n        }\n        return {\n            video: { min: 0, max: supportsVideo ? Infinity : 0 },\n            audio: { min: 0, max: supportsAudio ? Infinity : 0 },\n            subtitle: { min: 0, max: 0 }, // Currently disabled\n            total: { min: 1, max: Infinity },\n        };\n    }\n    get supportsVideoRotationMetadata() {\n        return toArray(this._options.segmentFormat).some(format => format.supportsVideoRotationMetadata);\n    }\n    get supportsTimestampedMediaData() {\n        return true; // I guess??\n    }\n    /** @internal */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _codecUnsupportedHint(codec) {\n        return ` Using different segment formats may grant support for this codec.`;\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\nimport { assert, AsyncMutex, EventEmitter, isIso639Dash2LanguageCode, toArray } from './misc.js';\nimport { validateMetadataTags, validateTrackDisposition } from './metadata.js';\nimport { OutputFormat } from './output-format.js';\nimport { AudioSource, SubtitleSource, VideoSource } from './media-source.js';\nimport { PathedTarget, Target } from './target.js';\nimport { Writer } from './writer.js';\nimport { Logging } from './logging.js';\n/**\n * List of all track types.\n * @group Miscellaneous\n * @public\n */\nexport const ALL_TRACK_TYPES = ['video', 'audio', 'subtitle'];\n/**\n * Represents a track added to an {@link Output}.\n * @group Output files\n * @public\n */\nexport class OutputTrack {\n    /** @internal */\n    constructor(id, output, type, source, metadata) {\n        this.id = id;\n        this.output = output;\n        this.type = type;\n        this.source = source;\n        this.metadata = metadata;\n    }\n    /** Returns true if and only if this track is a video track. */\n    isVideoTrack() {\n        return this.type === 'video';\n    }\n    /** Returns true if and only if this track is an audio track. */\n    isAudioTrack() {\n        return this.type === 'audio';\n    }\n    /** Returns true if and only if this track is a subtitle track. */\n    isSubtitleTrack() {\n        return this.type === 'subtitle';\n    }\n    /**\n     * Returns true if and only if this track can be paired with the given other track. Pairability can be set using\n     * the {@link BaseTrackMetadata.group} option.\n     */\n    canBePairedWith(other) {\n        if (!(other instanceof OutputTrack)) {\n            throw new TypeError('other must be an OutputTrack.');\n        }\n        if (this === other) {\n            return false;\n        }\n        const thisGroups = toArray(this.metadata.group);\n        const otherGroups = toArray(other.metadata.group);\n        for (const aGroup of thisGroups) {\n            const pairableInSameGroup = this.type !== other.type && otherGroups.some(bGroup => aGroup === bGroup);\n            if (pairableInSameGroup) {\n                return true;\n            }\n            const pairableAcrossGroups = otherGroups.some(bGroup => aGroup._pairedGroups.has(bGroup));\n            if (pairableAcrossGroups) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n/**\n * An {@link OutputTrack} providing video data, created using {@link Output.addVideoTrack}.\n * @group Output files\n * @public\n */\nexport class OutputVideoTrack extends OutputTrack {\n    /** @internal */\n    constructor(id, output, source, metadata) {\n        super(id, output, 'video', source, metadata);\n    }\n}\n/**\n * An {@link OutputTrack} providing audio data, created using {@link Output.addAudioTrack}.\n * @group Output files\n * @public\n */\nexport class OutputAudioTrack extends OutputTrack {\n    /** @internal */\n    constructor(id, output, source, metadata) {\n        super(id, output, 'audio', source, metadata);\n    }\n}\n/**\n * An {@link OutputTrack} providing subtitle data, created using {@link Output.addSubtitleTrack}.\n * @group Output files\n * @public\n */\nexport class OutputSubtitleTrack extends OutputTrack {\n    /** @internal */\n    constructor(id, output, source, metadata) {\n        super(id, output, 'subtitle', source, metadata);\n    }\n}\n/**\n * Used to define pairability between {@link OutputTrack} instances. First create the group, then assign tracks to it\n * via {@link BaseTrackMetadata.group}.\n *\n * Two tracks are considered _pairable_ if they are in the same group but have a different {@link TrackType}, or if they\n * are in different groups that are paired with each other. Groups can be paired with each other using the\n * {@link OutputTrackGroup.pairWith} method.\n *\n * @group Output files\n * @public\n */\nexport class OutputTrackGroup {\n    /** Creates a new {@link OutputTrackGroup}. */\n    constructor() {\n        /** @internal */\n        this._pairedGroups = new Set();\n        // The object's identity is the state\n    }\n    /**\n     * Marks this group as being pairable with another group, symmetrically. Output tracks where each track is assigned\n     * to one half of a group pairing are then considered pairable.\n     *\n     * You cannot pair a group with itself.\n     */\n    pairWith(other) {\n        if (!(other instanceof OutputTrackGroup)) {\n            throw new TypeError('other must be an OutputTrackGroup.');\n        }\n        if (this === other) {\n            throw new TypeError('Cannot pair a group with itself.');\n        }\n        this._pairedGroups.add(other);\n        other._pairedGroups.add(this);\n    }\n}\nconst validateBaseTrackMetadata = (metadata) => {\n    if (!metadata || typeof metadata !== 'object') {\n        throw new TypeError('metadata must be an object.');\n    }\n    if (metadata.languageCode !== undefined && !isIso639Dash2LanguageCode(metadata.languageCode)) {\n        throw new TypeError('metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.');\n    }\n    if (metadata.name !== undefined && typeof metadata.name !== 'string') {\n        throw new TypeError('metadata.name, when provided, must be a string.');\n    }\n    if (metadata.disposition !== undefined) {\n        validateTrackDisposition(metadata.disposition);\n    }\n    if (metadata.maximumPacketCount !== undefined\n        && (!Number.isInteger(metadata.maximumPacketCount) || metadata.maximumPacketCount < 0)) {\n        throw new TypeError('metadata.maximumPacketCount, when provided, must be a non-negative integer.');\n    }\n    if (metadata.group !== undefined\n        && !(metadata.group instanceof OutputTrackGroup)\n        && (!Array.isArray(metadata.group) || metadata.group.some(group => !(group instanceof OutputTrackGroup)))) {\n        throw new TypeError('metadata.group, when provided, must be an OutputTrackGroup instance or an array of'\n            + ' OutputTrackGroup instances.');\n    }\n};\n/**\n * Main class orchestrating the creation of new media files.\n * @group Output files\n * @public\n */\nexport class Output extends EventEmitter {\n    /**\n     * The target to which the root file will be written. Throws when using {@link PathedTarget} with an async callback;\n     * prefer the `'target'` event for those cases.\n     */\n    get target() {\n        const errorMessage = 'Output.target cannot be used when using PathedTarget with an async callback.'\n            + ' Use the \\'target\\' event instead.';\n        // We use this field to make sure we can reliably throw in the `target` getter whenever retrieving the target\n        // requires awaiting a promise. We do this so there is no different behavior based on order: if the target has\n        // already been retrieved via the normal internal operations, and then somebody calls the `target` getter, even\n        // if the target is now available, the getter should still throw to be consistent in behavior and in definition.\n        if (this._rootTargetPromise) {\n            throw new TypeError(errorMessage);\n        }\n        const rootTargetResult = this._getRootTarget();\n        if (rootTargetResult instanceof Promise) {\n            throw new TypeError(errorMessage);\n        }\n        return rootTargetResult;\n    }\n    /**\n     * Creates a new instance of {@link Output} which can then be used to create a new media file according to the\n     * specified {@link OutputOptions}.\n     */\n    constructor(options) {\n        super();\n        /** The current state of the output. */\n        this.state = 'pending';\n        /**\n         * The {@link OutputTrackGroup} that all tracks are assigned to by default unless otherwise specified by\n         * {@link BaseTrackMetadata.group}.\n         */\n        this.defaultTrackGroup = new OutputTrackGroup();\n        /** @internal */\n        this._onFinalize = null;\n        /** @internal */\n        this._unfinalizedTargets = new Set();\n        /** @internal */\n        this._rootWriterPromise = null;\n        /** @internal */\n        this._tracks = [];\n        /** @internal */\n        this._startPromise = null;\n        /** @internal */\n        this._cancelPromise = null;\n        /** @internal */\n        this._finalizePromise = null;\n        /** @internal */\n        this._mutex = new AsyncMutex();\n        /** @internal */\n        this._metadataTags = {};\n        /** @internal */\n        this._rootTarget = null;\n        /** @internal */\n        this._rootTargetPromise = null;\n        /**\n         * This field is used to synchronize multiple MediaStreamTracks. They use the same time coordinate system across\n         * tracks, and to ensure correct audio-video sync, we must use the same offset for all of them. The reason an offset\n         * is needed at all is because the timestamps typically don't start at zero.\n         * @internal\n         */\n        this._firstMediaStreamTimestamp = null;\n        if (!options || typeof options !== 'object') {\n            throw new TypeError('options must be an object.');\n        }\n        if (!(options.format instanceof OutputFormat)) {\n            throw new TypeError('options.format must be an OutputFormat.');\n        }\n        if (!(options.target instanceof Target || options.target instanceof PathedTarget)) {\n            throw new TypeError('options.target must be a Target or a PathedTarget.');\n        }\n        if (options.target instanceof Target) {\n            this._rememberTarget(options.target);\n        }\n        if (options.initTarget !== undefined\n            && !(options.initTarget instanceof Target)\n            && typeof options.initTarget !== 'function') {\n            throw new Error('options.initTarget, when provided, must be a Target or a function that returns or resolves to'\n                + ' a Target.');\n        }\n        if (options.onFinalize !== undefined && typeof options.onFinalize !== 'function') {\n            throw new TypeError('options.onFinalize, when provided, must be a function.');\n        }\n        this.format = options.format;\n        this._target = options.target;\n        this._onFinalize = options.onFinalize ?? null;\n        this._initTarget = options.initTarget ?? null;\n        if (this._initTarget instanceof Target) {\n            this._rememberTarget(this._initTarget);\n        }\n        this._muxer = options.format._createMuxer(this);\n    }\n    /** @internal */\n    _getTargetValidated(request) {\n        assert(this._target instanceof PathedTarget);\n        const result = this._target.getTarget(request);\n        const handleResult = (result) => {\n            if (!(result instanceof Target)) {\n                throw new TypeError('getTarget must return a Target.');\n            }\n            return result;\n        };\n        if (result instanceof Promise) {\n            return result.then(handleResult);\n        }\n        else {\n            return handleResult(result);\n        }\n    }\n    /** @internal */\n    async _getTarget(request) {\n        assert(this._target instanceof PathedTarget);\n        const target = await this._getTargetValidated(request);\n        this._emit('target', { target, request, isRoot: request.isRoot });\n        if (this.state === 'canceled') {\n            await target._close();\n        }\n        else {\n            this._rememberTarget(target);\n        }\n        return target;\n    }\n    /** @internal */\n    _rememberTarget(target) {\n        this._unfinalizedTargets.add(target);\n        target.on('finalized', () => this._unfinalizedTargets.delete(target), { once: true });\n    }\n    /** @internal */\n    async _getInitTarget() {\n        assert(this._initTarget !== null);\n        if (this._initTarget instanceof Target) {\n            return this._initTarget;\n        }\n        const target = await this._initTarget();\n        if (this.state === 'canceled') {\n            await target._close();\n        }\n        else {\n            this._rememberTarget(target);\n        }\n        return target;\n    }\n    /** @internal */\n    _hasInitTarget() {\n        return this._initTarget !== null;\n    }\n    /** @internal */\n    _getRootTarget() {\n        if (this._rootTarget) {\n            return this._rootTarget;\n        }\n        if (this._rootTargetPromise) {\n            return this._rootTargetPromise;\n        }\n        if (this._target instanceof Target) {\n            this._emit('target', { target: this._target, request: null, isRoot: true });\n            this._rootTarget = this._target;\n            return this._target;\n        }\n        const request = {\n            path: this._target.rootPath,\n            isRoot: true,\n            mimeType: this.format.mimeType,\n        };\n        const result = this._getTargetValidated(request);\n        const handleResult = (target) => {\n            if (this.state === 'canceled') {\n                // Promise thrown away here, but no way to surface it to the user really\n                void target._close();\n            }\n            else {\n                this._rememberTarget(target);\n            }\n            this._emit('target', { target, request, isRoot: true });\n            this._rootTarget = target;\n            return target;\n        };\n        if (result instanceof Promise) {\n            return this._rootTargetPromise = result.then(handleResult);\n        }\n        else {\n            return handleResult(result);\n        }\n    }\n    /** @internal */\n    _getRootWriter(isMonotonic) {\n        return this._rootWriterPromise ??= (async () => {\n            const target = await this._getRootTarget();\n            const writer = new Writer(target, typeof isMonotonic === 'boolean' ? isMonotonic : isMonotonic(target));\n            writer.start();\n            return writer;\n        })();\n    }\n    /** Adds a video track to the output with the given source. Can only be called before the output is started. */\n    addVideoTrack(source, metadata = {}) {\n        if (!(source instanceof VideoSource)) {\n            throw new TypeError('source must be a VideoSource.');\n        }\n        validateBaseTrackMetadata(metadata);\n        if (metadata.rotation !== undefined && ![0, 90, 180, 270].includes(metadata.rotation)) {\n            throw new TypeError(`Invalid video rotation: ${metadata.rotation}. Has to be 0, 90, 180 or 270.`);\n        }\n        if (!this.format.supportsVideoRotationMetadata && metadata.rotation) {\n            throw new Error(`${this.format._name} does not support video rotation metadata.`);\n        }\n        if (metadata.frameRate !== undefined\n            && (!Number.isFinite(metadata.frameRate) || metadata.frameRate <= 0)) {\n            throw new TypeError(`Invalid video frame rate: ${metadata.frameRate}. Must be a positive number.`);\n        }\n        const metadataCopy = { ...metadata };\n        metadataCopy.group ??= this.defaultTrackGroup;\n        return this._addTrack(new OutputVideoTrack(this._tracks.length + 1, this, source, metadataCopy));\n    }\n    /** Adds an audio track to the output with the given source. Can only be called before the output is started. */\n    addAudioTrack(source, metadata = {}) {\n        if (!(source instanceof AudioSource)) {\n            throw new TypeError('source must be an AudioSource.');\n        }\n        validateBaseTrackMetadata(metadata);\n        const metadataCopy = { ...metadata };\n        metadataCopy.group ??= this.defaultTrackGroup;\n        return this._addTrack(new OutputAudioTrack(this._tracks.length + 1, this, source, metadataCopy));\n    }\n    /** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */\n    addSubtitleTrack(source, metadata = {}) {\n        if (!(source instanceof SubtitleSource)) {\n            throw new TypeError('source must be a SubtitleSource.');\n        }\n        validateBaseTrackMetadata(metadata);\n        const metadataCopy = { ...metadata };\n        metadataCopy.group ??= this.defaultTrackGroup;\n        return this._addTrack(new OutputSubtitleTrack(this._tracks.length + 1, this, source, metadataCopy));\n    }\n    /**\n     * Sets descriptive metadata tags about the media file, such as title, author, date, or cover art. When called\n     * multiple times, only the metadata from the last call will be used.\n     *\n     * Can only be called before the output is started.\n     */\n    setMetadataTags(tags) {\n        validateMetadataTags(tags);\n        if (this.state !== 'pending') {\n            throw new Error('Cannot set metadata tags after output has been started or canceled.');\n        }\n        this._metadataTags = tags;\n    }\n    /** @internal */\n    _addTrack(track) {\n        if (this.state !== 'pending') {\n            throw new Error('Cannot add track after output has been started or canceled.');\n        }\n        if (track.source._connectedTrack) {\n            throw new Error('Source is already used for a track.');\n        }\n        // Verify maximum track count constraints\n        const supportedTrackCounts = this.format.getSupportedTrackCounts();\n        const presentTracksOfThisType = this._tracks.reduce((count, t) => count + (t.type === track.type ? 1 : 0), 0);\n        const maxCount = supportedTrackCounts[track.type].max;\n        if (presentTracksOfThisType === maxCount) {\n            throw new Error(maxCount === 0\n                ? `${this.format._name} does not support ${track.type} tracks.`\n                : (`${this.format._name} does not support more than ${maxCount} ${track.type} track`\n                    + `${maxCount === 1 ? '' : 's'}.`));\n        }\n        const maxTotalCount = supportedTrackCounts.total.max;\n        if (this._tracks.length === maxTotalCount) {\n            throw new Error(`${this.format._name} does not support more than ${maxTotalCount} tracks`\n                + `${maxTotalCount === 1 ? '' : 's'} in total.`);\n        }\n        if (track.isVideoTrack()) {\n            const supportedVideoCodecs = this.format.getSupportedVideoCodecs();\n            if (supportedVideoCodecs.length === 0) {\n                throw new Error(`${this.format._name} does not support video tracks.`\n                    + this.format._codecUnsupportedHint(track.source._codec));\n            }\n            else if (!supportedVideoCodecs.includes(track.source._codec)) {\n                throw new Error(`Codec '${track.source._codec}' cannot be contained within ${this.format._name}. Supported`\n                    + ` video codecs are: ${supportedVideoCodecs.map(codec => `'${codec}'`).join(', ')}.`\n                    + this.format._codecUnsupportedHint(track.source._codec));\n            }\n        }\n        else if (track.isAudioTrack()) {\n            const supportedAudioCodecs = this.format.getSupportedAudioCodecs();\n            if (supportedAudioCodecs.length === 0) {\n                throw new Error(`${this.format._name} does not support audio tracks.`\n                    + this.format._codecUnsupportedHint(track.source._codec));\n            }\n            else if (!supportedAudioCodecs.includes(track.source._codec)) {\n                throw new Error(`Codec '${track.source._codec}' cannot be contained within ${this.format._name}. Supported`\n                    + ` audio codecs are: ${supportedAudioCodecs.map(codec => `'${codec}'`).join(', ')}.`\n                    + this.format._codecUnsupportedHint(track.source._codec));\n            }\n        }\n        else if (track.isSubtitleTrack()) {\n            const supportedSubtitleCodecs = this.format.getSupportedSubtitleCodecs();\n            if (supportedSubtitleCodecs.length === 0) {\n                throw new Error(`${this.format._name} does not support subtitle tracks.`\n                    + this.format._codecUnsupportedHint(track.source._codec));\n            }\n            else if (!supportedSubtitleCodecs.includes(track.source._codec)) {\n                throw new Error(`Codec '${track.source._codec}' cannot be contained within ${this.format._name}. Supported`\n                    + ` subtitle codecs are: ${supportedSubtitleCodecs.map(codec => `'${codec}'`).join(', ')}.`\n                    + this.format._codecUnsupportedHint(track.source._codec));\n            }\n        }\n        this._tracks.push(track);\n        track.source._connectedTrack = track;\n        return track;\n    }\n    /**\n     * Starts the creation of the output file. This method should be called after all tracks have been added. Only after\n     * the output has started can media samples be added to the tracks.\n     *\n     * @returns A promise that resolves when the output has successfully started and is ready to receive media samples.\n     */\n    async start() {\n        // Verify minimum track count constraints\n        const supportedTrackCounts = this.format.getSupportedTrackCounts();\n        for (const trackType of ALL_TRACK_TYPES) {\n            const presentTracksOfThisType = this._tracks.reduce((count, track) => count + (track.type === trackType ? 1 : 0), 0);\n            const minCount = supportedTrackCounts[trackType].min;\n            if (presentTracksOfThisType < minCount) {\n                throw new Error(minCount === supportedTrackCounts[trackType].max\n                    ? (`${this.format._name} requires exactly ${minCount} ${trackType}`\n                        + ` track${minCount === 1 ? '' : 's'}.`)\n                    : (`${this.format._name} requires at least ${minCount} ${trackType}`\n                        + ` track${minCount === 1 ? '' : 's'}.`));\n            }\n        }\n        const totalMinCount = supportedTrackCounts.total.min;\n        if (this._tracks.length < totalMinCount) {\n            throw new Error(totalMinCount === supportedTrackCounts.total.max\n                ? (`${this.format._name} requires exactly ${totalMinCount} track`\n                    + `${totalMinCount === 1 ? '' : 's'}.`)\n                : (`${this.format._name} requires at least ${totalMinCount} track`\n                    + `${totalMinCount === 1 ? '' : 's'}.`));\n        }\n        if (this.state === 'canceled') {\n            throw new Error('Output has been canceled.');\n        }\n        if (this._startPromise) {\n            Logging._warn('Output has already been started.');\n            return this._startPromise;\n        }\n        return this._startPromise = (async () => {\n            this.state = 'started';\n            const release = await this._mutex.acquire();\n            try {\n                await this._muxer.start();\n                const promises = this._tracks.map(track => track.source._start());\n                await Promise.all(promises);\n            }\n            finally {\n                release();\n            }\n        })();\n    }\n    /**\n     * Resolves with the full MIME type of the output file, including track codecs.\n     *\n     * The returned promise will resolve only once the precise codec strings of all tracks are known.\n     */\n    getMimeType() {\n        return this._muxer.getMimeType();\n    }\n    /**\n     * Cancels the creation of the output file, releasing internal resources like encoders and preventing further\n     * samples from being added.\n     *\n     * @returns A promise that resolves once all internal resources have been released.\n     */\n    async cancel() {\n        if (this._cancelPromise) {\n            Logging._warn('Output has already been canceled.');\n            return this._cancelPromise;\n        }\n        else if (this.state === 'finalizing' || this.state === 'finalized') {\n            // Don't wanna warn when finalizing since that shows a warning when finalization fails and then cancel\n            // is called\n            if (this.state === 'finalized') {\n                Logging._warn('Output has already been finalized.');\n            }\n            return;\n        }\n        return this._cancelPromise = (async () => {\n            this.state = 'canceled';\n            const release = await this._mutex.acquire();\n            try {\n                const promises = this._tracks.map(x => x.source._flushOrWaitForOngoingClose(true)); // Force close\n                await Promise.all(promises);\n                await Promise.all([...this._unfinalizedTargets].map(target => target._close()));\n                this._unfinalizedTargets.clear();\n            }\n            finally {\n                release();\n            }\n        })();\n    }\n    /**\n     * Finalizes the output file. This method must be called after all media samples across all tracks have been added.\n     * Once the Promise returned by this method completes, the output file is ready.\n     */\n    async finalize() {\n        if (this.state === 'pending') {\n            throw new Error('Cannot finalize before starting.');\n        }\n        if (this.state === 'canceled') {\n            throw new Error('Cannot finalize after canceling.');\n        }\n        if (this._finalizePromise) {\n            Logging._warn('Output has already been finalized.');\n            return this._finalizePromise;\n        }\n        return this._finalizePromise = (async () => {\n            this.state = 'finalizing';\n            const release = await this._mutex.acquire();\n            try {\n                const promises = this._tracks.map(x => x.source._flushOrWaitForOngoingClose(false));\n                await Promise.all(promises);\n                await this._muxer.finalize();\n                if (this._rootWriterPromise) {\n                    const rootWriter = await this._rootWriterPromise;\n                    if (!rootWriter.finalized) {\n                        await rootWriter.flush();\n                        await rootWriter.finalize();\n                    }\n                }\n                if (this._onFinalize) {\n                    await this._onFinalize();\n                }\n                this.state = 'finalized';\n            }\n            finally {\n                release();\n            }\n        })();\n    }\n}\n", "/*!\n * Copyright (c) 2026-present, Vanilagy and contributors\n *\n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/// <reference types=\"dom-mediacapture-transform\" preserve=\"true\" />\n/// <reference types=\"dom-webcodecs\" preserve=\"true\" />\nimport { Logging } from './logging.js';\nconst MEDIABUNNY_LOADED_SYMBOL = Symbol.for('mediabunny loaded');\nif (globalThis[MEDIABUNNY_LOADED_SYMBOL]) {\n    Logging._error('[WARNING]\\nMediabunny was loaded twice.'\n        + ' This will likely cause Mediabunny not to work correctly.'\n        + ' Check if multiple dependencies are importing different versions of Mediabunny,'\n        + ' or if something is being bundled incorrectly.');\n}\nglobalThis[MEDIABUNNY_LOADED_SYMBOL] = true;\nexport { Output, OutputTrack, OutputVideoTrack, OutputAudioTrack, OutputSubtitleTrack, OutputTrackGroup, } from './output.js';\nexport { OutputFormat, AdtsOutputFormat, CmafOutputFormat, FlacOutputFormat, HlsOutputFormat, IsobmffOutputFormat, MkvOutputFormat, MovOutputFormat, Mp3OutputFormat, Mp4OutputFormat, MpegTsOutputFormat, OggOutputFormat, WavOutputFormat, WebMOutputFormat, } from './output-format.js';\nexport { MediaSource, VideoSource, AudioSource, SubtitleSource, AudioBufferSource, AudioSampleSource, CanvasSource, EncodedAudioPacketSource, EncodedVideoPacketSource, MediaStreamAudioTrackSource, MediaStreamVideoTrackSource, TextSubtitleSource, VideoSampleSource, } from './media-source.js';\nexport { VIDEO_CODECS, AUDIO_CODECS, PCM_AUDIO_CODECS, NON_PCM_AUDIO_CODECS, SUBTITLE_CODECS, } from './codec.js';\nexport { canDecode, canDecodeVideo, canDecodeAudio, getDecodableCodecs, getDecodableVideoCodecs, getDecodableAudioCodecs, } from './decode.js';\nexport { canEncode, canEncodeVideo, canEncodeAudio, canEncodeSubtitles, getEncodableCodecs, getEncodableVideoCodecs, getEncodableAudioCodecs, getEncodableSubtitleCodecs, getFirstEncodableVideoCodec, getFirstEncodableAudioCodec, getFirstEncodableSubtitleCodec, Quality, QUALITY_VERY_LOW, QUALITY_LOW, QUALITY_MEDIUM, QUALITY_HIGH, QUALITY_VERY_HIGH, } from './encode.js';\nexport { Target, AppendOnlyStreamTarget, BufferTarget, FilePathTarget, NullTarget, PathedTarget, RangedTarget, StreamTarget, } from './target.js';\nexport { ConcurrentRunner, EventEmitter, } from './misc.js';\nexport { Logging, LogLevel, } from './logging.js';\nexport { ALL_TRACK_TYPES, } from './output.js';\nexport { Source, SourceRef, BlobSource, BufferSource, CustomPathedSource, CustomSource, FilePathSource, PathedSource, \n// eslint-disable-next-line @typescript-eslint/no-deprecated\nStreamSource, RangedSource, ReadableStreamSource, UrlSource, } from './source.js';\nexport { InputFormat, AdtsInputFormat, FlacInputFormat, IsobmffInputFormat, HlsInputFormat, MatroskaInputFormat, Mp3InputFormat, Mp4InputFormat, MpegTsInputFormat, OggInputFormat, QuickTimeInputFormat, WaveInputFormat, WebMInputFormat, ALL_FORMATS, HLS_FORMATS, ADTS, FLAC, HLS, MATROSKA, MP3, MP4, MPEG_TS, OGG, QTFF, WAVE, WEBM, } from './input-format.js';\nexport { Input, InputDisposedError, UnsupportedInputFormatError, } from './input.js';\nexport { InputTrack, InputVideoTrack, InputAudioTrack, asc, desc, prefer, } from './input-track.js';\nexport { EncodedPacket, } from './packet.js';\nexport { AudioSample, AudioSampleResource, VideoSample, VideoSampleColorSpace, VideoSampleResource, VIDEO_SAMPLE_PIXEL_FORMATS, registerVideoSampleTransformer, } from './sample.js';\nexport { AudioBufferSink, AudioSampleSink, BaseMediaSampleSink, CanvasSink, EncodedPacketSink, VideoSampleSink, } from './media-sink.js';\nexport { Conversion, ConversionCanceledError, } from './conversion.js';\nexport { CustomVideoDecoder, CustomVideoEncoder, CustomAudioDecoder, CustomAudioEncoder, registerDecoder, registerEncoder, } from './custom-coder.js';\nexport { RichImageData, AttachedFile, } from './metadata.js';\n// 🐡🦔\n", "import {\n\tOutput,\n\tBufferTarget,\n\tMp4OutputFormat,\n\tWebMOutputFormat,\n\tVideoSampleSource,\n\tVideoSample,\n\tQUALITY_HIGH,\n\tcanEncodeVideo,\n} from 'mediabunny';\nimport type { ItemId } from './types.ts';\n\n/**\n * Tracks in-progress operations so they can be cancelled at async boundaries.\n */\nconst inProgressOperations = new Set< ItemId >();\n\n/**\n * Fallback per-frame duration when ImageDecoder reports none.\n * GIF spec default 10fps = 100ms (in microseconds).\n */\nconst GIF_DEFAULT_FRAME_DURATION_US = 100_000;\n\n/**\n * Message prefix for \"unsupported but graceful\" outcomes (no WebCodecs,\n * unsupported codec). Consumers detect this prefix and fall back to uploading\n * the original GIF instead of surfacing a hard error.\n *\n * The contract is the message *prefix*, not the Error type: the worker RPC\n * layer (comctx) serializes a thrown error to its `message` string only - the\n * Error subclass, `name`, and `stack` do not survive the worker boundary.\n */\nexport const UNSUPPORTED_ERROR_PREFIX = 'Unsupported';\n\n/**\n * Message prefix for GIFs skipped because they exceed the total-pixel budget.\n *\n * Starts with UNSUPPORTED_ERROR_PREFIX so existing consumers treat the skip\n * as a graceful fallback (keep the uploaded GIF, no companion video); the\n * longer prefix lets consumers distinguish it, e.g. to log a warning. Like\n * UNSUPPORTED_ERROR_PREFIX, the contract is the message prefix because only\n * the message string survives the worker boundary.\n */\nexport const SIZE_LIMIT_ERROR_PREFIX = `${ UNSUPPORTED_ERROR_PREFIX }: GIF exceeds maximum conversion size`;\n\n/**\n * Default budget for total decoded pixels (width × height × frame count)\n * beyond which conversion is not attempted.\n *\n * Conversion cost is roughly proportional to the total number of decoded\n * pixels. 300 megapixels approximates what a mid-range machine converts\n * within the ~30s the caller is willing to wait (e.g. a 1920x1080 GIF at\n * ~145 frames); anything larger would likely be abandoned anyway, so it is\n * cheaper to not start. Pass `0` to disable the check.\n */\nexport const DEFAULT_MAX_TOTAL_PIXELS = 300_000_000;\n\n/**\n * Serializes encoder access. The upload-media concurrency limit already caps\n * this at 1, but the lock guards direct callers too.\n */\nlet operationLock: Promise< void > = Promise.resolve();\n\n/**\n * Cancels all ongoing operations for a given item ID.\n *\n * Cancellation takes effect at async boundaries (waiting for the lock,\n * encoder-support check, decoder completion, between frames).\n *\n * @param id Item ID.\n * @return Whether an operation was cancelled.\n */\nexport async function cancelOperations( id: ItemId ): Promise< boolean > {\n\treturn inProgressOperations.delete( id );\n}\n\n/**\n * Pads a dimension up to the nearest even number (encoder requirement).\n *\n * @param value Dimension value.\n * @return Even dimension value.\n */\nfunction padToEven( value: number ): number {\n\treturn value % 2 === 0 ? value : value + 1;\n}\n\n/**\n * Converts an animated GIF to a video file (MP4 or WebM).\n *\n * Decodes GIF frames via the browser ImageDecoder (honoring per-frame\n * delays) and re-encodes them with mediabunny / WebCodecs.\n *\n * Accepts the GIF as a Blob so the bytes are read once, here in the worker,\n * instead of being materialized on the main thread and transferred. An\n * ArrayBuffer is still accepted for direct callers and tests.\n *\n * @param id             Item ID.\n * @param gifSource      GIF file as a Blob/File or ArrayBuffer.\n * @param outputMimeType Output MIME type ('video/mp4' or 'video/webm').\n * @param maxDimensions  Optional maximum dimension for downscaling.\n * @param maxTotalPixels Optional budget for total decoded pixels\n *                       (width × height × frame count) beyond which the\n *                       conversion is rejected with SIZE_LIMIT_ERROR_PREFIX.\n *                       Defaults to DEFAULT_MAX_TOTAL_PIXELS; `0` disables.\n * @return Encoded video buffer.\n */\nexport async function convertGifToVideo(\n\tid: ItemId,\n\tgifSource: ArrayBuffer | Blob,\n\toutputMimeType: string,\n\tmaxDimensions?: number,\n\tmaxTotalPixels?: number\n): Promise< ArrayBuffer > {\n\tinProgressOperations.add( id );\n\n\tconst previousLock = operationLock;\n\tlet releaseLock: () => void = () => {};\n\toperationLock = new Promise< void >( ( resolve ) => {\n\t\treleaseLock = resolve;\n\t} );\n\n\ttry {\n\t\tawait previousLock;\n\n\t\tif ( ! inProgressOperations.has( id ) ) {\n\t\t\tthrow new Error( 'Operation cancelled' );\n\t\t}\n\n\t\tif (\n\t\t\ttypeof ImageDecoder === 'undefined' ||\n\t\t\ttypeof VideoEncoder === 'undefined'\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`${ UNSUPPORTED_ERROR_PREFIX }: WebCodecs unavailable`\n\t\t\t);\n\t\t}\n\n\t\tconst isWebm = outputMimeType === 'video/webm';\n\t\tconst codec = isWebm ? 'vp9' : 'avc';\n\n\t\tif ( ! ( await canEncodeVideo( codec ) ) ) {\n\t\t\tthrow new Error(\n\t\t\t\t`${ UNSUPPORTED_ERROR_PREFIX }: encoder codec not supported`\n\t\t\t);\n\t\t}\n\n\t\tif ( ! inProgressOperations.has( id ) ) {\n\t\t\tthrow new Error( 'Operation cancelled' );\n\t\t}\n\n\t\t// Read the bytes here (worker thread) rather than on the main thread.\n\t\tconst data =\n\t\t\tgifSource instanceof ArrayBuffer\n\t\t\t\t? gifSource\n\t\t\t\t: await gifSource.arrayBuffer();\n\n\t\tif ( ! inProgressOperations.has( id ) ) {\n\t\t\tthrow new Error( 'Operation cancelled' );\n\t\t}\n\n\t\tconst decoder = new ImageDecoder( {\n\t\t\tdata,\n\t\t\ttype: 'image/gif',\n\t\t} );\n\n\t\ttry {\n\t\t\t// Wait for the track list to be populated, not decoder.completed.\n\t\t\t// For a fully-buffered ArrayBuffer source, `completed` resolves as\n\t\t\t// soon as the bytes are received, which can be *before* the GIF is\n\t\t\t// parsed - leaving `tracks` empty and `frameCount` at 0 (decoded as\n\t\t\t// \"GIF contains no decodable frames\"). `tracks.ready` is the\n\t\t\t// promise that resolves once track metadata is available.\n\t\t\tawait decoder.tracks.ready;\n\n\t\t\tif ( ! inProgressOperations.has( id ) ) {\n\t\t\t\tthrow new Error( 'Operation cancelled' );\n\t\t\t}\n\n\t\t\tconst track = decoder.tracks.selectedTrack;\n\t\t\tconst frameCount = track?.frameCount ?? 0;\n\t\t\tif ( frameCount === 0 ) {\n\t\t\t\tthrow new Error( 'GIF contains no decodable frames' );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Enforce the total-pixel budget before any encoding work: an\n\t\t\t * over-budget GIF would churn the CPU for minutes only to be\n\t\t\t * abandoned. Track metadata does not expose dimensions, so decode\n\t\t\t * the first frame (cheap) to learn them.\n\t\t\t */\n\t\t\tconst pixelBudget = maxTotalPixels ?? DEFAULT_MAX_TOTAL_PIXELS;\n\t\t\tif ( pixelBudget > 0 ) {\n\t\t\t\tconst { image: probe } = await decoder.decode( {\n\t\t\t\t\tframeIndex: 0,\n\t\t\t\t} );\n\t\t\t\tconst probeWidth = probe.displayWidth;\n\t\t\t\tconst probeHeight = probe.displayHeight;\n\t\t\t\tprobe.close();\n\n\t\t\t\tif ( ! inProgressOperations.has( id ) ) {\n\t\t\t\t\tthrow new Error( 'Operation cancelled' );\n\t\t\t\t}\n\n\t\t\t\tconst totalPixels = probeWidth * probeHeight * frameCount;\n\t\t\t\tif ( totalPixels > pixelBudget ) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${ SIZE_LIMIT_ERROR_PREFIX } (${ probeWidth }x${ probeHeight } x ${ frameCount } frames = ${ totalPixels } pixels; limit is ${ pixelBudget })`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst source = new VideoSampleSource( {\n\t\t\t\tcodec,\n\t\t\t\tbitrate: QUALITY_HIGH,\n\t\t\t\t/*\n\t\t\t\t * A sparser key frame cadence than mediabunny's 2s default\n\t\t\t\t * roughly halves the output size for long GIFs at no\n\t\t\t\t * encode-time or quality cost. These looping, autoplaying\n\t\t\t\t * GIF replacements don't need fine seek granularity.\n\t\t\t\t */\n\t\t\t\tkeyFrameInterval: 10,\n\t\t\t} );\n\t\t\tconst target = new BufferTarget();\n\t\t\tconst output = new Output( {\n\t\t\t\tformat: isWebm ? new WebMOutputFormat() : new Mp4OutputFormat(),\n\t\t\t\ttarget,\n\t\t\t} );\n\t\t\toutput.addVideoTrack( source );\n\t\t\tawait output.start();\n\n\t\t\t// ImageDecoder durations are MICROSECONDS; mediabunny VideoSample\n\t\t\t// timestamps/durations are SECONDS. Accumulate in seconds.\n\t\t\tlet timestampSec = 0;\n\t\t\tfor ( let i = 0; i < frameCount; i++ ) {\n\t\t\t\tif ( ! inProgressOperations.has( id ) ) {\n\t\t\t\t\tthrow new Error( 'Operation cancelled' );\n\t\t\t\t}\n\n\t\t\t\tconst { image } = await decoder.decode( { frameIndex: i } );\n\t\t\t\tconst durationUs =\n\t\t\t\t\timage.duration ?? GIF_DEFAULT_FRAME_DURATION_US;\n\t\t\t\tconst durationSec = durationUs / 1_000_000;\n\n\t\t\t\tconst srcW = image.displayWidth;\n\t\t\t\tconst srcH = image.displayHeight;\n\n\t\t\t\t// Optionally downscale, then force even dimensions: the avc/vp9\n\t\t\t\t// encoders reject odd width/height (e.g. a 600x385 GIF). This\n\t\t\t\t// runs even when no downscaling is requested, so odd-sized GIFs\n\t\t\t\t// are not rejected outright.\n\t\t\t\tlet targetW = srcW;\n\t\t\t\tlet targetH = srcH;\n\t\t\t\tif (\n\t\t\t\t\tmaxDimensions &&\n\t\t\t\t\t( srcW > maxDimensions || srcH > maxDimensions )\n\t\t\t\t) {\n\t\t\t\t\tconst scale = Math.min(\n\t\t\t\t\t\tmaxDimensions / srcW,\n\t\t\t\t\t\tmaxDimensions / srcH\n\t\t\t\t\t);\n\t\t\t\t\ttargetW = Math.round( srcW * scale );\n\t\t\t\t\ttargetH = Math.round( srcH * scale );\n\t\t\t\t}\n\t\t\t\ttargetW = padToEven( targetW );\n\t\t\t\ttargetH = padToEven( targetH );\n\n\t\t\t\tlet frameForEncode: VideoFrame = image;\n\t\t\t\tif ( targetW !== srcW || targetH !== srcH ) {\n\t\t\t\t\tconst canvas = new OffscreenCanvas( targetW, targetH );\n\t\t\t\t\tconst ctx = canvas.getContext( '2d' );\n\t\t\t\t\tif ( ! ctx ) {\n\t\t\t\t\t\tthrow new Error( 'Failed to create 2D canvas context' );\n\t\t\t\t\t}\n\t\t\t\t\tctx.drawImage( image, 0, 0, targetW, targetH );\n\t\t\t\t\t// This replacement VideoFrame's timestamp is in\n\t\t\t\t\t// microseconds.\n\t\t\t\t\tframeForEncode = new VideoFrame( canvas, {\n\t\t\t\t\t\ttimestamp: Math.round( timestampSec * 1_000_000 ),\n\t\t\t\t\t\tduration: durationUs,\n\t\t\t\t\t} );\n\t\t\t\t\timage.close();\n\t\t\t\t}\n\n\t\t\t\tconst sample = new VideoSample( frameForEncode, {\n\t\t\t\t\ttimestamp: timestampSec,\n\t\t\t\t\tduration: durationSec,\n\t\t\t\t} );\n\t\t\t\ttry {\n\t\t\t\t\tawait source.add( sample );\n\t\t\t\t} finally {\n\t\t\t\t\t// Close both the sample wrapper and the underlying frame;\n\t\t\t\t\t// leaking either pressures memory across a long GIF.\n\t\t\t\t\tsample.close();\n\t\t\t\t\tframeForEncode.close();\n\t\t\t\t}\n\t\t\t\ttimestampSec += durationSec;\n\t\t\t}\n\n\t\t\tawait output.finalize();\n\n\t\t\tconst out = target.buffer;\n\t\t\tif ( ! out || out.byteLength === 0 ) {\n\t\t\t\tthrow new Error( 'Encoder produced empty output' );\n\t\t\t}\n\t\t\treturn out;\n\t\t} finally {\n\t\t\tdecoder.close();\n\t\t}\n\t} finally {\n\t\tinProgressOperations.delete( id );\n\t\treleaseLock();\n\t}\n}\n", "/**\n * Worker entry point for video conversion.\n *\n * This file exposes the video conversion functions in the Web Worker\n * context. The @wordpress/worker-threads library handles the RPC\n * communication with the main thread.\n */\nimport { expose } from '@wordpress/worker-threads';\nimport { cancelOperations, convertGifToVideo } from './index.ts';\n\n/**\n * The API object that exposes the video conversion functions to the main thread.\n */\nconst api = {\n\tcancelOperations,\n\tconvertGifToVideo,\n};\n\nexpose( api );\n\n/**\n * Type export for use with wrap() on the main thread.\n */\nexport type WorkerAPI = typeof api;\n"],
  "mappings": "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",
  "names": ["n", "r", "i", "a", "e", "o", "s", "c", "l", "u", "d", "f", "t", "safeInstanceOf", "clearHeartbeatInterval: () => void", "clearHeartbeatTimeout: () => void", "setIntervalImmediate", "uuid", "pingMessage: Message", "extractTransfer", "pongMessage: Message", "callbackMessage: Message", "responseMessage: Message", "callbackIds: string[]", "p", "m", "h", "applyMessage: Message", "g", "target: ReturnType<T>", "bytes", "i", "view", "view", "a", "i", "i", "a", "t", "LogLevel", "bytes", "n", "i", "bytes", "level", "AvcNalUnitType", "HevcNalUnitType", "i", "bytes", "a", "bytes", "i", "i", "bytes", "i", "HevcNaluOrderState", "i", "bytes", "view", "bytes", "FlacBlockType", "EBMLId", "i", "bytes", "bytes", "e", "SuppressedError", "r", "s", "i", "a", "bytes", "view", "i", "box", "bytes", "_", "i", "_", "a", "box", "body", "sample", "i", "trackData", "n", "t", "movieBox", "bytes", "i", "a", "relativeTimestamp", "view", "i", "stack", "colorChunk", "url", "pending", "result", "t", "i"]
}
