From be44c1f8dd17437f58f08e46a42556521f456f36 Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Thu, 1 Jan 2026 16:57:54 +0800 Subject: [PATCH] Enhance property handling in artplayerProxyMediabunny - Updated the way properties from the shim instance and its prototype are retrieved. - Replaced the for-in loop with a Set to ensure all properties, including inherited ones, are considered. - Excluded the 'constructor' property from being added to the canvas. refactor: remove unused utility functions and streamline event handling - Deleted `videoEvents.js`, `clamp.js`, and `sleep.js` as they were not utilized. - Introduced a new `EventTarget` class to manage event listeners more efficiently. - Enhanced `MediaBunnyEngine`, `AudioEngine`, `VideoEngine`, and `VideoShim` to utilize the new event system. - Updated type definitions in `artplayer-proxy-mediabunny.d.ts` to include new configuration options. - Added comprehensive architecture documentation to clarify the structure and flow of the MediaBunny engine. - Refactored the codebase for improved readability and maintainability, including better naming conventions and JSDoc comments. --- docs/assets/example/mediabunny.js | 2 +- .../artplayer-proxy-mediabunny/index.js | 1609 +++--- .../artplayer-proxy-mediabunny/index.js.map | 2 +- .../ARCHITECTURE.md | 167 + packages/artplayer-proxy-mediabunny/README.md | 61 +- .../dist/artplayer-proxy-mediabunny.js | 8 - .../dist/artplayer-proxy-mediabunny.legacy.js | 8 - .../dist/artplayer-proxy-mediabunny.mjs | 8 - .../mediabunny/llms-full.txt | 5067 ----------------- .../mediabunny/mediabunny.d.ts | 3174 ----------- .../src/AudioEngine.js | 287 + .../src/EventTarget.js | 36 + .../src/MediaBunnyEngine.js | 205 + .../src/VideoEngine.js | 297 + .../src/VideoShim.js | 307 + .../src/engine/audioEngine.js | 316 - .../src/engine/mediabunnyEngine.js | 223 - .../src/engine/videoEngine.js | 311 - .../artplayer-proxy-mediabunny/src/index.js | 80 +- .../src/proxy/canvasProxy.js | 64 - .../src/shim/mediabunnyVideoShim.js | 278 - .../src/shim/videoEvents.js | 28 - .../src/utils/clamp.js | 3 - .../src/utils/sleep.js | 5 - .../types/artplayer-proxy-mediabunny.d.ts | 62 +- 25 files changed, 2299 insertions(+), 10309 deletions(-) create mode 100644 packages/artplayer-proxy-mediabunny/ARCHITECTURE.md delete mode 100644 packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js delete mode 100644 packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js delete mode 100644 packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs delete mode 100644 packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt delete mode 100644 packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts create mode 100644 packages/artplayer-proxy-mediabunny/src/AudioEngine.js create mode 100644 packages/artplayer-proxy-mediabunny/src/EventTarget.js create mode 100644 packages/artplayer-proxy-mediabunny/src/MediaBunnyEngine.js create mode 100644 packages/artplayer-proxy-mediabunny/src/VideoEngine.js create mode 100644 packages/artplayer-proxy-mediabunny/src/VideoShim.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/utils/clamp.js delete mode 100644 packages/artplayer-proxy-mediabunny/src/utils/sleep.js diff --git a/docs/assets/example/mediabunny.js b/docs/assets/example/mediabunny.js index 5f2482b95..a1b234da3 100644 --- a/docs/assets/example/mediabunny.js +++ b/docs/assets/example/mediabunny.js @@ -3,7 +3,7 @@ const art = new Artplayer({ container: '.artplayer-app', - url: '/assets/sample/frag_bunny.mp4', + url: 'https://artplayer.org/assets/sample/frag_bunny.mp4', autoSize: false, screenshot: true, setting: true, diff --git a/docs/uncompiled/artplayer-proxy-mediabunny/index.js b/docs/uncompiled/artplayer-proxy-mediabunny/index.js index 9afcc81f7..d7b8794ff 100644 --- a/docs/uncompiled/artplayer-proxy-mediabunny/index.js +++ b/docs/uncompiled/artplayer-proxy-mediabunny/index.js @@ -208,700 +208,702 @@ } } })({"gqawh":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +/** + * ArtPlayer MediaBunny Proxy + * Main entry point + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "default", ()=>artplayerProxyMediabunny); -var _canvasProxyJs = require("./proxy/canvasProxy.js"); -var _canvasProxyJsDefault = parcelHelpers.interopDefault(_canvasProxyJs); +var _videoShimJs = require("./VideoShim.js"); +var _videoShimJsDefault = parcelHelpers.interopDefault(_videoShimJs); function artplayerProxyMediabunny(option = {}) { return (art)=>{ - return (0, _canvasProxyJsDefault.default)(art, option); + const { constructor } = art; + const { createElement } = constructor.utils; + // Create canvas element + const canvas = createElement('canvas'); + const ctx = canvas.getContext('2d'); + // Create video shim + const shim = new (0, _videoShimJsDefault.default)({ + art, + canvas, + ctx, + option + }); + // Proxy canvas methods to shim + const originalCanvasMethods = {}; + for(const prop in canvas)if (typeof canvas[prop] === 'function') originalCanvasMethods[prop] = canvas[prop].bind(canvas); + // Get all properties from shim instance and prototype + const propertyNames = new Set([ + ...Object.getOwnPropertyNames(shim), + ...Object.getOwnPropertyNames(Object.getPrototypeOf(shim)) + ]); + // Add shim properties to canvas + for (const prop of propertyNames){ + if (prop === 'constructor') continue; + if (!(prop in canvas)) Object.defineProperty(canvas, prop, { + get () { + const value = shim[prop]; + return typeof value === 'function' ? value.bind(shim) : value; + }, + set (v) { + shim[prop] = v; + }, + configurable: true, + enumerable: true + }); + } + // Restore original canvas methods + for(const prop in originalCanvasMethods)canvas[prop] = (...args)=>originalCanvasMethods[prop](...args); + // Handle resize + function resize() { + const player = art.template?.$player; + if (!player || art.option.autoSize) return; + Object.assign(canvas.style, { + width: '100%', + height: '100%', + objectFit: 'contain' + }); + } + art.on('resize', resize); + art.on('video:loadedmetadata', resize); + // Cleanup on destroy + art.on('destroy', ()=>{ + shim.destroy(); + }); + return canvas; }; } if (typeof window !== 'undefined') window.artplayerProxyMediabunny = artplayerProxyMediabunny; -},{"./proxy/canvasProxy.js":"gycKW","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"gycKW":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +},{"./VideoShim.js":"l1ksT","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"l1ksT":[function(require,module,exports,__globalThis) { +/** + * Video Element Shim + * Simulates HTMLVideoElement interface for MediaBunny + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "default", ()=>createCanvasProxy); -var _mediabunnyVideoShimJs = require("../shim/mediabunnyVideoShim.js"); -var _mediabunnyVideoShimJsDefault = parcelHelpers.interopDefault(_mediabunnyVideoShimJs); -function createCanvasProxy(art, option) { - const { constructor } = art; - const { createElement } = constructor.utils; - const canvas = createElement('canvas'); - const ctx = canvas.getContext('2d'); - const shim = (0, _mediabunnyVideoShimJsDefault.default)({ - art, - canvas, - ctx, - option - }); - const originalCanvasMethods = {}; - for(const prop in canvas)if (typeof canvas[prop] === 'function') originalCanvasMethods[prop] = canvas[prop].bind(canvas); - for(const prop in shim)if (!(prop in canvas)) Object.defineProperty(canvas, prop, { - get () { - const value = shim[prop]; - return typeof value === 'function' ? value.bind(shim) : value; - }, - set (v) { - shim[prop] = v; - }, - configurable: true, - enumerable: true - }); - for(const prop in originalCanvasMethods)canvas[prop] = (...args)=>originalCanvasMethods[prop](...args); - art.on('destroy', ()=>{ - shim.destroy(); - }); - function resize() { - const player = art.template?.$player; - if (!player || art.option.autoSize) return; - Object.assign(canvas.style, { - width: '100%', - height: '100%', - objectFit: 'contain' +var _mediaBunnyEngineJs = require("./MediaBunnyEngine.js"); +var _mediaBunnyEngineJsDefault = parcelHelpers.interopDefault(_mediaBunnyEngineJs); +var _eventTargetJs = require("./EventTarget.js"); +var _eventTargetJsDefault = parcelHelpers.interopDefault(_eventTargetJs); +function clamp(v, min, max) { + return Math.max(min, Math.min(max, Number(v) || 0)); +} +class VideoShim { + constructor({ art, canvas, ctx, option }){ + this.art = art; + this.canvas = canvas; + this.option = option; + // Event system + this.events = new (0, _eventTargetJsDefault.default)(); + // MediaBunny engine + this.engine = new (0, _mediaBunnyEngineJsDefault.default)({ + canvas, + ctx, + events: this.events, + option + }); + // Internal state + this._src = null; + this._volume = option.volume ?? 0.7; + this._muted = !!option.muted; + this._playbackRate = 1; + // Apply initial volume + this.engine.setVolume(this._volume, this._muted); + // Forward events to ArtPlayer + this.setupEventForwarding(); + // Auto-load source + if (option.source) this.src = option.source; + else if (art.option?.url) this.src = art.option.url; + } + setupEventForwarding() { + const { events: artEvents } = this.art.constructor.config; + artEvents.forEach((name)=>{ + this.events.addEventListener(name, (e)=>{ + this.art.emit(`video:${e.type}`, e); + }); }); } - art.on('resize', resize); - art.on('video:loadedmetadata', resize); - return canvas; -} - -},{"../shim/mediabunnyVideoShim.js":"bWh4b","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"bWh4b":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "default", ()=>createMediabunnyVideoShim); -var _mediabunnyEngineJs = require("../engine/mediabunnyEngine.js"); -var _mediabunnyEngineJsDefault = parcelHelpers.interopDefault(_mediabunnyEngineJs); -var _clampJs = require("../utils/clamp.js"); -var _clampJsDefault = parcelHelpers.interopDefault(_clampJs); -var _videoEventsJs = require("./videoEvents.js"); -function createMediabunnyVideoShim({ art, canvas, ctx, option }) { - const events = (0, _videoEventsJs.createVideoEventTarget)(); - const engine = (0, _mediabunnyEngineJsDefault.default)({ - canvas, - ctx, - events, - option - }); - let _src = null; - let _volume = option.volume ?? 0.7; - let _muted = !!option.muted; - let _playbackRate = 1; - engine.setVolume(_volume, _muted); - const { events: artEvents } = art.constructor.config; - artEvents.forEach((name)=>{ - events.addEventListener(name, (e)=>{ - art.emit(`video:${e.type}`, e); - }); - }); - const shim = { - addEventListener: events.addEventListener, - removeEventListener: events.removeEventListener, - get src () { - return _src; - }, - set src (v){ - _src = v; - if (v) engine.load(v); - }, - get currentTime () { - return engine.currentTime; - }, - set currentTime (t){ - engine.seek(Number(t) || 0); - }, - get duration () { - return engine.duration; - }, - get buffered () { - const duration = engine.duration; - if (!duration || Number.isNaN(duration)) return { - length: 0, - start: ()=>0, - end: ()=>0 - }; - return { - length: 1, - start: ()=>0, - end: ()=>duration - }; - }, - get played () { - const duration = engine.duration; - const currentTime = engine.currentTime; - if (!duration || Number.isNaN(duration) || currentTime <= 0) return { - length: 0, - start: ()=>0, - end: ()=>0 - }; - return { - length: 1, - start: ()=>0, - end: ()=>currentTime - }; - }, - get paused () { - return engine.paused; - }, - get playing () { - return !engine.paused && !engine.ended; - }, - get ended () { - return engine.ended; - }, - get readyState () { - return engine.readyState; - }, - get networkState () { - return engine.networkState; - }, - get error () { - return engine.error; - }, - get seeking () { - return engine.seeking; - }, - get seekable () { - const duration = engine.duration; - if (!duration || Number.isNaN(duration)) return { - length: 0, - start: ()=>0, - end: ()=>0 - }; - return { - length: 1, - start: ()=>0, - end: ()=>duration - }; - }, - get playbackRate () { - return _playbackRate; - }, - set playbackRate (v){ - const rate = Number(v); - if (Number.isNaN(rate) || rate <= 0) return; - _playbackRate = rate; - engine.setPlaybackRate(rate); - events.emit('ratechange'); - }, - get volume () { - return _volume; - }, - set volume (v){ - _volume = (0, _clampJsDefault.default)(v, 0, 1); - _muted = false; - engine.setVolume(_volume, _muted); - events.emit('volumechange'); - }, - get muted () { - return _muted; - }, - set muted (v){ - _muted = !!v; - engine.setVolume(_volume, _muted); - events.emit('volumechange'); - }, - play () { - return engine.play(); - }, - pause () { - engine.pause(); - }, - load () { - if (_src) engine.load(_src); - }, - destroy () { - engine.destroy(); - }, - get videoWidth () { - return engine.videoWidth; - }, - get videoHeight () { - return engine.videoHeight; - }, - get playsInline () { - return true; - }, - set playsInline (v){}, - get autoplay () { - return option.autoplay || false; - }, - set autoplay (v){}, - get loop () { - return option.loop || false; - }, - set loop (v){}, - get controls () { - return false; - }, - set controls (v){}, - get crossOrigin () { - return option.crossOrigin || ''; - }, - set crossOrigin (v){}, - get currentSrc () { - return _src; - }, - get poster () { - return option.poster || ''; - }, - set poster (v){ - option.poster = v; - }, - get preload () { - return 'auto'; - }, - set preload (v){}, - get defaultMuted () { - return false; - }, - set defaultMuted (v){}, - get defaultPlaybackRate () { - return 1; - }, - set defaultPlaybackRate (v){}, - canPlayType (_type) { - return 'maybe'; - }, - getBoundingClientRect () { - return canvas.getBoundingClientRect(); - }, - requestVideoFrameCallback (callback) { - const id = requestAnimationFrame((time)=>{ - callback(time, { - presentationTime: engine.currentTime, - expectedDisplayTime: time + 16.6, - width: engine.videoWidth, - height: engine.videoHeight, - mediaTime: engine.currentTime, - presentedFrames: 0, - processingDuration: 0, - captureTime: time, - receiveTime: time, - rtpTimestamp: 0 - }); + // Event methods + addEventListener(type, fn) { + this.events.addEventListener(type, fn); + } + removeEventListener(type, fn) { + this.events.removeEventListener(type, fn); + } + // Source + get src() { + return this._src; + } + set src(v) { + this._src = v; + if (v) this.engine.load(v); + } + get currentSrc() { + return this._src; + } + // Time + get currentTime() { + return this.engine.currentTime; + } + set currentTime(t) { + this.engine.seek(Number(t) || 0); + } + get duration() { + return this.engine.duration; + } + // Buffered/Played/Seekable + get buffered() { + return this.createTimeRanges(0, this.engine.duration); + } + get played() { + return this.createTimeRanges(0, this.engine.currentTime); + } + get seekable() { + return this.createTimeRanges(0, this.engine.duration); + } + createTimeRanges(start, end) { + const duration = this.engine.duration; + if (!duration || Number.isNaN(duration) || end <= 0) return { + length: 0, + start: ()=>0, + end: ()=>0 + }; + return { + length: 1, + start: ()=>start, + end: ()=>end + }; + } + // Playback state + get paused() { + return this.engine.paused; + } + get playing() { + return !this.engine.paused && !this.engine.ended; + } + get ended() { + return this.engine.ended; + } + get seeking() { + return this.engine.seeking; + } + // Ready state + get readyState() { + return this.engine.readyState; + } + get networkState() { + return this.engine.networkState; + } + get error() { + return this.engine.error; + } + // Playback rate + get playbackRate() { + return this._playbackRate; + } + set playbackRate(v) { + const rate = Number(v); + if (Number.isNaN(rate) || rate <= 0) return; + this._playbackRate = rate; + this.engine.setPlaybackRate(rate); + this.events.emit('ratechange'); + } + // Volume + get volume() { + return this._volume; + } + set volume(v) { + this._volume = clamp(v, 0, 1); + this._muted = false; + this.engine.setVolume(this._volume, this._muted); + this.events.emit('volumechange'); + } + get muted() { + return this._muted; + } + set muted(v) { + this._muted = !!v; + this.engine.setVolume(this._volume, this._muted); + this.events.emit('volumechange'); + } + // Playback methods + play() { + return this.engine.play(); + } + pause() { + this.engine.pause(); + } + load() { + if (this._src) this.engine.load(this._src); + } + // Video dimensions + get videoWidth() { + return this.engine.videoWidth; + } + get videoHeight() { + return this.engine.videoHeight; + } + // Other properties + get poster() { + return this.option.poster || ''; + } + set poster(v) { + this.option.poster = v; + } + get autoplay() { + return this.option.autoplay || false; + } + set autoplay(v) {} + get loop() { + return this.option.loop || false; + } + set loop(v) {} + get controls() { + return false; + } + set controls(v) {} + get playsInline() { + return true; + } + set playsInline(v) {} + get crossOrigin() { + return this.option.crossOrigin || ''; + } + set crossOrigin(v) {} + get preload() { + return 'auto'; + } + set preload(v) {} + get defaultMuted() { + return false; + } + set defaultMuted(v) {} + get defaultPlaybackRate() { + return 1; + } + set defaultPlaybackRate(v) {} + // Methods + canPlayType(_type) { + return 'maybe'; + } + getBoundingClientRect() { + return this.canvas.getBoundingClientRect(); + } + requestVideoFrameCallback(callback) { + const id = requestAnimationFrame((time)=>{ + callback(time, { + presentationTime: this.engine.currentTime, + expectedDisplayTime: time + 16.6, + width: this.engine.videoWidth, + height: this.engine.videoHeight, + mediaTime: this.engine.currentTime, + presentedFrames: 0, + processingDuration: 0, + captureTime: time, + receiveTime: time, + rtpTimestamp: 0 }); - return id; - }, - cancelVideoFrameCallback (id) { - cancelAnimationFrame(id); - }, - setAttribute (name, value) { - if (name === 'src') this.src = value; - else if (name === 'autoplay') this.autoplay = value; - else if (name === 'loop') this.loop = value; - else if (name === 'muted') this.muted = true; - else canvas.setAttribute(name, value); - } - }; - if (option.source) shim.src = option.source; - else if (art.option?.url) shim.src = art.option.url; - return shim; + }); + return id; + } + cancelVideoFrameCallback(id) { + cancelAnimationFrame(id); + } + setAttribute(name, value) { + if (name === 'src') this.src = value; + else if (name === 'autoplay') this.autoplay = value; + else if (name === 'loop') this.loop = value; + else if (name === 'muted') this.muted = true; + else this.canvas.setAttribute(name, value); + } + destroy() { + this.engine.destroy(); + } } +exports.default = VideoShim; -},{"../engine/mediabunnyEngine.js":"18g6U","../utils/clamp.js":"78ov3","./videoEvents.js":"9BYHB","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"18g6U":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +},{"./MediaBunnyEngine.js":"j1QXy","./EventTarget.js":"7Odz0","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"j1QXy":[function(require,module,exports,__globalThis) { +/** + * Main MediaBunny Engine + * Coordinates audio and video playback + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "default", ()=>createMediabunnyEngine); -var _audioEngineJs = require("./audioEngine.js"); +var _audioEngineJs = require("./AudioEngine.js"); var _audioEngineJsDefault = parcelHelpers.interopDefault(_audioEngineJs); -var _videoEngineJs = require("./videoEngine.js"); +var _videoEngineJs = require("./VideoEngine.js"); var _videoEngineJsDefault = parcelHelpers.interopDefault(_videoEngineJs); -function createMediabunnyEngine({ canvas, ctx, events, option = {} }) { - const defaults = { - timeupdateInterval: 250, - avSyncTolerance: 0.12, - loadTimeout: 12000, - dropLateFrames: false, - poster: '' - }; - const audio = (0, _audioEngineJsDefault.default)(events); - const video = (0, _videoEngineJsDefault.default)({ - canvas, - ctx, - events, - timeupdateInterval: option.timeupdateInterval ?? defaults.timeupdateInterval, - avSyncTolerance: option.avSyncTolerance ?? defaults.avSyncTolerance, - dropLateFrames: option.dropLateFrames ?? defaults.dropLateFrames, - poster: option.poster ?? defaults.poster, - preflightRange: option.preflightRange ?? false - }); - let _paused = true; - let _ended = false; - let _readyState = 0; - let _networkState = 0; - let _error = null; - let _seeking = false; - let loadSeq = 0; - events.addEventListener?.('ended', ()=>{ - _ended = true; - _paused = true; - }); - async function load(src) { - const id = ++loadSeq; - pause(); - _ended = false; - _error = null; - _networkState = 2; - _readyState = 0; - setTimeout(()=>events.emit('waiting'), 0); - setTimeout(()=>events.emit('loadstart'), 0); - const loadTimeout = Number.isFinite(option.loadTimeout) ? option.loadTimeout : defaults.loadTimeout; - let timer = null; - const timeoutPromise = loadTimeout > 0 ? new Promise((_, reject)=>{ - timer = setTimeout(()=>reject(new Error('Load timeout')), loadTimeout); - }) : null; - const loadTask = (async ()=>{ - try { - let videoMetadataLoaded = false; - let audioMetadataLoaded = false; - const checkMetadata = ()=>{ - if (videoMetadataLoaded && audioMetadataLoaded) { - _readyState = 1; - events.emit('loadedmetadata'); - events.emit('durationchange'); - } - }; - const p1 = video.load(src, ()=>{ - if (id !== loadSeq) return; - videoMetadataLoaded = true; - checkMetadata(); - }); - const p2 = audio.load(src, ()=>{ - if (id !== loadSeq) return; - audioMetadataLoaded = true; - checkMetadata(); - }); - await Promise.all([ - p1, - p2 - ]); - if (id !== loadSeq) return; - _readyState = 4; - _networkState = 1; - events.emit('loadeddata'); - events.emit('canplay'); - events.emit('canplaythrough'); - } catch (err) { - if (id !== loadSeq) return; - _error = { - code: 4, - message: err.message - }; - _networkState = 3; - events.emit('error'); - console.error(err); - } finally{ - if (timer) clearTimeout(timer); - } - })(); - if (timeoutPromise) try { +class MediaBunnyEngine { + constructor({ canvas, ctx, events, option = {} }){ + this.events = events; + this.option = option; + // Create audio and video engines + this.audio = new (0, _audioEngineJsDefault.default)(events); + this.video = new (0, _videoEngineJsDefault.default)({ + canvas, + ctx, + events, + timeupdateInterval: option.timeupdateInterval ?? 250, + avSyncTolerance: option.avSyncTolerance ?? 0.12, + dropLateFrames: option.dropLateFrames ?? false, + poster: option.poster ?? '', + preflightRange: option.preflightRange ?? false + }); + // Playback state + this.paused = true; + this.ended = false; + this.readyState = 0; + this.networkState = 0; + this.error = null; + this.seeking = false; + this.loadSeq = 0; + // Listen to ended event + events.addEventListener?.('ended', ()=>{ + this.ended = true; + this.paused = true; + }); + } + async load(src) { + const id = ++this.loadSeq; + this.pause(); + this.ended = false; + this.error = null; + this.networkState = 2 // NETWORK_LOADING + ; + this.readyState = 0 // HAVE_NOTHING + ; + setTimeout(()=>this.events.emit('waiting'), 0); + setTimeout(()=>this.events.emit('loadstart'), 0); + const loadTimeout = Number.isFinite(this.option.loadTimeout) ? this.option.loadTimeout : 12000; + try { await Promise.race([ - loadTask, - timeoutPromise + this.performLoad(src, id), + loadTimeout > 0 ? this.createTimeout(loadTimeout) : Promise.resolve() ]); } catch (err) { - if (id !== loadSeq) return; - loadSeq++; - _error = { + if (id !== this.loadSeq) return; + this.loadSeq++; + this.error = { code: 4, message: err.message }; - _networkState = 3; - events.emit('error'); + this.networkState = 3 // NETWORK_NO_SOURCE + ; + this.events.emit('error'); } - else await loadTask; } - async function play() { - if (!_paused) return; - if (_ended) { - _ended = false; - await seek(0); - } - _paused = false; - await audio.play(); - video.start(audio); - events.emit('play'); - events.emit('playing'); - } - function pause() { - if (_paused) return; - _paused = true; - audio.pause(); - video.stop(); - events.emit('pause'); - } - async function seek(time) { - const shouldResume = !_paused; - _ended = false; - _seeking = true; - events.emit('seeking'); - events.emit('waiting'); - pause(); - await audio.seek(time); - await video.seek(time); - _seeking = false; - events.emit('seeked'); - if (shouldResume && !_ended) await play(); - } - function destroy() { - pause(); - audio.destroy(); - video.destroy(); - } - return { - load, - play, - pause, - seek, - destroy, - setVolume: audio.setVolume, - setPlaybackRate (rate) { - audio.setPlaybackRate(rate); - video.setPlaybackRate(rate); - }, - get currentTime () { - return audio.currentTime; - }, - get duration () { - return audio.duration || video.duration; - }, - get paused () { - return _paused; - }, - get seeking () { - return _seeking; - }, - get ended () { - return _ended; - }, - get readyState () { - return _readyState; - }, - get networkState () { - return _networkState; - }, - get error () { - return _error; - }, - get videoWidth () { - return video.width; - }, - get videoHeight () { - return video.height; - } - }; -} - -},{"./audioEngine.js":"5E7zo","./videoEngine.js":"iSVKr","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"5E7zo":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "default", ()=>createAudioEngine); -var _mediabunny = require("mediabunny"); -function createAudioEngine(events) { - let input = null; - let audioSink = null; - let audioContext = null; - let gainNode = null; - let audioIterator = null; - let audioContextStartTime = 0; - let playbackTimeAtStart = 0; - let latestScheduledEndTime = 0; - let _duration = Number.NaN; - let _paused = true; - let _volume = 0.7; - let _muted = false; - let _playbackRate = 1; - let asyncId = 0; - const queuedNodes = new Set(); - function getCurrentTime() { - if (_paused) return playbackTimeAtStart; - return (audioContext.currentTime - audioContextStartTime) * _playbackRate + playbackTimeAtStart; - } - function updateGain() { - if (!gainNode) return; - const v = _muted ? 0 : _volume; - gainNode.gain.value = v * v; - } - function ensureAudioContext(sampleRate) { - if (audioContext) return; - const AudioContext = window.AudioContext || window.webkitAudioContext; + async performLoad(src, id) { + let videoMetadataLoaded = false; + let audioMetadataLoaded = false; + const checkMetadata = ()=>{ + if (videoMetadataLoaded && audioMetadataLoaded) { + this.readyState = 1 // HAVE_METADATA + ; + this.events.emit('loadedmetadata'); + this.events.emit('durationchange'); + } + }; try { - audioContext = new AudioContext({ - sampleRate - }); - } catch { - audioContext = new AudioContext(); + await Promise.all([ + this.video.load(src, ()=>{ + if (id !== this.loadSeq) return; + videoMetadataLoaded = true; + checkMetadata(); + }), + this.audio.load(src, ()=>{ + if (id !== this.loadSeq) return; + audioMetadataLoaded = true; + checkMetadata(); + }) + ]); + if (id !== this.loadSeq) return; + this.readyState = 4 // HAVE_ENOUGH_DATA + ; + this.networkState = 1 // NETWORK_IDLE + ; + this.events.emit('loadeddata'); + this.events.emit('canplay'); + this.events.emit('canplaythrough'); + } catch (err) { + if (id !== this.loadSeq) return; + this.error = { + code: 4, + message: err.message + }; + this.networkState = 3; + this.events.emit('error'); + console.error('MediaBunny load error:', err); } - gainNode = audioContext.createGain(); - gainNode.connect(audioContext.destination); - updateGain(); } - function stopQueuedNodes() { - for (const node of queuedNodes)node.stop(); - queuedNodes.clear(); + createTimeout(ms) { + return new Promise((_, reject)=>{ + setTimeout(()=>reject(new Error('Load timeout')), ms); + }); } - async function stopIterator() { - await audioIterator?.return(); - audioIterator = null; + async play() { + if (!this.paused) return; + if (this.ended) { + this.ended = false; + await this.seek(0); + } + this.paused = false; + await this.audio.play(); + this.video.start(this.audio); + this.events.emit('play'); + this.events.emit('playing'); } - function normalizeSource(src) { + pause() { + if (this.paused) return; + this.paused = true; + this.audio.pause(); + this.video.stop(); + this.events.emit('pause'); + } + async seek(time) { + const shouldResume = !this.paused; + this.ended = false; + this.seeking = true; + this.events.emit('seeking'); + this.events.emit('waiting'); + this.pause(); + await Promise.all([ + this.audio.seek(time), + this.video.seek(time) + ]); + this.seeking = false; + this.events.emit('seeked'); + if (shouldResume && !this.ended) await this.play(); + } + setVolume(volume, muted) { + this.audio.setVolume(volume, muted); + } + setPlaybackRate(rate) { + this.audio.setPlaybackRate(rate); + this.video.setPlaybackRate(rate); + } + destroy() { + this.pause(); + this.audio.destroy(); + this.video.destroy(); + } + // Getters + get currentTime() { + return this.audio.currentTime; + } + get duration() { + return this.audio.duration || this.video.duration; + } + get videoWidth() { + return this.video.width; + } + get videoHeight() { + return this.video.height; + } +} +exports.default = MediaBunnyEngine; + +},{"./AudioEngine.js":"fhVqP","./VideoEngine.js":"aylqP","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"fhVqP":[function(require,module,exports,__globalThis) { +/** + * Audio Engine for MediaBunny + * Handles audio playback using Web Audio API + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +var _mediabunny = require("mediabunny"); +class AudioEngine { + constructor(events){ + this.events = events; + // MediaBunny instances + this.input = null; + this.audioSink = null; + this.audioIterator = null; + // Web Audio API + this.audioContext = null; + this.gainNode = null; + // Playback state + this.audioContextStartTime = 0; + this.playbackTimeAtStart = 0; + this.latestScheduledEndTime = 0; + this.duration = Number.NaN; + this.paused = true; + // Audio settings + this.volume = 0.7; + this.muted = false; + this.playbackRate = 1; + // Async control + this.asyncId = 0; + this.queuedNodes = new Set(); + } + get currentTime() { + if (this.paused) return this.playbackTimeAtStart; + return (this.audioContext.currentTime - this.audioContextStartTime) * this.playbackRate + this.playbackTimeAtStart; + } + normalizeSource(src) { if (typeof src === 'string') return new (0, _mediabunny.UrlSource)(src); if (src instanceof Blob) return new (0, _mediabunny.BlobSource)(src); if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) return new (0, _mediabunny.ReadableStreamSource)(src); return src; } - async function load(src, onMetadata) { - asyncId++; - const id = asyncId; - await stopIterator(); - stopQueuedNodes(); - _paused = true; - playbackTimeAtStart = 0; - audioContextStartTime = 0; - const source = normalizeSource(src); + ensureAudioContext(sampleRate) { + if (this.audioContext) return; + const AudioContext = window.AudioContext || window.webkitAudioContext; + try { + this.audioContext = new AudioContext({ + sampleRate + }); + } catch { + this.audioContext = new AudioContext(); + } + this.gainNode = this.audioContext.createGain(); + this.gainNode.connect(this.audioContext.destination); + this.updateGain(); + } + updateGain() { + if (!this.gainNode) return; + const v = this.muted ? 0 : this.volume; + this.gainNode.gain.value = v * v; + } + stopQueuedNodes() { + this.queuedNodes.forEach((node)=>node.stop()); + this.queuedNodes.clear(); + } + async stopIterator() { + await this.audioIterator?.return(); + this.audioIterator = null; + } + async load(src, onMetadata) { + const id = ++this.asyncId; + await this.stopIterator(); + this.stopQueuedNodes(); + this.paused = true; + this.playbackTimeAtStart = 0; + this.audioContextStartTime = 0; + const source = this.normalizeSource(src); if (!source) return; - input = new (0, _mediabunny.Input)({ + this.input = new (0, _mediabunny.Input)({ source, formats: (0, _mediabunny.ALL_FORMATS) }); - _duration = await input.computeDuration(); - if (id !== asyncId) return; - const audioTrack = await input.getPrimaryAudioTrack(); + this.duration = await this.input.computeDuration(); + if (id !== this.asyncId) return; + const audioTrack = await this.input.getPrimaryAudioTrack(); if (!audioTrack) { - audioSink = null; - ensureAudioContext(); - if (onMetadata) onMetadata(); + this.audioSink = null; + this.ensureAudioContext(); + onMetadata?.(); return; } if (audioTrack.codec === null || !await audioTrack.canDecode()) { - audioSink = null; - ensureAudioContext(); - if (onMetadata) onMetadata(); + this.audioSink = null; + this.ensureAudioContext(); + onMetadata?.(); return; } - ensureAudioContext(audioTrack.sampleRate); - audioSink = new (0, _mediabunny.AudioBufferSink)(audioTrack); - if (onMetadata) onMetadata(); + this.ensureAudioContext(audioTrack.sampleRate); + this.audioSink = new (0, _mediabunny.AudioBufferSink)(audioTrack); + onMetadata?.(); } - async function runIterator(localId) { - if (!audioSink) return; - await stopIterator(); - audioIterator = audioSink.buffers(getCurrentTime()); + async runIterator(localId) { + if (!this.audioSink) return; + await this.stopIterator(); + this.audioIterator = this.audioSink.buffers(this.currentTime); while(true){ - if (localId !== asyncId) return; - if (_paused) return; - const nextPromise = audioIterator.next(); + if (localId !== this.asyncId || this.paused) return; + const nextPromise = this.audioIterator.next(); + // Monitor for buffer starvation const checkStarvation = setInterval(()=>{ - if (localId !== asyncId || _paused) { + if (localId !== this.asyncId || this.paused) { clearInterval(checkStarvation); return; } - if (audioContext.state === 'running' && audioContext.currentTime >= latestScheduledEndTime - 0.2) { - audioContext.suspend(); - events.emit('waiting'); + if (this.audioContext.state === 'running' && this.audioContext.currentTime >= this.latestScheduledEndTime - 0.2) { + this.audioContext.suspend(); + this.events.emit('waiting'); } }, 50); let result; try { result = await nextPromise; } catch (e) { - console.error(e); + console.error('Audio iterator error:', e); break; } finally{ clearInterval(checkStarvation); } - if (localId !== asyncId) return; - if (_paused) return; - if (audioContext.state === 'suspended') { - await audioContext.resume(); - events.emit('canplay'); - events.emit('playing'); + if (localId !== this.asyncId || this.paused) return; + // Resume if was suspended + if (this.audioContext.state === 'suspended') { + await this.audioContext.resume(); + this.events.emit('canplay'); + this.events.emit('playing'); } if (result.done) break; const { buffer, timestamp } = result.value; - const node = audioContext.createBufferSource(); + // Schedule audio buffer + const node = this.audioContext.createBufferSource(); node.buffer = buffer; - node.connect(gainNode); - node.playbackRate.value = _playbackRate; - const startAt = audioContextStartTime + (timestamp - playbackTimeAtStart) / _playbackRate; + node.connect(this.gainNode); + node.playbackRate.value = this.playbackRate; + const startAt = this.audioContextStartTime + (timestamp - this.playbackTimeAtStart) / this.playbackRate; const duration = buffer.duration; - const endAt = startAt + duration / _playbackRate; - if (endAt > latestScheduledEndTime) latestScheduledEndTime = endAt; - if (startAt >= audioContext.currentTime) node.start(startAt); - else node.start(audioContext.currentTime, (audioContext.currentTime - startAt) * _playbackRate); - queuedNodes.add(node); - node.onended = ()=>queuedNodes.delete(node); + const endAt = startAt + duration / this.playbackRate; + if (endAt > this.latestScheduledEndTime) this.latestScheduledEndTime = endAt; + if (startAt >= this.audioContext.currentTime) node.start(startAt); + else node.start(this.audioContext.currentTime, (this.audioContext.currentTime - startAt) * this.playbackRate); + this.queuedNodes.add(node); + node.onended = ()=>this.queuedNodes.delete(node); } } - async function play() { - if (!_paused) return; - if (!audioContext) ensureAudioContext(); - if (audioContext.state === 'suspended') await audioContext.resume(); - audioContextStartTime = audioContext.currentTime; - latestScheduledEndTime = audioContextStartTime; - _paused = false; - asyncId++; - runIterator(asyncId); + async play() { + if (!this.paused) return; + if (!this.audioContext) this.ensureAudioContext(); + if (this.audioContext.state === 'suspended') await this.audioContext.resume(); + this.audioContextStartTime = this.audioContext.currentTime; + this.latestScheduledEndTime = this.audioContextStartTime; + this.paused = false; + const id = ++this.asyncId; + this.runIterator(id); } - function pause() { - if (_paused) return; - playbackTimeAtStart = getCurrentTime(); - _paused = true; - stopIterator(); - stopQueuedNodes(); + pause() { + if (this.paused) return; + this.playbackTimeAtStart = this.currentTime; + this.paused = true; + this.stopIterator(); + this.stopQueuedNodes(); } - async function seek(time) { - playbackTimeAtStart = Math.max(0, time); - audioContextStartTime = audioContext.currentTime; - latestScheduledEndTime = audioContextStartTime; - asyncId++; - if (!_paused) runIterator(asyncId); + async seek(time) { + this.playbackTimeAtStart = Math.max(0, time); + this.audioContextStartTime = this.audioContext.currentTime; + this.latestScheduledEndTime = this.audioContextStartTime; + const id = ++this.asyncId; + if (!this.paused) this.runIterator(id); } - function destroy() { - asyncId++; - pause(); - audioContext?.close(); - audioContext = null; - input = null; - audioSink = null; + setVolume(volume, muted) { + this.volume = volume; + this.muted = muted; + this.updateGain(); } - return { - load, - play, - pause, - seek, - destroy, - setVolume (v, muted) { - _volume = v; - _muted = muted; - updateGain(); - }, - setPlaybackRate (rate) { - if (rate === _playbackRate) return; - if (!_paused) { - playbackTimeAtStart = getCurrentTime(); - audioContextStartTime = audioContext.currentTime; - } - _playbackRate = rate; - if (!_paused) { - asyncId++; - runIterator(asyncId); - } - }, - get currentTime () { - return getCurrentTime(); - }, - get duration () { - return _duration; - }, - get paused () { - return _paused; + setPlaybackRate(rate) { + if (rate === this.playbackRate) return; + if (!this.paused) { + this.playbackTimeAtStart = this.currentTime; + this.audioContextStartTime = this.audioContext.currentTime; } - }; + this.playbackRate = rate; + if (!this.paused) { + const id = ++this.asyncId; + this.runIterator(id); + } + } + destroy() { + this.asyncId++; + this.pause(); + this.audioContext?.close(); + this.audioContext = null; + this.input = null; + this.audioSink = null; + } } +exports.default = AudioEngine; },{"mediabunny":"6p2EH","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"6p2EH":[function(require,module,exports,__globalThis) { /*! @@ -16394,274 +16396,261 @@ const calculateCrc8 = (data)=>{ return crc; }; -},{"../misc.js":"kkhLS","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"iSVKr":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +},{"../misc.js":"kkhLS","../reader.js":"fr2Ka","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"aylqP":[function(require,module,exports,__globalThis) { +/** + * Video Engine for MediaBunny + * Handles video frame rendering and synchronization + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "default", ()=>createVideoEngine); var _mediabunny = require("mediabunny"); -function createVideoEngine({ canvas, ctx, events, timeupdateInterval = 250, avSyncTolerance = 0.12, dropLateFrames = false, poster = '', preflightRange = false }) { - let input = null; - let videoSink = null; - let videoIterator = null; - let nextFrame = null; - let rafId = 0; - let asyncId = 0; - let _width = 0; - let _height = 0; - let _duration = Number.NaN; - let audioClock = null; - let lastTimeUpdate = 0; - let stalled = false; - let playbackRate = 1; - let posterDrawn = false; - function normalizeSource(src) { +class VideoEngine { + constructor({ canvas, ctx, events, timeupdateInterval = 250, avSyncTolerance = 0.12, dropLateFrames = false, poster = '', preflightRange = false }){ + this.canvas = canvas; + this.ctx = ctx; + this.events = events; + this.timeupdateInterval = timeupdateInterval; + this.avSyncTolerance = avSyncTolerance; + this.dropLateFrames = dropLateFrames; + this.poster = poster; + this.preflightRange = preflightRange; + // MediaBunny instances + this.input = null; + this.videoSink = null; + this.videoIterator = null; + // Frame rendering + this.nextFrame = null; + this.rafId = 0; + this.asyncId = 0; + // Video properties + this.width = 0; + this.height = 0; + this.duration = Number.NaN; + // Playback state + this.audioClock = null; + this.lastTimeUpdate = 0; + this.stalled = false; + this.playbackRate = 1; + this.posterDrawn = false; + } + normalizeSource(src) { if (typeof src === 'string') return new (0, _mediabunny.UrlSource)(src); if (src instanceof Blob) return new (0, _mediabunny.BlobSource)(src); if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) return new (0, _mediabunny.ReadableStreamSource)(src); return src; } - async function preflight(url) { - if (!preflightRange || typeof url !== 'string') return true; + async preflight(url) { + if (!this.preflightRange || typeof url !== 'string') return true; try { const res = await fetch(url, { method: 'HEAD' }); const acceptRanges = res.headers.get('accept-ranges'); if (!acceptRanges || acceptRanges === 'none') { - events.emit('error', new Event('RangeNotSupported')); + this.events.emit('error', new Event('RangeNotSupported')); return false; } return true; } catch (e) { - console.warn('preflight failed', e); + console.warn('Preflight check failed:', e); return true; } } - function drawPoster() { - if (!poster || posterDrawn) return; + drawPoster() { + if (!this.poster || this.posterDrawn) return; const img = new Image(); img.onload = ()=>{ - ctx.clearRect(0, 0, canvas.width, canvas.height); - canvas.width = img.naturalWidth || canvas.width; - canvas.height = img.naturalHeight || canvas.height; - ctx.drawImage(img, 0, 0, canvas.width, canvas.height); - posterDrawn = true; + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.canvas.width = img.naturalWidth || this.canvas.width; + this.canvas.height = img.naturalHeight || this.canvas.height; + this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height); + this.posterDrawn = true; }; - img.src = poster; + img.src = this.poster; } - async function stopIterator() { - await videoIterator?.return(); - videoIterator = null; + async stopIterator() { + await this.videoIterator?.return(); + this.videoIterator = null; } - function clear() { - ctx.clearRect(0, 0, canvas.width, canvas.height); + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); } - async function load(src, onMetadata) { - asyncId++; - const id = asyncId; - await stopIterator(); - clear(); - posterDrawn = false; - if (!await preflight(src)) return; - const source = normalizeSource(src); + async load(src, onMetadata) { + const id = ++this.asyncId; + await this.stopIterator(); + this.clear(); + this.posterDrawn = false; + if (!await this.preflight(src)) return; + const source = this.normalizeSource(src); if (!source) { - drawPoster(); + this.drawPoster(); return; } - input = new (0, _mediabunny.Input)({ + this.input = new (0, _mediabunny.Input)({ source, formats: (0, _mediabunny.ALL_FORMATS) }); - _duration = await input.computeDuration(); - if (id !== asyncId) return; - const videoTrack = await input.getPrimaryVideoTrack(); + this.duration = await this.input.computeDuration(); + if (id !== this.asyncId) return; + const videoTrack = await this.input.getPrimaryVideoTrack(); if (!videoTrack) { - videoSink = null; - _width = 0; - _height = 0; - canvas.width = 0; - canvas.height = 0; - drawPoster(); - if (onMetadata) onMetadata(); + this.handleNoVideoTrack(); + onMetadata?.(); return; } if (videoTrack.codec === null || !await videoTrack.canDecode()) { - videoSink = null; - _width = 0; - _height = 0; - canvas.width = 0; - canvas.height = 0; - clear(); - drawPoster(); - if (onMetadata) onMetadata(); + this.handleNoVideoTrack(); + onMetadata?.(); return; } const transparent = await videoTrack.canBeTransparent(); - videoSink = new (0, _mediabunny.CanvasSink)(videoTrack, { + this.videoSink = new (0, _mediabunny.CanvasSink)(videoTrack, { poolSize: 2, fit: 'contain', alpha: transparent }); - _width = videoTrack.displayWidth; - _height = videoTrack.displayHeight; - canvas.width = _width; - canvas.height = _height; - if (onMetadata) onMetadata(); - await resetIterator(0); + this.width = videoTrack.displayWidth; + this.height = videoTrack.displayHeight; + this.canvas.width = this.width; + this.canvas.height = this.height; + onMetadata?.(); + await this.resetIterator(0); } - async function resetIterator(time) { - await stopIterator(); - if (!videoSink) return; - videoIterator = videoSink.canvases(time); - const first = (await videoIterator.next()).value ?? null; - const second = (await videoIterator.next()).value ?? null; - nextFrame = second; + handleNoVideoTrack() { + this.videoSink = null; + this.width = 0; + this.height = 0; + this.canvas.width = 0; + this.canvas.height = 0; + this.clear(); + this.drawPoster(); + } + async resetIterator(time) { + await this.stopIterator(); + if (!this.videoSink) return; + this.videoIterator = this.videoSink.canvases(time); + const first = (await this.videoIterator.next()).value ?? null; + const second = (await this.videoIterator.next()).value ?? null; + this.nextFrame = second; if (first) { - ctx.drawImage(first.canvas, 0, 0); - events.emit('loadeddata'); - } else drawPoster(); + this.ctx.drawImage(first.canvas, 0, 0); + this.events.emit('loadeddata'); + } else this.drawPoster(); } - async function updateNextFrame(localId) { - if (!videoIterator) return; + async updateNextFrame(localId) { + if (!this.videoIterator) return; while(true){ - const frame = (await videoIterator.next()).value ?? null; - if (!frame) return; - if (localId !== asyncId) return; - const t = audioClock.currentTime; - if (dropLateFrames) { - const tolerance = Math.max(0.06, avSyncTolerance / Math.max(1, playbackRate)); - if (frame.timestamp < t - tolerance) continue; - if (frame.timestamp <= t + tolerance) { - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(frame.canvas, 0, 0); - } else { - nextFrame = frame; + const frame = (await this.videoIterator.next()).value ?? null; + if (!frame || localId !== this.asyncId) return; + const t = this.audioClock.currentTime; + const tolerance = this.dropLateFrames ? Math.max(0.06, this.avSyncTolerance / Math.max(1, this.playbackRate)) : 0; + if (this.dropLateFrames && frame.timestamp < t - tolerance) continue; + if (frame.timestamp <= t + tolerance) { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.ctx.drawImage(frame.canvas, 0, 0); + if (!this.dropLateFrames && frame.timestamp > t) { + this.nextFrame = null; return; } - } else if (frame.timestamp <= t) { - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(frame.canvas, 0, 0); } else { - nextFrame = frame; + this.nextFrame = frame; return; } } } - function render() { - if (!audioClock) return; - const t = audioClock.currentTime; + render() { + if (!this.audioClock) return; + const t = this.audioClock.currentTime; const now = Date.now(); - if (now - lastTimeUpdate >= timeupdateInterval) { - events.emit('timeupdate'); - lastTimeUpdate = now; + // Emit timeupdate event + if (now - this.lastTimeUpdate >= this.timeupdateInterval) { + this.events.emit('timeupdate'); + this.lastTimeUpdate = now; } - if (Number.isFinite(_duration) && t >= _duration) { - stop(); - stalled = false; - events.emit('ended'); - events.emit('pause'); - events.emit('canplay'); + // Check if reached end + if (Number.isFinite(this.duration) && t >= this.duration) { + this.stop(); + this.stalled = false; + this.events.emit('ended'); + this.events.emit('pause'); + this.events.emit('canplay'); return; } - if (nextFrame && nextFrame.timestamp <= t) { - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(nextFrame.canvas, 0, 0); - nextFrame = null; - updateNextFrame(asyncId); - if (stalled) { - events.emit('canplay'); - events.emit('playing'); - stalled = false; + // Render next frame if ready + if (this.nextFrame && this.nextFrame.timestamp <= t) { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.ctx.drawImage(this.nextFrame.canvas, 0, 0); + this.nextFrame = null; + this.updateNextFrame(this.asyncId); + if (this.stalled) { + this.events.emit('canplay'); + this.events.emit('playing'); + this.stalled = false; } - } else if (!nextFrame) { - updateNextFrame(asyncId); - if (!nextFrame && Number.isFinite(_duration) && t < _duration && !stalled) { - stalled = true; - events.emit('waiting'); + } else if (!this.nextFrame) { + this.updateNextFrame(this.asyncId); + if (!this.nextFrame && Number.isFinite(this.duration) && t < this.duration && !this.stalled) { + this.stalled = true; + this.events.emit('waiting'); } } - rafId = requestAnimationFrame(render); + this.rafId = requestAnimationFrame(()=>this.render()); } - function start(audioEngine) { - audioClock = audioEngine; - asyncId++; - stalled = false; - updateNextFrame(asyncId); - rafId = requestAnimationFrame(render); + start(audioEngine) { + this.audioClock = audioEngine; + this.asyncId++; + this.stalled = false; + this.updateNextFrame(this.asyncId); + this.rafId = requestAnimationFrame(()=>this.render()); } - function stop() { - cancelAnimationFrame(rafId); + stop() { + cancelAnimationFrame(this.rafId); } - async function seek(time) { - asyncId++; - await resetIterator(time); + async seek(time) { + this.asyncId++; + await this.resetIterator(time); } - function setPlaybackRate(rate) { - playbackRate = Math.max(0.1, Number(rate) || 1); + setPlaybackRate(rate) { + this.playbackRate = Math.max(0.1, Number(rate) || 1); } - function destroy() { - asyncId++; - stop(); - stopIterator(); - posterDrawn = false; - input = null; - videoSink = null; + destroy() { + this.asyncId++; + this.stop(); + this.stopIterator(); + this.posterDrawn = false; + this.input = null; + this.videoSink = null; } - return { - load, - start, - stop, - seek, - setPlaybackRate, - destroy, - get width () { - return _width; - }, - get height () { - return _height; - }, - get duration () { - return _duration; - } - }; } +exports.default = VideoEngine; -},{"mediabunny":"6p2EH","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"78ov3":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +},{"mediabunny":"6p2EH","@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"7Odz0":[function(require,module,exports,__globalThis) { +/** + * Event Target Implementation + * Simple event system for video events + */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "default", ()=>clamp); -function clamp(v, min, max) { - return Math.max(min, Math.min(max, Number(v) || 0)); -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}],"9BYHB":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "createVideoEventTarget", ()=>createVideoEventTarget); -function createVideoEventTarget() { - const listeners = new Map(); - function addEventListener(type, fn) { - if (!listeners.has(type)) listeners.set(type, []); - listeners.get(type).push(fn); +class EventTarget { + constructor(){ + this.listeners = new Map(); } - function removeEventListener(type, fn) { - const list = listeners.get(type); + addEventListener(type, fn) { + if (!this.listeners.has(type)) this.listeners.set(type, []); + this.listeners.get(type).push(fn); + } + removeEventListener(type, fn) { + const list = this.listeners.get(type); if (!list) return; - const i = list.indexOf(fn); - if (i >= 0) list.splice(i, 1); + const index = list.indexOf(fn); + if (index >= 0) list.splice(index, 1); } - function emit(type, detail) { + emit(type, detail) { const evt = new Event(type); evt.detail = detail; - const list = listeners.get(type); + const list = this.listeners.get(type); if (list) list.forEach((fn)=>fn(evt)); } - return { - addEventListener, - removeEventListener, - emit - }; } +exports.default = EventTarget; },{"@parcel/transformer-js/src/esmodule-helpers.js":"8oCsH"}]},["gqawh"], "gqawh", "parcelRequire4dc0", {}) diff --git a/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map b/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map index 65574b81b..972602b90 100644 --- a/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map +++ b/docs/uncompiled/artplayer-proxy-mediabunny/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["packages/artplayer-proxy-mediabunny/src/index.js","packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js","packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js","packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js","packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js","node_modules/mediabunny/dist/modules/src/index.js","node_modules/mediabunny/dist/modules/src/codec.js","node_modules/mediabunny/dist/modules/src/misc.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","node_modules/mediabunny/dist/modules/src/source.js","node_modules/@parcel/node-resolver-core/lib/_empty.js","node_modules/mediabunny/dist/modules/src/input.js","node_modules/mediabunny/dist/modules/src/input-format.js","node_modules/mediabunny/dist/modules/src/isobmff/isobmff-demuxer.js","node_modules/mediabunny/dist/modules/src/codec-data.js","node_modules/mediabunny/dist/modules/src/demuxer.js","node_modules/mediabunny/dist/modules/src/input-track.js","node_modules/mediabunny/dist/modules/src/custom-coder.js","node_modules/mediabunny/dist/modules/src/media-sink.js","node_modules/mediabunny/dist/modules/src/packet.js","node_modules/mediabunny/dist/modules/src/pcm.js","node_modules/mediabunny/dist/modules/src/sample.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/metadata.js","node_modules/mediabunny/dist/modules/src/reader.js","node_modules/mediabunny/dist/modules/src/matroska/ebml.js","node_modules/mediabunny/dist/modules/src/matroska/matroska-demuxer.js","node_modules/mediabunny/dist/modules/src/matroska/matroska-misc.js","node_modules/mediabunny/dist/modules/src/mp3/mp3-demuxer.js","node_modules/mediabunny/dist/modules/shared/mp3-misc.js","node_modules/mediabunny/dist/modules/src/id3.js","node_modules/mediabunny/dist/modules/src/mp3/mp3-reader.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-demuxer.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-misc.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-reader.js","node_modules/mediabunny/dist/modules/src/wave/wave-demuxer.js","node_modules/mediabunny/dist/modules/src/adts/adts-reader.js","node_modules/mediabunny/dist/modules/src/adts/adts-demuxer.js","node_modules/mediabunny/dist/modules/src/flac/flac-demuxer.js","node_modules/mediabunny/dist/modules/src/flac/flac-misc.js","packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js","packages/artplayer-proxy-mediabunny/src/utils/clamp.js","packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js"],"sourcesContent":["import createCanvasProxy from './proxy/canvasProxy.js'\n\nexport default function artplayerProxyMediabunny(option = {}) {\n return (art) => {\n return createCanvasProxy(art, option)\n }\n}\n\nif (typeof window !== 'undefined') {\n window.artplayerProxyMediabunny = artplayerProxyMediabunny\n}\n","import createMediabunnyVideoShim from '../shim/mediabunnyVideoShim.js'\n\nexport default function createCanvasProxy(art, option) {\n const { constructor } = art\n const { createElement } = constructor.utils\n\n const canvas = createElement('canvas')\n const ctx = canvas.getContext('2d')\n\n const shim = createMediabunnyVideoShim({\n art,\n canvas,\n ctx,\n option,\n })\n\n const originalCanvasMethods = {}\n for (const prop in canvas) {\n if (typeof canvas[prop] === 'function') {\n originalCanvasMethods[prop] = canvas[prop].bind(canvas)\n }\n }\n\n for (const prop in shim) {\n if (!(prop in canvas)) {\n Object.defineProperty(canvas, prop, {\n get() {\n const value = shim[prop]\n return typeof value === 'function' ? value.bind(shim) : value\n },\n set(v) {\n shim[prop] = v\n },\n configurable: true,\n enumerable: true,\n })\n }\n }\n\n for (const prop in originalCanvasMethods) {\n canvas[prop] = (...args) => originalCanvasMethods[prop](...args)\n }\n\n art.on('destroy', () => {\n shim.destroy()\n })\n\n function resize() {\n const player = art.template?.$player\n if (!player || art.option.autoSize)\n return\n\n Object.assign(canvas.style, {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n })\n }\n\n art.on('resize', resize)\n art.on('video:loadedmetadata', resize)\n\n return canvas\n}\n","import createMediabunnyEngine from '../engine/mediabunnyEngine.js'\nimport clamp from '../utils/clamp.js'\nimport { createVideoEventTarget } from './videoEvents.js'\n\nexport default function createMediabunnyVideoShim({ art, canvas, ctx, option }) {\n const events = createVideoEventTarget()\n const engine = createMediabunnyEngine({ canvas, ctx, events, option })\n\n let _src = null\n let _volume = option.volume ?? 0.7\n let _muted = !!option.muted\n let _playbackRate = 1\n\n engine.setVolume(_volume, _muted)\n\n const { events: artEvents } = art.constructor.config\n artEvents.forEach((name) => {\n events.addEventListener(name, (e) => {\n art.emit(`video:${e.type}`, e)\n })\n })\n\n const shim = {\n addEventListener: events.addEventListener,\n removeEventListener: events.removeEventListener,\n\n get src() {\n return _src\n },\n set src(v) {\n _src = v\n if (v)\n engine.load(v)\n },\n\n get currentTime() {\n return engine.currentTime\n },\n set currentTime(t) {\n engine.seek(Number(t) || 0)\n },\n\n get duration() {\n return engine.duration\n },\n\n get buffered() {\n const duration = engine.duration\n if (!duration || Number.isNaN(duration)) {\n return {\n length: 0,\n start: () => 0,\n end: () => 0,\n }\n }\n return {\n length: 1,\n start: () => 0,\n end: () => duration,\n }\n },\n\n get played() {\n const duration = engine.duration\n const currentTime = engine.currentTime\n if (!duration || Number.isNaN(duration) || currentTime <= 0) {\n return {\n length: 0,\n start: () => 0,\n end: () => 0,\n }\n }\n return {\n length: 1,\n start: () => 0,\n end: () => currentTime,\n }\n },\n\n get paused() {\n return engine.paused\n },\n get playing() {\n return !engine.paused && !engine.ended\n },\n get ended() {\n return engine.ended\n },\n\n get readyState() {\n return engine.readyState\n },\n\n get networkState() {\n return engine.networkState\n },\n\n get error() {\n return engine.error\n },\n\n get seeking() {\n return engine.seeking\n },\n\n get seekable() {\n const duration = engine.duration\n if (!duration || Number.isNaN(duration)) {\n return {\n length: 0,\n start: () => 0,\n end: () => 0,\n }\n }\n return {\n length: 1,\n start: () => 0,\n end: () => duration,\n }\n },\n\n get playbackRate() {\n return _playbackRate\n },\n set playbackRate(v) {\n const rate = Number(v)\n if (Number.isNaN(rate) || rate <= 0)\n return\n _playbackRate = rate\n engine.setPlaybackRate(rate)\n events.emit('ratechange')\n },\n\n get volume() {\n return _volume\n },\n set volume(v) {\n _volume = clamp(v, 0, 1)\n _muted = false\n engine.setVolume(_volume, _muted)\n events.emit('volumechange')\n },\n\n get muted() {\n return _muted\n },\n set muted(v) {\n _muted = !!v\n engine.setVolume(_volume, _muted)\n events.emit('volumechange')\n },\n\n play() {\n return engine.play()\n },\n pause() {\n engine.pause()\n },\n load() {\n if (_src)\n engine.load(_src)\n },\n\n destroy() {\n engine.destroy()\n },\n\n get videoWidth() {\n return engine.videoWidth\n },\n get videoHeight() {\n return engine.videoHeight\n },\n\n get playsInline() {\n return true\n },\n set playsInline(v) {},\n\n get autoplay() {\n return option.autoplay || false\n },\n set autoplay(v) {},\n\n get loop() {\n return option.loop || false\n },\n set loop(v) {},\n\n get controls() {\n return false\n },\n set controls(v) {},\n\n get crossOrigin() {\n return option.crossOrigin || ''\n },\n set crossOrigin(v) {},\n\n get currentSrc() {\n return _src\n },\n\n get poster() {\n return option.poster || ''\n },\n set poster(v) {\n option.poster = v\n },\n\n get preload() {\n return 'auto'\n },\n set preload(v) {},\n\n get defaultMuted() {\n return false\n },\n set defaultMuted(v) {},\n\n get defaultPlaybackRate() {\n return 1\n },\n set defaultPlaybackRate(v) {},\n\n canPlayType(_type) {\n return 'maybe'\n },\n\n getBoundingClientRect() {\n return canvas.getBoundingClientRect()\n },\n\n requestVideoFrameCallback(callback) {\n const id = requestAnimationFrame((time) => {\n callback(time, {\n presentationTime: engine.currentTime,\n expectedDisplayTime: time + 16.6,\n width: engine.videoWidth,\n height: engine.videoHeight,\n mediaTime: engine.currentTime,\n presentedFrames: 0,\n processingDuration: 0,\n captureTime: time,\n receiveTime: time,\n rtpTimestamp: 0,\n })\n })\n return id\n },\n\n cancelVideoFrameCallback(id) {\n cancelAnimationFrame(id)\n },\n\n setAttribute(name, value) {\n if (name === 'src')\n this.src = value\n else if (name === 'autoplay')\n this.autoplay = value\n else if (name === 'loop')\n this.loop = value\n else if (name === 'muted')\n this.muted = true\n else\n canvas.setAttribute(name, value)\n },\n }\n\n if (option.source) {\n shim.src = option.source\n }\n else if (art.option?.url) {\n shim.src = art.option.url\n }\n\n return shim\n}\n","import createAudioEngine from './audioEngine.js'\nimport createVideoEngine from './videoEngine.js'\n\nexport default function createMediabunnyEngine({\n canvas,\n ctx,\n events,\n option = {},\n}) {\n const defaults = {\n timeupdateInterval: 250,\n avSyncTolerance: 0.12,\n loadTimeout: 12000,\n dropLateFrames: false,\n poster: '',\n }\n\n const audio = createAudioEngine(events)\n const video = createVideoEngine({\n canvas,\n ctx,\n events,\n timeupdateInterval: option.timeupdateInterval ?? defaults.timeupdateInterval,\n avSyncTolerance: option.avSyncTolerance ?? defaults.avSyncTolerance,\n dropLateFrames: option.dropLateFrames ?? defaults.dropLateFrames,\n poster: option.poster ?? defaults.poster,\n preflightRange: option.preflightRange ?? false,\n })\n\n let _paused = true\n let _ended = false\n let _readyState = 0\n let _networkState = 0\n let _error = null\n let _seeking = false\n let loadSeq = 0\n\n events.addEventListener?.('ended', () => {\n _ended = true\n _paused = true\n })\n\n async function load(src) {\n const id = ++loadSeq\n pause()\n _ended = false\n _error = null\n _networkState = 2\n _readyState = 0\n setTimeout(() => events.emit('waiting'), 0)\n setTimeout(() => events.emit('loadstart'), 0)\n\n const loadTimeout = Number.isFinite(option.loadTimeout)\n ? option.loadTimeout\n : defaults.loadTimeout\n\n let timer = null\n const timeoutPromise\n = loadTimeout > 0\n ? new Promise((_, reject) => {\n timer = setTimeout(() => reject(new Error('Load timeout')), loadTimeout)\n })\n : null\n\n const loadTask = (async () => {\n try {\n let videoMetadataLoaded = false\n let audioMetadataLoaded = false\n\n const checkMetadata = () => {\n if (videoMetadataLoaded && audioMetadataLoaded) {\n _readyState = 1\n events.emit('loadedmetadata')\n events.emit('durationchange')\n }\n }\n\n const p1 = video.load(src, () => {\n if (id !== loadSeq)\n return\n videoMetadataLoaded = true\n checkMetadata()\n })\n\n const p2 = audio.load(src, () => {\n if (id !== loadSeq)\n return\n audioMetadataLoaded = true\n checkMetadata()\n })\n\n await Promise.all([p1, p2])\n if (id !== loadSeq)\n return\n\n _readyState = 4\n _networkState = 1\n events.emit('loadeddata')\n events.emit('canplay')\n events.emit('canplaythrough')\n }\n catch (err) {\n if (id !== loadSeq)\n return\n _error = { code: 4, message: err.message }\n _networkState = 3\n events.emit('error')\n console.error(err)\n }\n finally {\n if (timer)\n clearTimeout(timer)\n }\n })()\n\n if (timeoutPromise) {\n try {\n await Promise.race([loadTask, timeoutPromise])\n }\n catch (err) {\n if (id !== loadSeq)\n return\n loadSeq++\n _error = { code: 4, message: err.message }\n _networkState = 3\n events.emit('error')\n }\n }\n else {\n await loadTask\n }\n }\n\n async function play() {\n if (!_paused)\n return\n if (_ended) {\n _ended = false\n await seek(0)\n }\n _paused = false\n await audio.play()\n video.start(audio)\n events.emit('play')\n events.emit('playing')\n }\n\n function pause() {\n if (_paused)\n return\n _paused = true\n audio.pause()\n video.stop()\n events.emit('pause')\n }\n\n async function seek(time) {\n const shouldResume = !_paused\n _ended = false\n _seeking = true\n events.emit('seeking')\n events.emit('waiting')\n pause()\n await audio.seek(time)\n await video.seek(time)\n _seeking = false\n events.emit('seeked')\n if (shouldResume && !_ended) {\n await play()\n }\n }\n\n function destroy() {\n pause()\n audio.destroy()\n video.destroy()\n }\n\n return {\n load,\n play,\n pause,\n seek,\n destroy,\n\n setVolume: audio.setVolume,\n setPlaybackRate(rate) {\n audio.setPlaybackRate(rate)\n video.setPlaybackRate(rate)\n },\n\n get currentTime() {\n return audio.currentTime\n },\n get duration() {\n return audio.duration || video.duration\n },\n get paused() {\n return _paused\n },\n get seeking() {\n return _seeking\n },\n get ended() {\n return _ended\n },\n get readyState() {\n return _readyState\n },\n get networkState() {\n return _networkState\n },\n get error() {\n return _error\n },\n get videoWidth() {\n return video.width\n },\n get videoHeight() {\n return video.height\n },\n }\n}\n","import {\n ALL_FORMATS,\n AudioBufferSink,\n BlobSource,\n Input,\n ReadableStreamSource,\n UrlSource,\n} from 'mediabunny'\n\nexport default function createAudioEngine(events) {\n let input = null\n let audioSink = null\n\n let audioContext = null\n let gainNode = null\n\n let audioIterator = null\n let audioContextStartTime = 0\n let playbackTimeAtStart = 0\n let latestScheduledEndTime = 0\n\n let _duration = Number.NaN\n let _paused = true\n\n let _volume = 0.7\n let _muted = false\n let _playbackRate = 1\n\n let asyncId = 0\n const queuedNodes = new Set()\n\n function getCurrentTime() {\n if (_paused)\n return playbackTimeAtStart\n return (\n (audioContext.currentTime - audioContextStartTime) * _playbackRate\n + playbackTimeAtStart\n )\n }\n\n function updateGain() {\n if (!gainNode)\n return\n const v = _muted ? 0 : _volume\n gainNode.gain.value = v * v\n }\n\n function ensureAudioContext(sampleRate) {\n if (audioContext)\n return\n\n const AudioContext\n = window.AudioContext || window.webkitAudioContext\n\n try {\n audioContext = new AudioContext({ sampleRate })\n }\n catch {\n audioContext = new AudioContext()\n }\n\n gainNode = audioContext.createGain()\n gainNode.connect(audioContext.destination)\n updateGain()\n }\n\n function stopQueuedNodes() {\n for (const node of queuedNodes) {\n node.stop()\n }\n queuedNodes.clear()\n }\n\n async function stopIterator() {\n await audioIterator?.return()\n audioIterator = null\n }\n\n function normalizeSource(src) {\n if (typeof src === 'string')\n return new UrlSource(src)\n if (src instanceof Blob)\n return new BlobSource(src)\n if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream)\n return new ReadableStreamSource(src)\n return src\n }\n\n async function load(src, onMetadata) {\n asyncId++\n const id = asyncId\n\n await stopIterator()\n stopQueuedNodes()\n\n _paused = true\n playbackTimeAtStart = 0\n audioContextStartTime = 0\n\n const source = normalizeSource(src)\n if (!source)\n return\n\n input = new Input({\n source,\n formats: ALL_FORMATS,\n })\n\n _duration = await input.computeDuration()\n if (id !== asyncId)\n return\n\n const audioTrack = await input.getPrimaryAudioTrack()\n if (!audioTrack) {\n audioSink = null\n ensureAudioContext()\n if (onMetadata)\n onMetadata()\n return\n }\n\n if (audioTrack.codec === null || !(await audioTrack.canDecode())) {\n audioSink = null\n ensureAudioContext()\n if (onMetadata)\n onMetadata()\n return\n }\n\n ensureAudioContext(audioTrack.sampleRate)\n audioSink = new AudioBufferSink(audioTrack)\n\n if (onMetadata)\n onMetadata()\n }\n\n async function runIterator(localId) {\n if (!audioSink)\n return\n\n await stopIterator()\n audioIterator = audioSink.buffers(getCurrentTime())\n\n while (true) {\n if (localId !== asyncId)\n return\n if (_paused)\n return\n\n const nextPromise = audioIterator.next()\n\n const checkStarvation = setInterval(() => {\n if (localId !== asyncId || _paused) {\n clearInterval(checkStarvation)\n return\n }\n if (audioContext.state === 'running'\n && audioContext.currentTime >= latestScheduledEndTime - 0.2) {\n audioContext.suspend()\n events.emit('waiting')\n }\n }, 50)\n\n let result\n try {\n result = await nextPromise\n }\n catch (e) {\n console.error(e)\n break\n }\n finally {\n clearInterval(checkStarvation)\n }\n\n if (localId !== asyncId)\n return\n if (_paused)\n return\n\n if (audioContext.state === 'suspended') {\n await audioContext.resume()\n events.emit('canplay')\n events.emit('playing')\n }\n\n if (result.done)\n break\n\n const { buffer, timestamp } = result.value\n\n const node = audioContext.createBufferSource()\n node.buffer = buffer\n node.connect(gainNode)\n node.playbackRate.value = _playbackRate\n\n const startAt\n = audioContextStartTime\n + (timestamp - playbackTimeAtStart) / _playbackRate\n\n const duration = buffer.duration\n const endAt = startAt + duration / _playbackRate\n\n if (endAt > latestScheduledEndTime) {\n latestScheduledEndTime = endAt\n }\n\n if (startAt >= audioContext.currentTime) {\n node.start(startAt)\n }\n else {\n node.start(\n audioContext.currentTime,\n (audioContext.currentTime - startAt) * _playbackRate,\n )\n }\n\n queuedNodes.add(node)\n node.onended = () => queuedNodes.delete(node)\n }\n }\n\n async function play() {\n if (!_paused)\n return\n\n if (!audioContext) {\n ensureAudioContext()\n }\n\n if (audioContext.state === 'suspended') {\n await audioContext.resume()\n }\n\n audioContextStartTime = audioContext.currentTime\n latestScheduledEndTime = audioContextStartTime\n _paused = false\n\n asyncId++\n runIterator(asyncId)\n }\n\n function pause() {\n if (_paused)\n return\n\n playbackTimeAtStart = getCurrentTime()\n _paused = true\n\n stopIterator()\n stopQueuedNodes()\n }\n\n async function seek(time) {\n playbackTimeAtStart = Math.max(0, time)\n audioContextStartTime = audioContext.currentTime\n latestScheduledEndTime = audioContextStartTime\n\n asyncId++\n if (!_paused) {\n runIterator(asyncId)\n }\n }\n\n function destroy() {\n asyncId++\n pause()\n audioContext?.close()\n audioContext = null\n input = null\n audioSink = null\n }\n\n return {\n load,\n play,\n pause,\n seek,\n destroy,\n\n setVolume(v, muted) {\n _volume = v\n _muted = muted\n updateGain()\n },\n\n setPlaybackRate(rate) {\n if (rate === _playbackRate)\n return\n\n if (!_paused) {\n playbackTimeAtStart = getCurrentTime()\n audioContextStartTime = audioContext.currentTime\n }\n\n _playbackRate = rate\n\n if (!_paused) {\n asyncId++\n runIterator(asyncId)\n }\n },\n\n get currentTime() {\n return getCurrentTime()\n },\n\n get duration() {\n return _duration\n },\n\n get paused() {\n return _paused\n },\n }\n}\n","/*!\n * Copyright (c) 2025-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/// \n/// \nexport { Output, } from './output.js';\nexport { OutputFormat, AdtsOutputFormat, FlacOutputFormat, IsobmffOutputFormat, MkvOutputFormat, MovOutputFormat, Mp3OutputFormat, Mp4OutputFormat, 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 { 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, BufferTarget, FilePathTarget, NullTarget, StreamTarget, } from './target.js';\nexport { ALL_TRACK_TYPES, } from './output.js';\nexport { Source, BlobSource, BufferSource, FilePathSource, StreamSource, ReadableStreamSource, UrlSource, } from './source.js';\nexport { InputFormat, AdtsInputFormat, IsobmffInputFormat, MatroskaInputFormat, Mp3InputFormat, Mp4InputFormat, OggInputFormat, QuickTimeInputFormat, WaveInputFormat, WebMInputFormat, FlacInputFormat, ALL_FORMATS, ADTS, MATROSKA, MP3, MP4, OGG, QTFF, WAVE, WEBM, FLAC, } from './input-format.js';\nexport { Input, InputDisposedError, } from './input.js';\nexport { InputTrack, InputVideoTrack, InputAudioTrack, } from './input-track.js';\nexport { EncodedPacket, } from './packet.js';\nexport { AudioSample, VideoSample, } from './sample.js';\nexport { AudioBufferSink, AudioSampleSink, BaseMediaSampleSink, CanvasSink, EncodedPacketSink, VideoSampleSink, } from './media-sink.js';\nexport { Conversion, } from './conversion.js';\nexport { CustomVideoDecoder, CustomVideoEncoder, CustomAudioDecoder, CustomAudioEncoder, registerDecoder, registerEncoder, } from './custom-coder.js';\nexport { RichImageData, AttachedFile, } from './metadata.js';\n// 🐡🦔\n","/*!\n * Copyright (c) 2025-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, COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, assert, 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];\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\nconst AVC_LEVEL_TABLE = [\n { maxMacroblocks: 99, maxBitrate: 64000, level: 0x0A }, // Level 1\n { maxMacroblocks: 396, maxBitrate: 192000, level: 0x0B }, // Level 1.1\n { maxMacroblocks: 396, maxBitrate: 384000, level: 0x0C }, // Level 1.2\n { maxMacroblocks: 396, maxBitrate: 768000, level: 0x0D }, // Level 1.3\n { maxMacroblocks: 396, maxBitrate: 2000000, level: 0x14 }, // Level 2\n { maxMacroblocks: 792, maxBitrate: 4000000, level: 0x15 }, // Level 2.1\n { maxMacroblocks: 1620, maxBitrate: 4000000, level: 0x16 }, // Level 2.2\n { maxMacroblocks: 1620, maxBitrate: 10000000, level: 0x1E }, // Level 3\n { maxMacroblocks: 3600, maxBitrate: 14000000, level: 0x1F }, // Level 3.1\n { maxMacroblocks: 5120, maxBitrate: 20000000, level: 0x20 }, // Level 3.2\n { maxMacroblocks: 8192, maxBitrate: 20000000, level: 0x28 }, // Level 4\n { maxMacroblocks: 8192, maxBitrate: 50000000, level: 0x29 }, // Level 4.1\n { maxMacroblocks: 8704, maxBitrate: 50000000, level: 0x2A }, // Level 4.2\n { maxMacroblocks: 22080, maxBitrate: 135000000, level: 0x32 }, // Level 5\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x33 }, // Level 5.1\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x34 }, // Level 5.2\n { maxMacroblocks: 139264, maxBitrate: 240000000, level: 0x3C }, // Level 6\n { maxMacroblocks: 139264, maxBitrate: 480000000, level: 0x3D }, // Level 6.1\n { maxMacroblocks: 139264, maxBitrate: 800000000, 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 (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 const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription);\n return `mp4a.40.${audioSpecificConfig.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 && PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\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 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.startsWith('mp4a.40') || codecString === 'mp4a.67') {\n return 'aac';\n }\n else if (codecString === 'mp3'\n || codecString === 'mp4a.69'\n || codecString === 'mp4a.6B'\n || codecString === 'mp4a.6b') {\n return 'mp3';\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 === '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 WebCodecs 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.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 = ['mp4a', 'mp3', 'opus', 'vorbis', 'flac', 'ulaw', 'alaw', 'pcm'];\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 WebCodecs 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 if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be'\n + ' an AudioSpecificConfig as specified in ISO 14496-3.');\n }\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('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) 2025-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 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};\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 // Ensure we're byte-aligned\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/** 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 }\n async acquire() {\n let resolver;\n const nextPromise = new Promise((resolve) => {\n resolver = resolve;\n });\n const currentPromiseAlias = this.currentPromise;\n this.currentPromise = nextPromise;\n await currentPromiseAlias;\n return resolver;\n }\n}\nexport const bytesToHexString = (bytes) => {\n return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');\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 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 format. */\nconst 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 console.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 new Promise(resolve => setTimeout(resolve, 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 numerator: sign * currNumerator,\n denominator: 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 numerator: sign * currNumerator,\n denominator: 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 && (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 && (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};\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","/*!\n * Copyright (c) 2025-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, binarySearchLessOrEqual, closedIntervalsOverlap, isNumber, isWebKit, mergeRequestInit, promiseWithResolvers, retriedFetch, toDataView, toUint8Array, } from './misc.js';\nimport * as nodeAlias from './node.js';\nimport { InputDisposedError } from './input.js';\nconst node = typeof nodeAlias !== 'undefined'\n ? nodeAlias // Aliasing it prevents some bundler warnings\n : undefined;\n/**\n * The source base class, representing a resource from which bytes can be read.\n * @group Input sources\n * @public\n */\nexport class Source {\n constructor() {\n /** @internal */\n this._disposed = false;\n /** @internal */\n this._sizePromise = null;\n /** Called each time data is retrieved from the source. Will be called with the retrieved range (end exclusive). */\n this.onread = null;\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n *\n * Returns null if the source is unsized.\n */\n async getSizeOrNull() {\n if (this._disposed) {\n throw new InputDisposedError();\n }\n return this._sizePromise ??= Promise.resolve(this._retrieveSize());\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n *\n * Throws an error if the source is unsized.\n */\n async getSize() {\n if (this._disposed) {\n throw new InputDisposedError();\n }\n const result = await this.getSizeOrNull();\n if (result === null) {\n throw new Error('Cannot determine the size of an unsized source.');\n }\n return result;\n }\n}\n/**\n * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory.\n * @group Input sources\n * @public\n */\nexport class BufferSource extends Source {\n /**\n * Creates a new {@link BufferSource} backed by the specified `ArrayBuffer`, `SharedArrayBuffer`,\n * or `ArrayBufferView`.\n */\n constructor(buffer) {\n if (!(buffer instanceof ArrayBuffer)\n && !(typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer)\n && !ArrayBuffer.isView(buffer)) {\n throw new TypeError('buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.');\n }\n super();\n /** @internal */\n this._onreadCalled = false;\n this._bytes = toUint8Array(buffer);\n this._view = toDataView(buffer);\n }\n /** @internal */\n _retrieveSize() {\n return this._bytes.byteLength;\n }\n /** @internal */\n _read() {\n if (!this._onreadCalled) {\n // We just say the first read retrives all bytes from the source (which, I mean, it does)\n this.onread?.(0, this._bytes.byteLength);\n this._onreadCalled = true;\n }\n return {\n bytes: this._bytes,\n view: this._view,\n offset: 0,\n };\n }\n /** @internal */\n _dispose() { }\n}\n/**\n * A source backed by a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). Since a\n * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) is also a `Blob`, this is the source to use when\n * reading files off the disk.\n * @group Input sources\n * @public\n */\nexport class BlobSource extends Source {\n /**\n * Creates a new {@link BlobSource} backed by the specified\n * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob).\n */\n constructor(blob, options = {}) {\n if (!(blob instanceof Blob)) {\n throw new TypeError('blob must be a Blob.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._readers = new WeakMap();\n this._blob = blob;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (8 * 2 ** 20 /* 8 MiB */),\n maxWorkerCount: 4,\n runWorker: this._runWorker.bind(this),\n prefetchProfile: PREFETCH_PROFILES.fileSystem,\n });\n }\n /** @internal */\n _retrieveSize() {\n const size = this._blob.size;\n this._orchestrator.fileSize = size;\n return size;\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n let reader = this._readers.get(worker);\n if (reader === undefined) {\n // https://github.com/Vanilagy/mediabunny/issues/184\n // WebKit has critical bugs with blob.stream():\n // - WebKitBlobResource error 1 when streaming large files\n // - Memory buildup and reload loops on iOS (network process crashes)\n // - ReadableStream stalls under backpressure (especially video)\n // Affects Safari and all iOS browsers (Chrome, Firefox, etc.).\n // Use arrayBuffer() fallback for WebKit browsers.\n if ('stream' in this._blob && !isWebKit()) {\n // Get a reader of the blob starting at the required offset, and then keep it around\n const slice = this._blob.slice(worker.currentPos);\n reader = slice.stream().getReader();\n }\n else {\n // We'll need to use more primitive ways\n reader = null;\n }\n this._readers.set(worker, reader);\n }\n while (worker.currentPos < worker.targetPos && !worker.aborted) {\n if (reader) {\n const { done, value } = await reader.read();\n if (done) {\n this._orchestrator.forgetWorker(worker);\n throw new Error('Blob reader stopped unexpectedly before all requested data was read.');\n }\n if (worker.aborted) {\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + value.length);\n this._orchestrator.supplyWorkerData(worker, value);\n }\n else {\n const data = await this._blob.slice(worker.currentPos, worker.targetPos).arrayBuffer();\n if (worker.aborted) {\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + data.byteLength);\n this._orchestrator.supplyWorkerData(worker, new Uint8Array(data));\n }\n }\n worker.running = false;\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n }\n}\nconst URL_SOURCE_MIN_LOAD_AMOUNT = 0.5 * 2 ** 20; // 0.5 MiB\nconst DEFAULT_RETRY_DELAY = ((previousAttempts, error, src) => {\n // Check if this could be a CORS error. If so, we cannot recover from it and\n // should not attempt to retry.\n // CORS errors are intentionally not opaque, so we need to rely on heuristics.\n const couldBeCorsError = error instanceof Error && (error.message.includes('Failed to fetch') // Chrome\n || error.message.includes('Load failed') // Safari\n || error.message.includes('NetworkError when attempting to fetch resource') // Firefox\n );\n if (couldBeCorsError) {\n let originOfSrc = null;\n // Checking if the origin is different, because only then a CORS error could originate\n try {\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n originOfSrc = new URL(src instanceof Request ? src.url : src, window.location.href).origin;\n }\n }\n catch {\n // URL parse failed\n }\n // If user is offline, it is probably not a CORS error.\n const isOnline = typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true;\n if (isOnline && originOfSrc !== null && originOfSrc !== window.location.origin) {\n console.warn(`Request will not be retried because a CORS error was suspected due to different origins. You can`\n + ` modify this behavior by providing your own function for the 'getRetryDelay' option.`);\n return null;\n }\n }\n return Math.min(2 ** (previousAttempts - 2), 16);\n});\n/**\n * A source backed by a URL. This is useful for reading data from the network. Requests will be made using an optimized\n * reading and prefetching pattern to minimize request count and latency.\n * @group Input sources\n * @public\n */\nexport class UrlSource extends Source {\n /** Creates a new {@link UrlSource} backed by the resource at the specified URL. */\n constructor(url, options = {}) {\n if (typeof url !== 'string'\n && !(url instanceof URL)\n && !(typeof Request !== 'undefined' && url instanceof Request)) {\n throw new TypeError('url must be a string, URL or Request.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.requestInit !== undefined && (!options.requestInit || typeof options.requestInit !== 'object')) {\n throw new TypeError('options.requestInit, when provided, must be an object.');\n }\n if (options.getRetryDelay !== undefined && typeof options.getRetryDelay !== 'function') {\n throw new TypeError('options.getRetryDelay, when provided, must be a function.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n if (options.fetchFn !== undefined && typeof options.fetchFn !== 'function') {\n throw new TypeError('options.fetchFn, when provided, must be a function.');\n // Won't bother validating this function beyond this\n }\n super();\n /** @internal */\n this._existingResponses = new WeakMap();\n this._url = url;\n this._options = options;\n this._getRetryDelay = options.getRetryDelay ?? DEFAULT_RETRY_DELAY;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (64 * 2 ** 20 /* 64 MiB */),\n // Most files in the real-world have a single sequential access pattern, but having two in parallel can\n // also happen\n maxWorkerCount: 2,\n runWorker: this._runWorker.bind(this),\n prefetchProfile: PREFETCH_PROFILES.network,\n });\n }\n /** @internal */\n async _retrieveSize() {\n // Retrieving the resource size for UrlSource is optimized: Almost always (= always), the first bytes we have to\n // read are the start of the file. This means it's smart to combine size fetching with fetching the start of the\n // file. We additionally use this step to probe if the server supports range requests, killing three birds with\n // one stone.\n const abortController = new AbortController();\n const response = await retriedFetch(this._options.fetchFn ?? fetch, this._url, mergeRequestInit(this._options.requestInit ?? {}, {\n headers: {\n // We could also send a non-range request to request the same bytes (all of them), but doing it like\n // this is an easy way to check if the server supports range requests in the first place\n Range: 'bytes=0-',\n },\n signal: abortController.signal,\n }), this._getRetryDelay, () => this._disposed);\n if (!response.ok) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`);\n }\n let worker;\n let fileSize;\n if (response.status === 206) {\n fileSize = this._getTotalLengthFromRangeResponse(response);\n worker = this._orchestrator.createWorker(0, Math.min(fileSize, URL_SOURCE_MIN_LOAD_AMOUNT));\n }\n else {\n // Server probably returned a 200.\n const contentLength = response.headers.get('Content-Length');\n if (contentLength) {\n fileSize = Number(contentLength);\n worker = this._orchestrator.createWorker(0, fileSize);\n this._orchestrator.options.maxCacheSize = Infinity; // 🤷\n console.warn('HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has'\n + ' to be downloaded. For efficient media file streaming across a network, please make sure your'\n + ' server supports range requests.');\n }\n else {\n throw new Error(`HTTP response (status ${response.status}) must surface Content-Length header.`);\n }\n }\n this._orchestrator.fileSize = fileSize;\n this._existingResponses.set(worker, { response, abortController });\n this._orchestrator.runWorker(worker);\n return fileSize;\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n // The outer loop is for resuming a request if it dies mid-response\n while (true) {\n const existing = this._existingResponses.get(worker);\n this._existingResponses.delete(worker);\n let abortController = existing?.abortController;\n let response = existing?.response;\n if (!abortController) {\n abortController = new AbortController();\n response = await retriedFetch(this._options.fetchFn ?? fetch, this._url, mergeRequestInit(this._options.requestInit ?? {}, {\n headers: {\n Range: `bytes=${worker.currentPos}-`,\n },\n signal: abortController.signal,\n }), this._getRetryDelay, () => this._disposed);\n }\n assert(response);\n if (!response.ok) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`);\n }\n if (worker.currentPos > 0 && response.status !== 206) {\n throw new Error('HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media'\n + ' file streaming across a network, please make sure your server supports range requests.');\n }\n if (!response.body) {\n throw new Error('Missing HTTP response body stream. The used fetch function must provide the response body as a'\n + ' ReadableStream.');\n }\n const reader = response.body.getReader();\n while (true) {\n if (worker.currentPos >= worker.targetPos || worker.aborted) {\n abortController.abort();\n worker.running = false;\n return;\n }\n let readResult;\n try {\n readResult = await reader.read();\n }\n catch (error) {\n if (this._disposed) {\n // No need to try to retry\n throw error;\n }\n const retryDelayInSeconds = this._getRetryDelay(1, error, this._url);\n if (retryDelayInSeconds !== null) {\n console.error('Error while reading response stream. Attempting to resume.', error);\n await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));\n break;\n }\n else {\n throw error;\n }\n }\n if (worker.aborted) {\n break;\n }\n const { done, value } = readResult;\n if (done) {\n if (worker.currentPos >= worker.targetPos) {\n // All data was delivered, we're good\n this._orchestrator.forgetWorker(worker);\n worker.running = false;\n return;\n }\n // The response stopped early, before the target. This can happen if server decides to cap range\n // requests arbitrarily, even if the request had an uncapped end. In this case, let's fetch the rest\n // of the data using a new request.\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + value.length);\n this._orchestrator.supplyWorkerData(worker, value);\n }\n if (worker.aborted) {\n break;\n }\n }\n worker.running = false;\n // The previous UrlSource had logic for circumventing https://issues.chromium.org/issues/436025873; I haven't\n // been able to observe this bug with the new UrlSource (maybe because we're using response streaming), so the\n // logic for that has vanished for now. Leaving a comment here if this becomes relevant again.\n }\n /** @internal */\n _getTotalLengthFromRangeResponse(response) {\n const contentRange = response.headers.get('Content-Range');\n if (contentRange) {\n const match = /\\/(\\d+)/.exec(contentRange);\n if (match) {\n return Number(match[1]);\n }\n }\n const contentLength = response.headers.get('Content-Length');\n if (contentLength) {\n return Number(contentLength);\n }\n else {\n throw new Error('Partial HTTP response (status 206) must surface either Content-Range or'\n + ' Content-Length header.');\n }\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n }\n}\n/**\n * A source backed by a path to a file. Intended for server-side usage in Node, Bun, or Deno.\n *\n * Make sure to call `.dispose()` on the corresponding {@link Input} when done to explicitly free the internal file\n * handle acquired by this source.\n * @group Input sources\n * @public\n */\nexport class FilePathSource extends Source {\n /** Creates a new {@link FilePathSource} backed by 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 (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._fileHandle = null;\n // Let's back this source with a StreamSource, makes the implementation very simple\n this._streamSource = new StreamSource({\n getSize: async () => {\n this._fileHandle = await node.fs.open(filePath, 'r');\n const stats = await this._fileHandle.stat();\n return stats.size;\n },\n read: async (start, end) => {\n assert(this._fileHandle);\n const buffer = new Uint8Array(end - start);\n await this._fileHandle.read(buffer, 0, end - start, start);\n return buffer;\n },\n maxCacheSize: options.maxCacheSize,\n prefetchProfile: 'fileSystem',\n });\n }\n /** @internal */\n _read(start, end) {\n return this._streamSource._read(start, end);\n }\n /** @internal */\n _retrieveSize() {\n return this._streamSource._retrieveSize();\n }\n /** @internal */\n _dispose() {\n this._streamSource._dispose();\n void this._fileHandle?.close();\n this._fileHandle = null;\n }\n}\n/**\n * A general-purpose, callback-driven source that can get its data from anywhere.\n * @group Input sources\n * @public\n */\nexport class StreamSource extends Source {\n /** Creates a new {@link StreamSource} whose behavior is specified by `options`. */\n constructor(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (typeof options.getSize !== 'function') {\n throw new TypeError('options.getSize must be a function.');\n }\n if (typeof options.read !== 'function') {\n throw new TypeError('options.read must be a function.');\n }\n if (options.dispose !== undefined && typeof options.dispose !== 'function') {\n throw new TypeError('options.dispose, when provided, must be a function.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n if (options.prefetchProfile && !['none', 'fileSystem', 'network'].includes(options.prefetchProfile)) {\n throw new TypeError('options.prefetchProfile, when provided, must be one of \\'none\\', \\'fileSystem\\' or \\'network\\'.');\n }\n super();\n this._options = options;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (8 * 2 ** 20 /* 8 MiB */),\n maxWorkerCount: 2, // Fixed for now, *should* be fine\n prefetchProfile: PREFETCH_PROFILES[options.prefetchProfile ?? 'none'],\n runWorker: this._runWorker.bind(this),\n });\n }\n /** @internal */\n _retrieveSize() {\n const result = this._options.getSize();\n if (result instanceof Promise) {\n return result.then((size) => {\n if (!Number.isInteger(size) || size < 0) {\n throw new TypeError('options.getSize must return or resolve to a non-negative integer.');\n }\n this._orchestrator.fileSize = size;\n return size;\n });\n }\n else {\n if (!Number.isInteger(result) || result < 0) {\n throw new TypeError('options.getSize must return or resolve to a non-negative integer.');\n }\n this._orchestrator.fileSize = result;\n return result;\n }\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n while (worker.currentPos < worker.targetPos && !worker.aborted) {\n const originalCurrentPos = worker.currentPos;\n const originalTargetPos = worker.targetPos;\n let data = this._options.read(worker.currentPos, originalTargetPos);\n if (data instanceof Promise)\n data = await data;\n if (worker.aborted) {\n break;\n }\n if (data instanceof Uint8Array) {\n data = toUint8Array(data); // Normalize things like Node.js Buffer to Uint8Array\n if (data.length !== originalTargetPos - worker.currentPos) {\n // Yes, we're that strict\n throw new Error(`options.read returned a Uint8Array with unexpected length: Requested ${originalTargetPos - worker.currentPos} bytes, but got ${data.length}.`);\n }\n this.onread?.(worker.currentPos, worker.currentPos + data.length);\n this._orchestrator.supplyWorkerData(worker, data);\n }\n else if (data instanceof ReadableStream) {\n const reader = data.getReader();\n while (worker.currentPos < originalTargetPos && !worker.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n if (worker.currentPos < originalTargetPos) {\n // Yes, we're *that* strict\n throw new Error(`ReadableStream returned by options.read ended before supplying enough data.`\n + ` Requested ${originalTargetPos - originalCurrentPos} bytes, but got ${worker.currentPos - originalCurrentPos}`);\n }\n break;\n }\n if (!(value instanceof Uint8Array)) {\n throw new TypeError('ReadableStream returned by options.read must yield Uint8Array chunks.');\n }\n if (worker.aborted) {\n break;\n }\n const data = toUint8Array(value); // Normalize things like Node.js Buffer to Uint8Array\n this.onread?.(worker.currentPos, worker.currentPos + data.length);\n this._orchestrator.supplyWorkerData(worker, data);\n }\n }\n else {\n throw new TypeError('options.read must return or resolve to a Uint8Array or a ReadableStream.');\n }\n }\n worker.running = false;\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n this._options.dispose?.();\n }\n}\n/**\n * A source backed by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) of\n * `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally\n * streaming in input files that are still being constructed and whose size we don't yet know, like for example the\n * output chunks of [MediaRecorder](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder).\n *\n * This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the\n * lack of random file access. You should only use this source with sequential access patterns, such as reading all\n * packets from start to end. This source does not work well with random access patterns unless you increase its\n * max cache size.\n *\n * @group Input sources\n * @public\n */\nexport class ReadableStreamSource extends Source {\n /** Creates a new {@link ReadableStreamSource} backed by the specified `ReadableStream`. */\n constructor(stream, options = {}) {\n if (!(stream instanceof ReadableStream)) {\n throw new TypeError('stream must be a ReadableStream.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._reader = null;\n /** @internal */\n this._cache = [];\n /** @internal */\n this._pendingSlices = [];\n /** @internal */\n this._currentIndex = 0;\n /** @internal */\n this._targetIndex = 0;\n /** @internal */\n this._maxRequestedIndex = 0;\n /** @internal */\n this._endIndex = null;\n /** @internal */\n this._pulling = false;\n this._stream = stream;\n this._maxCacheSize = options.maxCacheSize ?? (16 * 2 ** 20 /* 16 MiB */);\n }\n /** @internal */\n _retrieveSize() {\n return this._endIndex; // Starts out as null, meaning this source is unsized\n }\n /** @internal */\n _read(start, end) {\n if (this._endIndex !== null && end > this._endIndex) {\n return null;\n }\n this._maxRequestedIndex = Math.max(this._maxRequestedIndex, end);\n const cacheStartIndex = binarySearchLessOrEqual(this._cache, start, x => x.start);\n const cacheStartEntry = cacheStartIndex !== -1 ? this._cache[cacheStartIndex] : null;\n if (cacheStartEntry && cacheStartEntry.start <= start && end <= cacheStartEntry.end) {\n // The request can be satisfied with a single cache entry\n return {\n bytes: cacheStartEntry.bytes,\n view: cacheStartEntry.view,\n offset: cacheStartEntry.start,\n };\n }\n let lastEnd = start;\n const bytes = new Uint8Array(end - start);\n if (cacheStartIndex !== -1) {\n // Walk over the cache to see if we can satisfy the request using multiple cache entries\n for (let i = cacheStartIndex; i < this._cache.length; i++) {\n const cacheEntry = this._cache[i];\n if (cacheEntry.start >= end) {\n break;\n }\n const cappedStart = Math.max(start, cacheEntry.start);\n if (cappedStart > lastEnd) {\n // We're too far behind\n this._throwDueToCacheMiss();\n }\n const cappedEnd = Math.min(end, cacheEntry.end);\n if (cappedStart < cappedEnd) {\n bytes.set(cacheEntry.bytes.subarray(cappedStart - cacheEntry.start, cappedEnd - cacheEntry.start), cappedStart - start);\n lastEnd = cappedEnd;\n }\n }\n }\n if (lastEnd === end) {\n return {\n bytes,\n view: toDataView(bytes),\n offset: start,\n };\n }\n // We need to pull more data\n if (this._currentIndex > lastEnd) {\n // We're too far behind\n this._throwDueToCacheMiss();\n }\n const { promise, resolve, reject } = promiseWithResolvers();\n this._pendingSlices.push({\n start,\n end,\n bytes,\n resolve,\n reject,\n });\n this._targetIndex = Math.max(this._targetIndex, end);\n // Start pulling from the stream if we're not already doing it\n if (!this._pulling) {\n this._pulling = true;\n void this._pull()\n .catch((error) => {\n this._pulling = false;\n if (this._pendingSlices.length > 0) {\n this._pendingSlices.forEach(x => x.reject(error)); // Make sure to propagate any errors\n this._pendingSlices.length = 0;\n }\n else {\n throw error; // So it doesn't get swallowed\n }\n });\n }\n return promise;\n }\n /** @internal */\n _throwDueToCacheMiss() {\n throw new Error('Read is before the cached region. With ReadableStreamSource, you must access the data more'\n + ' sequentially or increase the size of its cache.');\n }\n /** @internal */\n async _pull() {\n this._reader ??= this._stream.getReader();\n // This is the loop that keeps pulling data from the stream until a target index is reached, filling requests\n // in the process\n while (this._currentIndex < this._targetIndex && !this._disposed) {\n const { done, value } = await this._reader.read();\n if (done) {\n for (const pendingSlice of this._pendingSlices) {\n pendingSlice.resolve(null);\n }\n this._pendingSlices.length = 0;\n this._endIndex = this._currentIndex; // We know how long the file is now!\n break;\n }\n const startIndex = this._currentIndex;\n const endIndex = this._currentIndex + value.byteLength;\n // Fill the pending slices with the data\n for (let i = 0; i < this._pendingSlices.length; i++) {\n const pendingSlice = this._pendingSlices[i];\n const cappedStart = Math.max(startIndex, pendingSlice.start);\n const cappedEnd = Math.min(endIndex, pendingSlice.end);\n if (cappedStart < cappedEnd) {\n pendingSlice.bytes.set(value.subarray(cappedStart - startIndex, cappedEnd - startIndex), cappedStart - pendingSlice.start);\n if (cappedEnd === pendingSlice.end) {\n // Pending slice fully filled\n pendingSlice.resolve({\n bytes: pendingSlice.bytes,\n view: toDataView(pendingSlice.bytes),\n offset: pendingSlice.start,\n });\n this._pendingSlices.splice(i, 1);\n i--;\n }\n }\n }\n this._cache.push({\n start: startIndex,\n end: endIndex,\n bytes: value,\n view: toDataView(value),\n age: 0, // Unused\n });\n // Do cache eviction, based on the distance from the last-requested index. It's important that we do it like\n // this and not based on where the reader is at, because if the reader is fast, we'll unnecessarily evict\n // data that we still might need.\n while (this._cache.length > 0) {\n const firstEntry = this._cache[0];\n const distance = this._maxRequestedIndex - firstEntry.end;\n if (distance <= this._maxCacheSize) {\n break;\n }\n this._cache.shift();\n }\n this._currentIndex += value.byteLength;\n }\n this._pulling = false;\n }\n /** @internal */\n _dispose() {\n this._pendingSlices.length = 0;\n this._cache.length = 0;\n }\n}\nconst PREFETCH_PROFILES = {\n none: (start, end) => ({ start, end }),\n fileSystem: (start, end) => {\n const padding = 2 ** 16;\n start = Math.floor((start - padding) / padding) * padding;\n end = Math.ceil((end + padding) / padding) * padding;\n return { start, end };\n },\n network: (start, end, workers) => {\n // Add a slight bit of start padding because backwards reading is painful\n const paddingStart = 2 ** 16;\n start = Math.max(0, Math.floor((start - paddingStart) / paddingStart) * paddingStart);\n // Remote resources have extreme latency (relatively speaking), so the benefit from intelligent\n // prefetching is great. The network prefetch strategy is as follows: When we notice\n // successive reads to a worker's read region, we prefetch more data at the end of that region,\n // growing exponentially (up to a cap). This performs well for real-world use cases: Either we read a\n // small part of the file once and then never need it again, in which case the requested about of data\n // is small. Or, we're repeatedly doing a sequential access pattern (common in media files), in which\n // case we can become more and more confident to prefetch more and more data.\n for (const worker of workers) {\n const maxExtensionAmount = 8 * 2 ** 20; // 8 MiB\n // When the read region cross the threshold point, we trigger a prefetch. This point is typically\n // in the middle of the worker's read region, or a fixed offset from the end if the region has grown\n // really large.\n const thresholdPoint = Math.max((worker.startPos + worker.targetPos) / 2, worker.targetPos - maxExtensionAmount);\n if (closedIntervalsOverlap(start, end, thresholdPoint, worker.targetPos)) {\n const size = worker.targetPos - worker.startPos;\n // If we extend by maxExtensionAmount\n const a = Math.ceil((size + 1) / maxExtensionAmount) * maxExtensionAmount;\n // If we extend to the next power of 2\n const b = 2 ** Math.ceil(Math.log2(size + 1));\n const extent = Math.min(b, a);\n end = Math.max(end, worker.startPos + extent);\n }\n }\n end = Math.max(end, start + URL_SOURCE_MIN_LOAD_AMOUNT);\n return {\n start,\n end,\n };\n },\n};\n/**\n * Godclass for orchestrating complex, cached read operations. The reading model is as follows: Any reading task is\n * delegated to a *worker*, which is a sequential reader positioned somewhere along the file. All workers run in\n * parallel and can be stopped and resumed in their forward movement. When read requests come in, this orchestrator will\n * first try to satisfy the request with only the cached data. If this isn't possible, workers are spun up for all\n * missing parts (or existing workers are repurposed), and these workers will then fill the holes in the data as they\n * march along the file.\n */\nclass ReadOrchestrator {\n constructor(options) {\n this.options = options;\n this.fileSize = null;\n this.nextAge = 0; // Used for LRU eviction of both cache entries and workers\n this.workers = [];\n this.cache = [];\n this.currentCacheSize = 0;\n this.disposed = false;\n }\n read(innerStart, innerEnd) {\n assert(this.fileSize !== null);\n const prefetchRange = this.options.prefetchProfile(innerStart, innerEnd, this.workers);\n const outerStart = Math.max(prefetchRange.start, 0);\n const outerEnd = Math.min(prefetchRange.end, this.fileSize);\n assert(outerStart <= innerStart && innerEnd <= outerEnd);\n let result = null;\n const innerCacheStartIndex = binarySearchLessOrEqual(this.cache, innerStart, x => x.start);\n const innerStartEntry = innerCacheStartIndex !== -1 ? this.cache[innerCacheStartIndex] : null;\n // See if the read request can be satisfied by a single cache entry\n if (innerStartEntry && innerStartEntry.start <= innerStart && innerEnd <= innerStartEntry.end) {\n innerStartEntry.age = this.nextAge++;\n result = {\n bytes: innerStartEntry.bytes,\n view: innerStartEntry.view,\n offset: innerStartEntry.start,\n };\n // Can't return yet though, still need to check if the prefetch range might lie outside the cached area\n }\n const outerCacheStartIndex = binarySearchLessOrEqual(this.cache, outerStart, x => x.start);\n const bytes = result ? null : new Uint8Array(innerEnd - innerStart);\n let contiguousBytesWriteEnd = 0; // Used to track if the cache is able to completely cover the bytes\n let lastEnd = outerStart;\n // The \"holes\" in the cache (the parts we need to load)\n const outerHoles = [];\n // Loop over the cache and build up the list of holes\n if (outerCacheStartIndex !== -1) {\n for (let i = outerCacheStartIndex; i < this.cache.length; i++) {\n const entry = this.cache[i];\n if (entry.start >= outerEnd) {\n break;\n }\n if (entry.end <= outerStart) {\n continue;\n }\n const cappedOuterStart = Math.max(outerStart, entry.start);\n const cappedOuterEnd = Math.min(outerEnd, entry.end);\n assert(cappedOuterStart <= cappedOuterEnd);\n if (lastEnd < cappedOuterStart) {\n outerHoles.push({ start: lastEnd, end: cappedOuterStart });\n }\n lastEnd = cappedOuterEnd;\n if (bytes) {\n const cappedInnerStart = Math.max(innerStart, entry.start);\n const cappedInnerEnd = Math.min(innerEnd, entry.end);\n if (cappedInnerStart < cappedInnerEnd) {\n const relativeOffset = cappedInnerStart - innerStart;\n // Fill the relevant section of the bytes with the cached data\n bytes.set(entry.bytes.subarray(cappedInnerStart - entry.start, cappedInnerEnd - entry.start), relativeOffset);\n if (relativeOffset === contiguousBytesWriteEnd) {\n contiguousBytesWriteEnd = cappedInnerEnd - innerStart;\n }\n }\n }\n entry.age = this.nextAge++;\n }\n if (lastEnd < outerEnd) {\n outerHoles.push({ start: lastEnd, end: outerEnd });\n }\n }\n else {\n outerHoles.push({ start: outerStart, end: outerEnd });\n }\n if (bytes && contiguousBytesWriteEnd >= bytes.length) {\n // Multiple cache entries were able to completely cover the requested bytes!\n result = {\n bytes,\n view: toDataView(bytes),\n offset: innerStart,\n };\n }\n if (outerHoles.length === 0) {\n assert(result);\n return result;\n }\n // We need to read more data, so now we're in async land\n const { promise, resolve, reject } = promiseWithResolvers();\n const innerHoles = [];\n for (const outerHole of outerHoles) {\n const cappedStart = Math.max(innerStart, outerHole.start);\n const cappedEnd = Math.min(innerEnd, outerHole.end);\n if (cappedStart === outerHole.start && cappedEnd === outerHole.end) {\n innerHoles.push(outerHole); // Can reuse without allocating a new object\n }\n else if (cappedStart < cappedEnd) {\n innerHoles.push({ start: cappedStart, end: cappedEnd });\n }\n }\n // Fire off workers to take care of patching the holes\n for (const outerHole of outerHoles) {\n const pendingSlice = bytes && {\n start: innerStart,\n bytes,\n holes: innerHoles,\n resolve,\n reject,\n };\n let workerFound = false;\n for (const worker of this.workers) {\n // A small tolerance in the case that the requested region is *just* after the target position of an\n // existing worker. In that case, it's probably more efficient to repurpose that worker than to spawn\n // another one so close to it\n const gapTolerance = 2 ** 17;\n // This check also implies worker.currentPos <= outerHole.start, a critical condition\n if (closedIntervalsOverlap(outerHole.start - gapTolerance, outerHole.start, worker.currentPos, worker.targetPos)) {\n worker.targetPos = Math.max(worker.targetPos, outerHole.end); // Update the worker's target position\n workerFound = true;\n if (pendingSlice && !worker.pendingSlices.includes(pendingSlice)) {\n worker.pendingSlices.push(pendingSlice);\n }\n if (!worker.running) {\n // Kick it off if it's idle\n this.runWorker(worker);\n }\n break;\n }\n }\n if (!workerFound) {\n // We need to spawn a new worker\n const newWorker = this.createWorker(outerHole.start, outerHole.end);\n if (pendingSlice) {\n newWorker.pendingSlices = [pendingSlice];\n }\n this.runWorker(newWorker);\n }\n }\n if (!result) {\n assert(bytes);\n result = promise.then(bytes => ({\n bytes,\n view: toDataView(bytes),\n offset: innerStart,\n }));\n }\n else {\n // The requested region was satisfied by the cache, but the entire prefetch region was not\n }\n return result;\n }\n createWorker(startPos, targetPos) {\n const worker = {\n startPos,\n currentPos: startPos,\n targetPos,\n running: false,\n // Due to async shenanigans, it can happen that workers are started after disposal. In this case, instead of\n // simply not creating the worker, we allow it to run but immediately label it as aborted, so it can then\n // shut itself down.\n aborted: this.disposed,\n pendingSlices: [],\n age: this.nextAge++,\n };\n this.workers.push(worker);\n // LRU eviction of the other workers\n while (this.workers.length > this.options.maxWorkerCount) {\n let oldestIndex = 0;\n let oldestWorker = this.workers[0];\n for (let i = 1; i < this.workers.length; i++) {\n const worker = this.workers[i];\n if (worker.age < oldestWorker.age) {\n oldestIndex = i;\n oldestWorker = worker;\n }\n }\n if (oldestWorker.running && oldestWorker.pendingSlices.length > 0) {\n break;\n }\n oldestWorker.aborted = true;\n this.workers.splice(oldestIndex, 1);\n }\n return worker;\n }\n runWorker(worker) {\n assert(!worker.running);\n assert(worker.currentPos < worker.targetPos);\n worker.running = true;\n worker.age = this.nextAge++;\n void this.options.runWorker(worker)\n .catch((error) => {\n worker.running = false;\n if (worker.pendingSlices.length > 0) {\n worker.pendingSlices.forEach(x => x.reject(error)); // Make sure to propagate any errors\n worker.pendingSlices.length = 0;\n }\n else {\n throw error; // So it doesn't get swallowed\n }\n });\n }\n /** Called by a worker when it has read some data. */\n supplyWorkerData(worker, bytes) {\n assert(!worker.aborted);\n const start = worker.currentPos;\n const end = start + bytes.length;\n this.insertIntoCache({\n start,\n end,\n bytes,\n view: toDataView(bytes),\n age: this.nextAge++,\n });\n worker.currentPos += bytes.length;\n worker.targetPos = Math.max(worker.targetPos, worker.currentPos); // In case it overshoots\n // Now, let's see if we can use the read bytes to fill any pending slice\n for (let i = 0; i < worker.pendingSlices.length; i++) {\n const pendingSlice = worker.pendingSlices[i];\n const clampedStart = Math.max(start, pendingSlice.start);\n const clampedEnd = Math.min(end, pendingSlice.start + pendingSlice.bytes.length);\n if (clampedStart < clampedEnd) {\n pendingSlice.bytes.set(bytes.subarray(clampedStart - start, clampedEnd - start), clampedStart - pendingSlice.start);\n }\n for (let j = 0; j < pendingSlice.holes.length; j++) {\n // The hole is intentionally not modified here if the read section starts somewhere in the middle of\n // the hole. We don't need to do \"hole splitting\", since the workers are spawned *by* the holes,\n // meaning there's always a worker which will consume the hole left to right.\n const hole = pendingSlice.holes[j];\n if (start <= hole.start && end > hole.start) {\n hole.start = end;\n }\n if (hole.end <= hole.start) {\n pendingSlice.holes.splice(j, 1);\n j--;\n }\n }\n if (pendingSlice.holes.length === 0) {\n // The slice has been fulfilled, everything has been read. Let's resolve the promise\n pendingSlice.resolve(pendingSlice.bytes);\n worker.pendingSlices.splice(i, 1);\n i--;\n }\n }\n // Remove other idle workers if we \"ate\" into their territory\n for (let i = 0; i < this.workers.length; i++) {\n const otherWorker = this.workers[i];\n if (worker === otherWorker || otherWorker.running) {\n continue;\n }\n if (closedIntervalsOverlap(start, end, otherWorker.currentPos, otherWorker.targetPos)) {\n this.workers.splice(i, 1);\n i--;\n }\n }\n }\n forgetWorker(worker) {\n const index = this.workers.indexOf(worker);\n assert(index !== -1);\n this.workers.splice(index, 1);\n }\n insertIntoCache(entry) {\n if (this.options.maxCacheSize === 0) {\n return; // No caching\n }\n let insertionIndex = binarySearchLessOrEqual(this.cache, entry.start, x => x.start) + 1;\n if (insertionIndex > 0) {\n const previous = this.cache[insertionIndex - 1];\n if (previous.end >= entry.end) {\n // Previous entry swallows the one to be inserted; we don't need to do anything\n return;\n }\n if (previous.end > entry.start) {\n // Partial overlap with the previous entry, let's join\n const joined = new Uint8Array(entry.end - previous.start);\n joined.set(previous.bytes, 0);\n joined.set(entry.bytes, entry.start - previous.start);\n this.currentCacheSize += entry.end - previous.end;\n previous.bytes = joined;\n previous.view = toDataView(joined);\n previous.end = entry.end;\n // Do the rest of the logic with the previous entry instead\n insertionIndex--;\n entry = previous;\n }\n else {\n this.cache.splice(insertionIndex, 0, entry);\n this.currentCacheSize += entry.bytes.length;\n }\n }\n else {\n this.cache.splice(insertionIndex, 0, entry);\n this.currentCacheSize += entry.bytes.length;\n }\n for (let i = insertionIndex + 1; i < this.cache.length; i++) {\n const next = this.cache[i];\n if (entry.end <= next.start) {\n // Even if they touch, we don't wanna merge them, no need\n break;\n }\n if (entry.end >= next.end) {\n // The inserted entry completely swallows the next entry\n this.cache.splice(i, 1);\n this.currentCacheSize -= next.bytes.length;\n i--;\n continue;\n }\n // Partial overlap, let's join\n const joined = new Uint8Array(next.end - entry.start);\n joined.set(entry.bytes, 0);\n joined.set(next.bytes, next.start - entry.start);\n this.currentCacheSize -= entry.end - next.start; // Subtract the overlap\n entry.bytes = joined;\n entry.view = toDataView(joined);\n entry.end = next.end;\n this.cache.splice(i, 1);\n break; // After the join case, we're done: the next entry cannot possibly overlap with the inserted one.\n }\n // LRU eviction of cache entries\n while (this.currentCacheSize > this.options.maxCacheSize) {\n let oldestIndex = 0;\n let oldestEntry = this.cache[0];\n for (let i = 1; i < this.cache.length; i++) {\n const entry = this.cache[i];\n if (entry.age < oldestEntry.age) {\n oldestIndex = i;\n oldestEntry = entry;\n }\n }\n if (this.currentCacheSize - oldestEntry.bytes.length <= this.options.maxCacheSize) {\n // Don't evict if it would shrink the cache below the max size\n break;\n }\n this.cache.splice(oldestIndex, 1);\n this.currentCacheSize -= oldestEntry.bytes.length;\n }\n }\n dispose() {\n for (const worker of this.workers) {\n worker.aborted = true;\n }\n this.workers.length = 0;\n this.cache.length = 0;\n this.disposed = true;\n }\n}\n","\"use strict\";","/*!\n * Copyright (c) 2025-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 { InputFormat } from './input-format.js';\nimport { assert, polyfillSymbolDispose } from './misc.js';\nimport { Reader } from './reader.js';\nimport { Source } from './source.js';\npolyfillSymbolDispose();\n/**\n * Represents an input media file. This is the root object from which all media read operations start.\n * @group Input files & tracks\n * @public\n */\nexport class Input {\n /** True if the input has been disposed. */\n get disposed() {\n return this._disposed;\n }\n /**\n * Creates a new input file from the specified options. No reading operations will be performed until methods are\n * called on this instance.\n */\n constructor(options) {\n /** @internal */\n this._demuxerPromise = null;\n /** @internal */\n this._format = null;\n /** @internal */\n this._disposed = false;\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Array.isArray(options.formats) || options.formats.some(x => !(x instanceof InputFormat))) {\n throw new TypeError('options.formats must be an array of InputFormat.');\n }\n if (!(options.source instanceof Source)) {\n throw new TypeError('options.source must be a Source.');\n }\n if (options.source._disposed) {\n throw new Error('options.source must not be disposed.');\n }\n this._formats = options.formats;\n this._source = options.source;\n this._reader = new Reader(options.source);\n }\n /** @internal */\n _getDemuxer() {\n return this._demuxerPromise ??= (async () => {\n this._reader.fileSize = await this._source.getSizeOrNull();\n for (const format of this._formats) {\n const canRead = await format._canReadInput(this);\n if (canRead) {\n this._format = format;\n return format._createDemuxer(this);\n }\n }\n throw new Error('Input has an unsupported or unrecognizable format.');\n })();\n }\n /**\n * Returns the source from which this input file reads its data. This is the same source that was passed to the\n * constructor.\n */\n get source() {\n return this._source;\n }\n /**\n * Returns the format of the input file. You can compare this result directly to the {@link InputFormat} singletons\n * or use `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true\n * for both MKV and WebM).\n */\n async getFormat() {\n await this._getDemuxer();\n assert(this._format);\n return this._format;\n }\n /**\n * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among\n * all tracks.\n */\n async computeDuration() {\n const demuxer = await this._getDemuxer();\n return demuxer.computeDuration();\n }\n /** Returns the list of all tracks of this input file. */\n async getTracks() {\n const demuxer = await this._getDemuxer();\n return demuxer.getTracks();\n }\n /** Returns the list of all video tracks of this input file. */\n async getVideoTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isVideoTrack());\n }\n /** Returns the list of all audio tracks of this input file. */\n async getAudioTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isAudioTrack());\n }\n /** Returns the primary video track of this input file, or null if there are no video tracks. */\n async getPrimaryVideoTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isVideoTrack()) ?? null;\n }\n /** Returns the primary audio track of this input file, or null if there are no audio tracks. */\n async getPrimaryAudioTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isAudioTrack()) ?? null;\n }\n /** Returns the full MIME type of this input file, including track codecs. */\n async getMimeType() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMimeType();\n }\n /**\n * Returns descriptive metadata tags about the media file, such as title, author, date, cover art, or other\n * attached files.\n */\n async getMetadataTags() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMetadataTags();\n }\n /**\n * Disposes this input and frees connected resources. When an input is disposed, ongoing read operations will be\n * canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink\n * operations will be canceled. Disallowed and canceled operations will throw an {@link InputDisposedError}.\n *\n * You are expected not to use an input after disposing it. While some operations may still work, it is not\n * specified and may change in any future update.\n */\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._source._disposed = true;\n this._source._dispose();\n }\n /**\n * Calls `.dispose()` on the input, implementing the `Disposable` interface for use with\n * JavaScript Explicit Resource Management features.\n */\n [Symbol.dispose]() {\n this.dispose();\n }\n}\n/**\n * Thrown when an operation was prevented because the corresponding {@link Input} has been disposed.\n * @group Input files & tracks\n * @public\n */\nexport class InputDisposedError extends Error {\n /** Creates a new {@link InputDisposedError}. */\n constructor(message = 'Input has been disposed.') {\n super(message);\n this.name = 'InputDisposedError';\n }\n}\n","/*!\n * Copyright (c) 2025-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 { IsobmffDemuxer } from './isobmff/isobmff-demuxer.js';\nimport { EBMLId, MAX_HEADER_SIZE, MIN_HEADER_SIZE, readAsciiString, readElementHeader, readElementSize, readUnsignedInt, readVarIntSize, } from './matroska/ebml.js';\nimport { MatroskaDemuxer } from './matroska/matroska-demuxer.js';\nimport { Mp3Demuxer } from './mp3/mp3-demuxer.js';\nimport { FRAME_HEADER_SIZE } from '../shared/mp3-misc.js';\nimport { ID3_V2_HEADER_SIZE, readId3V2Header } from './id3.js';\nimport { readNextFrameHeader } from './mp3/mp3-reader.js';\nimport { OggDemuxer } from './ogg/ogg-demuxer.js';\nimport { WaveDemuxer } from './wave/wave-demuxer.js';\nimport { MAX_FRAME_HEADER_SIZE, MIN_FRAME_HEADER_SIZE, readFrameHeader } from './adts/adts-reader.js';\nimport { AdtsDemuxer } from './adts/adts-demuxer.js';\nimport { readAscii } from './reader.js';\nimport { FlacDemuxer } from './flac/flac-demuxer.js';\n/**\n * Base class representing an input media file format.\n * @group Input formats\n * @public\n */\nexport class InputFormat {\n}\n/**\n * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files.\n * @group Input formats\n * @public\n */\nexport class IsobmffInputFormat extends InputFormat {\n /** @internal */\n async _getMajorBrand(input) {\n let slice = input._reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return null;\n slice.skip(4);\n const fourCc = readAscii(slice, 4);\n if (fourCc !== 'ftyp') {\n return null;\n }\n return readAscii(slice, 4);\n }\n /** @internal */\n _createDemuxer(input) {\n return new IsobmffDemuxer(input);\n }\n}\n/**\n * MPEG-4 Part 14 (MP4) file format.\n *\n * Do not instantiate this class; use the {@link MP4} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class Mp4InputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return !!majorBrand && majorBrand !== 'qt ';\n }\n get name() {\n return 'MP4';\n }\n get mimeType() {\n return 'video/mp4';\n }\n}\n/**\n * QuickTime File Format (QTFF), often called MOV.\n *\n * Do not instantiate this class; use the {@link QTFF} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class QuickTimeInputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return majorBrand === 'qt ';\n }\n get name() {\n return 'QuickTime File Format';\n }\n get mimeType() {\n return 'video/quicktime';\n }\n}\n/**\n * Matroska file format.\n *\n * Do not instantiate this class; use the {@link MATROSKA} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class MatroskaInputFormat extends InputFormat {\n /** @internal */\n async isSupportedEBMLOfDocType(input, desiredDocType) {\n let headerSlice = input._reader.requestSlice(0, MAX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice)\n return false;\n const varIntSize = readVarIntSize(headerSlice);\n if (varIntSize === null) {\n return false;\n }\n if (varIntSize < 1 || varIntSize > 8) {\n return false;\n }\n const id = readUnsignedInt(headerSlice, varIntSize);\n if (id !== EBMLId.EBML) {\n return false;\n }\n const dataSize = readElementSize(headerSlice);\n if (dataSize === null) {\n return false; // Miss me with that shit\n }\n let dataSlice = input._reader.requestSlice(headerSlice.filePos, dataSize);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (!dataSlice)\n return false;\n const startPos = headerSlice.filePos;\n while (dataSlice.filePos <= startPos + dataSize - MIN_HEADER_SIZE) {\n const header = readElementHeader(dataSlice);\n if (!header)\n break;\n const { id, size } = header;\n const dataStartPos = dataSlice.filePos;\n if (size === null)\n return false;\n switch (id) {\n case EBMLId.EBMLVersion:\n {\n const ebmlVersion = readUnsignedInt(dataSlice, size);\n if (ebmlVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.EBMLReadVersion:\n {\n const ebmlReadVersion = readUnsignedInt(dataSlice, size);\n if (ebmlReadVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocType:\n {\n const docType = readAsciiString(dataSlice, size);\n if (docType !== desiredDocType) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocTypeVersion:\n {\n const docTypeVersion = readUnsignedInt(dataSlice, size);\n if (docTypeVersion > 4) { // Support up to Matroska v4\n return false;\n }\n }\n ;\n break;\n }\n dataSlice.filePos = dataStartPos + size;\n }\n return true;\n }\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'matroska');\n }\n /** @internal */\n _createDemuxer(input) {\n return new MatroskaDemuxer(input);\n }\n get name() {\n return 'Matroska';\n }\n get mimeType() {\n return 'video/x-matroska';\n }\n}\n/**\n * WebM file format, based on Matroska.\n *\n * Do not instantiate this class; use the {@link WEBM} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class WebMInputFormat extends MatroskaInputFormat {\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'webm');\n }\n get name() {\n return 'WebM';\n }\n get mimeType() {\n return 'video/webm';\n }\n}\n/**\n * MP3 file format.\n *\n * Do not instantiate this class; use the {@link MP3} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class Mp3InputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 10);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n let currentPos = 0;\n let id3V2HeaderFound = false;\n while (true) {\n let slice = input._reader.requestSlice(currentPos, ID3_V2_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const id3V2Header = readId3V2Header(slice);\n if (!id3V2Header) {\n break;\n }\n id3V2HeaderFound = true;\n currentPos = slice.filePos + id3V2Header.size;\n }\n const firstResult = await readNextFrameHeader(input._reader, currentPos, currentPos + 4096);\n if (!firstResult) {\n return false;\n }\n if (id3V2HeaderFound) {\n // If there was an ID3v2 tag at the start, we can be pretty sure this is MP3 by now\n return true;\n }\n currentPos = firstResult.startPos + firstResult.header.totalSize;\n // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find\n // another header right after it:\n const secondResult = await readNextFrameHeader(input._reader, currentPos, currentPos + FRAME_HEADER_SIZE);\n if (!secondResult) {\n return false;\n }\n const firstHeader = firstResult.header;\n const secondHeader = secondResult.header;\n // In a well-formed MP3 file, we'd expect these two frames to share some similarities:\n if (firstHeader.channel !== secondHeader.channel || firstHeader.sampleRate !== secondHeader.sampleRate) {\n return false;\n }\n // We have found two matching consecutive MP3 frames, a strong indicator that this is an MP3 file\n return true;\n }\n /** @internal */\n _createDemuxer(input) {\n return new Mp3Demuxer(input);\n }\n get name() {\n return 'MP3';\n }\n get mimeType() {\n return 'audio/mpeg';\n }\n}\n/**\n * WAVE file format, based on RIFF.\n *\n * Do not instantiate this class; use the {@link WAVE} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class WaveInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const riffType = readAscii(slice, 4);\n if (riffType !== 'RIFF' && riffType !== 'RIFX' && riffType !== 'RF64') {\n return false;\n }\n slice.skip(4);\n const format = readAscii(slice, 4);\n return format === 'WAVE';\n }\n /** @internal */\n _createDemuxer(input) {\n return new WaveDemuxer(input);\n }\n get name() {\n return 'WAVE';\n }\n get mimeType() {\n return 'audio/wav';\n }\n}\n/**\n * Ogg file format.\n *\n * Do not instantiate this class; use the {@link OGG} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class OggInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n return readAscii(slice, 4) === 'OggS';\n }\n /** @internal */\n _createDemuxer(input) {\n return new OggDemuxer(input);\n }\n get name() {\n return 'Ogg';\n }\n get mimeType() {\n return 'application/ogg';\n }\n}\n/**\n * FLAC file format.\n *\n * Do not instantiate this class; use the {@link FLAC} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class FlacInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n return readAscii(slice, 4) === 'fLaC';\n }\n get name() {\n return 'FLAC';\n }\n get mimeType() {\n return 'audio/flac';\n }\n /** @internal */\n _createDemuxer(input) {\n return new FlacDemuxer(input);\n }\n}\n/**\n * ADTS file format.\n *\n * Do not instantiate this class; use the {@link ADTS} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class AdtsInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSliceRange(0, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const firstHeader = readFrameHeader(slice);\n if (!firstHeader) {\n return false;\n }\n slice = input._reader.requestSliceRange(firstHeader.frameLength, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const secondHeader = readFrameHeader(slice);\n if (!secondHeader) {\n return false;\n }\n return firstHeader.objectType === secondHeader.objectType\n && firstHeader.samplingFrequencyIndex === secondHeader.samplingFrequencyIndex\n && firstHeader.channelConfiguration === secondHeader.channelConfiguration;\n }\n /** @internal */\n _createDemuxer(input) {\n return new AdtsDemuxer(input);\n }\n get name() {\n return 'ADTS';\n }\n get mimeType() {\n return 'audio/aac';\n }\n}\n/**\n * MP4 input format singleton.\n * @group Input formats\n * @public\n */\nexport const MP4 = /* #__PURE__ */ new Mp4InputFormat();\n/**\n * QuickTime File Format input format singleton.\n * @group Input formats\n * @public\n */\nexport const QTFF = /* #__PURE__ */ new QuickTimeInputFormat();\n/**\n * Matroska input format singleton.\n * @group Input formats\n * @public\n */\nexport const MATROSKA = /* #__PURE__ */ new MatroskaInputFormat();\n/**\n * WebM input format singleton.\n * @group Input formats\n * @public\n */\nexport const WEBM = /* #__PURE__ */ new WebMInputFormat();\n/**\n * MP3 input format singleton.\n * @group Input formats\n * @public\n */\nexport const MP3 = /* #__PURE__ */ new Mp3InputFormat();\n/**\n * WAVE input format singleton.\n * @group Input formats\n * @public\n */\nexport const WAVE = /* #__PURE__ */ new WaveInputFormat();\n/**\n * Ogg input format singleton.\n * @group Input formats\n * @public\n */\nexport const OGG = /* #__PURE__ */ new OggInputFormat();\n/**\n * ADTS input format singleton.\n * @group Input formats\n * @public\n */\nexport const ADTS = /* #__PURE__ */ new AdtsInputFormat();\n/**\n * FLAC input format singleton.\n * @group Input formats\n * @public\n */\nexport const FLAC = /* #__PURE__ */ new FlacInputFormat();\n/**\n * List of all input format singletons. If you don't need to support all input formats, you should specify the\n * formats individually for better tree shaking.\n * @group Input formats\n * @public\n */\nexport const ALL_FORMATS = [MP4, QTFF, MATROSKA, WEBM, WAVE, OGG, FLAC, MP3, ADTS];\n","/*!\n * Copyright (c) 2025-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 { extractAudioCodecString, extractVideoCodecString, OPUS_SAMPLE_RATE, parseAacAudioSpecificConfig, parsePcmCodec, PCM_AUDIO_CODECS, } from '../codec.js';\nimport { extractAv1CodecInfoFromPacket, extractVp9CodecInfoFromPacket, FlacBlockType, } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, binarySearchExact, binarySearchLessOrEqual, Bitstream, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundToMultiple, textDecoder, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, toDataView, roundIfAlmostInteger, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { buildIsobmffMimeType } from './isobmff-misc.js';\nimport { MAX_BOX_HEADER_SIZE, MIN_BOX_HEADER_SIZE, readBoxHeader, readDataBox, readFixed_16_16, readFixed_2_30, readIsomVariableInteger, readMetadataStringShort, } from './isobmff-reader.js';\nimport { readBytes, readF64Be, readI16Be, readI32Be, readI64Be, readU16Be, readU24Be, readU32Be, readU64Be, readU8, readAscii, } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION, RichImageData } from '../metadata.js';\nexport class IsobmffDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.moovSlice = null;\n this.currentTrack = null;\n this.tracks = [];\n this.metadataPromise = null;\n this.movieTimescale = -1;\n this.movieDurationInTimescale = -1;\n this.isQuickTime = false;\n this.metadataTags = {};\n this.currentMetadataKeys = null;\n this.isFragmented = false;\n this.fragmentTrackDefaults = [];\n this.currentFragment = null;\n /**\n * Caches the last fragment that was read. Based on the assumption that there will be multiple reads to the\n * same fragment in quick succession.\n */\n this.lastReadFragment = null;\n this.reader = input._reader;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks.map(track => track.inputTrack);\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.inputTrack.getCodecParameterString()));\n return buildIsobmffMimeType({\n isQuickTime: this.isQuickTime,\n hasVideo: this.tracks.some(x => x.info?.type === 'video'),\n hasAudio: this.tracks.some(x => x.info?.type === 'audio'),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n readMetadata() {\n return this.metadataPromise ??= (async () => {\n let currentPos = 0;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const startPos = currentPos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n if (boxInfo.name === 'ftyp') {\n const majorBrand = readAscii(slice, 4);\n this.isQuickTime = majorBrand === 'qt ';\n }\n else if (boxInfo.name === 'moov') {\n // Found moov, load it\n let moovSlice = this.reader.requestSlice(slice.filePos, boxInfo.contentSize);\n if (moovSlice instanceof Promise)\n moovSlice = await moovSlice;\n if (!moovSlice)\n break;\n this.moovSlice = moovSlice;\n this.readContiguousBoxes(this.moovSlice);\n // Put default tracks first\n this.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));\n for (const track of this.tracks) {\n // Modify the edit list offset based on the previous segment durations. They are in different\n // timescales, so we first convert to seconds and then into the track timescale.\n const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale;\n track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale);\n }\n break;\n }\n currentPos = startPos + boxInfo.totalSize;\n }\n if (this.isFragmented && this.reader.fileSize !== null) {\n // The last 4 bytes may contain the size of the mfra box at the end of the file\n let lastWordSlice = this.reader.requestSlice(this.reader.fileSize - 4, 4);\n if (lastWordSlice instanceof Promise)\n lastWordSlice = await lastWordSlice;\n assert(lastWordSlice);\n const lastWord = readU32Be(lastWordSlice);\n const potentialMfraPos = this.reader.fileSize - lastWord;\n if (potentialMfraPos >= 0 && potentialMfraPos <= this.reader.fileSize - MAX_BOX_HEADER_SIZE) {\n let mfraHeaderSlice = this.reader.requestSliceRange(potentialMfraPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (mfraHeaderSlice instanceof Promise)\n mfraHeaderSlice = await mfraHeaderSlice;\n if (mfraHeaderSlice) {\n const boxInfo = readBoxHeader(mfraHeaderSlice);\n if (boxInfo && boxInfo.name === 'mfra') {\n // We found the mfra box, allowing for much better random access. Let's parse it.\n let mfraSlice = this.reader.requestSlice(mfraHeaderSlice.filePos, boxInfo.contentSize);\n if (mfraSlice instanceof Promise)\n mfraSlice = await mfraSlice;\n if (mfraSlice) {\n this.readContiguousBoxes(mfraSlice);\n }\n }\n }\n }\n }\n })();\n }\n getSampleTableForTrack(internalTrack) {\n if (internalTrack.sampleTable) {\n return internalTrack.sampleTable;\n }\n const sampleTable = {\n sampleTimingEntries: [],\n sampleCompositionTimeOffsets: [],\n sampleSizes: [],\n keySampleIndices: null,\n chunkOffsets: [],\n sampleToChunk: [],\n presentationTimestamps: null,\n presentationTimestampIndexMap: null,\n };\n internalTrack.sampleTable = sampleTable;\n assert(this.moovSlice);\n const stblContainerSlice = this.moovSlice.slice(internalTrack.sampleTableByteOffset);\n this.currentTrack = internalTrack;\n this.traverseBox(stblContainerSlice);\n this.currentTrack = null;\n const isPcmCodec = internalTrack.info?.type === 'audio'\n && internalTrack.info.codec\n && PCM_AUDIO_CODECS.includes(internalTrack.info.codec);\n if (isPcmCodec && sampleTable.sampleCompositionTimeOffsets.length === 0) {\n // If the audio has PCM samples, the way the samples are defined in the sample table is somewhat\n // suboptimal: Each individual audio sample is its own sample, meaning we can have 48000 samples per second.\n // Because we treat each sample as its own atomic unit that can be decoded, this would lead to a huge\n // amount of very short samples for PCM audio. So instead, we make a transformation: If the audio is in PCM,\n // we say that each chunk (that normally holds many samples) now is one big sample. We can this because\n // the samples in the chunk are contiguous and the format is PCM, so the entire chunk as one thing still\n // encodes valid audio information.\n assert(internalTrack.info?.type === 'audio');\n const pcmInfo = parsePcmCodec(internalTrack.info.codec);\n const newSampleTimingEntries = [];\n const newSampleSizes = [];\n for (let i = 0; i < sampleTable.sampleToChunk.length; i++) {\n const chunkEntry = sampleTable.sampleToChunk[i];\n const nextEntry = sampleTable.sampleToChunk[i + 1];\n const chunkCount = (nextEntry ? nextEntry.startChunkIndex : sampleTable.chunkOffsets.length)\n - chunkEntry.startChunkIndex;\n for (let j = 0; j < chunkCount; j++) {\n const startSampleIndex = chunkEntry.startSampleIndex + j * chunkEntry.samplesPerChunk;\n const endSampleIndex = startSampleIndex + chunkEntry.samplesPerChunk; // Exclusive, outside of chunk\n const startTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, startSampleIndex, x => x.startIndex);\n const startTimingEntry = sampleTable.sampleTimingEntries[startTimingEntryIndex];\n const endTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, endSampleIndex, x => x.startIndex);\n const endTimingEntry = sampleTable.sampleTimingEntries[endTimingEntryIndex];\n const firstSampleTimestamp = startTimingEntry.startDecodeTimestamp\n + (startSampleIndex - startTimingEntry.startIndex) * startTimingEntry.delta;\n const lastSampleTimestamp = endTimingEntry.startDecodeTimestamp\n + (endSampleIndex - endTimingEntry.startIndex) * endTimingEntry.delta;\n const delta = lastSampleTimestamp - firstSampleTimestamp;\n const lastSampleTimingEntry = last(newSampleTimingEntries);\n if (lastSampleTimingEntry && lastSampleTimingEntry.delta === delta) {\n lastSampleTimingEntry.count++;\n }\n else {\n // One sample for the entire chunk\n newSampleTimingEntries.push({\n startIndex: chunkEntry.startChunkIndex + j,\n startDecodeTimestamp: firstSampleTimestamp,\n count: 1,\n delta,\n });\n }\n // Instead of determining the chunk's size by looping over the samples sizes in the sample table, we\n // can directly compute it as we know how many PCM frames are in this chunk, and the size of each\n // PCM frame. This also improves compatibility with some files which fail to write proper sample\n // size values into their sample tables in the PCM case.\n const chunkSize = chunkEntry.samplesPerChunk\n * pcmInfo.sampleSize\n * internalTrack.info.numberOfChannels;\n newSampleSizes.push(chunkSize);\n }\n chunkEntry.startSampleIndex = chunkEntry.startChunkIndex;\n chunkEntry.samplesPerChunk = 1;\n }\n sampleTable.sampleTimingEntries = newSampleTimingEntries;\n sampleTable.sampleSizes = newSampleSizes;\n }\n if (sampleTable.sampleCompositionTimeOffsets.length > 0) {\n // If composition time offsets are defined, we must build a list of all presentation timestamps and then\n // sort them\n sampleTable.presentationTimestamps = [];\n for (const entry of sampleTable.sampleTimingEntries) {\n for (let i = 0; i < entry.count; i++) {\n sampleTable.presentationTimestamps.push({\n presentationTimestamp: entry.startDecodeTimestamp + i * entry.delta,\n sampleIndex: entry.startIndex + i,\n });\n }\n }\n for (const entry of sampleTable.sampleCompositionTimeOffsets) {\n for (let i = 0; i < entry.count; i++) {\n const sampleIndex = entry.startIndex + i;\n const sample = sampleTable.presentationTimestamps[sampleIndex];\n if (!sample) {\n continue;\n }\n sample.presentationTimestamp += entry.offset;\n }\n }\n sampleTable.presentationTimestamps.sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n sampleTable.presentationTimestampIndexMap = Array(sampleTable.presentationTimestamps.length).fill(-1);\n for (let i = 0; i < sampleTable.presentationTimestamps.length; i++) {\n sampleTable.presentationTimestampIndexMap[sampleTable.presentationTimestamps[i].sampleIndex] = i;\n }\n }\n else {\n // If they're not defined, we can simply use the decode timestamps as presentation timestamps\n }\n return sampleTable;\n }\n async readFragment(startPos) {\n if (this.lastReadFragment?.moofOffset === startPos) {\n return this.lastReadFragment;\n }\n let headerSlice = this.reader.requestSliceRange(startPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const moofBoxInfo = readBoxHeader(headerSlice);\n assert(moofBoxInfo?.name === 'moof');\n let entireSlice = this.reader.requestSlice(startPos, moofBoxInfo.totalSize);\n if (entireSlice instanceof Promise)\n entireSlice = await entireSlice;\n assert(entireSlice);\n this.traverseBox(entireSlice);\n const fragment = this.lastReadFragment;\n assert(fragment && fragment.moofOffset === startPos);\n for (const [, trackData] of fragment.trackData) {\n const track = trackData.track;\n const { fragmentPositionCache } = track;\n if (!trackData.startTimestampIsFinal) {\n // It may be that some tracks don't define the base decode time, i.e. when the fragment begins. This\n // we'll need to figure out the start timestamp another way. We'll compute the timestamp by accessing\n // the lookup entries and fragment cache, which works out nicely with the lookup algorithm: If these\n // exist, then the lookup will automatically start at the furthest possible point. If they don't, the\n // lookup starts sequentially from the start, incrementally summing up all fragment durations. It's sort\n // of implicit, but it ends up working nicely.\n const lookupEntry = track.fragmentLookupTable.find(x => x.moofOffset === fragment.moofOffset);\n if (lookupEntry) {\n // There's a lookup entry, let's use its timestamp\n offsetFragmentTrackDataByTimestamp(trackData, lookupEntry.timestamp);\n }\n else {\n const lastCacheIndex = binarySearchLessOrEqual(fragmentPositionCache, fragment.moofOffset - 1, x => x.moofOffset);\n if (lastCacheIndex !== -1) {\n // Let's use the timestamp of the previous fragment in the cache\n const lastCache = fragmentPositionCache[lastCacheIndex];\n offsetFragmentTrackDataByTimestamp(trackData, lastCache.endTimestamp);\n }\n else {\n // We're the first fragment I guess, \"offset by 0\"\n }\n }\n trackData.startTimestampIsFinal = true;\n }\n // Let's remember that a fragment with a given timestamp is here, speeding up future lookups if no\n // lookup table exists\n const insertionIndex = binarySearchLessOrEqual(fragmentPositionCache, trackData.startTimestamp, x => x.startTimestamp);\n if (insertionIndex === -1\n || fragmentPositionCache[insertionIndex].moofOffset !== fragment.moofOffset) {\n fragmentPositionCache.splice(insertionIndex + 1, 0, {\n moofOffset: fragment.moofOffset,\n startTimestamp: trackData.startTimestamp,\n endTimestamp: trackData.endTimestamp,\n });\n }\n }\n return fragment;\n }\n readContiguousBoxes(slice) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_BOX_HEADER_SIZE) {\n const foundBox = this.traverseBox(slice);\n if (!foundBox) {\n break;\n }\n }\n }\n // eslint-disable-next-line @stylistic/generator-star-spacing\n *iterateContiguousBoxes(slice) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_BOX_HEADER_SIZE) {\n const startPos = slice.filePos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n yield { boxInfo, slice };\n slice.filePos = startPos + boxInfo.totalSize;\n }\n }\n traverseBox(slice) {\n const startPos = slice.filePos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n return false;\n }\n const contentStartPos = slice.filePos;\n const boxEndPos = startPos + boxInfo.totalSize;\n switch (boxInfo.name) {\n case 'mdia':\n case 'minf':\n case 'dinf':\n case 'mfra':\n case 'edts':\n {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'mvhd':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n if (version === 1) {\n slice.skip(8 + 8);\n this.movieTimescale = readU32Be(slice);\n this.movieDurationInTimescale = readU64Be(slice);\n }\n else {\n slice.skip(4 + 4);\n this.movieTimescale = readU32Be(slice);\n this.movieDurationInTimescale = readU32Be(slice);\n }\n }\n ;\n break;\n case 'trak':\n {\n const track = {\n id: -1,\n demuxer: this,\n inputTrack: null,\n disposition: {\n ...DEFAULT_TRACK_DISPOSITION,\n },\n info: null,\n timescale: -1,\n durationInMovieTimescale: -1,\n durationInMediaTimescale: -1,\n rotation: 0,\n internalCodecId: null,\n name: null,\n languageCode: UNDETERMINED_LANGUAGE,\n sampleTableByteOffset: -1,\n sampleTable: null,\n fragmentLookupTable: [],\n currentFragmentState: null,\n fragmentPositionCache: [],\n editListPreviousSegmentDurations: 0,\n editListOffset: 0,\n };\n this.currentTrack = track;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n if (track.id !== -1 && track.timescale !== -1 && track.info !== null) {\n if (track.info.type === 'video' && track.info.width !== -1) {\n const videoTrack = track;\n track.inputTrack = new InputVideoTrack(this.input, new IsobmffVideoTrackBacking(videoTrack));\n this.tracks.push(track);\n }\n else if (track.info.type === 'audio' && track.info.numberOfChannels !== -1) {\n const audioTrack = track;\n track.inputTrack = new InputAudioTrack(this.input, new IsobmffAudioTrackBacking(audioTrack));\n this.tracks.push(track);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case 'tkhd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n const flags = readU24Be(slice);\n // Spec says disabled tracks are to be treated like they don't exist, but in practice, they are treated\n // more like non-default tracks.\n const trackEnabled = !!(flags & 0x1);\n track.disposition.default = trackEnabled;\n // Skip over creation & modification time to reach the track ID\n if (version === 0) {\n slice.skip(8);\n track.id = readU32Be(slice);\n slice.skip(4);\n track.durationInMovieTimescale = readU32Be(slice);\n }\n else if (version === 1) {\n slice.skip(16);\n track.id = readU32Be(slice);\n slice.skip(4);\n track.durationInMovieTimescale = readU64Be(slice);\n }\n else {\n throw new Error(`Incorrect track header version ${version}.`);\n }\n slice.skip(2 * 4 + 2 + 2 + 2 + 2);\n const matrix = [\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n ];\n const rotation = normalizeRotation(roundToMultiple(extractRotationFromMatrix(matrix), 90));\n assert(rotation === 0 || rotation === 90 || rotation === 180 || rotation === 270);\n track.rotation = rotation;\n }\n ;\n break;\n case 'elst':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n slice.skip(3); // Flags\n let relevantEntryFound = false;\n let previousSegmentDurations = 0;\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const segmentDuration = version === 1\n ? readU64Be(slice)\n : readU32Be(slice);\n const mediaTime = version === 1\n ? readI64Be(slice)\n : readI32Be(slice);\n const mediaRate = readFixed_16_16(slice);\n if (segmentDuration === 0) {\n // Don't care\n continue;\n }\n if (relevantEntryFound) {\n console.warn('Unsupported edit list: multiple edits are not currently supported. Only using first edit.');\n break;\n }\n if (mediaTime === -1) {\n previousSegmentDurations += segmentDuration;\n continue;\n }\n if (mediaRate !== 1) {\n console.warn('Unsupported edit list entry: media rate must be 1.');\n break;\n }\n track.editListPreviousSegmentDurations = previousSegmentDurations;\n track.editListOffset = mediaTime;\n relevantEntryFound = true;\n }\n }\n ;\n break;\n case 'mdhd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n slice.skip(3); // Flags\n if (version === 0) {\n slice.skip(8);\n track.timescale = readU32Be(slice);\n track.durationInMediaTimescale = readU32Be(slice);\n }\n else if (version === 1) {\n slice.skip(16);\n track.timescale = readU32Be(slice);\n track.durationInMediaTimescale = readU64Be(slice);\n }\n let language = readU16Be(slice);\n if (language > 0) {\n track.languageCode = '';\n for (let i = 0; i < 3; i++) {\n track.languageCode = String.fromCharCode(0x60 + (language & 0b11111)) + track.languageCode;\n language >>= 5;\n }\n if (!isIso639Dash2LanguageCode(track.languageCode)) {\n // Sometimes the bytes are garbage\n track.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n }\n ;\n break;\n case 'hdlr':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n slice.skip(8); // Version + flags + pre-defined\n const handlerType = readAscii(slice, 4);\n if (handlerType === 'vide') {\n track.info = {\n type: 'video',\n width: -1,\n height: -1,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n avcType: null,\n avcCodecInfo: null,\n hevcCodecInfo: null,\n vp9CodecInfo: null,\n av1CodecInfo: null,\n };\n }\n else if (handlerType === 'soun') {\n track.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case 'stbl':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n track.sampleTableByteOffset = startPos;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'stsd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (track.info === null || track.sampleTable) {\n break;\n }\n const stsdVersion = readU8(slice);\n slice.skip(3); // Flags\n const entries = readU32Be(slice);\n for (let i = 0; i < entries; i++) {\n const sampleBoxStartPos = slice.filePos;\n const sampleBoxInfo = readBoxHeader(slice);\n if (!sampleBoxInfo) {\n break;\n }\n track.internalCodecId = sampleBoxInfo.name;\n const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();\n if (track.info.type === 'video') {\n if (lowercaseBoxName === 'avc1' || lowercaseBoxName === 'avc3') {\n track.info.codec = 'avc';\n track.info.avcType = lowercaseBoxName === 'avc1' ? 1 : 3;\n }\n else if (lowercaseBoxName === 'hvc1' || lowercaseBoxName === 'hev1') {\n track.info.codec = 'hevc';\n }\n else if (lowercaseBoxName === 'vp08') {\n track.info.codec = 'vp8';\n }\n else if (lowercaseBoxName === 'vp09') {\n track.info.codec = 'vp9';\n }\n else if (lowercaseBoxName === 'av01') {\n track.info.codec = 'av1';\n }\n else {\n console.warn(`Unsupported video codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n slice.skip(6 * 1 + 2 + 2 + 2 + 3 * 4);\n track.info.width = readU16Be(slice);\n track.info.height = readU16Be(slice);\n slice.skip(4 + 4 + 4 + 2 + 32 + 2 + 2);\n this.readContiguousBoxes(slice.slice(slice.filePos, (sampleBoxStartPos + sampleBoxInfo.totalSize) - slice.filePos));\n }\n else {\n if (lowercaseBoxName === 'mp4a') {\n // We don't know the codec yet (might be AAC, might be MP3), need to read the esds box\n }\n else if (lowercaseBoxName === 'opus') {\n track.info.codec = 'opus';\n }\n else if (lowercaseBoxName === 'flac') {\n track.info.codec = 'flac';\n }\n else if (lowercaseBoxName === 'twos'\n || lowercaseBoxName === 'sowt'\n || lowercaseBoxName === 'raw '\n || lowercaseBoxName === 'in24'\n || lowercaseBoxName === 'in32'\n || lowercaseBoxName === 'fl32'\n || lowercaseBoxName === 'fl64'\n || lowercaseBoxName === 'lpcm'\n || lowercaseBoxName === 'ipcm' // ISO/IEC 23003-5\n || lowercaseBoxName === 'fpcm' // \"\n ) {\n // It's PCM\n // developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions/\n }\n else if (lowercaseBoxName === 'ulaw') {\n track.info.codec = 'ulaw';\n }\n else if (lowercaseBoxName === 'alaw') {\n track.info.codec = 'alaw';\n }\n else {\n console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n slice.skip(6 * 1 + 2);\n const version = readU16Be(slice);\n slice.skip(3 * 2);\n let channelCount = readU16Be(slice);\n let sampleSize = readU16Be(slice);\n slice.skip(2 * 2);\n // Can't use fixed16_16 as that's signed\n let sampleRate = readU32Be(slice) / 0x10000;\n if (stsdVersion === 0 && version > 0) {\n // Additional QuickTime fields\n if (version === 1) {\n slice.skip(4);\n sampleSize = 8 * readU32Be(slice);\n slice.skip(2 * 4);\n }\n else if (version === 2) {\n slice.skip(4);\n sampleRate = readF64Be(slice);\n channelCount = readU32Be(slice);\n slice.skip(4); // Always 0x7f000000\n sampleSize = readU32Be(slice);\n const flags = readU32Be(slice);\n slice.skip(2 * 4);\n if (lowercaseBoxName === 'lpcm') {\n const bytesPerSample = (sampleSize + 7) >> 3;\n const isFloat = Boolean(flags & 1);\n const isBigEndian = Boolean(flags & 2);\n const sFlags = flags & 4 ? -1 : 0; // I guess it means \"signed flags\" or something?\n if (sampleSize > 0 && sampleSize <= 64) {\n if (isFloat) {\n if (sampleSize === 32) {\n track.info.codec = isBigEndian ? 'pcm-f32be' : 'pcm-f32';\n }\n }\n else {\n if (sFlags & (1 << (bytesPerSample - 1))) {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-s8';\n }\n else if (bytesPerSample === 2) {\n track.info.codec = isBigEndian ? 'pcm-s16be' : 'pcm-s16';\n }\n else if (bytesPerSample === 3) {\n track.info.codec = isBigEndian ? 'pcm-s24be' : 'pcm-s24';\n }\n else if (bytesPerSample === 4) {\n track.info.codec = isBigEndian ? 'pcm-s32be' : 'pcm-s32';\n }\n }\n else {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-u8';\n }\n }\n }\n }\n if (track.info.codec === null) {\n console.warn('Unsupported PCM format.');\n }\n }\n }\n }\n if (track.info.codec === 'opus') {\n sampleRate = OPUS_SAMPLE_RATE; // Always the same\n }\n track.info.numberOfChannels = channelCount;\n track.info.sampleRate = sampleRate;\n // PCM codec assignments\n if (lowercaseBoxName === 'twos') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'twos'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'sowt') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'sowt'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'raw ') {\n track.info.codec = 'pcm-u8';\n }\n else if (lowercaseBoxName === 'in24') {\n track.info.codec = 'pcm-s24be';\n }\n else if (lowercaseBoxName === 'in32') {\n track.info.codec = 'pcm-s32be';\n }\n else if (lowercaseBoxName === 'fl32') {\n track.info.codec = 'pcm-f32be';\n }\n else if (lowercaseBoxName === 'fl64') {\n track.info.codec = 'pcm-f64be';\n }\n else if (lowercaseBoxName === 'ipcm') {\n track.info.codec = 'pcm-s16be'; // Placeholder, will be adjusted by the pcmC box\n }\n else if (lowercaseBoxName === 'fpcm') {\n track.info.codec = 'pcm-f32be'; // Placeholder, will be adjusted by the pcmC box\n }\n this.readContiguousBoxes(slice.slice(slice.filePos, (sampleBoxStartPos + sampleBoxInfo.totalSize) - slice.filePos));\n }\n }\n }\n ;\n break;\n case 'avcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info);\n track.info.codecDescription = readBytes(slice, boxInfo.contentSize);\n }\n ;\n break;\n case 'hvcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info);\n track.info.codecDescription = readBytes(slice, boxInfo.contentSize);\n }\n ;\n break;\n case 'vpcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n slice.skip(4); // Version + flags\n const profile = readU8(slice);\n const level = readU8(slice);\n const thirdByte = readU8(slice);\n const bitDepth = thirdByte >> 4;\n const chromaSubsampling = (thirdByte >> 1) & 0b111;\n const videoFullRangeFlag = thirdByte & 1;\n const colourPrimaries = readU8(slice);\n const transferCharacteristics = readU8(slice);\n const matrixCoefficients = readU8(slice);\n track.info.vp9CodecInfo = {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n }\n ;\n break;\n case 'av1C':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n slice.skip(1); // Marker + version\n const secondByte = readU8(slice);\n const profile = secondByte >> 5;\n const level = secondByte & 0b11111;\n const thirdByte = readU8(slice);\n const tier = thirdByte >> 7;\n const highBitDepth = (thirdByte >> 6) & 1;\n const twelveBit = (thirdByte >> 5) & 1;\n const monochrome = (thirdByte >> 4) & 1;\n const chromaSubsamplingX = (thirdByte >> 3) & 1;\n const chromaSubsamplingY = (thirdByte >> 2) & 1;\n const chromaSamplePosition = thirdByte & 0b11;\n // Logic from https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitDepth = profile === 2 && highBitDepth ? (twelveBit ? 12 : 10) : (highBitDepth ? 10 : 8);\n track.info.av1CodecInfo = {\n profile,\n level,\n tier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n ;\n break;\n case 'colr':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n const colourType = readAscii(slice, 4);\n if (colourType !== 'nclx') {\n break;\n }\n const colourPrimaries = readU16Be(slice);\n const transferCharacteristics = readU16Be(slice);\n const matrixCoefficients = readU16Be(slice);\n const fullRangeFlag = Boolean(readU8(slice) & 0x80);\n track.info.colorSpace = {\n primaries: COLOR_PRIMARIES_MAP_INVERSE[colourPrimaries],\n transfer: TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics],\n matrix: MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients],\n fullRange: fullRangeFlag,\n };\n }\n ;\n break;\n case 'wave':\n {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'esds':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(4); // Version + flags\n const tag = readU8(slice);\n assert(tag === 0x03); // ES Descriptor\n readIsomVariableInteger(slice); // Length\n slice.skip(2); // ES ID\n const mixed = readU8(slice);\n const streamDependenceFlag = (mixed & 0x80) !== 0;\n const urlFlag = (mixed & 0x40) !== 0;\n const ocrStreamFlag = (mixed & 0x20) !== 0;\n if (streamDependenceFlag) {\n slice.skip(2);\n }\n if (urlFlag) {\n const urlLength = readU8(slice);\n slice.skip(urlLength);\n }\n if (ocrStreamFlag) {\n slice.skip(2);\n }\n const decoderConfigTag = readU8(slice);\n assert(decoderConfigTag === 0x04); // DecoderConfigDescriptor\n const decoderConfigDescriptorLength = readIsomVariableInteger(slice); // Length\n const payloadStart = slice.filePos;\n const objectTypeIndication = readU8(slice);\n if (objectTypeIndication === 0x40 || objectTypeIndication === 0x67) {\n track.info.codec = 'aac';\n track.info.aacCodecInfo = { isMpeg2: objectTypeIndication === 0x67 };\n }\n else if (objectTypeIndication === 0x69 || objectTypeIndication === 0x6b) {\n track.info.codec = 'mp3';\n }\n else if (objectTypeIndication === 0xdd) {\n track.info.codec = 'vorbis'; // \"nonstandard, gpac uses it\" - FFmpeg\n }\n else {\n console.warn(`Unsupported audio codec (objectTypeIndication ${objectTypeIndication}) - discarding track.`);\n }\n slice.skip(1 + 3 + 4 + 4);\n if (decoderConfigDescriptorLength > slice.filePos - payloadStart) {\n // There's a DecoderSpecificInfo at the end, let's read it\n const decoderSpecificInfoTag = readU8(slice);\n assert(decoderSpecificInfoTag === 0x05); // DecoderSpecificInfo\n const decoderSpecificInfoLength = readIsomVariableInteger(slice);\n track.info.codecDescription = readBytes(slice, decoderSpecificInfoLength);\n if (track.info.codec === 'aac') {\n // Let's try to deduce more accurate values directly from the AudioSpecificConfig:\n const audioSpecificConfig = parseAacAudioSpecificConfig(track.info.codecDescription);\n if (audioSpecificConfig.numberOfChannels !== null) {\n track.info.numberOfChannels = audioSpecificConfig.numberOfChannels;\n }\n if (audioSpecificConfig.sampleRate !== null) {\n track.info.sampleRate = audioSpecificConfig.sampleRate;\n }\n }\n }\n }\n ;\n break;\n case 'enda':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n const littleEndian = readU16Be(slice) & 0xff; // 0xff is from FFmpeg\n if (littleEndian) {\n if (track.info.codec === 'pcm-s16be') {\n track.info.codec = 'pcm-s16';\n }\n else if (track.info.codec === 'pcm-s24be') {\n track.info.codec = 'pcm-s24';\n }\n else if (track.info.codec === 'pcm-s32be') {\n track.info.codec = 'pcm-s32';\n }\n else if (track.info.codec === 'pcm-f32be') {\n track.info.codec = 'pcm-f32';\n }\n else if (track.info.codec === 'pcm-f64be') {\n track.info.codec = 'pcm-f64';\n }\n }\n }\n ;\n break;\n case 'pcmC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(1 + 3); // Version + flags\n // ISO/IEC 23003-5\n const formatFlags = readU8(slice);\n const isLittleEndian = Boolean(formatFlags & 0x01);\n const pcmSampleSize = readU8(slice);\n if (track.info.codec === 'pcm-s16be') {\n // ipcm\n if (isLittleEndian) {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24be';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32be';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n else if (track.info.codec === 'pcm-f32be') {\n // fpcm\n if (isLittleEndian) {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32be';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64be';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n break;\n }\n ;\n case 'dOps':\n { // Used for Opus audio\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(1); // Version\n // https://www.opus-codec.org/docs/opus_in_isobmff.html\n const outputChannelCount = readU8(slice);\n const preSkip = readU16Be(slice);\n const inputSampleRate = readU32Be(slice);\n const outputGain = readI16Be(slice);\n const channelMappingFamily = readU8(slice);\n let channelMappingTable;\n if (channelMappingFamily !== 0) {\n channelMappingTable = readBytes(slice, 2 + outputChannelCount);\n }\n else {\n channelMappingTable = new Uint8Array(0);\n }\n // https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-06\n const description = new Uint8Array(8 + 1 + 1 + 2 + 4 + 2 + 1 + channelMappingTable.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x4f707573, false); // 'Opus'\n view.setUint32(4, 0x48656164, false); // 'Head'\n view.setUint8(8, 1); // Version\n view.setUint8(9, outputChannelCount);\n view.setUint16(10, preSkip, true);\n view.setUint32(12, inputSampleRate, true);\n view.setInt16(16, outputGain, true);\n view.setUint8(18, channelMappingFamily);\n description.set(channelMappingTable, 19);\n track.info.codecDescription = description;\n track.info.numberOfChannels = outputChannelCount;\n // Don't copy the input sample rate, irrelevant, and output sample rate is fixed\n }\n ;\n break;\n case 'dfLa':\n { // Used for FLAC audio\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(4); // Version + flags\n // https://datatracker.ietf.org/doc/rfc9639/\n const BLOCK_TYPE_MASK = 0x7f;\n const LAST_METADATA_BLOCK_FLAG_MASK = 0x80;\n const startPos = slice.filePos;\n while (slice.filePos < boxEndPos) {\n const flagAndType = readU8(slice);\n const metadataBlockLength = readU24Be(slice);\n const type = flagAndType & BLOCK_TYPE_MASK;\n // It's a STREAMINFO block; let's extract the actual sample rate and channel count\n if (type === FlacBlockType.STREAMINFO) {\n slice.skip(10);\n // Extract sample rate and channel count\n const word = readU32Be(slice);\n const sampleRate = word >>> 12;\n const numberOfChannels = ((word >> 9) & 0b111) + 1;\n track.info.sampleRate = sampleRate;\n track.info.numberOfChannels = numberOfChannels;\n slice.skip(20);\n }\n else {\n // Simply skip ahead to the next block\n slice.skip(metadataBlockLength);\n }\n if (flagAndType & LAST_METADATA_BLOCK_FLAG_MASK) {\n break;\n }\n }\n const endPos = slice.filePos;\n slice.filePos = startPos;\n const bytes = readBytes(slice, endPos - startPos);\n const description = new Uint8Array(4 + bytes.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x664c6143, false); // 'fLaC'\n description.set(bytes, 4);\n // Set the codec description to be 'fLaC' + all metadata blocks\n track.info.codecDescription = description;\n }\n ;\n break;\n case 'stts':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n let currentIndex = 0;\n let currentTimestamp = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = readU32Be(slice);\n const sampleDelta = readU32Be(slice);\n track.sampleTable.sampleTimingEntries.push({\n startIndex: currentIndex,\n startDecodeTimestamp: currentTimestamp,\n count: sampleCount,\n delta: sampleDelta,\n });\n currentIndex += sampleCount;\n currentTimestamp += sampleCount * sampleDelta;\n }\n }\n ;\n break;\n case 'ctts':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(1 + 3); // Version + flags\n const entryCount = readU32Be(slice);\n let sampleIndex = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = readU32Be(slice);\n const sampleOffset = readI32Be(slice);\n track.sampleTable.sampleCompositionTimeOffsets.push({\n startIndex: sampleIndex,\n count: sampleCount,\n offset: sampleOffset,\n });\n sampleIndex += sampleCount;\n }\n }\n ;\n break;\n case 'stsz':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const sampleSize = readU32Be(slice);\n const sampleCount = readU32Be(slice);\n if (sampleSize === 0) {\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = readU32Be(slice);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n else {\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stz2':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n slice.skip(3); // Reserved\n const fieldSize = readU8(slice); // in bits\n const sampleCount = readU32Be(slice);\n const bytes = readBytes(slice, Math.ceil(sampleCount * fieldSize / 8));\n const bitstream = new Bitstream(bytes);\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = bitstream.readBits(fieldSize);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stss':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n track.sampleTable.keySampleIndices = [];\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const sampleIndex = readU32Be(slice) - 1; // Convert to 0-indexed\n track.sampleTable.keySampleIndices.push(sampleIndex);\n }\n if (track.sampleTable.keySampleIndices[0] !== 0) {\n // Some files don't mark the first sample a key sample, which is basically almost always incorrect.\n // Here, we correct for that mistake:\n track.sampleTable.keySampleIndices.unshift(0);\n }\n }\n ;\n break;\n case 'stsc':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4);\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const startChunkIndex = readU32Be(slice) - 1; // Convert to 0-indexed\n const samplesPerChunk = readU32Be(slice);\n const sampleDescriptionIndex = readU32Be(slice);\n track.sampleTable.sampleToChunk.push({\n startSampleIndex: -1,\n startChunkIndex,\n samplesPerChunk,\n sampleDescriptionIndex,\n });\n }\n let startSampleIndex = 0;\n for (let i = 0; i < track.sampleTable.sampleToChunk.length; i++) {\n track.sampleTable.sampleToChunk[i].startSampleIndex = startSampleIndex;\n if (i < track.sampleTable.sampleToChunk.length - 1) {\n const nextChunk = track.sampleTable.sampleToChunk[i + 1];\n const chunkCount = nextChunk.startChunkIndex\n - track.sampleTable.sampleToChunk[i].startChunkIndex;\n startSampleIndex += chunkCount * track.sampleTable.sampleToChunk[i].samplesPerChunk;\n }\n }\n }\n ;\n break;\n case 'stco':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = readU32Be(slice);\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'co64':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = readU64Be(slice);\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'mvex':\n {\n this.isFragmented = true;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'mehd':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n const fragmentDuration = version === 1 ? readU64Be(slice) : readU32Be(slice);\n this.movieDurationInTimescale = fragmentDuration;\n }\n ;\n break;\n case 'trex':\n {\n slice.skip(4); // Version + flags\n const trackId = readU32Be(slice);\n const defaultSampleDescriptionIndex = readU32Be(slice);\n const defaultSampleDuration = readU32Be(slice);\n const defaultSampleSize = readU32Be(slice);\n const defaultSampleFlags = readU32Be(slice);\n // We store these separately rather than in the tracks since the tracks may not exist yet\n this.fragmentTrackDefaults.push({\n trackId,\n defaultSampleDescriptionIndex,\n defaultSampleDuration,\n defaultSampleSize,\n defaultSampleFlags,\n });\n }\n ;\n break;\n case 'tfra':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n const trackId = readU32Be(slice);\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n break;\n }\n const word = readU32Be(slice);\n const lengthSizeOfTrafNum = (word & 0b110000) >> 4;\n const lengthSizeOfTrunNum = (word & 0b001100) >> 2;\n const lengthSizeOfSampleNum = word & 0b000011;\n const functions = [readU8, readU16Be, readU24Be, readU32Be];\n const readTrafNum = functions[lengthSizeOfTrafNum];\n const readTrunNum = functions[lengthSizeOfTrunNum];\n const readSampleNum = functions[lengthSizeOfSampleNum];\n const numberOfEntries = readU32Be(slice);\n for (let i = 0; i < numberOfEntries; i++) {\n const time = version === 1 ? readU64Be(slice) : readU32Be(slice);\n const moofOffset = version === 1 ? readU64Be(slice) : readU32Be(slice);\n readTrafNum(slice);\n readTrunNum(slice);\n readSampleNum(slice);\n track.fragmentLookupTable.push({\n timestamp: time,\n moofOffset,\n });\n }\n // Sort by timestamp in case it's not naturally sorted\n track.fragmentLookupTable.sort((a, b) => a.timestamp - b.timestamp);\n // Remove multiple entries for the same time\n for (let i = 0; i < track.fragmentLookupTable.length - 1; i++) {\n const entry1 = track.fragmentLookupTable[i];\n const entry2 = track.fragmentLookupTable[i + 1];\n if (entry1.timestamp === entry2.timestamp) {\n track.fragmentLookupTable.splice(i + 1, 1);\n i--;\n }\n }\n }\n ;\n break;\n case 'moof':\n {\n this.currentFragment = {\n moofOffset: startPos,\n moofSize: boxInfo.totalSize,\n implicitBaseDataOffset: startPos,\n trackData: new Map(),\n };\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n this.lastReadFragment = this.currentFragment;\n this.currentFragment = null;\n }\n ;\n break;\n case 'traf':\n {\n assert(this.currentFragment);\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n // It is possible that there is no current track, for example when we don't care about the track\n // referenced in the track fragment header.\n if (this.currentTrack) {\n const trackData = this.currentFragment.trackData.get(this.currentTrack.id);\n if (trackData) {\n const { currentFragmentState } = this.currentTrack;\n assert(currentFragmentState);\n if (currentFragmentState.startTimestamp !== null) {\n offsetFragmentTrackDataByTimestamp(trackData, currentFragmentState.startTimestamp);\n trackData.startTimestampIsFinal = true;\n }\n }\n this.currentTrack.currentFragmentState = null;\n this.currentTrack = null;\n }\n }\n ;\n break;\n case 'tfhd':\n {\n assert(this.currentFragment);\n slice.skip(1); // Version\n const flags = readU24Be(slice);\n const baseDataOffsetPresent = Boolean(flags & 0x000001);\n const sampleDescriptionIndexPresent = Boolean(flags & 0x000002);\n const defaultSampleDurationPresent = Boolean(flags & 0x000008);\n const defaultSampleSizePresent = Boolean(flags & 0x000010);\n const defaultSampleFlagsPresent = Boolean(flags & 0x000020);\n const durationIsEmpty = Boolean(flags & 0x010000);\n const defaultBaseIsMoof = Boolean(flags & 0x020000);\n const trackId = readU32Be(slice);\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n // We don't care about this track\n break;\n }\n const defaults = this.fragmentTrackDefaults.find(x => x.trackId === trackId);\n this.currentTrack = track;\n track.currentFragmentState = {\n baseDataOffset: this.currentFragment.implicitBaseDataOffset,\n sampleDescriptionIndex: defaults?.defaultSampleDescriptionIndex ?? null,\n defaultSampleDuration: defaults?.defaultSampleDuration ?? null,\n defaultSampleSize: defaults?.defaultSampleSize ?? null,\n defaultSampleFlags: defaults?.defaultSampleFlags ?? null,\n startTimestamp: null,\n };\n if (baseDataOffsetPresent) {\n track.currentFragmentState.baseDataOffset = readU64Be(slice);\n }\n else if (defaultBaseIsMoof) {\n track.currentFragmentState.baseDataOffset = this.currentFragment.moofOffset;\n }\n if (sampleDescriptionIndexPresent) {\n track.currentFragmentState.sampleDescriptionIndex = readU32Be(slice);\n }\n if (defaultSampleDurationPresent) {\n track.currentFragmentState.defaultSampleDuration = readU32Be(slice);\n }\n if (defaultSampleSizePresent) {\n track.currentFragmentState.defaultSampleSize = readU32Be(slice);\n }\n if (defaultSampleFlagsPresent) {\n track.currentFragmentState.defaultSampleFlags = readU32Be(slice);\n }\n if (durationIsEmpty) {\n track.currentFragmentState.defaultSampleDuration = 0;\n }\n }\n ;\n break;\n case 'tfdt':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.currentFragmentState);\n const version = readU8(slice);\n slice.skip(3); // Flags\n const baseMediaDecodeTime = version === 0 ? readU32Be(slice) : readU64Be(slice);\n track.currentFragmentState.startTimestamp = baseMediaDecodeTime;\n }\n ;\n break;\n case 'trun':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(this.currentFragment);\n assert(track.currentFragmentState);\n if (this.currentFragment.trackData.has(track.id)) {\n console.warn('Can\\'t have two trun boxes for the same track in one fragment. Ignoring...');\n break;\n }\n const version = readU8(slice);\n const flags = readU24Be(slice);\n const dataOffsetPresent = Boolean(flags & 0x000001);\n const firstSampleFlagsPresent = Boolean(flags & 0x000004);\n const sampleDurationPresent = Boolean(flags & 0x000100);\n const sampleSizePresent = Boolean(flags & 0x000200);\n const sampleFlagsPresent = Boolean(flags & 0x000400);\n const sampleCompositionTimeOffsetsPresent = Boolean(flags & 0x000800);\n const sampleCount = readU32Be(slice);\n let dataOffset = track.currentFragmentState.baseDataOffset;\n if (dataOffsetPresent) {\n dataOffset += readI32Be(slice);\n }\n let firstSampleFlags = null;\n if (firstSampleFlagsPresent) {\n firstSampleFlags = readU32Be(slice);\n }\n let currentOffset = dataOffset;\n if (sampleCount === 0) {\n // Don't associate the fragment with the track if it has no samples, this simplifies other code\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n break;\n }\n let currentTimestamp = 0;\n const trackData = {\n track,\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n samples: [],\n presentationTimestamps: [],\n startTimestampIsFinal: false,\n };\n this.currentFragment.trackData.set(track.id, trackData);\n for (let i = 0; i < sampleCount; i++) {\n let sampleDuration;\n if (sampleDurationPresent) {\n sampleDuration = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleDuration !== null);\n sampleDuration = track.currentFragmentState.defaultSampleDuration;\n }\n let sampleSize;\n if (sampleSizePresent) {\n sampleSize = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleSize !== null);\n sampleSize = track.currentFragmentState.defaultSampleSize;\n }\n let sampleFlags;\n if (sampleFlagsPresent) {\n sampleFlags = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleFlags !== null);\n sampleFlags = track.currentFragmentState.defaultSampleFlags;\n }\n if (i === 0 && firstSampleFlags !== null) {\n sampleFlags = firstSampleFlags;\n }\n let sampleCompositionTimeOffset = 0;\n if (sampleCompositionTimeOffsetsPresent) {\n if (version === 0) {\n sampleCompositionTimeOffset = readU32Be(slice);\n }\n else {\n sampleCompositionTimeOffset = readI32Be(slice);\n }\n }\n const isKeyFrame = !(sampleFlags & 0x00010000);\n trackData.samples.push({\n presentationTimestamp: currentTimestamp + sampleCompositionTimeOffset,\n duration: sampleDuration,\n byteOffset: currentOffset,\n byteSize: sampleSize,\n isKeyFrame,\n });\n currentOffset += sampleSize;\n currentTimestamp += sampleDuration;\n }\n trackData.presentationTimestamps = trackData.samples\n .map((x, i) => ({ presentationTimestamp: x.presentationTimestamp, sampleIndex: i }))\n .sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentSample = trackData.samples[currentEntry.sampleIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentSample.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentSample.presentationTimestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update sample durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentSample.duration = nextEntry.presentationTimestamp - currentEntry.presentationTimestamp;\n }\n }\n const firstSample = trackData.samples[trackData.presentationTimestamps[0].sampleIndex];\n const lastSample = trackData.samples[last(trackData.presentationTimestamps).sampleIndex];\n trackData.startTimestamp = firstSample.presentationTimestamp;\n trackData.endTimestamp = lastSample.presentationTimestamp + lastSample.duration;\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n }\n ;\n break;\n // Metadata section\n // https://exiftool.org/TagNames/QuickTime.html\n // https://mp4workshop.com/about\n case 'udta':\n { // Contains either movie metadata or track metadata\n const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n for (const { boxInfo, slice } of iterator) {\n if (boxInfo.name !== 'meta' && !this.currentTrack) {\n const startPos = slice.filePos;\n this.metadataTags.raw ??= {};\n if (boxInfo.name[0] === '©') {\n // https://mp4workshop.com/about\n // Box name starting with © indicates \"international text\"\n this.metadataTags.raw[boxInfo.name] ??= readMetadataStringShort(slice);\n }\n else {\n this.metadataTags.raw[boxInfo.name] ??= readBytes(slice, boxInfo.contentSize);\n }\n slice.filePos = startPos;\n }\n switch (boxInfo.name) {\n case 'meta':\n {\n slice.skip(-boxInfo.headerSize);\n this.traverseBox(slice);\n }\n ;\n break;\n case '©nam':\n case 'name':\n {\n if (this.currentTrack) {\n this.currentTrack.name = textDecoder.decode(readBytes(slice, boxInfo.contentSize));\n }\n else {\n this.metadataTags.title ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©des':\n {\n if (!this.currentTrack) {\n this.metadataTags.description ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©ART':\n {\n if (!this.currentTrack) {\n this.metadataTags.artist ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©alb':\n {\n if (!this.currentTrack) {\n this.metadataTags.album ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case 'albr':\n {\n if (!this.currentTrack) {\n this.metadataTags.albumArtist ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©gen':\n {\n if (!this.currentTrack) {\n this.metadataTags.genre ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©day':\n {\n if (!this.currentTrack) {\n const date = new Date(readMetadataStringShort(slice));\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n }\n ;\n break;\n case '©cmt':\n {\n if (!this.currentTrack) {\n this.metadataTags.comment ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©lyr':\n {\n if (!this.currentTrack) {\n this.metadataTags.lyrics ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n }\n }\n }\n ;\n break;\n case 'meta':\n {\n if (this.currentTrack) {\n break; // Only care about movie-level metadata for now\n }\n // The 'meta' box comes in two flavors, one with flags/version and one without. To know which is which,\n // let's read the next 4 bytes, which are either the version or the size of the first subbox.\n const word = readU32Be(slice);\n const isQuickTime = word !== 0;\n this.currentMetadataKeys = new Map();\n if (isQuickTime) {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n else {\n this.readContiguousBoxes(slice.slice(contentStartPos + 4, boxInfo.contentSize - 4));\n }\n this.currentMetadataKeys = null;\n }\n ;\n break;\n case 'keys':\n {\n if (!this.currentMetadataKeys) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const keySize = readU32Be(slice);\n slice.skip(4); // Key namespace\n const keyName = textDecoder.decode(readBytes(slice, keySize - 8));\n this.currentMetadataKeys.set(i + 1, keyName);\n }\n }\n ;\n break;\n case 'ilst':\n {\n if (!this.currentMetadataKeys) {\n break;\n }\n const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n for (const { boxInfo, slice } of iterator) {\n let metadataKey = boxInfo.name;\n // Interpret the box name as a u32be\n const nameAsNumber = (metadataKey.charCodeAt(0) << 24)\n + (metadataKey.charCodeAt(1) << 16)\n + (metadataKey.charCodeAt(2) << 8)\n + metadataKey.charCodeAt(3);\n if (this.currentMetadataKeys.has(nameAsNumber)) {\n // An entry exists for this number\n metadataKey = this.currentMetadataKeys.get(nameAsNumber);\n }\n const data = readDataBox(slice);\n this.metadataTags.raw ??= {};\n this.metadataTags.raw[metadataKey] ??= data;\n switch (metadataKey) {\n case '©nam':\n case 'titl':\n case 'com.apple.quicktime.title':\n case 'title':\n {\n if (typeof data === 'string') {\n this.metadataTags.title ??= data;\n }\n }\n ;\n break;\n case '©des':\n case 'desc':\n case 'dscp':\n case 'com.apple.quicktime.description':\n case 'description':\n {\n if (typeof data === 'string') {\n this.metadataTags.description ??= data;\n }\n }\n ;\n break;\n case '©ART':\n case 'com.apple.quicktime.artist':\n case 'artist':\n {\n if (typeof data === 'string') {\n this.metadataTags.artist ??= data;\n }\n }\n ;\n break;\n case '©alb':\n case 'albm':\n case 'com.apple.quicktime.album':\n case 'album':\n {\n if (typeof data === 'string') {\n this.metadataTags.album ??= data;\n }\n }\n ;\n break;\n case 'aART':\n case 'album_artist':\n {\n if (typeof data === 'string') {\n this.metadataTags.albumArtist ??= data;\n }\n }\n ;\n break;\n case '©cmt':\n case 'com.apple.quicktime.comment':\n case 'comment':\n {\n if (typeof data === 'string') {\n this.metadataTags.comment ??= data;\n }\n }\n ;\n break;\n case '©gen':\n case 'gnre':\n case 'com.apple.quicktime.genre':\n case 'genre':\n {\n if (typeof data === 'string') {\n this.metadataTags.genre ??= data;\n }\n }\n ;\n break;\n case '©lyr':\n case 'lyrics':\n {\n if (typeof data === 'string') {\n this.metadataTags.lyrics ??= data;\n }\n }\n ;\n break;\n case '©day':\n case 'rldt':\n case 'com.apple.quicktime.creationdate':\n case 'date':\n {\n if (typeof data === 'string') {\n const date = new Date(data);\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n }\n ;\n break;\n case 'covr':\n case 'com.apple.quicktime.artwork':\n {\n if (data instanceof RichImageData) {\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data: data.data,\n kind: 'coverFront',\n mimeType: data.mimeType,\n });\n }\n else if (data instanceof Uint8Array) {\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data,\n kind: 'coverFront',\n mimeType: 'image/*',\n });\n }\n }\n ;\n break;\n case 'track':\n {\n if (typeof data === 'string') {\n const parts = data.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 this.metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n }\n ;\n break;\n case 'trkn':\n {\n if (data instanceof Uint8Array && data.length >= 6) {\n const view = toDataView(data);\n const trackNumber = view.getUint16(2, false);\n const tracksTotal = view.getUint16(4, false);\n if (trackNumber > 0) {\n this.metadataTags.trackNumber ??= trackNumber;\n }\n if (tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n }\n ;\n break;\n case 'disc':\n case 'disk':\n {\n if (data instanceof Uint8Array && data.length >= 6) {\n const view = toDataView(data);\n const discNumber = view.getUint16(2, false);\n const discNumberMax = view.getUint16(4, false);\n if (discNumber > 0) {\n this.metadataTags.discNumber ??= discNumber;\n }\n if (discNumberMax > 0) {\n this.metadataTags.discsTotal ??= discNumberMax;\n }\n }\n }\n ;\n break;\n }\n }\n }\n ;\n break;\n }\n slice.filePos = boxEndPos;\n return true;\n }\n}\nclass IsobmffTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToSampleIndex = new WeakMap();\n this.packetToFragmentLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getInternalCodecId() {\n return this.internalTrack.internalCodecId;\n }\n getName() {\n return this.internalTrack.name;\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n getTimeResolution() {\n return this.internalTrack.timescale;\n }\n getDisposition() {\n return this.internalTrack.disposition;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n async getFirstPacket(options) {\n const regularPacket = await this.fetchPacketForSampleIndex(0, options);\n if (regularPacket || !this.internalTrack.demuxer.isFragmented) {\n // If there's a non-fragmented packet, always prefer that\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n mapTimestampIntoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundIfAlmostInteger(timestamp * this.internalTrack.timescale) + this.internalTrack.editListOffset;\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { sampleIndex: -1, correctSampleFound: false };\n }\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.presentationTimestamp);\n const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1;\n const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { sampleIndex, correctSampleFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n return this.fetchPacketForSampleIndex(regularSampleIndex + 1, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performFragmentedLookup(locationInFragment.fragment, (fragment) => {\n if (fragment === locationInFragment.fragment) {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (locationInFragment.sampleIndex + 1 < trackData.samples.length) {\n // We can simply take the next sample in the fragment\n return {\n sampleIndex: locationInFragment.sampleIndex + 1,\n correctSampleFound: true,\n };\n }\n }\n else {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getKeyframeSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { sampleIndex: -1, correctSampleFound: false };\n }\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const sample = trackData.samples[x.sampleIndex];\n return sample.isKeyFrame && x.presentationTimestamp <= timestampInTimescale;\n });\n const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1;\n const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { sampleIndex, correctSampleFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const nextKeyFrameSampleIndex = getNextKeyframeIndexForSample(sampleTable, regularSampleIndex);\n return this.fetchPacketForSampleIndex(nextKeyFrameSampleIndex, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performFragmentedLookup(locationInFragment.fragment, (fragment) => {\n if (fragment === locationInFragment.fragment) {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const nextKeyFrameIndex = trackData.samples.findIndex((x, i) => x.isKeyFrame && i > locationInFragment.sampleIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the fragment\n return {\n sampleIndex: nextKeyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n else {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const keyFrameIndex = trackData.samples.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n sampleIndex: keyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n async fetchPacketForSampleIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleInfo = getSampleInfo(sampleTable, sampleIndex);\n if (!sampleInfo) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.internalTrack.demuxer.reader.requestSlice(sampleInfo.sampleOffset, sampleInfo.sampleSize);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, sampleInfo.sampleSize);\n }\n const timestamp = (sampleInfo.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = sampleInfo.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, sampleInfo.isKeyFrame ? 'key' : 'delta', timestamp, duration, sampleIndex, sampleInfo.sampleSize);\n this.packetToSampleIndex.set(packet, sampleIndex);\n return packet;\n }\n async fetchPacketInFragment(fragment, sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[sampleIndex];\n assert(fragmentSample);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.internalTrack.demuxer.reader.requestSlice(fragmentSample.byteOffset, fragmentSample.byteSize);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, fragmentSample.byteSize);\n }\n const timestamp = (fragmentSample.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = fragmentSample.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, fragmentSample.isKeyFrame ? 'key' : 'delta', timestamp, duration, fragment.moofOffset + sampleIndex, fragmentSample.byteSize);\n this.packetToFragmentLocation.set(packet, { fragment, sampleIndex });\n return packet;\n }\n /** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */\n async performFragmentedLookup(\n // The fragment where we start looking\n startFragment, \n // This function returns the best-matching sample in a given fragment\n getMatchInFragment, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct sample will not come after it\n latestTimestamp, options) {\n const demuxer = this.internalTrack.demuxer;\n let currentFragment = null;\n let bestFragment = null;\n let bestSampleIndex = -1;\n if (startFragment) {\n const { sampleIndex, correctSampleFound } = getMatchInFragment(startFragment);\n if (correctSampleFound) {\n return this.fetchPacketInFragment(startFragment, sampleIndex, options);\n }\n if (sampleIndex !== -1) {\n bestFragment = startFragment;\n bestSampleIndex = sampleIndex;\n }\n }\n // Search for a lookup entry; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct fragment (or at least nearby).\n const lookupEntryIndex = binarySearchLessOrEqual(this.internalTrack.fragmentLookupTable, searchTimestamp, x => x.timestamp);\n const lookupEntry = lookupEntryIndex !== -1\n ? this.internalTrack.fragmentLookupTable[lookupEntryIndex]\n : null;\n const positionCacheIndex = binarySearchLessOrEqual(this.internalTrack.fragmentPositionCache, searchTimestamp, x => x.startTimestamp);\n const positionCacheEntry = positionCacheIndex !== -1\n ? this.internalTrack.fragmentPositionCache[positionCacheIndex]\n : null;\n const lookupEntryPosition = Math.max(lookupEntry?.moofOffset ?? 0, positionCacheEntry?.moofOffset ?? 0) || null;\n let currentPos;\n if (!startFragment) {\n currentPos = lookupEntryPosition ?? 0;\n }\n else {\n if (lookupEntryPosition === null || startFragment.moofOffset >= lookupEntryPosition) {\n currentPos = startFragment.moofOffset + startFragment.moofSize;\n currentFragment = startFragment;\n }\n else {\n // Use the lookup entry\n currentPos = lookupEntryPosition;\n }\n }\n while (true) {\n if (currentFragment) {\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n }\n // Load the header\n let slice = demuxer.reader.requestSliceRange(currentPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const boxStartPos = currentPos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n if (boxInfo.name === 'moof') {\n currentFragment = await demuxer.readFragment(boxStartPos);\n const { sampleIndex, correctSampleFound } = getMatchInFragment(currentFragment);\n if (correctSampleFound) {\n return this.fetchPacketInFragment(currentFragment, sampleIndex, options);\n }\n if (sampleIndex !== -1) {\n bestFragment = currentFragment;\n bestSampleIndex = sampleIndex;\n }\n }\n currentPos = boxStartPos + boxInfo.totalSize;\n }\n // Catch faulty lookup table entries\n if (lookupEntry && (!bestFragment || bestFragment.moofOffset < lookupEntry.moofOffset)) {\n // The lookup table entry lied to us! We found a lookup entry but no fragment there that satisfied\n // the match. In this case, let's search again but using the lookup entry before that.\n const previousLookupEntry = this.internalTrack.fragmentLookupTable[lookupEntryIndex - 1];\n assert(!previousLookupEntry || previousLookupEntry.timestamp < lookupEntry.timestamp);\n const newSearchTimestamp = previousLookupEntry?.timestamp ?? -Infinity;\n return this.performFragmentedLookup(null, getMatchInFragment, newSearchTimestamp, latestTimestamp, options);\n }\n if (bestFragment) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n return this.fetchPacketInFragment(bestFragment, bestSampleIndex, options);\n }\n return null;\n }\n}\nclass IsobmffVideoTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async canBeTransparent() {\n return false;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n if (this.internalTrack.info.codec === 'vp9' && !this.internalTrack.info.vp9CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.vp9CodecInfo = firstPacket && extractVp9CodecInfoFromPacket(firstPacket.data);\n }\n else if (this.internalTrack.info.codec === 'av1' && !this.internalTrack.info.av1CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.av1CodecInfo = firstPacket && extractAv1CodecInfoFromPacket(firstPacket.data);\n }\n return {\n codec: extractVideoCodecString(this.internalTrack.info),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass IsobmffAudioTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString(this.internalTrack.info),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\nconst getSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n return sampleTable.presentationTimestamps[index].sampleIndex;\n }\n else {\n const index = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, timescaleUnits, x => x.startDecodeTimestamp);\n if (index === -1) {\n return -1;\n }\n const entry = sampleTable.sampleTimingEntries[index];\n return entry.startIndex\n + Math.min(Math.floor((timescaleUnits - entry.startDecodeTimestamp) / entry.delta), entry.count - 1);\n }\n};\nconst getKeyframeSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (!sampleTable.keySampleIndices) {\n // Every sample is a keyframe\n return getSampleIndexForTimestamp(sampleTable, timescaleUnits);\n }\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n // Walk the samples in presentation order until we find one that's a keyframe\n for (let i = index; i >= 0; i--) {\n const sampleIndex = sampleTable.presentationTimestamps[i].sampleIndex;\n const isKeyFrame = binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1;\n if (isKeyFrame) {\n return sampleIndex;\n }\n }\n return -1;\n }\n else {\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timescaleUnits);\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index] ?? -1;\n }\n};\nconst getSampleInfo = (sampleTable, sampleIndex) => {\n const timingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, sampleIndex, x => x.startIndex);\n const timingEntry = sampleTable.sampleTimingEntries[timingEntryIndex];\n if (!timingEntry || timingEntry.startIndex + timingEntry.count <= sampleIndex) {\n return null;\n }\n const decodeTimestamp = timingEntry.startDecodeTimestamp\n + (sampleIndex - timingEntry.startIndex) * timingEntry.delta;\n let presentationTimestamp = decodeTimestamp;\n const offsetEntryIndex = binarySearchLessOrEqual(sampleTable.sampleCompositionTimeOffsets, sampleIndex, x => x.startIndex);\n const offsetEntry = sampleTable.sampleCompositionTimeOffsets[offsetEntryIndex];\n if (offsetEntry && sampleIndex - offsetEntry.startIndex < offsetEntry.count) {\n presentationTimestamp += offsetEntry.offset;\n }\n const sampleSize = sampleTable.sampleSizes[Math.min(sampleIndex, sampleTable.sampleSizes.length - 1)];\n const chunkEntryIndex = binarySearchLessOrEqual(sampleTable.sampleToChunk, sampleIndex, x => x.startSampleIndex);\n const chunkEntry = sampleTable.sampleToChunk[chunkEntryIndex];\n assert(chunkEntry);\n const chunkIndex = chunkEntry.startChunkIndex\n + Math.floor((sampleIndex - chunkEntry.startSampleIndex) / chunkEntry.samplesPerChunk);\n const chunkOffset = sampleTable.chunkOffsets[chunkIndex];\n const startSampleIndexOfChunk = chunkEntry.startSampleIndex\n + (chunkIndex - chunkEntry.startChunkIndex) * chunkEntry.samplesPerChunk;\n let chunkSize = 0;\n let sampleOffset = chunkOffset;\n if (sampleTable.sampleSizes.length === 1) {\n sampleOffset += sampleSize * (sampleIndex - startSampleIndexOfChunk);\n chunkSize += sampleSize * chunkEntry.samplesPerChunk;\n }\n else {\n for (let i = startSampleIndexOfChunk; i < startSampleIndexOfChunk + chunkEntry.samplesPerChunk; i++) {\n const sampleSize = sampleTable.sampleSizes[i];\n if (i < sampleIndex) {\n sampleOffset += sampleSize;\n }\n chunkSize += sampleSize;\n }\n }\n let duration = timingEntry.delta;\n if (sampleTable.presentationTimestamps) {\n // In order to accurately compute the duration, we need to take the duration to the next sample in presentation\n // order, not in decode order\n const presentationIndex = sampleTable.presentationTimestampIndexMap[sampleIndex];\n assert(presentationIndex !== undefined);\n if (presentationIndex < sampleTable.presentationTimestamps.length - 1) {\n const nextEntry = sampleTable.presentationTimestamps[presentationIndex + 1];\n const nextPresentationTimestamp = nextEntry.presentationTimestamp;\n duration = nextPresentationTimestamp - presentationTimestamp;\n }\n }\n return {\n presentationTimestamp,\n duration,\n sampleOffset,\n sampleSize,\n chunkOffset,\n chunkSize,\n isKeyFrame: sampleTable.keySampleIndices\n ? binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1\n : true,\n };\n};\nconst getNextKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex + 1;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index + 1] ?? -1;\n};\nconst offsetFragmentTrackDataByTimestamp = (trackData, timestamp) => {\n trackData.startTimestamp += timestamp;\n trackData.endTimestamp += timestamp;\n for (const sample of trackData.samples) {\n sample.presentationTimestamp += timestamp;\n }\n for (const entry of trackData.presentationTimestamps) {\n entry.presentationTimestamp += timestamp;\n }\n};\n/** Extracts the rotation component from a transformation matrix, in degrees. */\nconst extractRotationFromMatrix = (matrix) => {\n const [m11, , , m21] = matrix;\n const scaleX = Math.hypot(m11, m21);\n const cosTheta = m11 / scaleX;\n const sinTheta = m21 / scaleX;\n // Invert the rotation because matrices are post-multiplied in ISOBMFF\n const result = -Math.atan2(sinTheta, cosTheta) * (180 / Math.PI);\n if (!Number.isFinite(result)) {\n // Can happen if the entire matrix is 0, for example\n return 0;\n }\n return result;\n};\nconst sampleTableIsEmpty = (sampleTable) => {\n return sampleTable.sampleSizes.length === 0;\n};\n","/*!\n * Copyright (c) 2025-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 { VP9_LEVEL_TABLE } from './codec.js';\nimport { assert, assertNever, base64ToBytes, Bitstream, bytesToBase64, keyValueIterator, getUint24, last, readExpGolomb, readSignedExpGolomb, textDecoder, textEncoder, toDataView, toUint8Array, getChromiumVersion, isChromium, } from './misc.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[\"IDR\"] = 5] = \"IDR\";\n AvcNalUnitType[AvcNalUnitType[\"SEI\"] = 6] = \"SEI\";\n AvcNalUnitType[AvcNalUnitType[\"SPS\"] = 7] = \"SPS\";\n AvcNalUnitType[AvcNalUnitType[\"PPS\"] = 8] = \"PPS\";\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[\"PREFIX_SEI_NUT\"] = 39] = \"PREFIX_SEI_NUT\";\n HevcNalUnitType[HevcNalUnitType[\"SUFFIX_SEI_NUT\"] = 40] = \"SUFFIX_SEI_NUT\";\n})(HevcNalUnitType || (HevcNalUnitType = {}));\n/** Finds all NAL units in an AVC packet in Annex B format. */\nexport const findNalUnitsInAnnexB = (packetData) => {\n const nalUnits = [];\n let i = 0;\n while (i < packetData.length) {\n let startCodePos = -1;\n let startCodeLength = 0;\n for (let j = i; j < packetData.length - 3; j++) {\n // Check for 3-byte start code (0x000001)\n if (packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 1) {\n startCodePos = j;\n startCodeLength = 3;\n break;\n }\n // Check for 4-byte start code (0x00000001)\n if (j < packetData.length - 4\n && packetData[j] === 0\n && packetData[j + 1] === 0\n && packetData[j + 2] === 0\n && packetData[j + 3] === 1) {\n startCodePos = j;\n startCodeLength = 4;\n break;\n }\n }\n if (startCodePos === -1) {\n break; // No more start codes found\n }\n // If this isn't the first start code, extract the previous NAL unit\n if (i > 0 && startCodePos > i) {\n const nalData = packetData.subarray(i, startCodePos);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n i = startCodePos + startCodeLength;\n }\n // Extract the last NAL unit if there is one\n if (i < packetData.length) {\n const nalData = packetData.subarray(i);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n return nalUnits;\n};\n/** Finds all NAL units in an AVC packet in length-prefixed format. */\nconst findNalUnitsInLengthPrefixed = (packetData, lengthSize) => {\n const nalUnits = [];\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 if (lengthSize === 4) {\n nalUnitLength = dataView.getUint32(offset, false);\n }\n else {\n assertNever(lengthSize);\n assert(false);\n }\n offset += lengthSize;\n const nalUnit = packetData.subarray(offset, offset + nalUnitLength);\n nalUnits.push(nalUnit);\n offset += nalUnitLength;\n }\n return nalUnits;\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};\n/** Converts an AVC packet in Annex B format to length-prefixed format. */\nexport const transformAnnexBToLengthPrefixed = (packetData) => {\n const NAL_UNIT_LENGTH_SIZE = 4;\n const nalUnits = findNalUnitsInAnnexB(packetData);\n if (nalUnits.length === 0) {\n // If no NAL units were found, it's not valid Annex B data\n return null;\n }\n let totalSize = 0;\n for (const nalUnit of nalUnits) {\n totalSize += NAL_UNIT_LENGTH_SIZE + nalUnit.byteLength;\n }\n const avccData = new Uint8Array(totalSize);\n const dataView = new DataView(avccData.buffer);\n let offset = 0;\n // Write each NAL unit with its length prefix\n for (const nalUnit of nalUnits) {\n const length = nalUnit.byteLength;\n dataView.setUint32(offset, length, false);\n offset += 4;\n avccData.set(nalUnit, offset);\n offset += nalUnit.byteLength;\n }\n return avccData;\n};\nexport const extractAvcNalUnits = (packetData, 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 findNalUnitsInLengthPrefixed(packetData, lengthSize);\n }\n else {\n // Stream is in Annex B format\n return findNalUnitsInAnnexB(packetData);\n }\n};\nconst extractNalUnitTypeForAvc = (data) => {\n return data[0] & 0x1F;\n};\n/** Builds an AvcDecoderConfigurationRecord from an AVC packet in Annex B format. */\nexport const extractAvcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.PPS);\n const spsExtUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS_EXT);\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 console.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 console.error('Error deserializing AVC Decoder Configuration Record:', error);\n return null;\n }\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 let chromaFormatIdc = null;\n let bitDepthLumaMinus8 = null;\n let bitDepthChromaMinus8 = null;\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 bitstream.skipBits(1); // separate_colour_plane_flag\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 readExpGolomb(bitstream); // pic_width_in_mbs_minus1\n readExpGolomb(bitstream); // pic_height_in_map_units_minus1\n const frameMbsOnlyFlag = bitstream.readBits(1);\n return {\n profileIdc,\n constraintFlags,\n levelIdc,\n frameMbsOnlyFlag,\n chromaFormatIdc,\n bitDepthLumaMinus8,\n bitDepthChromaMinus8,\n };\n }\n catch (error) {\n console.error('Error parsing AVC SPS:', error);\n return null;\n }\n};\nexport const extractHevcNalUnits = (packetData, 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 findNalUnitsInLengthPrefixed(packetData, lengthSize);\n }\n else {\n // Stream is in Annex B format\n return findNalUnitsInAnnexB(packetData);\n }\n};\nexport const extractNalUnitTypeForHevc = (data) => {\n return (data[0] >> 1) & 0x3F;\n};\n/** Builds a HevcDecoderConfigurationRecord from an HEVC packet in Annex B format. */\nexport const extractHevcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const vpsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.VPS_NUT);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SPS_NUT);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PPS_NUT);\n const seiUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PREFIX_SEI_NUT\n || extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SUFFIX_SEI_NUT);\n if (spsUnits.length === 0 || ppsUnits.length === 0)\n return null;\n const sps = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n bitstream.skipBits(16); // NAL header\n bitstream.readBits(4); // sps_video_parameter_set_id\n const sps_max_sub_layers_minus1 = bitstream.readBits(3);\n const sps_temporal_id_nesting_flag = 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, sps_max_sub_layers_minus1);\n readExpGolomb(bitstream); // sps_seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3)\n bitstream.skipBits(1); // separate_colour_plane_flag\n readExpGolomb(bitstream); // pic_width_in_luma_samples\n readExpGolomb(bitstream); // pic_height_in_luma_samples\n if (bitstream.readBits(1)) { // conformance_window_flag\n readExpGolomb(bitstream); // conf_win_left_offset\n readExpGolomb(bitstream); // conf_win_right_offset\n readExpGolomb(bitstream); // conf_win_top_offset\n readExpGolomb(bitstream); // conf_win_bottom_offset\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n const sps_sub_layer_ordering_info_present_flag = bitstream.readBits(1);\n const maxNum = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;\n for (let i = maxNum; i <= sps_max_sub_layers_minus1; i++) {\n readExpGolomb(bitstream); // sps_max_dec_pic_buffering_minus1[i]\n 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 num_short_term_ref_pic_sets = readExpGolomb(bitstream);\n skipAllStRefPicSets(bitstream, num_short_term_ref_pic_sets);\n if (bitstream.readBits(1)) { // long_term_ref_pics_present_flag\n const num_long_term_ref_pics_sps = readExpGolomb(bitstream);\n for (let i = 0; i < num_long_term_ref_pics_sps; 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 min_spatial_segmentation_idc = 0;\n if (bitstream.readBits(1)) { // vui_parameters_present_flag\n min_spatial_segmentation_idc = parseVuiForMinSpatialSegmentationIdc(bitstream, sps_max_sub_layers_minus1);\n }\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]),\n nalUnits: seiUnits,\n },\n ]\n : []),\n ];\n const record = {\n configurationVersion: 1,\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 minSpatialSegmentationIdc: min_spatial_segmentation_idc,\n parallelismType,\n chromaFormatIdc: chroma_format_idc,\n bitDepthLumaMinus8: bit_depth_luma_minus8,\n bitDepthChromaMinus8: bit_depth_chroma_minus8,\n avgFrameRate: 0,\n constantFrameRate: 0,\n numTemporalLayers: sps_max_sub_layers_minus1 + 1,\n temporalIdNested: sps_temporal_id_nesting_flag,\n lengthSizeMinusOne: 3,\n arrays,\n };\n return record;\n }\n catch (error) {\n console.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 parseVuiForMinSpatialSegmentationIdc = (bitstream, sps_max_sub_layers_minus1) => {\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 bitstream.readBits(16); // sar_width\n bitstream.readBits(16); // sar_height\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 bitstream.readBits(1); // video_full_range_flag\n if (bitstream.readBits(1)) {\n bitstream.readBits(8); // colour_primaries\n bitstream.readBits(8); // transfer_characteristics\n bitstream.readBits(8); // matrix_coeffs\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 skipHrdParameters(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 const min_spatial_segmentation_idc = readExpGolomb(bitstream);\n // skip the rest\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 return min_spatial_segmentation_idc;\n }\n return 0;\n};\nconst skipHrdParameters = (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};\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 const nalUnits = extractAvcNalUnits(packetData, decoderConfig);\n let isKeyframe = nalUnits.some(x => extractNalUnitTypeForAvc(x) === AvcNalUnitType.IDR);\n if (!isKeyframe && (!isChromium() || getChromiumVersion() >= 144)) {\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 for (const nalUnit of nalUnits) {\n const type = extractNalUnitTypeForAvc(nalUnit);\n if (type !== AvcNalUnitType.SEI) {\n continue;\n }\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 isKeyframe = true;\n break;\n }\n }\n pos += payloadSize;\n } while (pos < bytes.length - 1);\n }\n }\n return isKeyframe ? 'key' : 'delta';\n }\n ;\n case 'hevc':\n {\n const nalUnits = extractHevcNalUnits(packetData, decoderConfig);\n const isKeyframe = nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return HevcNalUnitType.BLA_W_LP <= type && type <= HevcNalUnitType.RSV_IRAP_VCL23;\n });\n return isKeyframe ? 'key' : '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 * Copyright (c) 2025-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 Demuxer {\n constructor(input) {\n this.input = input;\n }\n}\n","/*!\n * Copyright (c) 2025-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 { determineVideoPacketType } from './codec-data.js';\nimport { customAudioDecoders, customVideoDecoders } from './custom-coder.js';\nimport { EncodedPacketSink } from './media-sink.js';\nimport { assert } from './misc.js';\nimport { EncodedPacket } from './packet.js';\n/**\n * Represents a media track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputTrack {\n /** @internal */\n constructor(input, backing) {\n this.input = input;\n this._backing = backing;\n }\n /** Returns true if and only if this track is a video track. */\n isVideoTrack() {\n return this instanceof InputVideoTrack;\n }\n /** Returns true if and only if this track is an audio track. */\n isAudioTrack() {\n return this instanceof InputAudioTrack;\n }\n /** The unique ID of this track in the input file. */\n get id() {\n return this._backing.getId();\n }\n /**\n * The identifier of the codec used internally by the container. It is not homogenized by Mediabunny\n * and depends entirely on the container format.\n *\n * This field can be used to determine the codec of a track in case Mediabunny doesn't know that codec.\n *\n * - For ISOBMFF files, this field returns the name of the Sample Description Box (e.g. `'avc1'`).\n * - For Matroska files, this field returns the value of the `CodecID` element.\n * - For WAVE files, this field returns the value of the format tag in the `'fmt '` chunk.\n * - For ADTS files, this field contains the `MPEG-4 Audio Object Type`.\n * - In all other cases, this field is `null`.\n */\n get internalCodecId() {\n return this._backing.getInternalCodecId();\n }\n /**\n * The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined).\n */\n get languageCode() {\n return this._backing.getLanguageCode();\n }\n /** A user-defined name for this track. */\n get name() {\n return this._backing.getName();\n }\n /**\n * A positive number x such that all timestamps and durations of all packets of this track are\n * integer multiples of 1/x.\n */\n get timeResolution() {\n return this._backing.getTimeResolution();\n }\n /** The track's disposition, i.e. information about its intended usage. */\n get disposition() {\n return this._backing.getDisposition();\n }\n /**\n * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value\n * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples\n * with a negative timestamp should not be presented.\n */\n getFirstTimestamp() {\n return this._backing.getFirstTimestamp();\n }\n /** Returns the end timestamp of the last packet of this track, in seconds. */\n computeDuration() {\n return this._backing.computeDuration();\n }\n /**\n * Computes aggregate packet statistics for this track, such as average packet rate or bitrate.\n *\n * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have\n * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all\n * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the\n * entire file.\n */\n async computePacketStats(targetPacketCount = Infinity) {\n const sink = new EncodedPacketSink(this);\n let startTimestamp = Infinity;\n let endTimestamp = -Infinity;\n let packetCount = 0;\n let totalPacketBytes = 0;\n for await (const packet of sink.packets(undefined, undefined, { metadataOnly: true })) {\n if (packetCount >= targetPacketCount\n // This additional condition is needed to produce correct results with out-of-presentation-order packets\n && packet.timestamp >= endTimestamp) {\n break;\n }\n startTimestamp = Math.min(startTimestamp, packet.timestamp);\n endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration);\n packetCount++;\n totalPacketBytes += packet.byteLength;\n }\n return {\n packetCount,\n averagePacketRate: packetCount\n ? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n averageBitrate: packetCount\n ? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n };\n }\n}\n/**\n * Represents a video track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputVideoTrack extends InputTrack {\n /** @internal */\n constructor(input, backing) {\n super(input, backing);\n this._backing = backing;\n }\n get type() {\n return 'video';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The width in pixels of the track's coded samples, before any transformations or rotations. */\n get codedWidth() {\n return this._backing.getCodedWidth();\n }\n /** The height in pixels of the track's coded samples, before any transformations or rotations. */\n get codedHeight() {\n return this._backing.getCodedHeight();\n }\n /** The angle in degrees by which the track's frames should be rotated (clockwise). */\n get rotation() {\n return this._backing.getRotation();\n }\n /** The width in pixels of the track's frames after rotation. */\n get displayWidth() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedWidth() : this._backing.getCodedHeight();\n }\n /** The height in pixels of the track's frames after rotation. */\n get displayHeight() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedHeight() : this._backing.getCodedWidth();\n }\n /** Returns the color space of the track's samples. */\n getColorSpace() {\n return this._backing.getColorSpace();\n }\n /** If this method returns true, the track's samples use a high dynamic range (HDR). */\n async hasHighDynamicRange() {\n const colorSpace = await this._backing.getColorSpace();\n return colorSpace.primaries === 'bt2020' || colorSpace.primaries === 'smpte432'\n || colorSpace.transfer === 'pg' || colorSpace.transfer === 'hlg'\n || colorSpace.matrix === 'bt2020-ncl';\n }\n /** Checks if this track may contain transparent samples with alpha data. */\n canBeTransparent() {\n return this._backing.canBeTransparent();\n }\n /**\n * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the\n * track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns\n * null if the track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customVideoDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (typeof VideoDecoder === 'undefined') {\n return false;\n }\n const support = await VideoDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (packet.isMetadataOnly) {\n throw new TypeError('packet must not be metadata-only to determine its type.');\n }\n if (this.codec === null) {\n return null;\n }\n const decoderConfig = await this.getDecoderConfig();\n assert(decoderConfig);\n return determineVideoPacketType(this.codec, decoderConfig, packet.data);\n }\n}\n/**\n * Represents an audio track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputAudioTrack extends InputTrack {\n /** @internal */\n constructor(input, backing) {\n super(input, backing);\n this._backing = backing;\n }\n get type() {\n return 'audio';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The number of audio channels in the track. */\n get numberOfChannels() {\n return this._backing.getNumberOfChannels();\n }\n /** The track's audio sample rate in hertz. */\n get sampleRate() {\n return this._backing.getSampleRate();\n }\n /**\n * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the\n * track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns\n * null if the track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customAudioDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (decoderConfig.codec.startsWith('pcm-')) {\n return true; // Since we decode it ourselves\n }\n else {\n if (typeof AudioDecoder === 'undefined') {\n return false;\n }\n const support = await AudioDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (this.codec === null) {\n return null;\n }\n return 'key'; // No audio codec with delta packets\n }\n}\n","/*!\n * Copyright (c) 2025-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/**\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 console.warn('Video decoder already registered.');\n return;\n }\n customVideoDecoders.push(casted);\n }\n else if (decoder.prototype instanceof CustomAudioDecoder) {\n const casted = decoder;\n if (customAudioDecoders.includes(casted)) {\n console.warn('Audio decoder already registered.');\n return;\n }\n customAudioDecoders.push(casted);\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 console.warn('Video encoder already registered.');\n return;\n }\n customVideoEncoders.push(casted);\n }\n else if (encoder.prototype instanceof CustomAudioEncoder) {\n const casted = encoder;\n if (customAudioEncoders.includes(casted)) {\n console.warn('Audio encoder already registered.');\n return;\n }\n customAudioEncoders.push(casted);\n }\n else {\n throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.');\n }\n};\n","/*!\n * Copyright (c) 2025-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 { parsePcmCodec, PCM_AUDIO_CODECS } from './codec.js';\nimport { deserializeAvcDecoderConfigurationRecord, determineVideoPacketType, extractHevcNalUnits, extractNalUnitTypeForHevc, HevcNalUnitType, parseAvcSps, } from './codec-data.js';\nimport { customVideoDecoders, customAudioDecoders } from './custom-coder.js';\nimport { InputDisposedError } from './input.js';\nimport { InputAudioTrack, InputTrack, InputVideoTrack } from './input-track.js';\nimport { assert, assertNever, CallSerializer, getInt24, getUint24, insertSorted, isChromium, isFirefox, isNumber, isWebKit, last, mapAsyncGenerator, promiseWithResolvers, toAsyncIterator, toDataView, toUint8Array, validateAnyIterable, } from './misc.js';\nimport { EncodedPacket } from './packet.js';\nimport { fromAlaw, fromUlaw } from './pcm.js';\nimport { AudioSample, clampCropRectangle, validateCropRectangle, VideoSample } from './sample.js';\nconst validatePacketRetrievalOptions = (options) => {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.metadataOnly !== undefined && typeof options.metadataOnly !== 'boolean') {\n throw new TypeError('options.metadataOnly, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets !== undefined && typeof options.verifyKeyPackets !== 'boolean') {\n throw new TypeError('options.verifyKeyPackets, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets && options.metadataOnly) {\n throw new TypeError('options.verifyKeyPackets and options.metadataOnly cannot be enabled together.');\n }\n};\nconst validateTimestamp = (timestamp) => {\n if (!isNumber(timestamp)) {\n throw new TypeError('timestamp must be a number.'); // It can be non-finite, that's fine\n }\n};\nconst maybeFixPacketType = (track, promise, options) => {\n if (options.verifyKeyPackets) {\n return promise.then(async (packet) => {\n if (!packet || packet.type === 'delta') {\n return packet;\n }\n const determinedType = await track.determinePacketType(packet);\n if (determinedType) {\n // @ts-expect-error Technically readonly\n packet.type = determinedType;\n }\n return packet;\n });\n }\n else {\n return promise;\n }\n};\n/**\n * Sink for retrieving encoded packets from an input track.\n * @group Media sinks\n * @public\n */\nexport class EncodedPacketSink {\n /** Creates a new {@link EncodedPacketSink} for the given {@link InputTrack}. */\n constructor(track) {\n if (!(track instanceof InputTrack)) {\n throw new TypeError('track must be an InputTrack.');\n }\n this._track = track;\n }\n /**\n * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very\n * likely to be a key packet.\n */\n getFirstPacket(options = {}) {\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getFirstPacket(options), options);\n }\n /**\n * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet\n * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be\n * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp\n * is before the first packet in the track.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n getPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getPacket(timestamp, options), options);\n }\n /**\n * Retrieves the packet following the given packet (in decode order), or null if the given packet is the\n * last packet.\n */\n getNextPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getNextPacket(packet, options), options);\n }\n /**\n * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last\n * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet\n * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's\n * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first\n * key packet in the track.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getKeyPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n if (!options.verifyKeyPackets) {\n return this._track._backing.getKeyPacket(timestamp, options);\n }\n const packet = await this._track._backing.getKeyPacket(timestamp, options);\n if (!packet) {\n return packet;\n }\n assert(packet.type === 'key');\n const determinedType = await this._track.determinePacketType(packet);\n if (determinedType === 'delta') {\n // Try returning the previous key packet (in hopes that it's actually a key packet)\n return this.getKeyPacket(packet.timestamp - 1 / this._track.timeResolution, options);\n }\n return packet;\n }\n /**\n * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last\n * key packet.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n */\n async getNextKeyPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n if (!options.verifyKeyPackets) {\n return this._track._backing.getNextKeyPacket(packet, options);\n }\n const nextPacket = await this._track._backing.getNextKeyPacket(packet, options);\n if (!nextPacket) {\n return nextPacket;\n }\n assert(nextPacket.type === 'key');\n const determinedType = await this._track.determinePacketType(nextPacket);\n if (determinedType === 'delta') {\n // Try returning the next key packet (in hopes that it's actually a key packet)\n return this.getNextKeyPacket(nextPacket, options);\n }\n return nextPacket;\n }\n /**\n * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this\n * method will intelligently preload packets based on the speed of the consumer.\n *\n * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded.\n * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded.\n */\n packets(startPacket, endPacket, options = {}) {\n if (startPacket !== undefined && !(startPacket instanceof EncodedPacket)) {\n throw new TypeError('startPacket must be an EncodedPacket.');\n }\n if (startPacket !== undefined && startPacket.isMetadataOnly && !options?.metadataOnly) {\n throw new TypeError('startPacket can only be metadata-only if options.metadataOnly is enabled.');\n }\n if (endPacket !== undefined && !(endPacket instanceof EncodedPacket)) {\n throw new TypeError('endPacket must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n const packetQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const timestamps = [];\n // The queue should always be big enough to hold 1 second worth of packets\n const maxQueueSize = () => Math.max(2, timestamps.length);\n // The following is the \"pump\" process that keeps pumping packets into the queue\n (async () => {\n let packet = startPacket ?? await this.getFirstPacket(options);\n while (packet && !terminated && !this._track.input._disposed) {\n if (endPacket && packet.sequenceNumber >= endPacket?.sequenceNumber) {\n break;\n }\n if (packetQueue.length > maxQueueSize()) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n packetQueue.push(packet);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n packet = await this.getNextPacket(packet, options);\n }\n ended = true;\n onQueueNotEmpty();\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (packetQueue.length > 0) {\n const value = packetQueue.shift();\n const now = performance.now();\n timestamps.push(now);\n while (timestamps.length > 0 && now - timestamps[0] >= 1000) {\n timestamps.shift();\n }\n onQueueDequeue();\n return { value, done: false };\n }\n else if (ended) {\n return { value: undefined, done: true };\n }\n else {\n await queueNotEmpty;\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nclass DecoderWrapper {\n constructor(onSample, onError) {\n this.onSample = onSample;\n this.onError = onError;\n }\n}\n/**\n * Base class for decoded media sample sinks.\n * @group Media sinks\n * @public\n */\nexport class BaseMediaSampleSink {\n /** @internal */\n mediaSamplesInRange(startTimestamp = 0, endTimestamp = Infinity) {\n validateTimestamp(startTimestamp);\n validateTimestamp(endTimestamp);\n const sampleQueue = [];\n let firstSampleQueued = false;\n let lastSample = null;\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (sample.timestamp >= endTimestamp) {\n ended = true;\n }\n if (ended) {\n sample.close();\n return;\n }\n if (lastSample) {\n if (sample.timestamp > startTimestamp) {\n // We don't know ahead of time what the first first is. This is because the first first is the\n // last first whose timestamp is less than or equal to the start timestamp. Therefore we need to\n // wait for the first first after the start timestamp, and then we'll know that the previous\n // first was the first first.\n sampleQueue.push(lastSample);\n firstSampleQueued = true;\n }\n else {\n lastSample.close();\n }\n }\n if (sample.timestamp >= startTimestamp) {\n sampleQueue.push(sample);\n firstSampleQueued = true;\n }\n lastSample = firstSampleQueued ? null : sample;\n if (sampleQueue.length > 0) {\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n const keyPacket = await packetSink.getKeyPacket(startTimestamp, { verifyKeyPackets: true })\n ?? await packetSink.getFirstPacket();\n let currentPacket = keyPacket;\n let endPacket = undefined;\n if (endTimestamp < Infinity) {\n // When an end timestamp is set, we cannot simply use that for the packet iterator due to out-of-order\n // frames (B-frames). Instead, we'll need to keep decoding packets until we get a frame that exceeds\n // this end time. However, we can still put a bound on it: Since key frames are by definition never\n // out of order, we can stop at the first key frame after the end timestamp.\n const packet = await packetSink.getPacket(endTimestamp);\n const keyPacket = !packet\n ? null\n : packet.type === 'key' && packet.timestamp === endTimestamp\n ? packet\n : await packetSink.getNextKeyPacket(packet, { verifyKeyPackets: true });\n if (keyPacket) {\n endPacket = keyPacket;\n }\n }\n const packets = packetSink.packets(keyPacket ?? undefined, endPacket);\n await packets.next(); // Skip the start packet as we already have it\n while (currentPacket && !ended && !this._track.input._disposed) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n if (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n decoder.decode(currentPacket);\n const packetResult = await packets.next();\n if (packetResult.done) {\n break;\n }\n currentPacket = packetResult.value;\n }\n await packets.return();\n if (!terminated && !this._track.input._disposed) {\n await decoder.flush();\n }\n decoder.close();\n if (!firstSampleQueued && lastSample) {\n sampleQueue.push(lastSample);\n }\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n const closeSamples = () => {\n lastSample?.close();\n for (const sample of sampleQueue) {\n sample.close();\n }\n };\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n closeSamples();\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n closeSamples();\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n ended = true;\n onQueueDequeue();\n onQueueNotEmpty();\n closeSamples();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n /** @internal */\n mediaSamplesAtTimestamps(timestamps) {\n validateAnyIterable(timestamps);\n const timestampIterator = toAsyncIterator(timestamps);\n const timestampsOfInterest = [];\n const sampleQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const pushToQueue = (sample) => {\n sampleQueue.push(sample);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n };\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (terminated) {\n sample.close();\n return;\n }\n let sampleUses = 0;\n while (timestampsOfInterest.length > 0\n && sample.timestamp - timestampsOfInterest[0] > -1e-10 // Give it a little epsilon\n ) {\n sampleUses++;\n timestampsOfInterest.shift();\n }\n if (sampleUses > 0) {\n for (let i = 0; i < sampleUses; i++) {\n // Clone the sample if we need to emit it multiple times\n pushToQueue((i < sampleUses - 1 ? sample.clone() : sample));\n }\n }\n else {\n sample.close();\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n let lastPacket = null;\n let lastKeyPacket = null;\n // The end sequence number (inclusive) in the next batch of packets that will be decoded. The batch starts\n // at the last key frame and goes until this sequence number.\n let maxSequenceNumber = -1;\n const decodePackets = async () => {\n assert(lastKeyPacket);\n // Start at the current key packet\n let currentPacket = lastKeyPacket;\n decoder.decode(currentPacket);\n while (currentPacket.sequenceNumber < maxSequenceNumber) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n while (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize && !terminated) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n }\n if (terminated) {\n break;\n }\n const nextPacket = await packetSink.getNextPacket(currentPacket);\n assert(nextPacket);\n decoder.decode(nextPacket);\n currentPacket = nextPacket;\n }\n maxSequenceNumber = -1;\n };\n const flushDecoder = async () => {\n await decoder.flush();\n // We don't expect this list to have any elements in it anymore, but in case it does, let's emit\n // nulls for every remaining element, then clear it.\n for (let i = 0; i < timestampsOfInterest.length; i++) {\n pushToQueue(null);\n }\n timestampsOfInterest.length = 0;\n };\n for await (const timestamp of timestampIterator) {\n validateTimestamp(timestamp);\n if (terminated || this._track.input._disposed) {\n break;\n }\n const targetPacket = await packetSink.getPacket(timestamp);\n const keyPacket = targetPacket && await packetSink.getKeyPacket(timestamp, { verifyKeyPackets: true });\n if (!keyPacket) {\n if (maxSequenceNumber !== -1) {\n await decodePackets();\n await flushDecoder();\n }\n pushToQueue(null);\n lastPacket = null;\n continue;\n }\n // Check if the key packet has changed or if we're going back in time\n if (lastPacket\n && (keyPacket.sequenceNumber !== lastKeyPacket.sequenceNumber\n || targetPacket.timestamp < lastPacket.timestamp)) {\n await decodePackets();\n await flushDecoder(); // Always flush here, improves decoder compatibility\n }\n timestampsOfInterest.push(targetPacket.timestamp);\n maxSequenceNumber = Math.max(targetPacket.sequenceNumber, maxSequenceNumber);\n lastPacket = targetPacket;\n lastKeyPacket = keyPacket;\n }\n if (!terminated && !this._track.input._disposed) {\n if (maxSequenceNumber !== -1) {\n // We still need to decode packets\n await decodePackets();\n }\n await flushDecoder();\n }\n decoder.close();\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n const closeSamples = () => {\n for (const sample of sampleQueue) {\n sample?.close();\n }\n };\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n closeSamples();\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n closeSamples();\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n assert(value !== undefined);\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n closeSamples();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nconst computeMaxQueueSize = (decodedSampleQueueSize) => {\n // If we have decoded samples lying around, limit the total queue size to a small value (decoded samples can use up\n // a lot of memory). If not, we're fine with a much bigger queue of encoded packets waiting to be decoded. In fact,\n // some decoders only start flushing out decoded chunks when the packet queue is large enough.\n return decodedSampleQueueSize === 0 ? 40 : 8;\n};\nclass VideoDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig, rotation, timeResolution) {\n super(onSample, onError);\n this.codec = codec;\n this.decoderConfig = decoderConfig;\n this.rotation = rotation;\n this.timeResolution = timeResolution;\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n this.inputTimestamps = []; // Timestamps input into the decoder, sorted.\n this.sampleQueue = []; // Safari-specific thing, check usage.\n this.currentPacketIndex = 0;\n this.raslSkipped = false; // For HEVC stuff\n // Alpha stuff\n this.alphaDecoder = null;\n this.alphaHadKeyframe = false;\n this.colorQueue = [];\n this.alphaQueue = [];\n this.merger = null;\n this.mergerCreationFailed = false;\n this.decodedAlphaChunkCount = 0;\n this.alphaDecoderQueueSize = 0;\n /** Each value is the number of decoded alpha chunks at which a null alpha frame should be added. */\n this.nullAlphaFrameQueue = [];\n this.currentAlphaPacketIndex = 0;\n this.alphaRaslSkipped = false; // For HEVC stuff\n const MatchingCustomDecoder = customVideoDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof VideoSample)) {\n throw new TypeError('The argument passed to onSample must be a VideoSample.');\n }\n this.finalizeAndEmitSample(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n const colorHandler = (frame) => {\n if (this.alphaQueue.length > 0) {\n // Even when no alpha data is present (most of the time), there will be nulls in this queue\n const alphaFrame = this.alphaQueue.shift();\n assert(alphaFrame !== undefined);\n this.mergeAlpha(frame, alphaFrame);\n }\n else {\n this.colorQueue.push(frame);\n }\n };\n if (codec === 'avc' && this.decoderConfig.description && isChromium()) {\n // Chromium has/had a bug with playing interlaced AVC (https://issues.chromium.org/issues/456919096)\n // which can be worked around by requesting that software decoding be used. So, here we peek into the\n // AVC description, if present, and switch to software decoding if we find interlaced content.\n const record = deserializeAvcDecoderConfigurationRecord(toUint8Array(this.decoderConfig.description));\n if (record && record.sequenceParameterSets.length > 0) {\n const sps = parseAvcSps(record.sequenceParameterSets[0]);\n if (sps && sps.frameMbsOnlyFlag === 0) {\n this.decoderConfig = {\n ...this.decoderConfig,\n hardwareAcceleration: 'prefer-software',\n };\n }\n }\n }\n this.decoder = new VideoDecoder({\n output: (frame) => {\n try {\n colorHandler(frame);\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: onError,\n });\n this.decoder.configure(this.decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return Math.max(this.decoder.decodeQueueSize, this.alphaDecoder?.decodeQueueSize ?? 0);\n }\n }\n decode(packet) {\n if (this.codec === 'hevc' && this.currentPacketIndex > 0 && !this.raslSkipped) {\n if (this.hasHevcRaslPicture(packet.data)) {\n return; // Drop\n }\n this.raslSkipped = true;\n }\n this.currentPacketIndex++;\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n if (!isWebKit()) {\n insertSorted(this.inputTimestamps, packet.timestamp, x => x);\n }\n this.decoder.decode(packet.toEncodedVideoChunk());\n this.decodeAlphaData(packet);\n }\n }\n decodeAlphaData(packet) {\n if (!packet.sideData.alpha || this.mergerCreationFailed) {\n // No alpha side data in the packet, most common case\n this.pushNullAlphaFrame();\n return;\n }\n if (!this.merger) {\n try {\n this.merger = new ColorAlphaMerger();\n }\n catch (error) {\n console.error('Due to an error, only color data will be decoded.', error);\n this.mergerCreationFailed = true;\n this.decodeAlphaData(packet); // Go again\n return;\n }\n }\n // Check if we need to set up the alpha decoder\n if (!this.alphaDecoder) {\n const alphaHandler = (frame) => {\n this.alphaDecoderQueueSize--;\n if (this.colorQueue.length > 0) {\n const colorFrame = this.colorQueue.shift();\n assert(colorFrame !== undefined);\n this.mergeAlpha(colorFrame, frame);\n }\n else {\n this.alphaQueue.push(frame);\n }\n // Check if any null frames have been queued for this point\n this.decodedAlphaChunkCount++;\n while (this.nullAlphaFrameQueue.length > 0\n && this.nullAlphaFrameQueue[0] === this.decodedAlphaChunkCount) {\n this.nullAlphaFrameQueue.shift();\n if (this.colorQueue.length > 0) {\n const colorFrame = this.colorQueue.shift();\n assert(colorFrame !== undefined);\n this.mergeAlpha(colorFrame, null);\n }\n else {\n this.alphaQueue.push(null);\n }\n }\n };\n this.alphaDecoder = new VideoDecoder({\n output: (frame) => {\n try {\n alphaHandler(frame);\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: this.onError,\n });\n this.alphaDecoder.configure(this.decoderConfig);\n }\n const type = determineVideoPacketType(this.codec, this.decoderConfig, packet.sideData.alpha);\n // Alpha packets might follow a different key frame rhythm than the main packets. Therefore, before we start\n // decoding, we must first find a packet that's actually a key frame. Until then, we treat the image as opaque.\n if (!this.alphaHadKeyframe) {\n this.alphaHadKeyframe = type === 'key';\n }\n if (this.alphaHadKeyframe) {\n // Same RASL skipping logic as for color, unlikely to be hit (since who uses HEVC with separate alpha??) but\n // here for symmetry.\n if (this.codec === 'hevc' && this.currentAlphaPacketIndex > 0 && !this.alphaRaslSkipped) {\n if (this.hasHevcRaslPicture(packet.sideData.alpha)) {\n this.pushNullAlphaFrame();\n return;\n }\n this.alphaRaslSkipped = true;\n }\n this.currentAlphaPacketIndex++;\n this.alphaDecoder.decode(packet.alphaToEncodedVideoChunk(type ?? packet.type));\n this.alphaDecoderQueueSize++;\n }\n else {\n this.pushNullAlphaFrame();\n }\n }\n pushNullAlphaFrame() {\n if (this.alphaDecoderQueueSize === 0) {\n // Easy\n this.alphaQueue.push(null);\n }\n else {\n // There are still alpha chunks being decoded, so pushing `null` immediately would result in out-of-order\n // data and be incorrect. Instead, we need to enqueue a \"null frame\" for when the current decoder workload\n // has finished.\n this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount + this.alphaDecoderQueueSize);\n }\n }\n /**\n * If we're using HEVC, we need to make sure to skip any RASL slices that follow a non-IDR key frame such as\n * CRA_NUT. This is because RASL slices cannot be decoded without data before the CRA_NUT. Browsers behave\n * differently here: Chromium drops the packets, Safari throws a decoder error. Either way, it's not good\n * and causes bugs upstream. So, let's take the dropping into our own hands.\n */\n hasHevcRaslPicture(packetData) {\n const nalUnits = extractHevcNalUnits(packetData, this.decoderConfig);\n return nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return type === HevcNalUnitType.RASL_N || type === HevcNalUnitType.RASL_R;\n });\n }\n /** Handler for the WebCodecs VideoDecoder for ironing out browser differences. */\n sampleHandler(sample) {\n if (isWebKit()) {\n // For correct B-frame handling, we don't just hand over the frames directly but instead add them to\n // a queue, because we want to ensure frames are emitted in presentation order. We flush the queue\n // each time we receive a frame with a timestamp larger than the highest we've seen so far, as we\n // can sure that is not a B-frame. Typically, WebCodecs automatically guarantees that frames are\n // emitted in presentation order, but Safari doesn't always follow this rule.\n if (this.sampleQueue.length > 0 && (sample.timestamp >= last(this.sampleQueue).timestamp)) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n insertSorted(this.sampleQueue, sample, x => x.timestamp);\n }\n else {\n // Assign it the next earliest timestamp from the input. We do this because browsers, by spec, are\n // required to emit decoded frames in presentation order *while* retaining the timestamp of their\n // originating EncodedVideoChunk. For files with B-frames but no out-of-order timestamps (like a\n // missing ctts box, for example), this causes a mismatch. We therefore fix the timestamps and\n // ensure they are sorted by doing this.\n const timestamp = this.inputTimestamps.shift();\n // There's no way we'd have more decoded frames than encoded packets we passed in. Actually, the\n // correspondence should be 1:1.\n assert(timestamp !== undefined);\n sample.setTimestamp(timestamp);\n this.finalizeAndEmitSample(sample);\n }\n }\n finalizeAndEmitSample(sample) {\n // Round the timestamps to the time resolution\n sample.setTimestamp(Math.round(sample.timestamp * this.timeResolution) / this.timeResolution);\n sample.setDuration(Math.round(sample.duration * this.timeResolution) / this.timeResolution);\n sample.setRotation(this.rotation);\n this.onSample(sample);\n }\n mergeAlpha(color, alpha) {\n if (!alpha) {\n // Nothing needs to be merged\n const finalSample = new VideoSample(color);\n this.sampleHandler(finalSample);\n return;\n }\n assert(this.merger);\n this.merger.update(color, alpha);\n color.close();\n alpha.close();\n const finalFrame = new VideoFrame(this.merger.canvas, {\n timestamp: color.timestamp,\n duration: color.duration ?? undefined,\n });\n const finalSample = new VideoSample(finalFrame);\n this.sampleHandler(finalSample);\n }\n async flush() {\n if (this.customDecoder) {\n await this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n await Promise.all([\n this.decoder.flush(),\n this.alphaDecoder?.flush(),\n ]);\n this.colorQueue.forEach(x => x.close());\n this.colorQueue.length = 0;\n this.alphaQueue.forEach(x => x?.close());\n this.alphaQueue.length = 0;\n this.alphaHadKeyframe = false;\n this.decodedAlphaChunkCount = 0;\n this.alphaDecoderQueueSize = 0;\n this.nullAlphaFrameQueue.length = 0;\n this.currentAlphaPacketIndex = 0;\n this.alphaRaslSkipped = false;\n }\n if (isWebKit()) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n this.currentPacketIndex = 0;\n this.raslSkipped = false;\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n this.alphaDecoder?.close();\n this.colorQueue.forEach(x => x.close());\n this.colorQueue.length = 0;\n this.alphaQueue.forEach(x => x?.close());\n this.alphaQueue.length = 0;\n this.merger?.close();\n }\n for (const sample of this.sampleQueue) {\n sample.close();\n }\n this.sampleQueue.length = 0;\n }\n}\n/** Utility class that merges together color and alpha information using simple WebGL 2 shaders. */\nclass ColorAlphaMerger {\n constructor() {\n // Canvas will be resized later\n if (typeof OffscreenCanvas !== 'undefined') {\n // Prefer OffscreenCanvas for Worker environments\n this.canvas = new OffscreenCanvas(300, 150);\n }\n else {\n this.canvas = document.createElement('canvas');\n }\n const gl = this.canvas.getContext('webgl2', {\n premultipliedAlpha: false,\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.program = this.createProgram();\n this.vao = this.createVAO();\n this.colorTexture = this.createTexture();\n this.alphaTexture = this.createTexture();\n this.gl.useProgram(this.program);\n this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_colorTexture'), 0);\n this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_alphaTexture'), 1);\n }\n createProgram() {\n const vertexShader = 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 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_colorTexture;\n\t\t\tuniform sampler2D u_alphaTexture;\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\tvec3 color = texture(u_colorTexture, v_texCoord).rgb;\n\t\t\t\tfloat alpha = texture(u_alphaTexture, v_texCoord).r;\n\t\t\t\tfragColor = vec4(color, alpha);\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 const shader = this.gl.createShader(type);\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n return shader;\n }\n createVAO() {\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.program, 'a_position');\n const texCoordLocation = this.gl.getAttribLocation(this.program, '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 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 update(color, alpha) {\n if (color.displayWidth !== this.canvas.width || color.displayHeight !== this.canvas.height) {\n this.canvas.width = color.displayWidth;\n this.canvas.height = color.displayHeight;\n }\n this.gl.activeTexture(this.gl.TEXTURE0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.colorTexture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, color);\n this.gl.activeTexture(this.gl.TEXTURE1);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.alphaTexture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, alpha);\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 }\n close() {\n this.gl.getExtension('WEBGL_lose_context')?.loseContext();\n this.gl = null;\n }\n}\n/**\n * A sink that retrieves decoded video samples (video frames) from a video track.\n * @group Media sinks\n * @public\n */\nexport class VideoSampleSink extends BaseMediaSampleSink {\n /** Creates a new {@link VideoSampleSink} for the given {@link InputVideoTrack}. */\n constructor(videoTrack) {\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n super();\n this._track = videoTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._track.canDecode())) {\n throw new Error('This video track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._track.codec;\n const rotation = this._track.rotation;\n const decoderConfig = await this._track.getDecoderConfig();\n const timeResolution = this._track.timeResolution;\n assert(codec && decoderConfig);\n return new VideoDecoderWrapper(onSample, onError, codec, decoderConfig, rotation, timeResolution);\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._track);\n }\n /**\n * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns\n * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method\n * will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than\n * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation\n * metadata.\n *\n * This sink will yield `HTMLCanvasElement`s when in a DOM context, and `OffscreenCanvas`es otherwise.\n *\n * @group Media sinks\n * @public\n */\nexport class CanvasSink {\n /** Creates a new {@link CanvasSink} for the given {@link InputVideoTrack}. */\n constructor(videoTrack, options = {}) {\n /** @internal */\n this._nextCanvasIndex = 0;\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n if (options && typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.alpha !== undefined && typeof options.alpha !== 'boolean') {\n throw new TypeError('options.alpha, when provided, must be a boolean.');\n }\n if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) {\n throw new TypeError('options.width, when defined, 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 defined, 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.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 if (options.poolSize !== undefined\n && (typeof options.poolSize !== 'number' || !Number.isInteger(options.poolSize) || options.poolSize < 0)) {\n throw new TypeError('poolSize must be a non-negative integer.');\n }\n const rotation = options.rotation ?? videoTrack.rotation;\n const [rotatedWidth, rotatedHeight] = rotation % 180 === 0\n ? [videoTrack.codedWidth, videoTrack.codedHeight]\n : [videoTrack.codedHeight, videoTrack.codedWidth];\n const crop = options.crop;\n if (crop) {\n clampCropRectangle(crop, rotatedWidth, rotatedHeight);\n }\n let [width, height] = crop\n ? [crop.width, crop.height]\n : [rotatedWidth, rotatedHeight];\n const originalAspectRatio = width / height;\n // If width and height aren't defined together, deduce the missing value using the aspect ratio\n if (options.width !== undefined && options.height === undefined) {\n width = options.width;\n height = Math.round(width / originalAspectRatio);\n }\n else if (options.width === undefined && options.height !== undefined) {\n height = options.height;\n width = Math.round(height * originalAspectRatio);\n }\n else if (options.width !== undefined && options.height !== undefined) {\n width = options.width;\n height = options.height;\n }\n this._videoTrack = videoTrack;\n this._alpha = options.alpha ?? false;\n this._width = width;\n this._height = height;\n this._rotation = rotation;\n this._crop = crop;\n this._fit = options.fit ?? 'fill';\n this._videoSampleSink = new VideoSampleSink(videoTrack);\n this._canvasPool = Array.from({ length: options.poolSize ?? 0 }, () => null);\n }\n /** @internal */\n _videoSampleToWrappedCanvas(sample) {\n let canvas = this._canvasPool[this._nextCanvasIndex];\n let canvasIsNew = false;\n if (!canvas) {\n if (typeof document !== 'undefined') {\n // Prefer an HTMLCanvasElement\n canvas = document.createElement('canvas');\n canvas.width = this._width;\n canvas.height = this._height;\n }\n else {\n canvas = new OffscreenCanvas(this._width, this._height);\n }\n if (this._canvasPool.length > 0) {\n this._canvasPool[this._nextCanvasIndex] = canvas;\n }\n canvasIsNew = true;\n }\n if (this._canvasPool.length > 0) {\n this._nextCanvasIndex = (this._nextCanvasIndex + 1) % this._canvasPool.length;\n }\n const context = canvas.getContext('2d', {\n alpha: this._alpha || isFirefox(), // Firefox has VideoFrame glitches with opaque canvases\n });\n assert(context);\n context.resetTransform();\n if (!canvasIsNew) {\n if (!this._alpha && isFirefox()) {\n context.fillStyle = 'black';\n context.fillRect(0, 0, this._width, this._height);\n }\n else {\n context.clearRect(0, 0, this._width, this._height);\n }\n }\n sample.drawWithFit(context, {\n fit: this._fit,\n rotation: this._rotation,\n crop: this._crop,\n });\n const result = {\n canvas,\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically,\n * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given\n * timestamp. Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getCanvas(timestamp) {\n validateTimestamp(timestamp);\n const sample = await this._videoSampleSink.getSample(timestamp);\n return sample && this._videoSampleToWrappedCanvas(sample);\n }\n /**\n * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This\n * method will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive).\n */\n canvases(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._videoSampleSink.samples(startTimestamp, endTimestamp), sample => this._videoSampleToWrappedCanvas(sample));\n }\n /**\n * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized\n * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is\n * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if\n * no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n canvasesAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._videoSampleSink.samplesAtTimestamps(timestamps), sample => sample && this._videoSampleToWrappedCanvas(sample));\n }\n}\nclass AudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig) {\n super(onSample, onError);\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) packet timestamps.\n this.currentTimestamp = null;\n const sampleHandler = (sample) => {\n if (this.currentTimestamp === null\n || Math.abs(sample.timestamp - this.currentTimestamp) >= sample.duration) {\n // We need to sync with the sample timestamp again\n this.currentTimestamp = sample.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += sample.duration;\n if (sample.numberOfFrames === 0) {\n // We skip zero-data (empty) AudioSamples. These are sometimes emitted, for example, by Firefox when it\n // decodes Vorbis (at the start).\n sample.close();\n return;\n }\n // Round the timestamp to the sample rate\n const sampleRate = decoderConfig.sampleRate;\n sample.setTimestamp(Math.round(preciseTimestamp * sampleRate) / sampleRate);\n onSample(sample);\n };\n const MatchingCustomDecoder = customAudioDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof AudioSample)) {\n throw new TypeError('The argument passed to onSample must be an AudioSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new AudioDecoder({\n output: (data) => {\n try {\n sampleHandler(new AudioSample(data));\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedAudioChunk());\n }\n }\n flush() {\n if (this.customDecoder) {\n return this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n return this.decoder.flush();\n }\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n }\n}\n// There are a lot of PCM variants not natively supported by the browser and by AudioData. Therefore we need a simple\n// decoder that maps any input PCM format into a PCM format supported by the browser.\nclass PcmAudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, decoderConfig) {\n super(onSample, onError);\n this.decoderConfig = decoderConfig;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) packet timestamps.\n this.currentTimestamp = null;\n assert(PCM_AUDIO_CODECS.includes(decoderConfig.codec));\n this.codec = decoderConfig.codec;\n const { dataType, sampleSize, littleEndian } = parsePcmCodec(this.codec);\n this.inputSampleSize = sampleSize;\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint8(byteOffset) - 2 ** 7;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt8(byteOffset);\n }\n else if (dataType === 'ulaw') {\n this.readInputValue = (view, byteOffset) => fromUlaw(view.getUint8(byteOffset));\n }\n else if (dataType === 'alaw') {\n this.readInputValue = (view, byteOffset) => fromAlaw(view.getUint8(byteOffset));\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 2:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint16(byteOffset, littleEndian) - 2 ** 15;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt16(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 3:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => getUint24(view, byteOffset, littleEndian) - 2 ** 23;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => getInt24(view, byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 4:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint32(byteOffset, littleEndian) - 2 ** 31;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt32(byteOffset, littleEndian);\n }\n else if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat32(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 8:\n {\n if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat64(byteOffset, 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 switch (sampleSize) {\n case 1:\n {\n if (dataType === 'ulaw' || dataType === 'alaw') {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n else {\n this.outputSampleSize = 1;\n this.outputFormat = 'u8';\n this.writeOutputValue = (view, byteOffset, value) => view.setUint8(byteOffset, value + 2 ** 7);\n }\n }\n ;\n break;\n case 2:\n {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n ;\n break;\n case 3:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 's32';\n // From https://www.w3.org/TR/webcodecs:\n // AudioData containing 24-bit samples SHOULD store those samples in s32 or f32. When samples are\n // stored in s32, each sample MUST be left-shifted by 8 bits.\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value << 8, true);\n }\n ;\n break;\n case 4:\n {\n this.outputSampleSize = 4;\n if (dataType === 'float') {\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n else {\n this.outputFormat = 's32';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value, true);\n }\n }\n ;\n break;\n case 8:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n ;\n }\n getDecodeQueueSize() {\n return 0;\n }\n decode(packet) {\n const inputView = toDataView(packet.data);\n const numberOfFrames = packet.byteLength / this.decoderConfig.numberOfChannels / this.inputSampleSize;\n const outputBufferSize = numberOfFrames * this.decoderConfig.numberOfChannels * this.outputSampleSize;\n const outputBuffer = new ArrayBuffer(outputBufferSize);\n const outputView = new DataView(outputBuffer);\n for (let i = 0; i < numberOfFrames * this.decoderConfig.numberOfChannels; i++) {\n const inputIndex = i * this.inputSampleSize;\n const outputIndex = i * this.outputSampleSize;\n const value = this.readInputValue(inputView, inputIndex);\n this.writeOutputValue(outputView, outputIndex, value);\n }\n const preciseDuration = numberOfFrames / this.decoderConfig.sampleRate;\n if (this.currentTimestamp === null || Math.abs(packet.timestamp - this.currentTimestamp) >= preciseDuration) {\n // We need to sync with the packet timestamp again\n this.currentTimestamp = packet.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += preciseDuration;\n const audioSample = new AudioSample({\n format: this.outputFormat,\n data: outputBuffer,\n numberOfChannels: this.decoderConfig.numberOfChannels,\n sampleRate: this.decoderConfig.sampleRate,\n numberOfFrames,\n timestamp: preciseTimestamp,\n });\n this.onSample(audioSample);\n }\n async flush() {\n // Do nothing\n }\n close() {\n // Do nothing\n }\n}\n/**\n * Sink for retrieving decoded audio samples from an audio track.\n * @group Media sinks\n * @public\n */\nexport class AudioSampleSink extends BaseMediaSampleSink {\n /** Creates a new {@link AudioSampleSink} for the given {@link InputAudioTrack}. */\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n super();\n this._track = audioTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._track.canDecode())) {\n throw new Error('This audio track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._track.codec;\n const decoderConfig = await this._track.getDecoderConfig();\n assert(codec && decoderConfig);\n if (PCM_AUDIO_CODECS.includes(decoderConfig.codec)) {\n return new PcmAudioDecoderWrapper(onSample, onError, decoderConfig);\n }\n else {\n return new AudioDecoderWrapper(onSample, onError, codec, decoderConfig);\n }\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._track);\n }\n /**\n * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the audio samples of this track in presentation order. This method\n * will intelligently pre-decode a few samples ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no sample is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that retrieves decoded audio samples from an audio track and converts them to `AudioBuffer` instances. This is\n * often more useful than directly retrieving audio samples, as audio buffers can be directly used with the\n * Web Audio API.\n * @group Media sinks\n * @public\n */\nexport class AudioBufferSink {\n /** Creates a new {@link AudioBufferSink} for the given {@link InputAudioTrack}. */\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n this._audioSampleSink = new AudioSampleSink(audioTrack);\n }\n /** @internal */\n _audioSampleToWrappedArrayBuffer(sample) {\n const result = {\n buffer: sample.toAudioBuffer(),\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getBuffer(timestamp) {\n validateTimestamp(timestamp);\n const data = await this._audioSampleSink.getSample(timestamp);\n return data && this._audioSampleToWrappedArrayBuffer(data);\n }\n /**\n * Creates an async iterator that yields audio buffers of this track in presentation order. This method\n * will intelligently pre-decode a few buffers ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive).\n */\n buffers(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._audioSampleSink.samples(startTimestamp, endTimestamp), data => this._audioSampleToWrappedArrayBuffer(data));\n }\n /**\n * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may\n * yield null if no buffer is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n buffersAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._audioSampleSink.samplesAtTimestamps(timestamps), data => data && this._audioSampleToWrappedArrayBuffer(data));\n }\n}\n","/*!\n * Copyright (c) 2025-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 /** The encoded data of this packet. */\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 updating timing information. */\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?.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 return new EncodedPacket(this.data, this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, this.sequenceNumber, this.byteLength);\n }\n}\n","/*!\n * Copyright (c) 2025-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// https://github.com/dystopiancode/pcm-g711/blob/master/pcm-g711/g711.c\nexport const toUlaw = (s16) => {\n const MULAW_MAX = 0x1FFF;\n const MULAW_BIAS = 33;\n let number = s16;\n let mask = 0x1000;\n let sign = 0;\n let position = 12;\n let lsb = 0;\n if (number < 0) {\n number = -number;\n sign = 0x80;\n }\n number += MULAW_BIAS;\n if (number > MULAW_MAX) {\n number = MULAW_MAX;\n }\n while ((number & mask) !== mask && position >= 5) {\n mask >>= 1;\n position--;\n }\n lsb = (number >> (position - 4)) & 0x0f;\n return ~(sign | ((position - 5) << 4) | lsb) & 0xFF;\n};\nexport const fromUlaw = (u8) => {\n const MULAW_BIAS = 33;\n let sign = 0;\n let position = 0;\n let number = ~u8;\n if (number & 0x80) {\n number &= ~(1 << 7);\n sign = -1;\n }\n position = ((number & 0xF0) >> 4) + 5;\n const decoded = ((1 << position) | ((number & 0x0F) << (position - 4))\n | (1 << (position - 5))) - MULAW_BIAS;\n return (sign === 0) ? decoded : -decoded;\n};\nexport const toAlaw = (s16) => {\n const ALAW_MAX = 0xFFF;\n let mask = 0x800;\n let sign = 0;\n let position = 11;\n let lsb = 0;\n let number = s16;\n if (number < 0) {\n number = -number;\n sign = 0x80;\n }\n if (number > ALAW_MAX) {\n number = ALAW_MAX;\n }\n while ((number & mask) !== mask && position >= 5) {\n mask >>= 1;\n position--;\n }\n lsb = (number >> ((position === 4) ? 1 : (position - 4))) & 0x0f;\n return (sign | ((position - 4) << 4) | lsb) ^ 0x55;\n};\nexport const fromAlaw = (u8) => {\n let sign = 0x00;\n let position = 0;\n let number = u8 ^ 0x55;\n if (number & 0x80) {\n number &= ~(1 << 7);\n sign = -1;\n }\n position = ((number & 0xF0) >> 4) + 4;\n let decoded = 0;\n if (position !== 4) {\n decoded = ((1 << position) | ((number & 0x0F) << (position - 4))\n | (1 << (position - 5)));\n }\n else {\n decoded = (number << 1) | 1;\n }\n return (sign === 0) ? decoded : -decoded;\n};\n","/*!\n * Copyright (c) 2025-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, clamp, isAllowSharedBufferSource, SECOND_TO_MICROSECOND_FACTOR, toDataView, toUint8Array, isFirefox, polyfillSymbolDispose, } from './misc.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 = Date.now();\n if (value.type === 'video') {\n if (now - lastVideoGcErrorLog >= 1000) {\n // This error is annoying but oh so important\n console.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 console.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 * 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 after rotation. */\n get displayWidth() {\n return this.rotation % 180 === 0 ? this.codedWidth : this.codedHeight;\n }\n /** The height of the frame in pixels after rotation. */\n get displayHeight() {\n return this.rotation % 180 === 0 ? this.codedHeight : this.codedWidth;\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 (!('format' in init) || typeof init.format !== 'string') {\n throw new TypeError('init.format must be a string.');\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 this._data = toUint8Array(data).slice(); // Copy it\n this.format = init.format;\n this.codedWidth = init.codedWidth;\n this.codedHeight = init.codedHeight;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace(init.colorSpace);\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 this._data = data;\n this.format = data.format;\n // Copying the display dimensions here, assuming no innate VideoFrame rotation\n this.codedWidth = data.displayWidth;\n this.codedHeight = data.displayHeight;\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 this.timestamp = init?.timestamp ?? data.timestamp / 1e6;\n this.duration = init?.duration ?? (data.duration ?? 0) / 1e6;\n this.colorSpace = 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 assert(context);\n // Draw it to a canvas\n context.drawImage(data, 0, 0);\n this._data = canvas;\n this.format = 'RGBX';\n this.codedWidth = width;\n this.codedHeight = height;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace({\n matrix: 'rgb',\n primaries: 'bt709',\n transfer: 'iec61966-2-1',\n fullRange: true,\n });\n }\n else {\n throw new TypeError('Invalid data type: Must be a BufferSource or CanvasImageSource.');\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 (isVideoFrame(this._data)) {\n return new VideoSample(this._data.clone(), {\n timestamp: this.timestamp,\n duration: this.duration,\n rotation: this.rotation,\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoSample(this._data.slice(), {\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 });\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 });\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 (isVideoFrame(this._data)) {\n this._data.close();\n }\n else {\n this._data = null; // GC that shit\n }\n this._closed = true;\n }\n /** Returns the number of bytes required to hold this video sample's pixel data. */\n allocationSize() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return this._data.allocationSize();\n }\n else if (this._data instanceof Uint8Array) {\n return this._data.byteLength;\n }\n else {\n return this.codedWidth * this.codedHeight * 4; // RGBX\n }\n }\n /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */\n async copyTo(destination) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n await this._data.copyTo(destination);\n }\n else if (this._data instanceof Uint8Array) {\n const dest = toUint8Array(destination);\n dest.set(this._data);\n }\n else {\n const canvas = this._data;\n const context = canvas.getContext('2d');\n assert(context);\n const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight);\n const dest = toUint8Array(destination);\n dest.set(imageData.data);\n }\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 (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 });\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.codedWidth, this.codedHeight]\n : [this.codedHeight, this.codedWidth];\n if (options.crop) {\n clampCropRectangle(options.crop, 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.codedHeight - sx - sWidth,\n sHeight,\n sWidth,\n ];\n }\n else if (rotation === 180) {\n [sx, sy] = [\n this.codedWidth - sx - sWidth,\n this.codedHeight - sy - sHeight,\n ];\n }\n else if (rotation === 270) {\n [sx, sy, sWidth, sHeight] = [\n this.codedWidth - 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 will\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 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 /** 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 /** Calls `.close()`. */\n [Symbol.dispose]() {\n this.close();\n }\n}\nconst isVideoFrame = (x) => {\n return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame;\n};\nexport const clampCropRectangle = (crop, outerWidth, outerHeight) => {\n crop.left = Math.min(crop.left, outerWidth);\n crop.top = Math.min(crop.top, outerHeight);\n crop.width = Math.min(crop.width, outerWidth - crop.left);\n crop.height = Math.min(crop.height, outerHeight - crop.top);\n assert(crop.width >= 0);\n assert(crop.height >= 0);\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 AUDIO_SAMPLE_FORMATS = new Set(['f32', 'f32-planar', 's16', 's16-planar', 's32', 's32-planar', 'u8', 'u8-planar']);\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 /**\n * Creates a new {@link AudioSample}, either from an existing\n * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) or from raw bytes specified in\n * {@link AudioSampleInit}.\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 {\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 { planeIndex, format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options;\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 (destIsPlanar) {\n if (destFormat === 'f32-planar') {\n // Simple, since the browser must support f32-planar, we can just delegate here\n this._data.copyTo(destination, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n }\n else {\n // Allocate temporary buffer for f32-planar data\n const tempBuffer = new ArrayBuffer(copyFrameCount * 4);\n const tempArray = new Float32Array(tempBuffer);\n this._data.copyTo(tempArray, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n // Convert each f32 sample to destination format\n const tempView = new DataView(tempBuffer);\n for (let i = 0; i < copyFrameCount; i++) {\n const destOffset = i * destBytesPerSample;\n const sample = tempView.getFloat32(i * 4, true);\n writeFn(destView, destOffset, sample);\n }\n }\n }\n else {\n // Destination is interleaved.\n // Allocate a temporary Float32Array to hold one channel's worth of data.\n const numCh = numChannels;\n const temp = new Float32Array(copyFrameCount);\n for (let ch = 0; ch < numCh; ch++) {\n this._data.copyTo(temp, {\n planeIndex: ch,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n for (let i = 0; i < copyFrameCount; i++) {\n const destIndex = i * numCh + ch;\n const destOffset = destIndex * destBytesPerSample;\n writeFn(destView, destOffset, temp[i]);\n }\n }\n }\n }\n else {\n const uint8Data = this._data;\n const srcView = toDataView(uint8Data);\n const srcFormat = this.format;\n const readFn = getReadFunction(srcFormat);\n const srcBytesPerSample = getBytesPerSample(srcFormat);\n const srcIsPlanar = formatIsPlanar(srcFormat);\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 (isAudioData(this._data)) {\n const sample = new AudioSample(this._data.clone());\n sample.setTimestamp(this.timestamp); // Make sure the timestamp is precise (beyond microsecond accuracy)\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 * 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 (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 (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 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 }\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 /** 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};\n","/*!\n * Copyright (c) 2025-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 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};\n","/*!\n * Copyright (c) 2025-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) 2025-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/**\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 throw new TypeError('Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, 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 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.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) 2025-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, toDataView } from './misc.js';\nexport class Reader {\n constructor(source) {\n this.source = source;\n }\n requestSlice(start, length) {\n if (this.source._disposed) {\n throw new InputDisposedError();\n }\n if (this.fileSize !== null && start + length > this.fileSize) {\n return null;\n }\n const end = start + length;\n const result = this.source._read(start, end);\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 (this.fileSize !== null) {\n return this.requestSlice(start, clamp(this.fileSize - 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 const handleFileSize = (fileSize) => {\n assert(fileSize !== null); // The slice couldn't fit, meaning we must know the file size now\n return this.requestSlice(start, clamp(fileSize - start, minLength, maxLength));\n };\n const promisedFileSize = this.source._retrieveSize();\n if (promisedFileSize instanceof Promise) {\n return promisedFileSize.then(handleFileSize);\n }\n else {\n return handleFileSize(promisedFileSize);\n }\n };\n if (promisedAttempt instanceof Promise) {\n return promisedAttempt.then(handleAttempt);\n }\n else {\n return handleAttempt(promisedAttempt);\n }\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};\n","/*!\n * Copyright (c) 2025-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 { 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[\"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 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 return width;\n};\nexport const readVarInt = (slice) => {\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 // 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 const id = readUnsignedInt(slice, size);\n return id;\n};\nexport const readElementSize = (slice) => {\n let size = readU8(slice);\n if (size === 0xff) {\n size = null;\n }\n else {\n slice.skip(-1);\n size = readVarInt(slice);\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 size = null;\n }\n }\n return size;\n};\nexport const readElementHeader = (slice) => {\n const id = readElementId(slice);\n if (id === null) {\n return null;\n }\n const size = readElementSize(slice);\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 '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 === null) {\n throw new Error('Undefined element size is used in a place where it is not supported.');\n }\n}\n;\n","/*!\n * Copyright (c) 2025-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 { extractAv1CodecInfoFromPacket, extractAvcDecoderConfigurationRecord, extractHevcDecoderConfigurationRecord, extractVp9CodecInfoFromPacket, } from '../codec-data.js';\nimport { extractAudioCodecString, extractVideoCodecString, OPUS_SAMPLE_RATE, } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { AttachedFile, DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, binarySearchLessOrEqual, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundIfAlmostInteger, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { assertDefinedSize, CODEC_STRING_MAP, EBMLId, LEVEL_0_AND_1_EBML_IDS, LEVEL_1_EBML_IDS, MAX_HEADER_SIZE, MIN_HEADER_SIZE, readAsciiString, readUnicodeString, readElementHeader, readElementId, readFloat, readUnsignedInt, readVarInt, resync, searchForNextElementId, readUnsignedBigInt, } from './ebml.js';\nimport { buildMatroskaMimeType } from './matroska-misc.js';\nimport { FileSlice, readBytes, readI16Be, readU8 } from '../reader.js';\nvar BlockLacing;\n(function (BlockLacing) {\n BlockLacing[BlockLacing[\"None\"] = 0] = \"None\";\n BlockLacing[BlockLacing[\"Xiph\"] = 1] = \"Xiph\";\n BlockLacing[BlockLacing[\"FixedSize\"] = 2] = \"FixedSize\";\n BlockLacing[BlockLacing[\"Ebml\"] = 3] = \"Ebml\";\n})(BlockLacing || (BlockLacing = {}));\nvar ContentEncodingScope;\n(function (ContentEncodingScope) {\n ContentEncodingScope[ContentEncodingScope[\"Block\"] = 1] = \"Block\";\n ContentEncodingScope[ContentEncodingScope[\"Private\"] = 2] = \"Private\";\n ContentEncodingScope[ContentEncodingScope[\"Next\"] = 4] = \"Next\";\n})(ContentEncodingScope || (ContentEncodingScope = {}));\nvar ContentCompAlgo;\n(function (ContentCompAlgo) {\n ContentCompAlgo[ContentCompAlgo[\"Zlib\"] = 0] = \"Zlib\";\n ContentCompAlgo[ContentCompAlgo[\"Bzlib\"] = 1] = \"Bzlib\";\n ContentCompAlgo[ContentCompAlgo[\"lzo1x\"] = 2] = \"lzo1x\";\n ContentCompAlgo[ContentCompAlgo[\"HeaderStripping\"] = 3] = \"HeaderStripping\";\n})(ContentCompAlgo || (ContentCompAlgo = {}));\nconst METADATA_ELEMENTS = [\n { id: EBMLId.SeekHead, flag: 'seekHeadSeen' },\n { id: EBMLId.Info, flag: 'infoSeen' },\n { id: EBMLId.Tracks, flag: 'tracksSeen' },\n { id: EBMLId.Cues, flag: 'cuesSeen' },\n];\nconst MAX_RESYNC_LENGTH = 10 * 2 ** 20; // 10 MiB\nexport class MatroskaDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.readMetadataPromise = null;\n this.segments = [];\n this.currentSegment = null;\n this.currentTrack = null;\n this.currentCluster = null;\n this.currentBlock = null;\n this.currentBlockAdditional = null;\n this.currentCueTime = null;\n this.currentDecodingInstruction = null;\n this.currentTagTargetIsMovie = true;\n this.currentSimpleTagName = null;\n this.currentAttachedFile = null;\n this.isWebM = false;\n this.reader = input._reader;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.segments.flatMap(segment => segment.tracks.map(track => track.inputTrack));\n }\n async getMimeType() {\n await this.readMetadata();\n const tracks = await this.getTracks();\n const codecStrings = await Promise.all(tracks.map(x => x.getCodecParameterString()));\n return buildMatroskaMimeType({\n isWebM: this.isWebM,\n hasVideo: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'video')),\n hasAudio: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'audio')),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getMetadataTags() {\n await this.readMetadata();\n // Load metadata tags from each segment lazily (only once)\n for (const segment of this.segments) {\n if (!segment.metadataTagsCollected) {\n if (this.reader.fileSize !== null) {\n await this.loadSegmentMetadata(segment);\n }\n else {\n // The seeking would be too crazy, let's not\n }\n segment.metadataTagsCollected = true;\n }\n }\n // This is kinda handwavy, and how we handle multiple segments isn't suuuuper well-defined anyway; so we just\n // shallow-merge metadata tags from all (usually just one) segments.\n let metadataTags = {};\n for (const segment of this.segments) {\n metadataTags = { ...metadataTags, ...segment.metadataTags };\n }\n return metadataTags;\n }\n readMetadata() {\n return this.readMetadataPromise ??= (async () => {\n let currentPos = 0;\n // Loop over all top-level elements in the file\n while (true) {\n let slice = this.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 header = readElementHeader(slice);\n if (!header) {\n break; // Zero padding at the end of the file triggers this, for example\n }\n const id = header.id;\n let size = header.size;\n const dataStartPos = slice.filePos;\n if (id === EBMLId.EBML) {\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n this.readContiguousElements(slice);\n }\n else if (id === EBMLId.Segment) { // Segment found!\n await this.readSegment(dataStartPos, size);\n if (size === null) {\n // Segment sizes can be undefined (common in livestreamed files), so assume this is the last\n // and only segment\n break;\n }\n if (this.reader.fileSize === null) {\n break; // Stop at the first segment\n }\n }\n else if (id === EBMLId.Cluster) {\n if (this.reader.fileSize === null) {\n break; // Shouldn't be reached anyway, since we stop at the first segment\n }\n // Clusters are not a top-level element in Matroska, but some files contain a Segment whose size\n // doesn't contain any of the clusters that follow it. In the case, we apply the following logic: if\n // we find a top-level cluster, attribute it to the previous segment.\n if (size === null) {\n // Just in case this is one of those weird sizeless clusters, let's do our best and still try to\n // determine its size.\n const nextElementPos = await searchForNextElementId(this.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, this.reader.fileSize);\n size = nextElementPos.pos - dataStartPos;\n }\n const lastSegment = last(this.segments);\n if (lastSegment) {\n // Extend the previous segment's size\n lastSegment.elementEndPos = dataStartPos + size;\n }\n }\n assertDefinedSize(size);\n currentPos = dataStartPos + size;\n }\n })();\n }\n async readSegment(segmentDataStart, dataSize) {\n this.currentSegment = {\n seekHeadSeen: false,\n infoSeen: false,\n tracksSeen: false,\n cuesSeen: false,\n tagsSeen: false,\n attachmentsSeen: false,\n timestampScale: -1,\n timestampFactor: -1,\n duration: -1,\n seekEntries: [],\n tracks: [],\n cuePoints: [],\n dataStartPos: segmentDataStart,\n elementEndPos: dataSize === null\n ? null // Assume it goes until the end of the file\n : segmentDataStart + dataSize,\n clusterSeekStartPos: segmentDataStart,\n lastReadCluster: null,\n metadataTags: {},\n metadataTagsCollected: false,\n };\n this.segments.push(this.currentSegment);\n let currentPos = segmentDataStart;\n while (this.currentSegment.elementEndPos === null || currentPos < this.currentSegment.elementEndPos) {\n let slice = this.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 elementStartPos = currentPos;\n const header = readElementHeader(slice);\n if (!header || (!LEVEL_1_EBML_IDS.includes(header.id) && header.id !== EBMLId.Void)) {\n // Potential junk. Let's try to resync\n const nextPos = await resync(this.reader, elementStartPos, LEVEL_1_EBML_IDS, Math.min(this.currentSegment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH));\n if (nextPos) {\n currentPos = nextPos;\n continue;\n }\n else {\n break; // Resync failed\n }\n }\n const { id, size } = header;\n const dataStartPos = slice.filePos;\n const metadataElementIndex = METADATA_ELEMENTS.findIndex(x => x.id === id);\n if (metadataElementIndex !== -1) {\n const field = METADATA_ELEMENTS[metadataElementIndex].flag;\n this.currentSegment[field] = true;\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n this.readContiguousElements(slice);\n }\n }\n else if (id === EBMLId.Tags || id === EBMLId.Attachments) {\n // Metadata found at the beginning of the segment, great, let's parse it\n if (id === EBMLId.Tags) {\n this.currentSegment.tagsSeen = true;\n }\n else {\n this.currentSegment.attachmentsSeen = true;\n }\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n this.readContiguousElements(slice);\n }\n }\n else if (id === EBMLId.Cluster) {\n this.currentSegment.clusterSeekStartPos = elementStartPos;\n break; // Stop at the first cluster\n }\n if (size === null) {\n break;\n }\n else {\n currentPos = dataStartPos + size;\n }\n }\n // Sort the seek entries by file position so reading them exhibits a sequential pattern\n this.currentSegment.seekEntries.sort((a, b) => a.segmentPosition - b.segmentPosition);\n if (this.reader.fileSize !== null) {\n // Use the seek head to read missing metadata elements\n for (const seekEntry of this.currentSegment.seekEntries) {\n const target = METADATA_ELEMENTS.find(x => x.id === seekEntry.id);\n if (!target) {\n continue;\n }\n if (this.currentSegment[target.flag])\n continue;\n let slice = this.reader.requestSliceRange(segmentDataStart + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n continue;\n const header = readElementHeader(slice);\n if (!header)\n continue;\n const { id, size } = header;\n if (id !== target.id)\n continue;\n assertDefinedSize(size);\n this.currentSegment[target.flag] = true;\n let dataSlice = this.reader.requestSlice(slice.filePos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (!dataSlice)\n continue;\n this.readContiguousElements(dataSlice);\n }\n }\n if (this.currentSegment.timestampScale === -1) {\n // TimestampScale element is missing. Technically an invalid file, but let's default to the typical value,\n // which is 1e6.\n this.currentSegment.timestampScale = 1e6;\n this.currentSegment.timestampFactor = 1e9 / 1e6;\n }\n // Put default tracks first\n this.currentSegment.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));\n // Now, let's distribute the cue points to the tracks\n const idToTrack = new Map(this.currentSegment.tracks.map(x => [x.id, x]));\n // Assign cue points to their respective tracks\n for (const cuePoint of this.currentSegment.cuePoints) {\n const track = idToTrack.get(cuePoint.trackId);\n if (track) {\n track.cuePoints.push(cuePoint);\n }\n }\n for (const track of this.currentSegment.tracks) {\n // Sort cue points by time\n track.cuePoints.sort((a, b) => a.time - b.time);\n // Remove multiple cue points for the same time\n for (let i = 0; i < track.cuePoints.length - 1; i++) {\n const cuePoint1 = track.cuePoints[i];\n const cuePoint2 = track.cuePoints[i + 1];\n if (cuePoint1.time === cuePoint2.time) {\n track.cuePoints.splice(i + 1, 1);\n i--;\n }\n }\n }\n let trackWithMostCuePoints = null;\n let maxCuePointCount = -Infinity;\n for (const track of this.currentSegment.tracks) {\n if (track.cuePoints.length > maxCuePointCount) {\n maxCuePointCount = track.cuePoints.length;\n trackWithMostCuePoints = track;\n }\n }\n // For every track that has received 0 cue points (can happen, often only the video track receives cue points),\n // we still want to have better seeking. Therefore, let's give it the cue points of the track with the most cue\n // points, which should provide us with the most fine-grained seeking.\n for (const track of this.currentSegment.tracks) {\n if (track.cuePoints.length === 0) {\n track.cuePoints = trackWithMostCuePoints.cuePoints;\n }\n }\n this.currentSegment = null;\n }\n async readCluster(startPos, segment) {\n if (segment.lastReadCluster?.elementStartPos === startPos) {\n return segment.lastReadCluster;\n }\n let headerSlice = this.reader.requestSliceRange(startPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const elementStartPos = startPos;\n const elementHeader = readElementHeader(headerSlice);\n assert(elementHeader);\n const id = elementHeader.id;\n assert(id === EBMLId.Cluster);\n let size = elementHeader.size;\n const dataStartPos = headerSlice.filePos;\n if (size === null) {\n // The cluster's size is undefined (can happen in livestreamed files). We'd still like to know the size of\n // it, so we have no other choice but to iterate over the EBML structure until we find an element at level\n // 0 or 1, indicating the end of the cluster (all elements inside the cluster are at level 2).\n const nextElementPos = await searchForNextElementId(this.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = nextElementPos.pos - dataStartPos;\n }\n // Load the entire cluster\n let dataSlice = this.reader.requestSlice(dataStartPos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n const cluster = {\n segment,\n elementStartPos,\n elementEndPos: dataStartPos + size,\n dataStartPos,\n timestamp: -1,\n trackData: new Map(),\n };\n this.currentCluster = cluster;\n if (dataSlice) {\n // Read the children of the cluster, stopping early at level 0 or 1 EBML elements. We do this because some\n // clusters have incorrect sizes that are too large\n const endPos = this.readContiguousElements(dataSlice, LEVEL_0_AND_1_EBML_IDS);\n cluster.elementEndPos = endPos;\n }\n for (const [, trackData] of cluster.trackData) {\n const track = trackData.track;\n // This must hold, as track datas only get created if a block for that track is encountered\n assert(trackData.blocks.length > 0);\n let hasLacedBlocks = false;\n for (let i = 0; i < trackData.blocks.length; i++) {\n const block = trackData.blocks[i];\n block.timestamp += cluster.timestamp;\n hasLacedBlocks ||= block.lacing !== BlockLacing.None;\n }\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentBlock = trackData.blocks[currentEntry.blockIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentBlock.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentBlock.timestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update block durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentBlock.duration = nextEntry.timestamp - currentBlock.timestamp;\n }\n else if (currentBlock.duration === 0) {\n if (track.defaultDuration != null) {\n if (currentBlock.lacing === BlockLacing.None) {\n currentBlock.duration = track.defaultDuration;\n }\n else {\n // Handled by the lace resolution code\n }\n }\n }\n }\n if (hasLacedBlocks) {\n // Perform lace resolution. Here, we expand each laced block into multiple blocks where each contains\n // one frame of the lace. We do this after determining block timestamps so we can properly distribute\n // the block's duration across the laced frames.\n this.expandLacedBlocks(trackData.blocks, track);\n // Recompute since blocks have changed\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n }\n const firstBlock = trackData.blocks[trackData.presentationTimestamps[0].blockIndex];\n const lastBlock = trackData.blocks[last(trackData.presentationTimestamps).blockIndex];\n trackData.startTimestamp = firstBlock.timestamp;\n trackData.endTimestamp = lastBlock.timestamp + lastBlock.duration;\n // Let's remember that a cluster with a given timestamp is here, speeding up future lookups if no cues exist\n const insertionIndex = binarySearchLessOrEqual(track.clusterPositionCache, trackData.startTimestamp, x => x.startTimestamp);\n if (insertionIndex === -1\n || track.clusterPositionCache[insertionIndex].elementStartPos !== elementStartPos) {\n track.clusterPositionCache.splice(insertionIndex + 1, 0, {\n elementStartPos: cluster.elementStartPos,\n startTimestamp: trackData.startTimestamp,\n });\n }\n }\n segment.lastReadCluster = cluster;\n return cluster;\n }\n getTrackDataInCluster(cluster, trackNumber) {\n let trackData = cluster.trackData.get(trackNumber);\n if (!trackData) {\n const track = cluster.segment.tracks.find(x => x.id === trackNumber);\n if (!track) {\n return null;\n }\n trackData = {\n track,\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n blocks: [],\n presentationTimestamps: [],\n };\n cluster.trackData.set(trackNumber, trackData);\n }\n return trackData;\n }\n expandLacedBlocks(blocks, track) {\n // https://www.matroska.org/technical/notes.html#block-lacing\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const originalBlock = blocks[blockIndex];\n if (originalBlock.lacing === BlockLacing.None) {\n continue;\n }\n // Decode the block data if it hasn't been decoded yet (needed for lacing expansion)\n if (!originalBlock.decoded) {\n originalBlock.data = this.decodeBlockData(track, originalBlock.data);\n originalBlock.decoded = true;\n }\n const slice = FileSlice.tempFromBytes(originalBlock.data);\n const frameSizes = [];\n const frameCount = readU8(slice) + 1;\n switch (originalBlock.lacing) {\n case BlockLacing.Xiph:\n {\n let totalUsedSize = 0;\n // Xiph lacing, just like in Ogg\n for (let i = 0; i < frameCount - 1; i++) {\n let frameSize = 0;\n while (slice.bufferPos < slice.length) {\n const value = readU8(slice);\n frameSize += value;\n if (value < 255) {\n frameSizes.push(frameSize);\n totalUsedSize += frameSize;\n break;\n }\n }\n }\n // Compute the last frame's size from whatever's left\n frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize));\n }\n ;\n break;\n case BlockLacing.FixedSize:\n {\n // Fixed size lacing: all frames have same size\n const totalDataSize = slice.length - 1; // Minus the frame count byte\n const frameSize = Math.floor(totalDataSize / frameCount);\n for (let i = 0; i < frameCount; i++) {\n frameSizes.push(frameSize);\n }\n }\n ;\n break;\n case BlockLacing.Ebml:\n {\n // EBML lacing: first size absolute, subsequent ones are coded as signed differences from the last\n const firstResult = readVarInt(slice);\n assert(firstResult !== null); // Assume it's not an invalid VINT\n let currentSize = firstResult;\n frameSizes.push(currentSize);\n let totalUsedSize = currentSize;\n for (let i = 1; i < frameCount - 1; i++) {\n const startPos = slice.bufferPos;\n const diffResult = readVarInt(slice);\n assert(diffResult !== null);\n const unsignedDiff = diffResult;\n const width = slice.bufferPos - startPos;\n const bias = (1 << (width * 7 - 1)) - 1; // Typo-corrected version of 2^((7*n)-1)^-1\n const diff = unsignedDiff - bias;\n currentSize += diff;\n frameSizes.push(currentSize);\n totalUsedSize += currentSize;\n }\n // Compute the last frame's size from whatever's left\n frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize));\n }\n ;\n break;\n default: assert(false);\n }\n assert(frameSizes.length === frameCount);\n blocks.splice(blockIndex, 1); // Remove the original block\n const blockDuration = originalBlock.duration || frameCount * (track.defaultDuration ?? 0);\n // Now, let's insert each frame as its own block\n for (let i = 0; i < frameCount; i++) {\n const frameSize = frameSizes[i];\n const frameData = readBytes(slice, frameSize);\n // Distribute timestamps evenly across the block duration\n const frameTimestamp = originalBlock.timestamp + (blockDuration * i / frameCount);\n const frameDuration = blockDuration / frameCount;\n blocks.splice(blockIndex + i, 0, {\n timestamp: frameTimestamp,\n duration: frameDuration,\n isKeyFrame: originalBlock.isKeyFrame,\n data: frameData,\n lacing: BlockLacing.None,\n decoded: true,\n mainAdditional: originalBlock.mainAdditional,\n });\n }\n blockIndex += frameCount; // Skip the blocks we just added\n blockIndex--;\n }\n }\n async loadSegmentMetadata(segment) {\n for (const seekEntry of segment.seekEntries) {\n if (seekEntry.id === EBMLId.Tags && !segment.tagsSeen) {\n // We need to load the tags\n }\n else if (seekEntry.id === EBMLId.Attachments && !segment.attachmentsSeen) {\n // We need to load the attachments\n }\n else {\n continue;\n }\n let slice = this.reader.requestSliceRange(segment.dataStartPos + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n continue;\n const header = readElementHeader(slice);\n if (!header || header.id !== seekEntry.id)\n continue;\n const { size } = header;\n assertDefinedSize(size);\n assert(!this.currentSegment);\n this.currentSegment = segment;\n let dataSlice = this.reader.requestSlice(slice.filePos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (dataSlice) {\n this.readContiguousElements(dataSlice);\n }\n this.currentSegment = null;\n // Mark as seen\n if (seekEntry.id === EBMLId.Tags) {\n segment.tagsSeen = true;\n }\n else if (seekEntry.id === EBMLId.Attachments) {\n segment.attachmentsSeen = true;\n }\n }\n }\n readContiguousElements(slice, stopIds) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_HEADER_SIZE) {\n const startPos = slice.filePos;\n const foundElement = this.traverseElement(slice, stopIds);\n if (!foundElement) {\n return startPos;\n }\n }\n return slice.filePos;\n }\n traverseElement(slice, stopIds) {\n const header = readElementHeader(slice);\n if (!header) {\n return false;\n }\n if (stopIds && stopIds.includes(header.id)) {\n return false;\n }\n const { id, size } = header;\n const dataStartPos = slice.filePos;\n assertDefinedSize(size);\n switch (id) {\n case EBMLId.DocType:\n {\n this.isWebM = readAsciiString(slice, size) === 'webm';\n }\n ;\n break;\n case EBMLId.Seek:\n {\n if (!this.currentSegment)\n break;\n const seekEntry = { id: -1, segmentPosition: -1 };\n this.currentSegment.seekEntries.push(seekEntry);\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (seekEntry.id === -1 || seekEntry.segmentPosition === -1) {\n this.currentSegment.seekEntries.pop();\n }\n }\n ;\n break;\n case EBMLId.SeekID:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.id = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.SeekPosition:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.segmentPosition = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.TimestampScale:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.timestampScale = readUnsignedInt(slice, size);\n this.currentSegment.timestampFactor = 1e9 / this.currentSegment.timestampScale;\n }\n ;\n break;\n case EBMLId.Duration:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.duration = readFloat(slice, size);\n }\n ;\n break;\n case EBMLId.TrackEntry:\n {\n if (!this.currentSegment)\n break;\n this.currentTrack = {\n id: -1,\n segment: this.currentSegment,\n demuxer: this,\n clusterPositionCache: [],\n cuePoints: [],\n disposition: {\n ...DEFAULT_TRACK_DISPOSITION,\n },\n inputTrack: null,\n codecId: null,\n codecPrivate: null,\n defaultDuration: null,\n name: null,\n languageCode: UNDETERMINED_LANGUAGE,\n decodingInstructions: [],\n info: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentTrack.decodingInstructions.some((instruction) => {\n return instruction.data?.type !== 'decompress'\n || instruction.scope !== ContentEncodingScope.Block\n || instruction.data.algorithm !== ContentCompAlgo.HeaderStripping;\n })) {\n console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`);\n this.currentTrack = null;\n }\n if (this.currentTrack\n && this.currentTrack.id !== -1\n && this.currentTrack.codecId\n && this.currentTrack.info) {\n const slashIndex = this.currentTrack.codecId.indexOf('/');\n const codecIdWithoutSuffix = slashIndex === -1\n ? this.currentTrack.codecId\n : this.currentTrack.codecId.slice(0, slashIndex);\n if (this.currentTrack.info.type === 'video'\n && this.currentTrack.info.width !== -1\n && this.currentTrack.info.height !== -1) {\n if (this.currentTrack.codecId === CODEC_STRING_MAP.avc) {\n this.currentTrack.info.codec = 'avc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.hevc) {\n this.currentTrack.info.codec = 'hevc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp8) {\n this.currentTrack.info.codec = 'vp8';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp9) {\n this.currentTrack.info.codec = 'vp9';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.av1) {\n this.currentTrack.info.codec = 'av1';\n }\n const videoTrack = this.currentTrack;\n const inputTrack = new InputVideoTrack(this.input, new MatroskaVideoTrackBacking(videoTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n else if (this.currentTrack.info.type === 'audio'\n && this.currentTrack.info.numberOfChannels !== -1\n && this.currentTrack.info.sampleRate !== -1) {\n if (codecIdWithoutSuffix === CODEC_STRING_MAP.aac) {\n this.currentTrack.info.codec = 'aac';\n this.currentTrack.info.aacCodecInfo = {\n isMpeg2: this.currentTrack.codecId.includes('MPEG2'),\n };\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.mp3) {\n this.currentTrack.info.codec = 'mp3';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.opus) {\n this.currentTrack.info.codec = 'opus';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n this.currentTrack.info.sampleRate = OPUS_SAMPLE_RATE; // Always the same\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vorbis) {\n this.currentTrack.info.codec = 'vorbis';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.flac) {\n this.currentTrack.info.codec = 'flac';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/LIT') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/BIG') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16be';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24be';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32be';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/FLOAT/IEEE') {\n if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-f32';\n }\n else if (this.currentTrack.info.bitDepth === 64) {\n this.currentTrack.info.codec = 'pcm-f64';\n }\n }\n const audioTrack = this.currentTrack;\n const inputTrack = new InputAudioTrack(this.input, new MatroskaAudioTrackBacking(audioTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case EBMLId.TrackNumber:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.id = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.TrackType:\n {\n if (!this.currentTrack)\n break;\n const type = readUnsignedInt(slice, size);\n if (type === 1) {\n this.currentTrack.info = {\n type: 'video',\n width: -1,\n height: -1,\n rotation: 0,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n alphaMode: false,\n };\n }\n else if (type === 2) {\n this.currentTrack.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n bitDepth: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case EBMLId.FlagEnabled:\n {\n if (!this.currentTrack)\n break;\n const enabled = readUnsignedInt(slice, size);\n if (!enabled) {\n this.currentSegment.tracks.pop();\n this.currentTrack = null;\n }\n }\n ;\n break;\n case EBMLId.FlagDefault:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.default = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagForced:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.forced = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagOriginal:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.original = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagHearingImpaired:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.hearingImpaired = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagVisualImpaired:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.visuallyImpaired = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagCommentary:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.commentary = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CodecID:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecId = readAsciiString(slice, size);\n }\n ;\n break;\n case EBMLId.CodecPrivate:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecPrivate = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.DefaultDuration:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.defaultDuration\n = this.currentTrack.segment.timestampFactor * readUnsignedInt(slice, size) / 1e9;\n }\n ;\n break;\n case EBMLId.Name:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.name = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.Language:\n {\n if (!this.currentTrack)\n break;\n if (this.currentTrack.languageCode !== UNDETERMINED_LANGUAGE) {\n // LanguageBCP47 was present, which takes precedence\n break;\n }\n this.currentTrack.languageCode = readAsciiString(slice, size);\n if (!isIso639Dash2LanguageCode(this.currentTrack.languageCode)) {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.LanguageBCP47:\n {\n if (!this.currentTrack)\n break;\n const bcp47 = readAsciiString(slice, size);\n const languageSubtag = bcp47.split('-')[0];\n if (languageSubtag) {\n // Technically invalid, for now: The language subtag might be a language code from ISO 639-1,\n // ISO 639-2, ISO 639-3, ISO 639-5 or some other thing (source: Wikipedia). But, `languageCode` is\n // documented as ISO 639-2. Changing the definition would be a breaking change. This will get\n // cleaned up in the future by defining languageCode to be BCP 47 instead.\n this.currentTrack.languageCode = languageSubtag;\n }\n else {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.Video:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.PixelWidth:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.width = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.PixelHeight:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.height = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.AlphaMode:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.alphaMode = readUnsignedInt(slice, size) === 1;\n }\n ;\n break;\n case EBMLId.Colour:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.colorSpace = {};\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.MatrixCoefficients:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const matrixCoefficients = readUnsignedInt(slice, size);\n const mapped = MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients] ?? null;\n this.currentTrack.info.colorSpace.matrix = mapped;\n }\n ;\n break;\n case EBMLId.Range:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n this.currentTrack.info.colorSpace.fullRange = readUnsignedInt(slice, size) === 2;\n }\n ;\n break;\n case EBMLId.TransferCharacteristics:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const transferCharacteristics = readUnsignedInt(slice, size);\n const mapped = TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics] ?? null;\n this.currentTrack.info.colorSpace.transfer = mapped;\n }\n ;\n break;\n case EBMLId.Primaries:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const primaries = readUnsignedInt(slice, size);\n const mapped = COLOR_PRIMARIES_MAP_INVERSE[primaries] ?? null;\n this.currentTrack.info.colorSpace.primaries = mapped;\n }\n ;\n break;\n case EBMLId.Projection:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.ProjectionPoseRoll:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n const rotation = readFloat(slice, size);\n const flippedRotation = -rotation; // Convert counter-clockwise to clockwise\n try {\n this.currentTrack.info.rotation = normalizeRotation(flippedRotation);\n }\n catch {\n // It wasn't a valid rotation\n }\n }\n ;\n break;\n case EBMLId.Audio:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.SamplingFrequency:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.sampleRate = readFloat(slice, size);\n }\n ;\n break;\n case EBMLId.Channels:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.numberOfChannels = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.BitDepth:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.bitDepth = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CuePoint:\n {\n if (!this.currentSegment)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n this.currentCueTime = null;\n }\n ;\n break;\n case EBMLId.CueTime:\n {\n this.currentCueTime = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CueTrackPositions:\n {\n if (this.currentCueTime === null)\n break;\n assert(this.currentSegment);\n const cuePoint = { time: this.currentCueTime, trackId: -1, clusterPosition: -1 };\n this.currentSegment.cuePoints.push(cuePoint);\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (cuePoint.trackId === -1 || cuePoint.clusterPosition === -1) {\n this.currentSegment.cuePoints.pop();\n }\n }\n ;\n break;\n case EBMLId.CueTrack:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n lastCuePoint.trackId = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CueClusterPosition:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n assert(this.currentSegment);\n lastCuePoint.clusterPosition = this.currentSegment.dataStartPos + readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.Timestamp:\n {\n if (!this.currentCluster)\n break;\n this.currentCluster.timestamp = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.SimpleBlock:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = readVarInt(slice);\n if (trackNumber === null)\n break;\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n if (!trackData)\n break; // Not a track we care about\n const relativeTimestamp = readI16Be(slice);\n const flags = readU8(slice);\n const lacing = (flags >> 1) & 0x3; // If the block is laced, we'll expand it later\n let isKeyFrame = !!(flags & 0x80);\n if (trackData.track.info?.type === 'audio' && trackData.track.info.codec) {\n // Some files don't mark their audio packets as key packets (I'm looking at you, Firefox). But, we\n // can fix this in most cases: if we recognize the codec of the track, then we know every packet is\n // necessarily a key packet, no matter what the container says.\n // https://github.com/Vanilagy/mediabunny/issues/192\n isKeyFrame = true;\n }\n const blockData = readBytes(slice, size - (slice.filePos - dataStartPos));\n const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0;\n trackData.blocks.push({\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0, // Will set later\n isKeyFrame,\n data: blockData,\n lacing,\n decoded: !hasDecodingInstructions,\n mainAdditional: null,\n });\n }\n ;\n break;\n case EBMLId.BlockGroup:\n {\n if (!this.currentCluster)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n this.currentBlock = null;\n }\n ;\n break;\n case EBMLId.Block:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = readVarInt(slice);\n if (trackNumber === null)\n break;\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n if (!trackData)\n break;\n const relativeTimestamp = readI16Be(slice);\n const flags = readU8(slice);\n const lacing = (flags >> 1) & 0x3; // If the block is laced, we'll expand it later\n const blockData = readBytes(slice, size - (slice.filePos - dataStartPos));\n const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0;\n this.currentBlock = {\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0, // Will set later\n isKeyFrame: true,\n data: blockData,\n lacing,\n decoded: !hasDecodingInstructions,\n mainAdditional: null,\n };\n trackData.blocks.push(this.currentBlock);\n }\n ;\n break;\n case EBMLId.BlockAdditions:\n {\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.BlockMore:\n {\n if (!this.currentBlock)\n break;\n this.currentBlockAdditional = {\n addId: 1,\n data: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentBlockAdditional.data && this.currentBlockAdditional.addId === 1) {\n this.currentBlock.mainAdditional = this.currentBlockAdditional.data;\n }\n this.currentBlockAdditional = null;\n }\n ;\n break;\n case EBMLId.BlockAdditional:\n {\n if (!this.currentBlockAdditional)\n break;\n this.currentBlockAdditional.data = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.BlockAddID:\n {\n if (!this.currentBlockAdditional)\n break;\n this.currentBlockAdditional.addId = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.BlockDuration:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.duration = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ReferenceBlock:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.isKeyFrame = false;\n // We ignore the actual value here, we just use the reference as an indicator for \"not a key frame\".\n // This is in line with FFmpeg's behavior.\n }\n ;\n break;\n case EBMLId.Tag:\n {\n this.currentTagTargetIsMovie = true;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.Targets:\n {\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.TargetTypeValue:\n {\n const targetTypeValue = readUnsignedInt(slice, size);\n if (targetTypeValue !== 50) {\n this.currentTagTargetIsMovie = false;\n }\n }\n ;\n break;\n case EBMLId.TagTrackUID:\n case EBMLId.TagEditionUID:\n case EBMLId.TagChapterUID:\n case EBMLId.TagAttachmentUID:\n {\n this.currentTagTargetIsMovie = false;\n }\n ;\n break;\n case EBMLId.SimpleTag:\n {\n if (!this.currentTagTargetIsMovie)\n break;\n this.currentSimpleTagName = null;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.TagName:\n {\n this.currentSimpleTagName = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.TagString:\n {\n if (!this.currentSimpleTagName)\n break;\n const value = readUnicodeString(slice, size);\n this.processTagValue(this.currentSimpleTagName, value);\n }\n ;\n break;\n case EBMLId.TagBinary:\n {\n if (!this.currentSimpleTagName)\n break;\n const value = readBytes(slice, size);\n this.processTagValue(this.currentSimpleTagName, value);\n }\n ;\n break;\n case EBMLId.AttachedFile:\n {\n if (!this.currentSegment)\n break;\n this.currentAttachedFile = {\n fileUid: null,\n fileName: null,\n fileMediaType: null,\n fileData: null,\n fileDescription: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n const tags = this.currentSegment.metadataTags;\n if (this.currentAttachedFile.fileUid && this.currentAttachedFile.fileData) {\n // All attached files get surfaced in the `raw` metadata tags\n tags.raw ??= {};\n tags.raw[this.currentAttachedFile.fileUid.toString()] = new AttachedFile(this.currentAttachedFile.fileData, this.currentAttachedFile.fileMediaType ?? undefined, this.currentAttachedFile.fileName ?? undefined, this.currentAttachedFile.fileDescription ?? undefined);\n }\n // Only process image attachments\n if (this.currentAttachedFile.fileMediaType?.startsWith('image/') && this.currentAttachedFile.fileData) {\n const fileName = this.currentAttachedFile.fileName;\n let kind = 'unknown';\n if (fileName) {\n const lowerName = fileName.toLowerCase();\n if (lowerName.startsWith('cover.')) {\n kind = 'coverFront';\n }\n else if (lowerName.startsWith('back.')) {\n kind = 'coverBack';\n }\n }\n tags.images ??= [];\n tags.images.push({\n data: this.currentAttachedFile.fileData,\n mimeType: this.currentAttachedFile.fileMediaType,\n kind,\n name: this.currentAttachedFile.fileName ?? undefined,\n description: this.currentAttachedFile.fileDescription ?? undefined,\n });\n }\n this.currentAttachedFile = null;\n }\n ;\n break;\n case EBMLId.FileUID:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileUid = readUnsignedBigInt(slice, size);\n }\n ;\n break;\n case EBMLId.FileName:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileName = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.FileMediaType:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileMediaType = readAsciiString(slice, size);\n }\n ;\n break;\n case EBMLId.FileData:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileData = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.FileDescription:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileDescription = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncodings:\n {\n if (!this.currentTrack)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n // \"**MUST** start with the `ContentEncoding` with the highest `ContentEncodingOrder`\"\n this.currentTrack.decodingInstructions.sort((a, b) => b.order - a.order);\n }\n ;\n break;\n case EBMLId.ContentEncoding:\n {\n this.currentDecodingInstruction = {\n order: 0,\n scope: ContentEncodingScope.Block,\n data: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentDecodingInstruction.data) {\n this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction);\n }\n this.currentDecodingInstruction = null;\n }\n ;\n break;\n case EBMLId.ContentEncodingOrder:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.order = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncodingScope:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.scope = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentCompression:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.data = {\n type: 'decompress',\n algorithm: ContentCompAlgo.Zlib,\n settings: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.ContentCompAlgo:\n {\n if (this.currentDecodingInstruction?.data?.type !== 'decompress')\n break;\n this.currentDecodingInstruction.data.algorithm = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentCompSettings:\n {\n if (this.currentDecodingInstruction?.data?.type !== 'decompress')\n break;\n this.currentDecodingInstruction.data.settings = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncryption:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.data = {\n type: 'decrypt',\n };\n }\n ;\n break;\n }\n slice.filePos = dataStartPos + size;\n return true;\n }\n decodeBlockData(track, rawData) {\n assert(track.decodingInstructions.length > 0); // This method shouldn't be called otherwise\n let currentData = rawData;\n for (const instruction of track.decodingInstructions) {\n assert(instruction.data);\n switch (instruction.data.type) {\n case 'decompress':\n {\n switch (instruction.data.algorithm) {\n case ContentCompAlgo.HeaderStripping:\n {\n if (instruction.data.settings && instruction.data.settings.length > 0) {\n const prefix = instruction.data.settings;\n const newData = new Uint8Array(prefix.length + currentData.length);\n newData.set(prefix, 0);\n newData.set(currentData, prefix.length);\n currentData = newData;\n }\n }\n ;\n break;\n default:\n {\n // Unhandled\n }\n ;\n }\n }\n ;\n break;\n default:\n {\n // Unhandled\n }\n ;\n }\n }\n return currentData;\n }\n processTagValue(name, value) {\n if (!this.currentSegment?.metadataTags)\n return;\n const metadataTags = this.currentSegment.metadataTags;\n metadataTags.raw ??= {};\n metadataTags.raw[name] ??= value;\n if (typeof value === 'string') {\n switch (name.toLowerCase()) {\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 'album_artist':\n {\n metadataTags.albumArtist ??= value;\n }\n ;\n break;\n case 'genre':\n {\n metadataTags.genre ??= 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 '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 'track_number':\n case 'part_number':\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 'disc_number':\n case 'disc':\n {\n const discParts = value.split('/');\n const discNum = Number.parseInt(discParts[0], 10);\n const discsTotal = discParts[1] && Number.parseInt(discParts[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 }\n }\n }\n}\nclass MatroskaTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToClusterLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getInternalCodecId() {\n return this.internalTrack.codecId;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return this.internalTrack.name;\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n getTimeResolution() {\n return this.internalTrack.segment.timestampFactor;\n }\n getDisposition() {\n return this.internalTrack.disposition;\n }\n async getFirstPacket(options) {\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n intoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundIfAlmostInteger(timestamp * this.internalTrack.segment.timestampFactor);\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { blockIndex: -1, correctBlockFound: false };\n }\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.timestamp);\n const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1;\n const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { blockIndex, correctBlockFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performClusterLookup(locationInCluster.cluster, (cluster) => {\n if (cluster === locationInCluster.cluster) {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (locationInCluster.blockIndex + 1 < trackData.blocks.length) {\n // We can simply take the next block in the cluster\n return {\n blockIndex: locationInCluster.blockIndex + 1,\n correctBlockFound: true,\n };\n }\n }\n else {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { blockIndex: -1, correctBlockFound: false };\n }\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const block = trackData.blocks[x.blockIndex];\n return block.isKeyFrame && x.timestamp <= timestampInTimescale;\n });\n const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1;\n const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { blockIndex, correctBlockFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performClusterLookup(locationInCluster.cluster, (cluster) => {\n if (cluster === locationInCluster.cluster) {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const nextKeyFrameIndex = trackData.blocks.findIndex((x, i) => x.isKeyFrame && i > locationInCluster.blockIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the cluster\n return {\n blockIndex: nextKeyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n else {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const keyFrameIndex = trackData.blocks.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n blockIndex: keyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n async fetchPacketInCluster(cluster, blockIndex, options) {\n if (blockIndex === -1) {\n return null;\n }\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[blockIndex];\n assert(block);\n // Perform lazy decoding if needed\n if (!block.decoded) {\n block.data = this.internalTrack.demuxer.decodeBlockData(this.internalTrack, block.data);\n block.decoded = true;\n }\n const data = options.metadataOnly ? PLACEHOLDER_DATA : block.data;\n const timestamp = block.timestamp / this.internalTrack.segment.timestampFactor;\n const duration = block.duration / this.internalTrack.segment.timestampFactor;\n const sideData = {};\n if (block.mainAdditional && this.internalTrack.info?.type === 'video' && this.internalTrack.info.alphaMode) {\n sideData.alpha = options.metadataOnly ? PLACEHOLDER_DATA : block.mainAdditional;\n sideData.alphaByteLength = block.mainAdditional.byteLength;\n }\n const packet = new EncodedPacket(data, block.isKeyFrame ? 'key' : 'delta', timestamp, duration, cluster.dataStartPos + blockIndex, block.data.byteLength, sideData);\n this.packetToClusterLocation.set(packet, { cluster, blockIndex });\n return packet;\n }\n /** Looks for a packet in the clusters while trying to load as few clusters as possible to retrieve it. */\n async performClusterLookup(\n // The cluster where we start looking\n startCluster, \n // This function returns the best-matching block in a given cluster\n getMatchInCluster, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct block will not come after it\n latestTimestamp, options) {\n const { demuxer, segment } = this.internalTrack;\n let currentCluster = null;\n let bestCluster = null;\n let bestBlockIndex = -1;\n if (startCluster) {\n const { blockIndex, correctBlockFound } = getMatchInCluster(startCluster);\n if (correctBlockFound) {\n return this.fetchPacketInCluster(startCluster, blockIndex, options);\n }\n if (blockIndex !== -1) {\n bestCluster = startCluster;\n bestBlockIndex = blockIndex;\n }\n }\n // Search for a cue point; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct cluster (or at least nearby).\n const cuePointIndex = binarySearchLessOrEqual(this.internalTrack.cuePoints, searchTimestamp, x => x.time);\n const cuePoint = cuePointIndex !== -1\n ? this.internalTrack.cuePoints[cuePointIndex]\n : null;\n // Also check the position cache\n const positionCacheIndex = binarySearchLessOrEqual(this.internalTrack.clusterPositionCache, searchTimestamp, x => x.startTimestamp);\n const positionCacheEntry = positionCacheIndex !== -1\n ? this.internalTrack.clusterPositionCache[positionCacheIndex]\n : null;\n const lookupEntryPosition = Math.max(cuePoint?.clusterPosition ?? 0, positionCacheEntry?.elementStartPos ?? 0) || null;\n let currentPos;\n if (!startCluster) {\n currentPos = lookupEntryPosition ?? segment.clusterSeekStartPos;\n }\n else {\n if (lookupEntryPosition === null || startCluster.elementStartPos >= lookupEntryPosition) {\n currentPos = startCluster.elementEndPos;\n currentCluster = startCluster;\n }\n else {\n // Use the lookup entry\n currentPos = lookupEntryPosition;\n }\n }\n while (segment.elementEndPos === null || currentPos <= segment.elementEndPos - MIN_HEADER_SIZE) {\n if (currentCluster) {\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n }\n // Load the header\n let slice = demuxer.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 elementStartPos = currentPos;\n const elementHeader = readElementHeader(slice);\n if (!elementHeader\n || (!LEVEL_1_EBML_IDS.includes(elementHeader.id) && elementHeader.id !== EBMLId.Void)) {\n // There's an element here that shouldn't be here. Might be garbage. In this case, let's\n // try and resync to the next valid element.\n const nextPos = await resync(demuxer.reader, elementStartPos, LEVEL_1_EBML_IDS, Math.min(segment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH));\n if (nextPos) {\n currentPos = nextPos;\n continue;\n }\n else {\n break; // Resync failed\n }\n }\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = slice.filePos;\n if (id === EBMLId.Cluster) {\n currentCluster = await demuxer.readCluster(elementStartPos, segment);\n // readCluster computes the proper size even if it's undefined in the header, so let's use that instead\n size = currentCluster.elementEndPos - dataStartPos;\n const { blockIndex, correctBlockFound } = getMatchInCluster(currentCluster);\n if (correctBlockFound) {\n return this.fetchPacketInCluster(currentCluster, blockIndex, options);\n }\n if (blockIndex !== -1) {\n bestCluster = currentCluster;\n bestBlockIndex = blockIndex;\n }\n }\n if (size === null) {\n // Undefined element size (can happen in livestreamed files). In this case, we need to do some\n // searching to determine the actual size of the element.\n assert(id !== EBMLId.Cluster); // Undefined cluster sizes are fixed further up\n // Search for the next element at level 0 or 1\n const nextElementPos = await searchForNextElementId(demuxer.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = nextElementPos.pos - dataStartPos;\n }\n const endPos = dataStartPos + size;\n if (segment.elementEndPos === null) {\n // Check the next element. If it's a new segment, we know this segment ends here. The new\n // segment is just ignored, since we're likely in a livestreamed file and thus only care about\n // the first segment.\n let slice = demuxer.reader.requestSliceRange(endPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const elementId = readElementId(slice);\n if (elementId === EBMLId.Segment) {\n segment.elementEndPos = endPos; // We now know the segment's size\n break;\n }\n }\n currentPos = endPos;\n }\n // Catch faulty cue points\n if (cuePoint && (!bestCluster || bestCluster.elementStartPos < cuePoint.clusterPosition)) {\n // The cue point lied to us! We found a cue point but no cluster there that satisfied the match. In this\n // case, let's search again but using the cue point before that.\n const previousCuePoint = this.internalTrack.cuePoints[cuePointIndex - 1];\n assert(!previousCuePoint || previousCuePoint.time < cuePoint.time);\n const newSearchTimestamp = previousCuePoint?.time ?? -Infinity;\n return this.performClusterLookup(null, getMatchInCluster, newSearchTimestamp, latestTimestamp, options);\n }\n if (bestCluster) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n return this.fetchPacketInCluster(bestCluster, bestBlockIndex, options);\n }\n return null;\n }\n}\nclass MatroskaVideoTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.info.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async canBeTransparent() {\n return this.internalTrack.info.alphaMode;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n let firstPacket = null;\n const needsPacketForAdditionalInfo = this.internalTrack.info.codec === 'vp9'\n || this.internalTrack.info.codec === 'av1'\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'avc' && !this.internalTrack.info.codecDescription)\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'hevc' && !this.internalTrack.info.codecDescription);\n if (needsPacketForAdditionalInfo) {\n firstPacket = await this.getFirstPacket({});\n }\n return {\n codec: extractVideoCodecString({\n width: this.internalTrack.info.width,\n height: this.internalTrack.info.height,\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n colorSpace: this.internalTrack.info.colorSpace,\n avcType: 1, // We don't know better (or do we?) so just assume 'avc1'\n avcCodecInfo: this.internalTrack.info.codec === 'avc' && firstPacket\n ? extractAvcDecoderConfigurationRecord(firstPacket.data)\n : null,\n hevcCodecInfo: this.internalTrack.info.codec === 'hevc' && firstPacket\n ? extractHevcDecoderConfigurationRecord(firstPacket.data)\n : null,\n vp9CodecInfo: this.internalTrack.info.codec === 'vp9' && firstPacket\n ? extractVp9CodecInfoFromPacket(firstPacket.data)\n : null,\n av1CodecInfo: this.internalTrack.info.codec === 'av1' && firstPacket\n ? extractAv1CodecInfoFromPacket(firstPacket.data)\n : null,\n }),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass MatroskaAudioTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString({\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n aacCodecInfo: this.internalTrack.info.aacCodecInfo,\n }),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\n","/*!\n * Copyright (c) 2025-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) 2025-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 { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { getXingOffset, INFO, XING } from '../../shared/mp3-misc.js';\nimport { ID3_V1_TAG_SIZE, ID3_V2_HEADER_SIZE, parseId3V1Tag, parseId3V2Tag, readId3V2Header, } from '../id3.js';\nimport { readNextFrameHeader } from './mp3-reader.js';\nimport { readAscii, readBytes, readU32Be } from '../reader.js';\nexport class Mp3Demuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos\n this.metadataTags = null;\n this.tracks = [];\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.lastLoadedPos = 0;\n this.nextTimestampInSamples = 0;\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n // Keep loading until we find the first frame header\n while (!this.firstFrameHeader && !this.lastSampleLoaded) {\n await this.advanceReader();\n }\n if (!this.firstFrameHeader) {\n throw new Error('No valid MP3 frame found.');\n }\n this.tracks = [new InputAudioTrack(this.input, new Mp3AudioTrackBacking(this))];\n })();\n }\n async advanceReader() {\n if (this.lastLoadedPos === 0) {\n // Let's skip all ID3v2 tags at the start of the file\n while (true) {\n let slice = this.reader.requestSlice(this.lastLoadedPos, ID3_V2_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n this.lastSampleLoaded = true;\n return;\n }\n const id3V2Header = readId3V2Header(slice);\n if (!id3V2Header) {\n break;\n }\n this.lastLoadedPos = slice.filePos + id3V2Header.size;\n }\n }\n const result = await readNextFrameHeader(this.reader, this.lastLoadedPos, this.reader.fileSize);\n if (!result) {\n this.lastSampleLoaded = true;\n return;\n }\n const header = result.header;\n this.lastLoadedPos = result.startPos + header.totalSize - 1; // -1 in case the frame is 1 byte too short\n const xingOffset = getXingOffset(header.mpegVersionId, header.channel);\n let slice = this.reader.requestSlice(result.startPos + xingOffset, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n const word = readU32Be(slice);\n const isXing = word === XING || word === INFO;\n if (isXing) {\n // There's no actual audio data in this frame, so let's skip it\n return;\n }\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n if (header.sampleRate !== this.firstFrameHeader.sampleRate) {\n console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${header.sampleRate} Hz.`\n + ` Might be a bug, so please report this file.`);\n }\n const sampleDuration = header.audioSamplesInFrame / this.firstFrameHeader.sampleRate;\n const sample = {\n timestamp: this.nextTimestampInSamples / this.firstFrameHeader.sampleRate,\n duration: sampleDuration,\n dataStart: result.startPos,\n dataSize: header.totalSize,\n };\n this.loadedSamples.push(sample);\n this.nextTimestampInSamples += header.audioSamplesInFrame;\n return;\n }\n async getMimeType() {\n return 'audio/mpeg';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getMetadataTags() {\n const release = await this.readingMutex.acquire();\n try {\n await this.readMetadata();\n if (this.metadataTags) {\n return this.metadataTags;\n }\n this.metadataTags = {};\n let currentPos = 0;\n let id3V2HeaderFound = false;\n while (true) {\n let headerSlice = this.reader.requestSlice(currentPos, ID3_V2_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice)\n break;\n const id3V2Header = readId3V2Header(headerSlice);\n if (!id3V2Header) {\n break;\n }\n id3V2HeaderFound = true;\n let contentSlice = this.reader.requestSlice(headerSlice.filePos, id3V2Header.size);\n if (contentSlice instanceof Promise)\n contentSlice = await contentSlice;\n if (!contentSlice)\n break;\n parseId3V2Tag(contentSlice, id3V2Header, this.metadataTags);\n currentPos = headerSlice.filePos + id3V2Header.size;\n }\n if (!id3V2HeaderFound && this.reader.fileSize !== null && this.reader.fileSize >= ID3_V1_TAG_SIZE) {\n // Try reading an ID3v1 tag at the end of the file\n let slice = this.reader.requestSlice(this.reader.fileSize - ID3_V1_TAG_SIZE, ID3_V1_TAG_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const tag = readAscii(slice, 3);\n if (tag === 'TAG') {\n parseId3V1Tag(slice, this.metadataTags);\n }\n }\n return this.metadataTags;\n }\n finally {\n release();\n }\n }\n}\nclass Mp3AudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'mp3';\n }\n getInternalCodecId() {\n return null;\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n return {\n codec: 'mp3',\n numberOfChannels: this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2,\n sampleRate: this.demuxer.firstFrameHeader.sampleRate,\n };\n }\n async getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const sampleIndex = binarySearchExact(this.demuxer.loadedSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n const nextIndex = sampleIndex + 1;\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const index = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.timestamp);\n if (index === -1 && this.demuxer.loadedSamples.length > 0) {\n // We're before the first sample\n return null;\n }\n if (this.demuxer.lastSampleLoaded) {\n // All data is loaded, return what we found\n return this.getPacketAtIndex(index, options);\n }\n if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) {\n // The next packet also exists, we're done\n return this.getPacketAtIndex(index, options);\n }\n // Otherwise, keep loading data\n await this.demuxer.advanceReader();\n }\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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 FRAME_HEADER_SIZE = 4;\nexport const SAMPLING_RATES = [44100, 48000, 32000];\nexport const KILOBIT_RATES = [\n // lowSamplingFrequency === 0\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // layer = 0\n -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1, // layer 1\n -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1, // layer = 2\n -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1, // layer = 3\n // lowSamplingFrequency === 1\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // layer = 0\n -1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1, // layer = 1\n -1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1, // layer = 2\n -1, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1, // layer = 3\n];\n/** 'Xing' */\nexport const XING = 0x58696e67;\n/** 'Info' */\nexport const INFO = 0x496e666f;\nexport const computeMp3FrameSize = (lowSamplingFrequency, layer, bitrate, sampleRate, padding) => {\n if (layer === 0) {\n return 0; // Not expected that this is hit\n }\n else if (layer === 1) {\n return Math.floor(144 * bitrate / (sampleRate << lowSamplingFrequency)) + padding;\n }\n else if (layer === 2) {\n return Math.floor(144 * bitrate / sampleRate) + padding;\n }\n else { // layer === 3\n return (Math.floor(12 * bitrate / sampleRate) + padding) * 4;\n }\n};\nexport const getXingOffset = (mpegVersionId, channel) => {\n return mpegVersionId === 3\n ? (channel === 3 ? 21 : 36)\n : (channel === 3 ? 13 : 21);\n};\nexport const readFrameHeader = (word, remainingBytes) => {\n const firstByte = word >>> 24;\n const secondByte = (word >>> 16) & 0xff;\n const thirdByte = (word >>> 8) & 0xff;\n const fourthByte = word & 0xff;\n if (firstByte !== 0xff && secondByte !== 0xff && thirdByte !== 0xff && fourthByte !== 0xff) {\n return {\n header: null,\n bytesAdvanced: 4,\n };\n }\n if (firstByte !== 0xff) {\n return { header: null, bytesAdvanced: 1 };\n }\n if ((secondByte & 0xe0) !== 0xe0) {\n return { header: null, bytesAdvanced: 1 };\n }\n let lowSamplingFrequency = 0;\n let mpeg25 = 0;\n if (secondByte & (1 << 4)) {\n lowSamplingFrequency = (secondByte & (1 << 3)) ? 0 : 1;\n }\n else {\n lowSamplingFrequency = 1;\n mpeg25 = 1;\n }\n const mpegVersionId = (secondByte >> 3) & 0x3;\n const layer = (secondByte >> 1) & 0x3;\n const bitrateIndex = (thirdByte >> 4) & 0xf;\n const frequencyIndex = ((thirdByte >> 2) & 0x3) % 3;\n const padding = (thirdByte >> 1) & 0x1;\n const channel = (fourthByte >> 6) & 0x3;\n const modeExtension = (fourthByte >> 4) & 0x3;\n const copyright = (fourthByte >> 3) & 0x1;\n const original = (fourthByte >> 2) & 0x1;\n const emphasis = fourthByte & 0x3;\n const kilobitRate = KILOBIT_RATES[lowSamplingFrequency * 16 * 4 + layer * 16 + bitrateIndex];\n if (kilobitRate === -1) {\n return { header: null, bytesAdvanced: 1 };\n }\n const bitrate = kilobitRate * 1000;\n const sampleRate = SAMPLING_RATES[frequencyIndex] >> (lowSamplingFrequency + mpeg25);\n const frameLength = computeMp3FrameSize(lowSamplingFrequency, layer, bitrate, sampleRate, padding);\n if (remainingBytes !== null && remainingBytes < frameLength) {\n // The frame doesn't fit into the rest of the file\n return { header: null, bytesAdvanced: 1 };\n }\n let audioSamplesInFrame;\n if (mpegVersionId === 3) {\n audioSamplesInFrame = layer === 3 ? 384 : 1152;\n }\n else {\n if (layer === 3) {\n audioSamplesInFrame = 384;\n }\n else if (layer === 2) {\n audioSamplesInFrame = 1152;\n }\n else {\n audioSamplesInFrame = 576;\n }\n }\n return {\n header: {\n totalSize: frameLength,\n mpegVersionId,\n layer,\n bitrate,\n frequencyIndex,\n sampleRate,\n channel,\n modeExtension,\n copyright,\n original,\n emphasis,\n audioSamplesInFrame,\n },\n bytesAdvanced: 1,\n };\n};\nexport const encodeSynchsafe = (unsynchsafed) => {\n let mask = 0x7f;\n let synchsafed = 0;\n let unsynchsafedRest = unsynchsafed;\n while ((mask ^ 0x7fffffff) !== 0) {\n synchsafed = unsynchsafedRest & ~mask;\n synchsafed <<= 1;\n synchsafed |= unsynchsafedRest & mask;\n mask = ((mask + 1) << 8) - 1;\n unsynchsafedRest = synchsafed;\n }\n return synchsafed;\n};\nexport const decodeSynchsafe = (synchsafed) => {\n let mask = 0x7f000000;\n let unsynchsafed = 0;\n while (mask !== 0) {\n unsynchsafed >>= 1;\n unsynchsafed |= synchsafed & mask;\n mask >>= 8;\n }\n return unsynchsafed;\n};\n","/*!\n * Copyright (c) 2025-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 { decodeSynchsafe, encodeSynchsafe } from '../shared/mp3-misc.js';\nimport { coalesceIndex, textDecoder, textEncoder, isIso88591Compatible, assertNever, keyValueIterator, toDataView, } from './misc.js';\nimport { readAscii, readBytes, readU32Be, readU8 } from './reader.js';\nexport var Id3V2HeaderFlags;\n(function (Id3V2HeaderFlags) {\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"Unsynchronisation\"] = 128] = \"Unsynchronisation\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"ExtendedHeader\"] = 64] = \"ExtendedHeader\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"ExperimentalIndicator\"] = 32] = \"ExperimentalIndicator\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"Footer\"] = 16] = \"Footer\";\n})(Id3V2HeaderFlags || (Id3V2HeaderFlags = {}));\nexport var Id3V2TextEncoding;\n(function (Id3V2TextEncoding) {\n Id3V2TextEncoding[Id3V2TextEncoding[\"ISO_8859_1\"] = 0] = \"ISO_8859_1\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_16_WITH_BOM\"] = 1] = \"UTF_16_WITH_BOM\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_16_BE_NO_BOM\"] = 2] = \"UTF_16_BE_NO_BOM\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_8\"] = 3] = \"UTF_8\";\n})(Id3V2TextEncoding || (Id3V2TextEncoding = {}));\nexport const ID3_V1_TAG_SIZE = 128;\nexport const ID3_V2_HEADER_SIZE = 10;\nexport const ID3_V1_GENRES = [\n 'Blues', 'Classic rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-hop', 'Jazz',\n 'Metal', 'New age', 'Oldies', 'Other', 'Pop', 'Rhythm and blues', 'Rap', 'Reggae', 'Rock',\n 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death metal', 'Pranks', 'Soundtrack',\n 'Euro-techno', 'Ambient', 'Trip-hop', 'Vocal', 'Jazz & funk', 'Fusion', 'Trance', 'Classical',\n 'Instrumental', 'Acid', 'House', 'Game', 'Sound clip', 'Gospel', 'Noise', 'Alternative rock',\n 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental pop', 'Instrumental rock',\n 'Ethnic', 'Gothic', 'Darkwave', 'Techno-industrial', 'Electronic', 'Pop-folk', 'Eurodance',\n 'Dream', 'Southern rock', 'Comedy', 'Cult', 'Gangsta', 'Top 40', 'Christian rap', 'Pop/funk',\n 'Jungle music', 'Native US', 'Cabaret', 'New wave', 'Psychedelic', 'Rave', 'Showtunes',\n 'Trailer', 'Lo-fi', 'Tribal', 'Acid punk', 'Acid jazz', 'Polka', 'Retro', 'Musical',\n 'Rock \\'n\\' roll', 'Hard rock', 'Folk', 'Folk rock', 'National folk', 'Swing', 'Fast fusion',\n 'Bebop', 'Latin', 'Revival', 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic rock',\n 'Progressive rock', 'Psychedelic rock', 'Symphonic rock', 'Slow rock', 'Big band', 'Chorus',\n 'Easy listening', 'Acoustic', 'Humour', 'Speech', 'Chanson', 'Opera', 'Chamber music',\n 'Sonata', 'Symphony', 'Booty bass', 'Primus', 'Porn groove', 'Satire', 'Slow jam', 'Club',\n 'Tango', 'Samba', 'Folklore', 'Ballad', 'Power ballad', 'Rhythmic Soul', 'Freestyle', 'Duet',\n 'Punk rock', 'Drum solo', 'A cappella', 'Euro-house', 'Dance hall', 'Goa music', 'Drum & bass',\n 'Club-house', 'Hardcore techno', 'Terror', 'Indie', 'Britpop', 'Negerpunk', 'Polsk punk',\n 'Beat', 'Christian gangsta rap', 'Heavy metal', 'Black metal', 'Crossover',\n 'Contemporary Christian', 'Christian rock', 'Merengue', 'Salsa', 'Thrash metal', 'Anime',\n 'Jpop', 'Synthpop', 'Christmas', 'Art rock', 'Baroque', 'Bhangra', 'Big beat', 'Breakbeat',\n 'Chillout', 'Downtempo', 'Dub', 'EBM', 'Eclectic', 'Electro', 'Electroclash', 'Emo',\n 'Experimental', 'Garage', 'Global', 'IDM', 'Illbient', 'Industro-Goth', 'Jam Band',\n 'Krautrock', 'Leftfield', 'Lounge', 'Math rock', 'New romantic', 'Nu-breakz', 'Post-punk',\n 'Post-rock', 'Psytrance', 'Shoegaze', 'Space rock', 'Trop rock', 'World music', 'Neoclassical',\n 'Audiobook', 'Audio theatre', 'Neue Deutsche Welle', 'Podcast', 'Indie rock', 'G-Funk',\n 'Dubstep', 'Garage rock', 'Psybient',\n];\nexport const parseId3V1Tag = (slice, tags) => {\n const startPos = slice.filePos;\n tags.raw ??= {};\n tags.raw['TAG'] ??= readBytes(slice, ID3_V1_TAG_SIZE - 3); // Dump the whole tag into the raw metadata\n slice.filePos = startPos;\n const title = readId3V1String(slice, 30);\n if (title)\n tags.title ??= title;\n const artist = readId3V1String(slice, 30);\n if (artist)\n tags.artist ??= artist;\n const album = readId3V1String(slice, 30);\n if (album)\n tags.album ??= album;\n const yearText = readId3V1String(slice, 4);\n const year = Number.parseInt(yearText, 10);\n if (Number.isInteger(year) && year > 0) {\n tags.date ??= new Date(year, 0, 1);\n }\n const commentBytes = readBytes(slice, 30);\n let comment;\n // Check for the ID3v1.1 track number format:\n // The 29th byte (index 28) is a null terminator, and the 30th byte is the track number.\n if (commentBytes[28] === 0 && commentBytes[29] !== 0) {\n const trackNum = commentBytes[29];\n if (trackNum > 0) {\n tags.trackNumber ??= trackNum;\n }\n slice.skip(-30);\n comment = readId3V1String(slice, 28);\n slice.skip(2);\n }\n else {\n slice.skip(-30);\n comment = readId3V1String(slice, 30);\n }\n if (comment)\n tags.comment ??= comment;\n const genreIndex = readU8(slice);\n if (genreIndex < ID3_V1_GENRES.length) {\n tags.genre ??= ID3_V1_GENRES[genreIndex];\n }\n};\nexport const readId3V1String = (slice, length) => {\n const bytes = readBytes(slice, length);\n const endIndex = coalesceIndex(bytes.indexOf(0), bytes.length);\n const relevantBytes = bytes.subarray(0, endIndex);\n // Decode as ISO-8859-1\n let str = '';\n for (let i = 0; i < relevantBytes.length; i++) {\n str += String.fromCharCode(relevantBytes[i]);\n }\n return str.trimEnd(); // String also may be padded with spaces\n};\nexport const readId3V2Header = (slice) => {\n const startPos = slice.filePos;\n const tag = readAscii(slice, 3);\n const majorVersion = readU8(slice);\n const revision = readU8(slice);\n const flags = readU8(slice);\n const sizeRaw = readU32Be(slice);\n if (tag !== 'ID3' || majorVersion === 0xff || revision === 0xff || (sizeRaw & 0x80808080) !== 0) {\n slice.filePos = startPos;\n return null;\n }\n const size = decodeSynchsafe(sizeRaw);\n return { majorVersion, revision, flags, size };\n};\nexport const parseId3V2Tag = (slice, header, tags) => {\n // https://id3.org/id3v2.3.0\n if (![2, 3, 4].includes(header.majorVersion)) {\n console.warn(`Unsupported ID3v2 major version: ${header.majorVersion}`);\n return;\n }\n const bytes = readBytes(slice, header.size);\n const reader = new Id3V2Reader(header, bytes);\n if (header.flags & Id3V2HeaderFlags.Footer) {\n reader.removeFooter();\n }\n if ((header.flags & Id3V2HeaderFlags.Unsynchronisation) && header.majorVersion === 3) {\n reader.ununsynchronizeAll();\n }\n if (header.flags & Id3V2HeaderFlags.ExtendedHeader) {\n const extendedHeaderSize = reader.readU32();\n if (header.majorVersion === 3) {\n reader.pos += extendedHeaderSize; // The extended header size excludes itself\n }\n else {\n reader.pos += extendedHeaderSize - 4; // The extended header size includes itself\n }\n }\n while (reader.pos <= reader.bytes.length - reader.frameHeaderSize()) {\n const frame = reader.readId3V2Frame();\n if (!frame) {\n break;\n }\n const frameStartPos = reader.pos;\n const frameEndPos = reader.pos + frame.size;\n let frameEncrypted = false;\n let frameCompressed = false;\n let frameUnsynchronized = false;\n if (header.majorVersion === 3) {\n frameEncrypted = !!(frame.flags & (1 << 6));\n frameCompressed = !!(frame.flags & (1 << 7));\n }\n else if (header.majorVersion === 4) {\n frameEncrypted = !!(frame.flags & (1 << 2));\n frameCompressed = !!(frame.flags & (1 << 3));\n frameUnsynchronized = !!(frame.flags & (1 << 1))\n || !!(header.flags & Id3V2HeaderFlags.Unsynchronisation);\n }\n if (frameEncrypted) {\n console.warn(`Skipping encrypted ID3v2 frame ${frame.id}`);\n reader.pos = frameEndPos;\n continue;\n }\n if (frameCompressed) {\n console.warn(`Skipping compressed ID3v2 frame ${frame.id}`); // Maybe someday? Idk\n reader.pos = frameEndPos;\n continue;\n }\n if (frameUnsynchronized) {\n reader.ununsynchronizeRegion(reader.pos, frameEndPos);\n }\n tags.raw ??= {};\n if (frame.id[0] === 'T') {\n // It's a text frame, let's decode as text\n tags.raw[frame.id] ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n else {\n // For the others, let's just get the bytes\n tags.raw[frame.id] ??= reader.readBytes(frame.size);\n }\n reader.pos = frameStartPos;\n switch (frame.id) {\n case 'TIT2':\n case 'TT2':\n {\n tags.title ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TIT3':\n case 'TT3':\n {\n tags.description ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TPE1':\n case 'TP1':\n {\n tags.artist ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TALB':\n case 'TAL':\n {\n tags.album ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TPE2':\n case 'TP2':\n {\n tags.albumArtist ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TRCK':\n case 'TRK':\n {\n const trackText = reader.readId3V2EncodingAndText(frameEndPos);\n const parts = trackText.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 tags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n tags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'TPOS':\n case 'TPA':\n {\n const discText = reader.readId3V2EncodingAndText(frameEndPos);\n const parts = discText.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 tags.discNumber ??= discNum;\n }\n if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) {\n tags.discsTotal ??= discsTotal;\n }\n }\n ;\n break;\n case 'TCON':\n case 'TCO':\n {\n const genreText = reader.readId3V2EncodingAndText(frameEndPos);\n let match = /^\\((\\d+)\\)/.exec(genreText);\n if (match) {\n const genreNumber = Number.parseInt(match[1]);\n if (ID3_V1_GENRES[genreNumber] !== undefined) {\n tags.genre ??= ID3_V1_GENRES[genreNumber];\n break;\n }\n }\n match = /^\\d+$/.exec(genreText);\n if (match) {\n const genreNumber = Number.parseInt(match[0]);\n if (ID3_V1_GENRES[genreNumber] !== undefined) {\n tags.genre ??= ID3_V1_GENRES[genreNumber];\n break;\n }\n }\n tags.genre ??= genreText;\n }\n ;\n break;\n case 'TDRC':\n case 'TDAT':\n {\n const dateText = reader.readId3V2EncodingAndText(frameEndPos);\n const date = new Date(dateText);\n if (!Number.isNaN(date.getTime())) {\n tags.date ??= date;\n }\n }\n ;\n break;\n case 'TYER':\n case 'TYE':\n {\n const yearText = reader.readId3V2EncodingAndText(frameEndPos);\n const year = Number.parseInt(yearText, 10);\n if (Number.isInteger(year)) {\n tags.date ??= new Date(year, 0, 1);\n }\n }\n ;\n break;\n case 'USLT':\n case 'ULT':\n {\n const encoding = reader.readU8();\n reader.pos += 3; // Skip language\n reader.readId3V2Text(encoding, frameEndPos); // Short content description\n tags.lyrics ??= reader.readId3V2Text(encoding, frameEndPos);\n }\n ;\n break;\n case 'COMM':\n case 'COM':\n {\n const encoding = reader.readU8();\n reader.pos += 3; // Skip language\n reader.readId3V2Text(encoding, frameEndPos); // Short content description\n tags.comment ??= reader.readId3V2Text(encoding, frameEndPos);\n }\n ;\n break;\n case 'APIC':\n case 'PIC':\n {\n const encoding = reader.readId3V2TextEncoding();\n let mimeType;\n if (header.majorVersion === 2) {\n const imageFormat = reader.readAscii(3);\n mimeType = imageFormat === 'PNG'\n ? 'image/png'\n : imageFormat === 'JPG'\n ? 'image/jpeg'\n : 'image/*';\n }\n else {\n mimeType = reader.readId3V2Text(encoding, frameEndPos);\n }\n const pictureType = reader.readU8();\n const description = reader.readId3V2Text(encoding, frameEndPos).trimEnd(); // Trim ending spaces\n const imageDataSize = frameEndPos - reader.pos;\n if (imageDataSize >= 0) {\n const imageData = reader.readBytes(imageDataSize);\n if (!tags.images)\n tags.images = [];\n tags.images.push({\n data: imageData,\n mimeType,\n kind: pictureType === 3\n ? 'coverFront'\n : pictureType === 4\n ? 'coverBack'\n : 'unknown',\n description,\n });\n }\n }\n ;\n break;\n default:\n {\n reader.pos += frame.size;\n }\n ;\n break;\n }\n reader.pos = frameEndPos;\n }\n};\n// https://id3.org/id3v2.3.0\nexport class Id3V2Reader {\n constructor(header, bytes) {\n this.header = header;\n this.bytes = bytes;\n this.pos = 0;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n frameHeaderSize() {\n return this.header.majorVersion === 2 ? 6 : 10;\n }\n ununsynchronizeAll() {\n const newBytes = [];\n for (let i = 0; i < this.bytes.length; i++) {\n const value1 = this.bytes[i];\n newBytes.push(value1);\n if (value1 === 0xff && i !== this.bytes.length - 1) {\n const value2 = this.bytes[i];\n if (value2 === 0x00) {\n i++;\n }\n }\n }\n this.bytes = new Uint8Array(newBytes);\n this.view = new DataView(this.bytes.buffer);\n }\n ununsynchronizeRegion(start, end) {\n const newBytes = [];\n for (let i = start; i < end; i++) {\n const value1 = this.bytes[i];\n newBytes.push(value1);\n if (value1 === 0xff && i !== end - 1) {\n const value2 = this.bytes[i + 1];\n if (value2 === 0x00) {\n i++;\n }\n }\n }\n const before = this.bytes.subarray(0, start);\n const after = this.bytes.subarray(end);\n this.bytes = new Uint8Array(before.length + newBytes.length + after.length);\n this.bytes.set(before, 0);\n this.bytes.set(newBytes, before.length);\n this.bytes.set(after, before.length + newBytes.length);\n this.view = new DataView(this.bytes.buffer);\n }\n removeFooter() {\n this.bytes = this.bytes.subarray(0, this.bytes.length - ID3_V2_HEADER_SIZE);\n this.view = new DataView(this.bytes.buffer);\n }\n readBytes(length) {\n const slice = this.bytes.subarray(this.pos, this.pos + length);\n this.pos += length;\n return slice;\n }\n readU8() {\n const value = this.view.getUint8(this.pos);\n this.pos += 1;\n return value;\n }\n readU16() {\n const value = this.view.getUint16(this.pos, false);\n this.pos += 2;\n return value;\n }\n readU24() {\n const high = this.view.getUint16(this.pos, false);\n const low = this.view.getUint8(this.pos + 1);\n this.pos += 3;\n return high * 0x100 + low;\n }\n readU32() {\n const value = this.view.getUint32(this.pos, false);\n this.pos += 4;\n return value;\n }\n readAscii(length) {\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(this.view.getUint8(this.pos + i));\n }\n this.pos += length;\n return str;\n }\n readId3V2Frame() {\n if (this.header.majorVersion === 2) {\n const id = this.readAscii(3);\n if (id === '\\x00\\x00\\x00') {\n return null;\n }\n const size = this.readU24();\n return { id, size, flags: 0 };\n }\n else {\n const id = this.readAscii(4);\n if (id === '\\x00\\x00\\x00\\x00') {\n // We've landed in the padding section\n return null;\n }\n const sizeRaw = this.readU32();\n let size = this.header.majorVersion === 4\n ? decodeSynchsafe(sizeRaw)\n : sizeRaw;\n const flags = this.readU16();\n const headerEndPos = this.pos;\n // Some files may have incorrectly synchsafed/unsynchsafed sizes. To validate which interpretation is valid,\n // we validate a size by skipping ahead and seeing if we land at a valid frame header (or at the end of the\n // tag.\n const isSizeValid = (size) => {\n const nextPos = this.pos + size;\n if (nextPos > this.bytes.length) {\n return false;\n }\n if (nextPos <= this.bytes.length - this.frameHeaderSize()) {\n this.pos += size;\n const nextId = this.readAscii(4);\n if (nextId !== '\\x00\\x00\\x00\\x00' && !/[0-9A-Z]{4}/.test(nextId)) {\n return false;\n }\n }\n return true;\n };\n if (!isSizeValid(size)) {\n // Flip the synchsafing, and try if this one makes more sense\n const otherSize = this.header.majorVersion === 4\n ? sizeRaw\n : decodeSynchsafe(sizeRaw);\n if (isSizeValid(otherSize)) {\n size = otherSize;\n }\n }\n this.pos = headerEndPos;\n return { id, size, flags };\n }\n }\n readId3V2TextEncoding() {\n const number = this.readU8();\n if (number > 3) {\n throw new Error(`Unsupported text encoding: ${number}`);\n }\n return number;\n }\n readId3V2Text(encoding, until) {\n const startPos = this.pos;\n const data = this.readBytes(until - this.pos);\n switch (encoding) {\n case Id3V2TextEncoding.ISO_8859_1: {\n let str = '';\n for (let i = 0; i < data.length; i++) {\n const value = data[i];\n if (value === 0) {\n this.pos = startPos + i + 1;\n break;\n }\n str += String.fromCharCode(value);\n }\n return str;\n }\n case Id3V2TextEncoding.UTF_16_WITH_BOM: {\n if (data[0] === 0xff && data[1] === 0xfe) {\n const decoder = new TextDecoder('utf-16le');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(2, endIndex));\n }\n else if (data[0] === 0xfe && data[1] === 0xff) {\n const decoder = new TextDecoder('utf-16be');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(2, endIndex));\n }\n else {\n // Treat it like UTF-8, some files do this\n const endIndex = coalesceIndex(data.findIndex(x => x === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 1, data.length);\n return textDecoder.decode(data.subarray(0, endIndex));\n }\n }\n case Id3V2TextEncoding.UTF_16_BE_NO_BOM: {\n const decoder = new TextDecoder('utf-16be');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(0, endIndex));\n }\n case Id3V2TextEncoding.UTF_8: {\n const endIndex = coalesceIndex(data.findIndex(x => x === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 1, data.length);\n return textDecoder.decode(data.subarray(0, endIndex));\n }\n }\n }\n readId3V2EncodingAndText(until) {\n if (this.pos >= until) {\n return '';\n }\n const encoding = this.readId3V2TextEncoding();\n return this.readId3V2Text(encoding, until);\n }\n}\nexport class Id3V2Writer {\n constructor(writer) {\n this.helper = new Uint8Array(8);\n this.helperView = toDataView(this.helper);\n this.writer = writer;\n }\n writeId3V2Tag(metadata) {\n const tagStartPos = this.writer.getPos();\n // Write ID3v2.4 header\n this.writeAscii('ID3');\n this.writeU8(0x04); // Version 2.4\n this.writeU8(0x00); // Revision 0\n this.writeU8(0x00); // Flags\n this.writeSynchsafeU32(0); // Size placeholder\n const framesStartPos = this.writer.getPos();\n const writtenTags = new Set();\n // Write all metadata frames\n for (const { key, value } of keyValueIterator(metadata)) {\n switch (key) {\n case 'title':\n {\n this.writeId3V2TextFrame('TIT2', value);\n writtenTags.add('TIT2');\n }\n ;\n break;\n case 'description':\n {\n this.writeId3V2TextFrame('TIT3', value);\n writtenTags.add('TIT3');\n }\n ;\n break;\n case 'artist':\n {\n this.writeId3V2TextFrame('TPE1', value);\n writtenTags.add('TPE1');\n }\n ;\n break;\n case 'album':\n {\n this.writeId3V2TextFrame('TALB', value);\n writtenTags.add('TALB');\n }\n ;\n break;\n case 'albumArtist':\n {\n this.writeId3V2TextFrame('TPE2', value);\n writtenTags.add('TPE2');\n }\n ;\n break;\n case 'trackNumber':\n {\n const string = metadata.tracksTotal !== undefined\n ? `${value}/${metadata.tracksTotal}`\n : value.toString();\n this.writeId3V2TextFrame('TRCK', string);\n writtenTags.add('TRCK');\n }\n ;\n break;\n case 'discNumber':\n {\n const string = metadata.discsTotal !== undefined\n ? `${value}/${metadata.discsTotal}`\n : value.toString();\n this.writeId3V2TextFrame('TPOS', string);\n writtenTags.add('TPOS');\n }\n ;\n break;\n case 'genre':\n {\n this.writeId3V2TextFrame('TCON', value);\n writtenTags.add('TCON');\n }\n ;\n break;\n case 'date':\n {\n this.writeId3V2TextFrame('TDRC', value.toISOString().slice(0, 10));\n writtenTags.add('TDRC');\n }\n ;\n break;\n case 'lyrics':\n {\n this.writeId3V2LyricsFrame(value);\n writtenTags.add('USLT');\n }\n ;\n break;\n case 'comment':\n {\n this.writeId3V2CommentFrame(value);\n writtenTags.add('COMM');\n }\n ;\n break;\n case 'images':\n {\n const pictureTypeMap = { coverFront: 0x03, coverBack: 0x04, unknown: 0x00 };\n for (const image of value) {\n const pictureType = pictureTypeMap[image.kind] ?? 0x00;\n const description = image.description ?? '';\n this.writeId3V2ApicFrame(image.mimeType, pictureType, description, image.data);\n }\n }\n ;\n break;\n case 'tracksTotal':\n case 'discsTotal':\n {\n // Handled with trackNumber and discNumber respectively\n }\n ;\n break;\n case 'raw':\n {\n // Handled later\n }\n ;\n break;\n default: {\n assertNever(key);\n }\n }\n }\n if (metadata.raw) {\n for (const key in metadata.raw) {\n const value = metadata.raw[key];\n if (value == null || key.length !== 4 || writtenTags.has(key)) {\n continue;\n }\n let bytes;\n if (typeof value === 'string') {\n const encoded = textEncoder.encode(value);\n bytes = new Uint8Array(encoded.byteLength + 2);\n bytes[0] = Id3V2TextEncoding.UTF_8;\n bytes.set(encoded, 1);\n // Last byte is the null terminator\n }\n else if (value instanceof Uint8Array) {\n bytes = value;\n }\n else {\n continue;\n }\n this.writeAscii(key);\n this.writeSynchsafeU32(bytes.byteLength);\n this.writeU16(0x0000);\n this.writer.write(bytes);\n }\n }\n const framesEndPos = this.writer.getPos();\n const framesSize = framesEndPos - framesStartPos;\n // Update the size field in the header (synchsafe)\n this.writer.seek(tagStartPos + 6); // Skip 'ID3' + version + revision + flags\n this.writeSynchsafeU32(framesSize);\n this.writer.seek(framesEndPos);\n return framesSize + 10; // +10 for the header size\n }\n writeU8(value) {\n this.helper[0] = value;\n this.writer.write(this.helper.subarray(0, 1));\n }\n writeU16(value) {\n this.helperView.setUint16(0, value, false);\n this.writer.write(this.helper.subarray(0, 2));\n }\n writeU32(value) {\n this.helperView.setUint32(0, value, false);\n this.writer.write(this.helper.subarray(0, 4));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n this.helper[i] = text.charCodeAt(i);\n }\n this.writer.write(this.helper.subarray(0, text.length));\n }\n writeSynchsafeU32(value) {\n this.writeU32(encodeSynchsafe(value));\n }\n writeIsoString(text) {\n const bytes = new Uint8Array(text.length + 1);\n for (let i = 0; i < text.length; i++) {\n bytes[i] = text.charCodeAt(i);\n }\n bytes[text.length] = 0x00;\n this.writer.write(bytes);\n }\n writeUtf8String(text) {\n const utf8Data = textEncoder.encode(text);\n this.writer.write(utf8Data);\n this.writeU8(0x00);\n }\n writeId3V2TextFrame(frameId, text) {\n const useIso88591 = isIso88591Compatible(text);\n const textDataLength = useIso88591 ? text.length : textEncoder.encode(text).byteLength;\n const frameSize = 1 + textDataLength + 1;\n this.writeAscii(frameId);\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n if (useIso88591) {\n this.writeIsoString(text);\n }\n else {\n this.writeUtf8String(text);\n }\n }\n writeId3V2LyricsFrame(lyrics) {\n const useIso88591 = isIso88591Compatible(lyrics);\n const shortDescription = '';\n const frameSize = 1 + 3 + shortDescription.length + 1 + lyrics.length + 1;\n this.writeAscii('USLT');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n this.writeAscii('und');\n if (useIso88591) {\n this.writeIsoString(shortDescription);\n this.writeIsoString(lyrics);\n }\n else {\n this.writeUtf8String(shortDescription);\n this.writeUtf8String(lyrics);\n }\n }\n writeId3V2CommentFrame(comment) {\n const useIso88591 = isIso88591Compatible(comment);\n const textDataLength = useIso88591 ? comment.length : textEncoder.encode(comment).byteLength;\n const shortDescription = '';\n const frameSize = 1 + 3 + shortDescription.length + 1 + textDataLength + 1;\n this.writeAscii('COMM');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n this.writeU8(0x75); // 'u'\n this.writeU8(0x6E); // 'n'\n this.writeU8(0x64); // 'd'\n if (useIso88591) {\n this.writeIsoString(shortDescription);\n this.writeIsoString(comment);\n }\n else {\n this.writeUtf8String(shortDescription);\n this.writeUtf8String(comment);\n }\n }\n writeId3V2ApicFrame(mimeType, pictureType, description, imageData) {\n const useIso88591 = isIso88591Compatible(mimeType) && isIso88591Compatible(description);\n const descriptionDataLength = useIso88591\n ? description.length\n : textEncoder.encode(description).byteLength;\n const frameSize = 1 + mimeType.length + 1 + 1 + descriptionDataLength + 1 + imageData.byteLength;\n this.writeAscii('APIC');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n if (useIso88591) {\n this.writeIsoString(mimeType);\n }\n else {\n this.writeUtf8String(mimeType);\n }\n this.writeU8(pictureType);\n if (useIso88591) {\n this.writeIsoString(description);\n }\n else {\n this.writeUtf8String(description);\n }\n this.writer.write(imageData);\n }\n}\n","/*!\n * Copyright (c) 2025-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 { FRAME_HEADER_SIZE, readFrameHeader } from '../../shared/mp3-misc.js';\nimport { readU32Be } from '../reader.js';\nexport const readNextFrameHeader = async (reader, startPos, until) => {\n let currentPos = startPos;\n while (until === null || currentPos < until) {\n let slice = reader.requestSlice(currentPos, FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const word = readU32Be(slice);\n const result = readFrameHeader(word, reader.fileSize !== null ? reader.fileSize - currentPos : null);\n if (result.header) {\n return { header: result.header, startPos: currentPos };\n }\n currentPos += result.bytesAdvanced;\n }\n return null;\n};\n","/*!\n * Copyright (c) 2025-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 { OPUS_SAMPLE_RATE } from '../codec.js';\nimport { parseModesFromVorbisSetupPacket, parseOpusIdentificationHeader, readVorbisComments } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, AsyncMutex, binarySearchLessOrEqual, findLast, last, roundIfAlmostInteger, toDataView, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes } from '../reader.js';\nimport { buildOggMimeType, computeOggPageCrc, extractSampleMetadata } from './ogg-misc.js';\nimport { findNextPageHeader, MAX_PAGE_HEADER_SIZE, MAX_PAGE_SIZE, MIN_PAGE_HEADER_SIZE, readPageHeader, } from './ogg-reader.js';\nexport class OggDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.bitstreams = [];\n this.tracks = [];\n this.metadataTags = {};\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n let currentPos = 0;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const page = readPageHeader(slice);\n if (!page) {\n break;\n }\n const isBos = !!(page.headerType & 0x02);\n if (!isBos) {\n // All bos pages for all bitstreams are required to be at the start, so if the page is not bos then\n // we know we've seen all bitstreams (minus chaining)\n break;\n }\n this.bitstreams.push({\n serialNumber: page.serialNumber,\n bosPage: page,\n description: null,\n numberOfChannels: -1,\n sampleRate: -1,\n codecInfo: {\n codec: null,\n vorbisInfo: null,\n opusInfo: null,\n },\n lastMetadataPacket: null,\n });\n currentPos = page.headerStartPos + page.totalSize;\n }\n for (const bitstream of this.bitstreams) {\n const firstPacket = await this.readPacket(bitstream.bosPage, 0);\n if (!firstPacket) {\n continue;\n }\n if (\n // Check for Vorbis\n firstPacket.data.byteLength >= 7\n && firstPacket.data[0] === 0x01 // Packet type 1 = identification header\n && firstPacket.data[1] === 0x76 // 'v'\n && firstPacket.data[2] === 0x6f // 'o'\n && firstPacket.data[3] === 0x72 // 'r'\n && firstPacket.data[4] === 0x62 // 'b'\n && firstPacket.data[5] === 0x69 // 'i'\n && firstPacket.data[6] === 0x73 // 's'\n ) {\n await this.readVorbisMetadata(firstPacket, bitstream);\n }\n else if (\n // Check for Opus\n firstPacket.data.byteLength >= 8\n && firstPacket.data[0] === 0x4f // 'O'\n && firstPacket.data[1] === 0x70 // 'p'\n && firstPacket.data[2] === 0x75 // 'u'\n && firstPacket.data[3] === 0x73 // 's'\n && firstPacket.data[4] === 0x48 // 'H'\n && firstPacket.data[5] === 0x65 // 'e'\n && firstPacket.data[6] === 0x61 // 'a'\n && firstPacket.data[7] === 0x64 // 'd'\n ) {\n await this.readOpusMetadata(firstPacket, bitstream);\n }\n if (bitstream.codecInfo.codec !== null) {\n this.tracks.push(new InputAudioTrack(this.input, new OggAudioTrackBacking(bitstream, this)));\n }\n }\n })();\n }\n async readVorbisMetadata(firstPacket, bitstream) {\n let nextPacketPosition = await this.findNextPacketStart(firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n nextPacketPosition = await this.findNextPacketStart(secondPacket);\n if (!nextPacketPosition) {\n return;\n }\n const thirdPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!thirdPacket) {\n return;\n }\n if (secondPacket.data[0] !== 0x03 || thirdPacket.data[0] !== 0x05) {\n return;\n }\n const lacingValues = [];\n const addBytesToSegmentTable = (bytes) => {\n while (true) {\n lacingValues.push(Math.min(255, bytes));\n if (bytes < 255) {\n break;\n }\n bytes -= 255;\n }\n };\n addBytesToSegmentTable(firstPacket.data.length);\n addBytesToSegmentTable(secondPacket.data.length);\n // We don't add the last packet to the segment table, as it is assumed to be whatever bytes remain\n const description = new Uint8Array(1 + lacingValues.length\n + firstPacket.data.length + secondPacket.data.length + thirdPacket.data.length);\n description[0] = 2; // Num entries in the segment table\n description.set(lacingValues, 1);\n description.set(firstPacket.data, 1 + lacingValues.length);\n description.set(secondPacket.data, 1 + lacingValues.length + firstPacket.data.length);\n description.set(thirdPacket.data, 1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length);\n bitstream.codecInfo.codec = 'vorbis';\n bitstream.description = description;\n bitstream.lastMetadataPacket = thirdPacket;\n const view = toDataView(firstPacket.data);\n bitstream.numberOfChannels = view.getUint8(11);\n bitstream.sampleRate = view.getUint32(12, true);\n const blockSizeByte = view.getUint8(28);\n bitstream.codecInfo.vorbisInfo = {\n blocksizes: [\n 1 << (blockSizeByte & 0xf),\n 1 << (blockSizeByte >> 4),\n ],\n modeBlockflags: parseModesFromVorbisSetupPacket(thirdPacket.data).modeBlockflags,\n };\n readVorbisComments(secondPacket.data.subarray(7), this.metadataTags); // Skip header type and 'vorbis'\n }\n async readOpusMetadata(firstPacket, bitstream) {\n // From https://datatracker.ietf.org/doc/html/rfc7845#section-5:\n // \"An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a\n // comment header.\"\n const nextPacketPosition = await this.findNextPacketStart(firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n bitstream.codecInfo.codec = 'opus';\n bitstream.description = firstPacket.data;\n bitstream.lastMetadataPacket = secondPacket;\n const header = parseOpusIdentificationHeader(firstPacket.data);\n bitstream.numberOfChannels = header.outputChannelCount;\n bitstream.sampleRate = OPUS_SAMPLE_RATE; // Always the same\n bitstream.codecInfo.opusInfo = {\n preSkip: header.preSkip,\n };\n readVorbisComments(secondPacket.data.subarray(8), this.metadataTags); // Skip 'OpusTags'\n }\n async readPacket(startPage, startSegmentIndex) {\n assert(startSegmentIndex < startPage.lacingValues.length);\n let startDataOffset = 0;\n for (let i = 0; i < startSegmentIndex; i++) {\n startDataOffset += startPage.lacingValues[i];\n }\n let currentPage = startPage;\n let currentDataOffset = startDataOffset;\n let currentSegmentIndex = startSegmentIndex;\n const chunks = [];\n outer: while (true) {\n // Load the entire page data\n let pageSlice = this.reader.requestSlice(currentPage.dataStartPos, currentPage.dataSize);\n if (pageSlice instanceof Promise)\n pageSlice = await pageSlice;\n assert(pageSlice);\n const pageData = readBytes(pageSlice, currentPage.dataSize);\n while (true) {\n if (currentSegmentIndex === currentPage.lacingValues.length) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break;\n }\n const lacingValue = currentPage.lacingValues[currentSegmentIndex];\n currentDataOffset += lacingValue;\n if (lacingValue < 255) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break outer;\n }\n currentSegmentIndex++;\n }\n // The packet extends to the next page; let's find it\n let currentPos = currentPage.headerStartPos + currentPage.totalSize;\n while (true) {\n let headerSlice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice) {\n return null;\n }\n const nextPage = readPageHeader(headerSlice);\n if (!nextPage) {\n return null;\n }\n currentPage = nextPage;\n if (currentPage.serialNumber === startPage.serialNumber) {\n break;\n }\n currentPos = currentPage.headerStartPos + currentPage.totalSize;\n }\n startDataOffset = 0;\n currentDataOffset = 0;\n currentSegmentIndex = 0;\n }\n const totalPacketSize = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const packetData = new Uint8Array(totalPacketSize);\n let offset = 0;\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n packetData.set(chunk, offset);\n offset += chunk.length;\n }\n return {\n data: packetData,\n endPage: currentPage,\n endSegmentIndex: currentSegmentIndex,\n };\n }\n async findNextPacketStart(lastPacket) {\n // If there's another segment in the same page, return it\n if (lastPacket.endSegmentIndex < lastPacket.endPage.lacingValues.length - 1) {\n return { startPage: lastPacket.endPage, startSegmentIndex: lastPacket.endSegmentIndex + 1 };\n }\n const isEos = !!(lastPacket.endPage.headerType & 0x04);\n if (isEos) {\n // The page is marked as the last page of the logical bitstream, so we won't find anything beyond it\n return null;\n }\n // Otherwise, search for the next page belonging to the same bitstream\n let currentPos = lastPacket.endPage.headerStartPos + lastPacket.endPage.totalSize;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null;\n }\n const nextPage = readPageHeader(slice);\n if (!nextPage) {\n return null;\n }\n if (nextPage.serialNumber === lastPacket.endPage.serialNumber) {\n return { startPage: nextPage, startSegmentIndex: 0 };\n }\n currentPos = nextPage.headerStartPos + nextPage.totalSize;\n }\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.getCodecParameterString()));\n return buildOggMimeType({\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n}\nclass OggAudioTrackBacking {\n constructor(bitstream, demuxer) {\n this.bitstream = bitstream;\n this.demuxer = demuxer;\n this.encodedPacketToMetadata = new WeakMap();\n this.sequentialScanCache = [];\n this.sequentialScanMutex = new AsyncMutex();\n // Opus always uses a fixed sample rate for its internal calculations, even if the actual rate is different\n this.internalSampleRate = bitstream.codecInfo.codec === 'opus'\n ? OPUS_SAMPLE_RATE\n : bitstream.sampleRate;\n }\n getId() {\n return this.bitstream.serialNumber;\n }\n getNumberOfChannels() {\n return this.bitstream.numberOfChannels;\n }\n getSampleRate() {\n return this.bitstream.sampleRate;\n }\n getTimeResolution() {\n return this.bitstream.sampleRate;\n }\n getCodec() {\n return this.bitstream.codecInfo.codec;\n }\n getInternalCodecId() {\n return null;\n }\n async getDecoderConfig() {\n assert(this.bitstream.codecInfo.codec);\n return {\n codec: this.bitstream.codecInfo.codec,\n numberOfChannels: this.bitstream.numberOfChannels,\n sampleRate: this.bitstream.sampleRate,\n description: this.bitstream.description ?? undefined,\n };\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n granulePositionToTimestampInSamples(granulePosition) {\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n return granulePosition - this.bitstream.codecInfo.opusInfo.preSkip;\n }\n return granulePosition;\n }\n createEncodedPacketFromOggPacket(packet, additional, options) {\n if (!packet) {\n return null;\n }\n const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);\n const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, 'key', Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);\n this.encodedPacketToMetadata.set(encodedPacket, {\n packet,\n timestampInSamples: additional.timestampInSamples,\n durationInSamples,\n vorbisLastBlockSize: additional.vorbisLastBlocksize,\n vorbisBlockSize,\n });\n return encodedPacket;\n }\n async getFirstPacket(options) {\n assert(this.bitstream.lastMetadataPacket);\n const packetPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);\n if (!packetPosition) {\n return null;\n }\n let timestampInSamples = 0;\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip;\n }\n const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: null,\n }, options);\n }\n async getNextPacket(prevPacket, options) {\n const prevMetadata = this.encodedPacketToMetadata.get(prevPacket);\n if (!prevMetadata) {\n throw new Error('Packet was not created from this track.');\n }\n const packetPosition = await this.demuxer.findNextPacketStart(prevMetadata.packet);\n if (!packetPosition) {\n return null;\n }\n const timestampInSamples = prevMetadata.timestampInSamples + prevMetadata.durationInSamples;\n const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: prevMetadata.vorbisBlockSize,\n }, options);\n }\n async getPacket(timestamp, options) {\n if (this.demuxer.reader.fileSize === null) {\n // No file size known, can't do binary search, but fall back to sequential algo instead\n return this.getPacketSequential(timestamp, options);\n }\n const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);\n if (timestampInSamples === 0) {\n // Fast path for timestamp 0 - avoids binary search when playing back from the start\n return this.getFirstPacket(options);\n }\n if (timestampInSamples < 0) {\n // There's nothing here\n return null;\n }\n assert(this.bitstream.lastMetadataPacket);\n const startPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);\n if (!startPosition) {\n return null;\n }\n let lowPage = startPosition.startPage;\n let high = this.demuxer.reader.fileSize;\n const lowPages = [lowPage];\n // First, let's perform a binary serach (bisection search) on the file to find the approximate page where\n // we'll find the packet. We want to find a page whose end packet position is less than or equal to the\n // packet position we're searching for.\n // Outer loop: Does the binary serach\n outer: while (lowPage.headerStartPos + lowPage.totalSize < high) {\n const low = lowPage.headerStartPos;\n const mid = Math.floor((low + high) / 2);\n let searchStartPos = mid;\n // Inner loop: Does a linear forward scan if the page cannot be found immediately\n while (true) {\n const until = Math.min(searchStartPos + MAX_PAGE_SIZE, high - MIN_PAGE_HEADER_SIZE);\n let searchSlice = this.demuxer.reader.requestSlice(searchStartPos, until - searchStartPos);\n if (searchSlice instanceof Promise)\n searchSlice = await searchSlice;\n assert(searchSlice);\n const found = findNextPageHeader(searchSlice, until);\n if (!found) {\n high = mid + MIN_PAGE_HEADER_SIZE;\n continue outer;\n }\n let headerSlice = this.demuxer.reader.requestSliceRange(searchSlice.filePos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const page = readPageHeader(headerSlice);\n assert(page);\n let pageValid = false;\n if (page.serialNumber === this.bitstream.serialNumber) {\n // Serial numbers are basically random numbers, and the chance of finding a fake page with\n // matching serial number is astronomically low, so we can be pretty sure this page is legit.\n pageValid = true;\n }\n else {\n let pageSlice = this.demuxer.reader.requestSlice(page.headerStartPos, page.totalSize);\n if (pageSlice instanceof Promise)\n pageSlice = await pageSlice;\n assert(pageSlice);\n // Validate the page by checking checksum\n const bytes = readBytes(pageSlice, page.totalSize);\n const crc = computeOggPageCrc(bytes);\n pageValid = crc === page.checksum;\n }\n if (!pageValid) {\n // Keep searching for a valid page\n searchStartPos = page.headerStartPos + 4; // 'OggS' is 4 bytes\n continue;\n }\n if (pageValid && page.serialNumber !== this.bitstream.serialNumber) {\n // Page is valid but from a different bitstream, so keep searching forward until we find one\n // belonging to the our bitstream\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n const isContinuationPage = page.granulePosition === -1;\n if (isContinuationPage) {\n // No packet ends on this page - keep looking\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n // The page is valid and belongs to our bitstream; let's check its granule position to see where we\n // need to take the bisection search.\n if (this.granulePositionToTimestampInSamples(page.granulePosition) > timestampInSamples) {\n high = page.headerStartPos;\n }\n else {\n lowPage = page;\n lowPages.push(page);\n }\n continue outer;\n }\n }\n // Now we have the last page with a packet position <= the packet position we're looking for, but there\n // might be multiple pages with the packet position, in which case we actually need to find the first of\n // such pages. We'll do this in two steps: First, let's find the latest page we know with an earlier packet\n // position, and then linear scan ourselves forward until we find the correct page.\n let lowerPage = startPosition.startPage;\n for (const otherLowPage of lowPages) {\n if (otherLowPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n if (!lowerPage || otherLowPage.headerStartPos > lowerPage.headerStartPos) {\n lowerPage = otherLowPage;\n }\n }\n let currentPage = lowerPage;\n // Keep track of the pages we traversed, we need these later for backwards seeking\n const previousPages = [currentPage];\n while (true) {\n // This loop must terminate as we'll eventually reach lowPage\n if (currentPage.serialNumber === this.bitstream.serialNumber\n && currentPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n const nextPos = currentPage.headerStartPos + currentPage.totalSize;\n let slice = this.demuxer.reader.requestSliceRange(nextPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const nextPage = readPageHeader(slice);\n assert(nextPage);\n currentPage = nextPage;\n if (currentPage.serialNumber === this.bitstream.serialNumber) {\n previousPages.push(currentPage);\n }\n }\n assert(currentPage.granulePosition !== -1);\n let currentSegmentIndex = null;\n let currentTimestampInSamples;\n let currentTimestampIsCorrect;\n // These indicate the end position of the packet that the granule position belongs to\n let endPage = currentPage;\n let endSegmentIndex = 0;\n if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) {\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(0);\n currentTimestampIsCorrect = true;\n currentSegmentIndex = 0;\n }\n else {\n currentTimestampInSamples = 0; // Placeholder value! We'll refine it once we can\n currentTimestampIsCorrect = false;\n // Find the segment index of the next packet\n for (let i = currentPage.lacingValues.length - 1; i >= 0; i--) {\n const value = currentPage.lacingValues[i];\n if (value < 255) {\n // We know the last packet ended at i, so the next one starts at i + 1\n currentSegmentIndex = i + 1;\n break;\n }\n }\n // This must hold: Since this page has a granule position set, that means there must be a packet that\n // ends in this page.\n if (currentSegmentIndex === null) {\n throw new Error('Invalid page with granule position: no packets end on this page.');\n }\n endSegmentIndex = currentSegmentIndex - 1;\n const pseudopacket = {\n data: PLACEHOLDER_DATA,\n endPage,\n endSegmentIndex,\n };\n const nextPosition = await this.demuxer.findNextPacketStart(pseudopacket);\n if (nextPosition) {\n // Let's rewind a single step (packet) - this previous packet ensures that we'll correctly compute\n // the duration for the packet we're looking for.\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n assert(endPosition);\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (startPosition) {\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n }\n }\n else {\n // There is no next position, which means we're looking for the last packet in the bitstream. The\n // granule position on the last page tends to be fucky, so let's instead start the search on the\n // page before that. So let's loop until we find a packet that ends in a previous page.\n while (true) {\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n if (!endPosition) {\n break;\n }\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (!startPosition) {\n break;\n }\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n if (endPosition.page.headerStartPos !== endPage.headerStartPos) {\n endPage = endPosition.page;\n endSegmentIndex = endPosition.segmentIndex;\n break;\n }\n }\n }\n }\n let lastEncodedPacket = null;\n let lastEncodedPacketMetadata = null;\n // Alright, now it's time for the final, granular seek: We keep iterating over packets until we've found the\n // one with the correct timestamp - i.e., the last one with a timestamp <= the timestamp we're looking for.\n while (currentPage !== null) {\n assert(currentSegmentIndex !== null);\n const packet = await this.demuxer.readPacket(currentPage, currentSegmentIndex);\n if (!packet) {\n break;\n }\n // We might need to skip the packet if it's a metadata one\n const skipPacket = currentPage.headerStartPos === startPosition.startPage.headerStartPos\n && currentSegmentIndex < startPosition.startSegmentIndex;\n if (!skipPacket) {\n let encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n let encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n if (!currentTimestampIsCorrect\n && packet.endPage.headerStartPos === endPage.headerStartPos\n && packet.endSegmentIndex === endSegmentIndex) {\n // We know this packet end timestamp can be derived from the page's granule position\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(currentPage.granulePosition);\n currentTimestampIsCorrect = true;\n // Let's backpatch the packet we just created with the correct timestamp\n encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples - encodedPacketMetadata.durationInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n }\n else {\n currentTimestampInSamples += encodedPacketMetadata.durationInSamples;\n }\n lastEncodedPacket = encodedPacket;\n lastEncodedPacketMetadata = encodedPacketMetadata;\n if (currentTimestampIsCorrect\n && (\n // Next timestamp will be too late\n Math.max(currentTimestampInSamples, 0) > timestampInSamples\n // This timestamp already matches\n || Math.max(encodedPacketMetadata.timestampInSamples, 0) === timestampInSamples)) {\n break;\n }\n }\n const nextPosition = await this.demuxer.findNextPacketStart(packet);\n if (!nextPosition) {\n break;\n }\n currentPage = nextPosition.startPage;\n currentSegmentIndex = nextPosition.startSegmentIndex;\n }\n return lastEncodedPacket;\n }\n // A slower but simpler and sequential algorithm for finding a packet in a file\n async getPacketSequential(timestamp, options) {\n const release = await this.sequentialScanMutex.acquire(); // Requires exclusivity because we write to a cache\n try {\n const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);\n timestamp = timestampInSamples / this.internalSampleRate;\n const index = binarySearchLessOrEqual(this.sequentialScanCache, timestampInSamples, x => x.timestampInSamples);\n let currentPacket;\n if (index !== -1) {\n // We don't need to start from the beginning, we can start at a previous scan point\n const cacheEntry = this.sequentialScanCache[index];\n currentPacket = this.createEncodedPacketFromOggPacket(cacheEntry.packet, {\n timestampInSamples: cacheEntry.timestampInSamples,\n vorbisLastBlocksize: cacheEntry.vorbisLastBlockSize,\n }, options);\n }\n else {\n currentPacket = await this.getFirstPacket(options);\n }\n let i = 0;\n while (currentPacket && currentPacket.timestamp < timestamp) {\n const nextPacket = await this.getNextPacket(currentPacket, options);\n if (!nextPacket || nextPacket.timestamp > timestamp) {\n break;\n }\n currentPacket = nextPacket;\n i++;\n if (i === 100) {\n // Add \"checkpoints\" every once in a while to speed up subsequent random accesses\n i = 0;\n const metadata = this.encodedPacketToMetadata.get(currentPacket);\n assert(metadata);\n if (this.sequentialScanCache.length > 0) {\n // If we reach this case, we must be at the end of the cache\n assert(last(this.sequentialScanCache).timestampInSamples <= metadata.timestampInSamples);\n }\n this.sequentialScanCache.push(metadata);\n }\n }\n return currentPacket;\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n/** Finds the start position of a packet given its end position. */\nconst findPacketStartPosition = (pageList, endPage, endSegmentIndex) => {\n let page = endPage;\n let segmentIndex = endSegmentIndex;\n outer: while (true) {\n segmentIndex--;\n for (segmentIndex; segmentIndex >= 0; segmentIndex--) {\n const lacingValue = page.lacingValues[segmentIndex];\n if (lacingValue < 255) {\n segmentIndex++; // We know the last packet starts here\n break outer;\n }\n }\n assert(segmentIndex === -1);\n const pageStartsWithFreshPacket = !(page.headerType & 0x01);\n if (pageStartsWithFreshPacket) {\n // Fast exit: We know we don't need to look in the previous page\n segmentIndex = 0;\n break;\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < page.headerStartPos);\n if (!previousPage) {\n return null;\n }\n page = previousPage;\n segmentIndex = page.lacingValues.length;\n }\n assert(segmentIndex !== -1);\n if (segmentIndex === page.lacingValues.length) {\n // Wrap back around to the first segment of the next page\n const nextPage = pageList[pageList.indexOf(page) + 1];\n assert(nextPage);\n page = nextPage;\n segmentIndex = 0;\n }\n return { page, segmentIndex };\n};\n/** Finds the end position of a packet given the start position of the following packet. */\nconst findPreviousPacketEndPosition = (pageList, startPage, startSegmentIndex) => {\n if (startSegmentIndex > 0) {\n // Easy\n return { page: startPage, segmentIndex: startSegmentIndex - 1 };\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < startPage.headerStartPos);\n if (!previousPage) {\n return null;\n }\n return { page: previousPage, segmentIndex: previousPage.lacingValues.length - 1 };\n};\n","/*!\n * Copyright (c) 2025-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 { parseOpusTocByte } from '../codec-data.js';\nimport { assert, ilog, toDataView } from '../misc.js';\nexport const OGGS = 0x5367674f; // 'OggS'\nconst OGG_CRC_POLYNOMIAL = 0x04c11db7;\nconst OGG_CRC_TABLE = new Uint32Array(256);\nfor (let n = 0; n < 256; n++) {\n let crc = n << 24;\n for (let k = 0; k < 8; k++) {\n crc = (crc & 0x80000000)\n ? ((crc << 1) ^ OGG_CRC_POLYNOMIAL)\n : (crc << 1);\n }\n OGG_CRC_TABLE[n] = (crc >>> 0) & 0xffffffff;\n}\nexport const computeOggPageCrc = (bytes) => {\n const view = toDataView(bytes);\n const originalChecksum = view.getUint32(22, true);\n view.setUint32(22, 0, true); // Zero out checksum field\n let crc = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n crc = ((crc << 8) ^ OGG_CRC_TABLE[(crc >>> 24) ^ byte]) >>> 0;\n }\n view.setUint32(22, originalChecksum, true); // Restore checksum field\n return crc;\n};\nexport const extractSampleMetadata = (data, codecInfo, vorbisLastBlocksize) => {\n let durationInSamples = 0;\n let currentBlocksize = null;\n if (data.length > 0) {\n // To know sample duration, we'll need to peak inside the packet\n if (codecInfo.codec === 'vorbis') {\n assert(codecInfo.vorbisInfo);\n const vorbisModeCount = codecInfo.vorbisInfo.modeBlockflags.length;\n const bitCount = ilog(vorbisModeCount - 1);\n const modeMask = ((1 << bitCount) - 1) << 1;\n const modeNumber = (data[0] & modeMask) >> 1;\n if (modeNumber >= codecInfo.vorbisInfo.modeBlockflags.length) {\n throw new Error('Invalid mode number.');\n }\n // In Vorbis, packet duration also depends on the blocksize of the previous packet\n let prevBlocksize = vorbisLastBlocksize;\n const blockflag = codecInfo.vorbisInfo.modeBlockflags[modeNumber];\n currentBlocksize = codecInfo.vorbisInfo.blocksizes[blockflag];\n if (blockflag === 1) {\n const prevMask = (modeMask | 0x1) + 1;\n const flag = data[0] & prevMask ? 1 : 0;\n prevBlocksize = codecInfo.vorbisInfo.blocksizes[flag];\n }\n durationInSamples = prevBlocksize !== null\n ? (prevBlocksize + currentBlocksize) >> 2\n : 0; // The first sample outputs no audio data and therefore has a duration of 0\n }\n else if (codecInfo.codec === 'opus') {\n const toc = parseOpusTocByte(data);\n durationInSamples = toc.durationInSamples;\n }\n }\n return {\n durationInSamples,\n vorbisBlockSize: currentBlocksize,\n };\n};\nexport const buildOggMimeType = (info) => {\n let string = 'audio/ogg';\n if (info.codecStrings) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n","/*!\n * Copyright (c) 2025-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 { readI64Le, readU32Le, readU8 } from '../reader.js';\nimport { OGGS } from './ogg-misc.js';\nexport const MIN_PAGE_HEADER_SIZE = 27;\nexport const MAX_PAGE_HEADER_SIZE = 27 + 255;\nexport const MAX_PAGE_SIZE = MAX_PAGE_HEADER_SIZE + 255 * 255;\nexport const readPageHeader = (slice) => {\n const startPos = slice.filePos;\n const capturePattern = readU32Le(slice);\n if (capturePattern !== OGGS) {\n return null;\n }\n slice.skip(1); // Version\n const headerType = readU8(slice);\n const granulePosition = readI64Le(slice);\n const serialNumber = readU32Le(slice);\n const sequenceNumber = readU32Le(slice);\n const checksum = readU32Le(slice);\n const numberPageSegments = readU8(slice);\n const lacingValues = new Uint8Array(numberPageSegments);\n for (let i = 0; i < numberPageSegments; i++) {\n lacingValues[i] = readU8(slice);\n }\n const headerSize = 27 + numberPageSegments;\n const dataSize = lacingValues.reduce((a, b) => a + b, 0);\n const totalSize = headerSize + dataSize;\n return {\n headerStartPos: startPos,\n totalSize,\n dataStartPos: startPos + headerSize,\n dataSize,\n headerType,\n granulePosition,\n serialNumber,\n sequenceNumber,\n checksum,\n lacingValues,\n };\n};\nexport const findNextPageHeader = (slice, until) => {\n while (slice.filePos < until - (4 - 1)) { // Size of word minus 1\n const word = readU32Le(slice);\n const firstByte = word & 0xff;\n const secondByte = (word >>> 8) & 0xff;\n const thirdByte = (word >>> 16) & 0xff;\n const fourthByte = (word >>> 24) & 0xff;\n const O = 0x4f; // 'O'\n if (firstByte !== O && secondByte !== O && thirdByte !== O && fourthByte !== O) {\n continue;\n }\n slice.skip(-4);\n if (word === OGGS) {\n // We have found the capture pattern\n return true;\n }\n slice.skip(1);\n }\n return false;\n};\n","/*!\n * Copyright (c) 2025-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 { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readAscii, readBytes, readU16, readU32, readU64 } from '../reader.js';\nimport { parseId3V2Tag, readId3V2Header } from '../id3.js';\nexport var WaveFormat;\n(function (WaveFormat) {\n WaveFormat[WaveFormat[\"PCM\"] = 1] = \"PCM\";\n WaveFormat[WaveFormat[\"IEEE_FLOAT\"] = 3] = \"IEEE_FLOAT\";\n WaveFormat[WaveFormat[\"ALAW\"] = 6] = \"ALAW\";\n WaveFormat[WaveFormat[\"MULAW\"] = 7] = \"MULAW\";\n WaveFormat[WaveFormat[\"EXTENSIBLE\"] = 65534] = \"EXTENSIBLE\";\n})(WaveFormat || (WaveFormat = {}));\nexport class WaveDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.dataStart = -1;\n this.dataSize = -1;\n this.audioInfo = null;\n this.tracks = [];\n this.lastKnownPacketIndex = 0;\n this.metadataTags = {};\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n let slice = this.reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const riffType = readAscii(slice, 4);\n const littleEndian = riffType !== 'RIFX';\n const isRf64 = riffType === 'RF64';\n const outerChunkSize = readU32(slice, littleEndian);\n let totalFileSize = isRf64\n ? this.reader.fileSize\n : Math.min(outerChunkSize + 8, this.reader.fileSize ?? Infinity);\n const format = readAscii(slice, 4);\n if (format !== 'WAVE') {\n throw new Error('Invalid WAVE file - wrong format');\n }\n let chunksRead = 0;\n let dataChunkSize = null;\n let currentPos = slice.filePos;\n while (totalFileSize === null || currentPos < totalFileSize) {\n let slice = this.reader.requestSlice(currentPos, 8);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const chunkId = readAscii(slice, 4);\n const chunkSize = readU32(slice, littleEndian);\n const startPos = slice.filePos;\n if (isRf64 && chunksRead === 0 && chunkId !== 'ds64') {\n throw new Error('Invalid RF64 file: First chunk must be \"ds64\".');\n }\n if (chunkId === 'fmt ') {\n await this.parseFmtChunk(startPos, chunkSize, littleEndian);\n }\n else if (chunkId === 'data') {\n dataChunkSize ??= chunkSize;\n this.dataStart = slice.filePos;\n this.dataSize = Math.min(dataChunkSize, (totalFileSize ?? Infinity) - this.dataStart);\n if (this.reader.fileSize === null) {\n break; // Stop once we hit the data chunk\n }\n }\n else if (chunkId === 'ds64') {\n // File and data chunk sizes are defined in here instead\n let ds64Slice = this.reader.requestSlice(startPos, chunkSize);\n if (ds64Slice instanceof Promise)\n ds64Slice = await ds64Slice;\n if (!ds64Slice)\n break;\n const riffChunkSize = readU64(ds64Slice, littleEndian);\n dataChunkSize = readU64(ds64Slice, littleEndian);\n totalFileSize = Math.min(riffChunkSize + 8, this.reader.fileSize ?? Infinity);\n }\n else if (chunkId === 'LIST') {\n await this.parseListChunk(startPos, chunkSize, littleEndian);\n }\n else if (chunkId === 'ID3 ' || chunkId === 'id3 ') {\n await this.parseId3Chunk(startPos, chunkSize);\n }\n currentPos = startPos + chunkSize + (chunkSize & 1); // Handle padding\n chunksRead++;\n }\n if (!this.audioInfo) {\n throw new Error('Invalid WAVE file - missing \"fmt \" chunk');\n }\n if (this.dataStart === -1) {\n throw new Error('Invalid WAVE file - missing \"data\" chunk');\n }\n const blockSize = this.audioInfo.blockSizeInBytes;\n this.dataSize = Math.floor(this.dataSize / blockSize) * blockSize;\n this.tracks.push(new InputAudioTrack(this.input, new WaveAudioTrackBacking(this)));\n })();\n }\n async parseFmtChunk(startPos, size, littleEndian) {\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n let formatTag = readU16(slice, littleEndian);\n const numChannels = readU16(slice, littleEndian);\n const sampleRate = readU32(slice, littleEndian);\n slice.skip(4); // Bytes per second\n const blockAlign = readU16(slice, littleEndian);\n let bitsPerSample;\n if (size === 14) { // Plain WAVEFORMAT\n bitsPerSample = 8;\n }\n else {\n bitsPerSample = readU16(slice, littleEndian);\n }\n // Handle WAVEFORMATEXTENSIBLE\n if (size >= 18 && formatTag !== 0x0165) {\n const cbSize = readU16(slice, littleEndian);\n const remainingSize = size - 18;\n const extensionSize = Math.min(remainingSize, cbSize);\n if (extensionSize >= 22 && formatTag === WaveFormat.EXTENSIBLE) {\n // Parse WAVEFORMATEXTENSIBLE\n slice.skip(2 + 4);\n const subFormat = readBytes(slice, 16);\n // Get actual format from subFormat GUID\n formatTag = subFormat[0] | (subFormat[1] << 8);\n }\n }\n if (formatTag === WaveFormat.MULAW || formatTag === WaveFormat.ALAW) {\n bitsPerSample = 8;\n }\n this.audioInfo = {\n format: formatTag,\n numberOfChannels: numChannels,\n sampleRate,\n sampleSizeInBytes: Math.ceil(bitsPerSample / 8),\n blockSizeInBytes: blockAlign,\n };\n }\n async parseListChunk(startPos, size, littleEndian) {\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n const infoType = readAscii(slice, 4);\n if (infoType !== 'INFO' && infoType !== 'INF0') { // exiftool.org claims INF0 can happen\n return; // Not an INFO chunk\n }\n let currentPos = slice.filePos;\n while (currentPos <= startPos + size - 8) {\n slice.filePos = currentPos;\n const chunkName = readAscii(slice, 4);\n const chunkSize = readU32(slice, littleEndian);\n const bytes = readBytes(slice, chunkSize);\n let stringLength = 0;\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i] === 0) {\n break;\n }\n stringLength++;\n }\n const value = String.fromCharCode(...bytes.subarray(0, stringLength));\n this.metadataTags.raw ??= {};\n this.metadataTags.raw[chunkName] = value;\n switch (chunkName) {\n case 'INAM':\n case 'TITL':\n {\n this.metadataTags.title ??= value;\n }\n ;\n break;\n case 'TIT3':\n {\n this.metadataTags.description ??= value;\n }\n ;\n break;\n case 'IART':\n {\n this.metadataTags.artist ??= value;\n }\n ;\n break;\n case 'IPRD':\n {\n this.metadataTags.album ??= value;\n }\n ;\n break;\n case 'IPRT':\n case 'ITRK':\n case 'TRCK':\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 this.metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'ICRD':\n case 'IDIT':\n {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n ;\n break;\n case 'YEAR':\n {\n const year = Number.parseInt(value, 10);\n if (Number.isInteger(year) && year > 0) {\n this.metadataTags.date ??= new Date(year, 0, 1);\n }\n }\n ;\n break;\n case 'IGNR':\n case 'GENR':\n {\n this.metadataTags.genre ??= value;\n }\n ;\n break;\n case 'ICMT':\n case 'CMNT':\n case 'COMM':\n {\n this.metadataTags.comment ??= value;\n }\n ;\n break;\n }\n currentPos += 8 + chunkSize + (chunkSize & 1); // Handle padding\n }\n }\n async parseId3Chunk(startPos, size) {\n // Parse ID3 tag embedded in WAV file (non-default, but used a lot in practice anyway)\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n const id3V2Header = readId3V2Header(slice);\n if (id3V2Header) {\n // Extract the content portion (skip the 10-byte header)\n const contentSlice = slice.slice(startPos + 10, id3V2Header.size);\n parseId3V2Tag(contentSlice, id3V2Header, this.metadataTags);\n }\n }\n getCodec() {\n assert(this.audioInfo);\n if (this.audioInfo.format === WaveFormat.MULAW) {\n return 'ulaw';\n }\n if (this.audioInfo.format === WaveFormat.ALAW) {\n return 'alaw';\n }\n if (this.audioInfo.format === WaveFormat.PCM) {\n // All formats are little-endian\n if (this.audioInfo.sampleSizeInBytes === 1) {\n return 'pcm-u8';\n }\n else if (this.audioInfo.sampleSizeInBytes === 2) {\n return 'pcm-s16';\n }\n else if (this.audioInfo.sampleSizeInBytes === 3) {\n return 'pcm-s24';\n }\n else if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-s32';\n }\n }\n if (this.audioInfo.format === WaveFormat.IEEE_FLOAT) {\n if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-f32';\n }\n }\n return null;\n }\n async getMimeType() {\n return 'audio/wav';\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n}\nconst PACKET_SIZE_IN_FRAMES = 2048;\nclass WaveAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return this.demuxer.getCodec();\n }\n getInternalCodecId() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.format;\n }\n async getDecoderConfig() {\n const codec = this.demuxer.getCodec();\n if (!codec) {\n return null;\n }\n assert(this.demuxer.audioInfo);\n return {\n codec,\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n };\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getPacketAtIndex(packetIndex, options) {\n assert(this.demuxer.audioInfo);\n const startOffset = packetIndex * PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n if (startOffset >= this.demuxer.dataSize) {\n return null;\n }\n const sizeInBytes = Math.min(PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes, this.demuxer.dataSize - startOffset);\n if (this.demuxer.reader.fileSize === null) {\n // If the file size is unknown, we weren't able to cap the dataSize in the init logic and we instead have to\n // rely on the headers telling us how large the file is. But, these might be wrong, so let's check if the\n // requested slice actually exists.\n let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null;\n }\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, sizeInBytes);\n }\n const timestamp = packetIndex * PACKET_SIZE_IN_FRAMES / this.demuxer.audioInfo.sampleRate;\n const duration = sizeInBytes / this.demuxer.audioInfo.blockSizeInBytes / this.demuxer.audioInfo.sampleRate;\n this.demuxer.lastKnownPacketIndex = Math.max(packetIndex, timestamp);\n return new EncodedPacket(data, 'key', timestamp, duration, packetIndex, sizeInBytes);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.floor(Math.min(timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES, (this.demuxer.dataSize - 1) / (PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes)));\n const packet = await this.getPacketAtIndex(packetIndex, options);\n if (packet) {\n return packet;\n }\n if (packetIndex === 0) {\n return null; // Empty data chunk\n }\n assert(this.demuxer.reader.fileSize === null);\n // The file is shorter than we thought, meaning the packet we were looking for doesn't exist. So, let's find\n // the last packet by doing a sequential scan, instead.\n let currentPacket = await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex, options);\n while (currentPacket) {\n const nextPacket = await this.getNextPacket(currentPacket, options);\n if (!nextPacket) {\n break;\n }\n currentPacket = nextPacket;\n }\n return currentPacket;\n }\n getNextPacket(packet, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.round(packet.timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex + 1, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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 '../misc.js';\nimport { readBytes } from '../reader.js';\nexport const MIN_FRAME_HEADER_SIZE = 7;\nexport const MAX_FRAME_HEADER_SIZE = 9;\nexport const readFrameHeader = (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) 2025-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 { aacChannelMap, aacFrequencyTable } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, Bitstream, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { MAX_FRAME_HEADER_SIZE, MIN_FRAME_HEADER_SIZE, readFrameHeader } from './adts-reader.js';\nconst SAMPLES_PER_AAC_FRAME = 1024;\nexport class AdtsDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.loadedSamples = [];\n this.tracks = [];\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.lastLoadedPos = 0;\n this.nextTimestampInSamples = 0;\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n // Keep loading until we find the first frame header\n while (!this.firstFrameHeader && !this.lastSampleLoaded) {\n await this.advanceReader();\n }\n // There has to be a frame if this demuxer got selected\n assert(this.firstFrameHeader);\n // Create the single audio track\n this.tracks = [new InputAudioTrack(this.input, new AdtsAudioTrackBacking(this))];\n })();\n }\n async advanceReader() {\n let slice = this.reader.requestSliceRange(this.lastLoadedPos, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n this.lastSampleLoaded = true;\n return;\n }\n const header = readFrameHeader(slice);\n if (!header) {\n this.lastSampleLoaded = true;\n return;\n }\n if (this.reader.fileSize !== null && header.startPos + header.frameLength > this.reader.fileSize) {\n // Frame doesn't fit in the rest of the file\n this.lastSampleLoaded = true;\n return;\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n const sampleRate = aacFrequencyTable[header.samplingFrequencyIndex];\n assert(sampleRate !== undefined);\n const sampleDuration = SAMPLES_PER_AAC_FRAME / sampleRate;\n const headerSize = header.crcCheck ? MAX_FRAME_HEADER_SIZE : MIN_FRAME_HEADER_SIZE;\n const sample = {\n timestamp: this.nextTimestampInSamples / sampleRate,\n duration: sampleDuration,\n dataStart: header.startPos + headerSize,\n dataSize: header.frameLength - headerSize,\n };\n this.loadedSamples.push(sample);\n this.nextTimestampInSamples += SAMPLES_PER_AAC_FRAME;\n this.lastLoadedPos = header.startPos + header.frameLength;\n }\n async getMimeType() {\n return 'audio/aac';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getMetadataTags() {\n return {}; // No tags in this one\n }\n}\nclass AdtsAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n const sampleRate = this.getSampleRate();\n return sampleRate / SAMPLES_PER_AAC_FRAME;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'aac';\n }\n getInternalCodecId() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.objectType;\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n const numberOfChannels = aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];\n assert(numberOfChannels !== undefined);\n return numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n const sampleRate = aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];\n assert(sampleRate !== undefined);\n return sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n const bytes = new Uint8Array(3); // 19 bits max\n const bitstream = new Bitstream(bytes);\n const { objectType, samplingFrequencyIndex, channelConfiguration } = this.demuxer.firstFrameHeader;\n if (objectType > 31) {\n bitstream.writeBits(5, 31);\n bitstream.writeBits(6, objectType - 32);\n }\n else {\n bitstream.writeBits(5, objectType);\n }\n bitstream.writeBits(4, samplingFrequencyIndex); // samplingFrequencyIndex === 15 is forbidden\n bitstream.writeBits(4, channelConfiguration);\n return {\n codec: `mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,\n numberOfChannels: this.getNumberOfChannels(),\n sampleRate: this.getSampleRate(),\n description: bytes.subarray(0, Math.ceil((bitstream.pos - 1) / 8)),\n };\n }\n async getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const sampleIndex = binarySearchExact(this.demuxer.loadedSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n const nextIndex = sampleIndex + 1;\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const index = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.timestamp);\n if (index === -1 && this.demuxer.loadedSamples.length > 0) {\n // We're before the first sample\n return null;\n }\n if (this.demuxer.lastSampleLoaded) {\n // All data is loaded, return what we found\n return this.getPacketAtIndex(index, options);\n }\n if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) {\n // The next packet also exists, we're done\n return this.getPacketAtIndex(index, options);\n }\n // Otherwise, keep loading data\n await this.demuxer.advanceReader();\n }\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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 { FlacBlockType, readVorbisComments } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchLessOrEqual, Bitstream, textDecoder, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes, readU24Be, readU32Be, readU8, } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { calculateCrc8, readBlockSize, getBlockSizeOrUncommon, readCodedNumber, readSampleRate, getSampleRateOrUncommon, } from './flac-misc.js';\nexport class FlacDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos\n this.metadataPromise = null;\n this.track = null;\n this.metadataTags = {};\n this.audioInfo = null;\n this.lastLoadedPos = null;\n this.blockingBit = null;\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.reader = input._reader;\n }\n async computeDuration() {\n await this.readMetadata();\n assert(this.track);\n return this.track.computeDuration();\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n async getTracks() {\n await this.readMetadata();\n assert(this.track);\n return [this.track];\n }\n async getMimeType() {\n return 'audio/flac';\n }\n async readMetadata() {\n let currentPos = 4; // Skip 'fLaC'\n return (this.metadataPromise ??= (async () => {\n while (this.reader.fileSize === null\n || currentPos < this.reader.fileSize) {\n let sizeSlice = this.reader.requestSlice(currentPos, 4);\n if (sizeSlice instanceof Promise)\n sizeSlice = await sizeSlice;\n currentPos += 4;\n if (sizeSlice === null) {\n throw new Error(`Metadata block at position ${currentPos} is too small! Corrupted file.`);\n }\n assert(sizeSlice);\n const byte = readU8(sizeSlice); // first bit: isLastMetadata, remaining 7 bits: metaBlockType\n const size = readU24Be(sizeSlice);\n const isLastMetadata = (byte & 0x80) !== 0;\n const metaBlockType = byte & 0x7f;\n switch (metaBlockType) {\n case FlacBlockType.STREAMINFO: {\n // Parse streaminfo block\n // https://www.rfc-editor.org/rfc/rfc9639.html#section-8.2\n let streamInfoBlock = this.reader.requestSlice(currentPos, size);\n if (streamInfoBlock instanceof Promise)\n streamInfoBlock = await streamInfoBlock;\n assert(streamInfoBlock);\n if (streamInfoBlock === null) {\n throw new Error(`StreamInfo block at position ${currentPos} is too small! Corrupted file.`);\n }\n const streamInfoBytes = readBytes(streamInfoBlock, 34);\n const bitstream = new Bitstream(streamInfoBytes);\n const minimumBlockSize = bitstream.readBits(16);\n const maximumBlockSize = bitstream.readBits(16);\n const minimumFrameSize = bitstream.readBits(24);\n const maximumFrameSize = bitstream.readBits(24);\n const sampleRate = bitstream.readBits(20);\n const numberOfChannels = bitstream.readBits(3) + 1;\n bitstream.readBits(5); // bitsPerSample - 1\n const totalSamples = bitstream.readBits(36);\n // https://www.w3.org/TR/webcodecs-flac-codec-registration/#audiodecoderconfig-description\n // description is required, and has to be the following:\n // 1. The bytes 0x66 0x4C 0x61 0x43 (\"fLaC\" in ASCII)\n // 2. A metadata block (called the STREAMINFO block) as described in section 7 of [FLAC]\n // 3. Optionaly (sic) other metadata blocks, that are not used by the specification\n bitstream.skipBits(16 * 8); // md5 hash\n const description = new Uint8Array(42);\n // 1. \"fLaC\"\n description.set(new Uint8Array([0x66, 0x4c, 0x61, 0x43]), 0);\n // 2. STREAMINFO block\n description.set(new Uint8Array([128, 0, 0, 34]), 4);\n // 3. Other metadata blocks\n description.set(streamInfoBytes, 8);\n this.audioInfo = {\n numberOfChannels,\n sampleRate,\n totalSamples,\n minimumBlockSize,\n maximumBlockSize,\n minimumFrameSize,\n maximumFrameSize,\n description,\n };\n this.track = new InputAudioTrack(this.input, new FlacAudioTrackBacking(this));\n break;\n }\n case FlacBlockType.VORBIS_COMMENT: {\n // Parse vorbis comment block\n // https://www.rfc-editor.org/rfc/rfc9639.html#name-vorbis-comment\n let vorbisCommentBlock = this.reader.requestSlice(currentPos, size);\n if (vorbisCommentBlock instanceof Promise)\n vorbisCommentBlock = await vorbisCommentBlock;\n assert(vorbisCommentBlock);\n readVorbisComments(readBytes(vorbisCommentBlock, size), this.metadataTags);\n break;\n }\n case FlacBlockType.PICTURE: {\n // Parse picture block\n // https://www.rfc-editor.org/rfc/rfc9639.html#name-picture\n let pictureBlock = this.reader.requestSlice(currentPos, size);\n if (pictureBlock instanceof Promise)\n pictureBlock = await pictureBlock;\n assert(pictureBlock);\n const pictureType = readU32Be(pictureBlock);\n const mediaTypeLength = readU32Be(pictureBlock);\n const mediaType = textDecoder.decode(readBytes(pictureBlock, mediaTypeLength));\n const descriptionLength = readU32Be(pictureBlock);\n const description = textDecoder.decode(readBytes(pictureBlock, descriptionLength));\n pictureBlock.skip(4 + 4 + 4 + 4); // Skip width, height, color depth, number of indexed colors\n const dataLength = readU32Be(pictureBlock);\n const data = readBytes(pictureBlock, dataLength);\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data,\n mimeType: mediaType,\n // https://www.rfc-editor.org/rfc/rfc9639.html#table13\n kind: pictureType === 3\n ? 'coverFront'\n : pictureType === 4\n ? 'coverBack'\n : 'unknown',\n description,\n });\n break;\n }\n default:\n break;\n }\n currentPos += size;\n if (isLastMetadata) {\n this.lastLoadedPos = currentPos;\n break;\n }\n }\n })());\n }\n async readNextFlacFrame({ startPos, isFirstPacket, }) {\n assert(this.audioInfo);\n // we expect that there are at least `minimumFrameSize` bytes left in the file\n // Ideally we also want to validate the next header is valid\n // to throw out an accidential sync word\n // The shortest valid FLAC header I can think of, based off the code\n // of readFlacFrameHeader:\n // 4 bytes used for bitstream from syncword to bit depth\n // 1 byte coded number\n // (uncommon values, no bytes read)\n // 1 byte crc\n // --> 6 bytes\n const minimumHeaderLength = 6;\n // If we read everything in readFlacFrameHeader, we read 16 bytes\n const maximumHeaderSize = 16;\n const maximumSliceLength = this.audioInfo.maximumFrameSize + maximumHeaderSize;\n const slice = await this.reader.requestSliceRange(startPos, this.audioInfo.minimumFrameSize, maximumSliceLength);\n if (!slice) {\n return null;\n }\n const frameHeader = this.readFlacFrameHeader({\n slice,\n isFirstPacket: isFirstPacket,\n });\n if (!frameHeader) {\n return null;\n }\n // We don't know exactly how long the packet is, we only know the `minimumFrameSize` and `maximumFrameSize`\n // The packet is over if the next 2 bytes are the sync word followed by a valid header\n // or the end of the file is reached\n // The next sync word is expected at earliest when `minimumFrameSize` is reached,\n // we can skip over anything before that\n slice.filePos = startPos + this.audioInfo.minimumFrameSize;\n while (true) {\n // Reached end of the file, packet is over\n if (slice.filePos > slice.end - minimumHeaderLength) {\n return {\n num: frameHeader.num,\n blockSize: frameHeader.blockSize,\n sampleRate: frameHeader.sampleRate,\n size: slice.end - startPos,\n isLastFrame: true,\n };\n }\n const nextByte = readU8(slice);\n if (nextByte === 0xff) {\n const positionBeforeReading = slice.filePos;\n const byteAfterNextByte = readU8(slice);\n const expected = this.blockingBit === 1 ? 0b1111_1001 : 0b1111_1000;\n if (byteAfterNextByte !== expected) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n slice.skip(-2);\n const lengthIfNextFlacFrameHeaderIsLegit = slice.filePos - startPos;\n const nextFrameHeader = this.readFlacFrameHeader({\n slice,\n isFirstPacket: false,\n });\n if (!nextFrameHeader) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n // Ensure the frameOrSampleNum is consecutive.\n // https://github.com/Vanilagy/mediabunny/issues/194\n if (this.blockingBit === 0) {\n // Case A: If the stream is fixed block size, this is the frame number, which increments by 1\n if (nextFrameHeader.num - frameHeader.num !== 1) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n }\n else {\n // Case B: If the stream is variable block size, this is the sample number, which increments by\n // amount of samples in a frame.\n if (nextFrameHeader.num - frameHeader.num !== frameHeader.blockSize) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n }\n return {\n num: frameHeader.num,\n blockSize: frameHeader.blockSize,\n sampleRate: frameHeader.sampleRate,\n size: lengthIfNextFlacFrameHeaderIsLegit,\n isLastFrame: false,\n };\n }\n }\n }\n readFlacFrameHeader({ slice, isFirstPacket, }) {\n // In this function, generally it is not safe to throw errors.\n // We might end up here because we stumbled upon a syncword,\n // but the data might not actually be a FLAC frame, it might be random bitstream\n // data, in that case we should return null and continue.\n const startOffset = slice.filePos;\n // https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1\n // Each frame MUST start on a byte boundary and start with the 15-bit frame\n // sync code 0b111111111111100. Following the sync code is the blocking strategy\n // bit, which MUST NOT change during the audio stream.\n const bytes = readBytes(slice, 4);\n const bitstream = new Bitstream(bytes);\n const bits = bitstream.readBits(15);\n if (bits !== 0b111111111111100) {\n // This cannot be a valid FLAC frame, must start with the syncword\n return null;\n }\n if (this.blockingBit === null) {\n assert(isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n this.blockingBit = newBlockingBit;\n }\n else if (this.blockingBit === 1) {\n assert(!isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n if (newBlockingBit !== 1) {\n // This cannot be a valid FLAC frame, expected 1 but got 0\n return null;\n }\n }\n else if (this.blockingBit === 0) {\n assert(!isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n if (newBlockingBit !== 0) {\n // This cannot be a valid FLAC frame, expected 0 but got 1\n return null;\n }\n }\n else {\n throw new Error('Invalid blocking bit');\n }\n const blockSizeOrUncommon = getBlockSizeOrUncommon(bitstream.readBits(4));\n if (!blockSizeOrUncommon) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n assert(this.audioInfo);\n const sampleRateOrUncommon = getSampleRateOrUncommon(bitstream.readBits(4), this.audioInfo.sampleRate);\n if (!sampleRateOrUncommon) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n bitstream.readBits(4); // channel count\n bitstream.readBits(3); // bit depth\n const reservedZero = bitstream.readBits(1); // reserved zero\n if (reservedZero !== 0) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n const num = readCodedNumber(slice);\n const blockSize = readBlockSize(slice, blockSizeOrUncommon);\n const sampleRate = readSampleRate(slice, sampleRateOrUncommon);\n if (sampleRate === null) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n if (sampleRate !== this.audioInfo.sampleRate) {\n // This cannot be a valid FLAC frame, the sample rate is not the same as in the stream info\n return null;\n }\n const size = slice.filePos - startOffset;\n const crc = readU8(slice);\n slice.skip(-size);\n slice.skip(-1);\n const crcCalculated = calculateCrc8(readBytes(slice, size));\n if (crc !== crcCalculated) {\n // Maybe this wasn't a FLAC frame at all, the syncword was just coincidentally\n // in the bitstream\n return null;\n }\n return { num, blockSize, sampleRate };\n }\n async advanceReader() {\n await this.readMetadata();\n assert(this.lastLoadedPos !== null);\n assert(this.audioInfo);\n const startPos = this.lastLoadedPos;\n const frame = await this.readNextFlacFrame({\n startPos,\n isFirstPacket: this.loadedSamples.length === 0,\n });\n if (!frame) {\n // Unexpected case, failed to read next FLAC frame\n // handling gracefully\n this.lastSampleLoaded = true;\n return;\n }\n const lastSample = this.loadedSamples[this.loadedSamples.length - 1];\n const blockOffset = lastSample\n ? lastSample.blockOffset + lastSample.blockSize\n : 0;\n const sample = {\n blockOffset,\n blockSize: frame.blockSize,\n byteOffset: startPos,\n byteSize: frame.size,\n };\n this.lastLoadedPos = this.lastLoadedPos + frame.size;\n this.loadedSamples.push(sample);\n if (frame.isLastFrame) {\n this.lastSampleLoaded = true;\n return;\n }\n }\n}\nclass FlacAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return 'flac';\n }\n getInternalCodecId() {\n return null;\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getDecoderConfig() {\n assert(this.demuxer.audioInfo);\n return {\n codec: 'flac',\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n description: this.demuxer.audioInfo.description,\n };\n }\n async getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n if (timestamp < 0) {\n throw new Error('Timestamp cannot be negative');\n }\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const packetIndex = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.blockOffset / this.demuxer.audioInfo.sampleRate);\n if (packetIndex === -1) {\n await this.demuxer.advanceReader();\n continue;\n }\n const packet = this.demuxer.loadedSamples[packetIndex];\n const sampleTimestamp = packet.blockOffset / this.demuxer.audioInfo.sampleRate;\n const sampleDuration = packet.blockSize / this.demuxer.audioInfo.sampleRate;\n if (sampleTimestamp + sampleDuration <= timestamp) {\n if (this.demuxer.lastSampleLoaded) {\n return this.getPacketAtIndex(this.demuxer.loadedSamples.length - 1, options);\n }\n await this.demuxer.advanceReader();\n continue;\n }\n return this.getPacketAtIndex(packetIndex, options);\n }\n }\n finally {\n release();\n }\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const nextIndex = packet.sequenceNumber + 1;\n if (this.demuxer.lastSampleLoaded\n && nextIndex >= this.demuxer.loadedSamples.length) {\n return null;\n }\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n async getPacketAtIndex(sampleIndex, options) {\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.byteOffset, rawSample.byteSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.byteSize);\n }\n assert(this.demuxer.audioInfo);\n const timestamp = rawSample.blockOffset / this.demuxer.audioInfo.sampleRate;\n const duration = rawSample.blockSize / this.demuxer.audioInfo.sampleRate;\n return new EncodedPacket(data, 'key', timestamp, duration, sampleIndex, rawSample.byteSize);\n }\n async getFirstPacket(options) {\n // Ensure the next sample exists\n while (this.demuxer.loadedSamples.length === 0\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(0, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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, Bitstream } from '../misc.js';\nimport { readBytes, readU16Be, readU8 } from '../reader.js';\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-block-size-bits\nexport const getBlockSizeOrUncommon = (bits) => {\n if (bits === 0b0000) {\n return null;\n }\n else if (bits === 0b0001) {\n return 192;\n }\n else if (bits >= 0b0010 && bits <= 0b0101) {\n return 144 * 2 ** bits;\n }\n else if (bits === 0b0110) {\n return 'uncommon-u8';\n }\n else if (bits === 0b0111) {\n return 'uncommon-u16';\n }\n else if (bits >= 0b1000 && bits <= 0b1111) {\n return 2 ** bits;\n }\n else {\n return null;\n }\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-sample-rate-bits\nexport const getSampleRateOrUncommon = (sampleRateBits, streamInfoSampleRate) => {\n switch (sampleRateBits) {\n case 0b0000: return streamInfoSampleRate;\n case 0b0001: return 88200;\n case 0b0010: return 176400;\n case 0b0011: return 192000;\n case 0b0100: return 8000;\n case 0b0101: return 16000;\n case 0b0110: return 22050;\n case 0b0111: return 24000;\n case 0b1000: return 32000;\n case 0b1001: return 44100;\n case 0b1010: return 48000;\n case 0b1011: return 96000;\n case 0b1100: return 'uncommon-u8';\n case 0b1101: return 'uncommon-u16';\n case 0b1110: return 'uncommon-u16-10';\n default: return null;\n }\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-coded-number\nexport const readCodedNumber = (fileSlice) => {\n let ones = 0;\n const bitstream1 = new Bitstream(readBytes(fileSlice, 1));\n while (bitstream1.readBits(1) === 1) {\n ones++;\n }\n if (ones === 0) {\n return bitstream1.readBits(7);\n }\n const bitArray = [];\n const extraBytes = ones - 1;\n const bitstream2 = new Bitstream(readBytes(fileSlice, extraBytes));\n const firstByteBits = 8 - ones - 1;\n for (let i = 0; i < firstByteBits; i++) {\n bitArray.unshift(bitstream1.readBits(1));\n }\n for (let i = 0; i < extraBytes; i++) {\n for (let j = 0; j < 8; j++) {\n const val = bitstream2.readBits(1);\n if (j < 2) {\n continue;\n }\n bitArray.unshift(val);\n }\n }\n const encoded = bitArray.reduce((acc, bit, index) => {\n return acc | (bit << index);\n }, 0);\n return encoded;\n};\nexport const readBlockSize = (slice, blockSizeBits) => {\n if (blockSizeBits === 'uncommon-u16') {\n return readU16Be(slice) + 1;\n }\n else if (blockSizeBits === 'uncommon-u8') {\n return readU8(slice) + 1;\n }\n else if (typeof blockSizeBits === 'number') {\n return blockSizeBits;\n }\n else {\n assertNever(blockSizeBits);\n assert(false);\n }\n};\nexport const readSampleRate = (slice, sampleRateOrUncommon) => {\n if (sampleRateOrUncommon === 'uncommon-u16') {\n return readU16Be(slice);\n }\n if (sampleRateOrUncommon === 'uncommon-u16-10') {\n return readU16Be(slice) * 10;\n }\n if (sampleRateOrUncommon === 'uncommon-u8') {\n return readU8(slice);\n }\n if (typeof sampleRateOrUncommon === 'number') {\n return sampleRateOrUncommon;\n }\n return null;\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1.1\nexport const calculateCrc8 = (data) => {\n const polynomial = 0x07; // x^8 + x^2 + x^1 + x^0\n let crc = 0x00; // Initialize CRC to 0\n for (const byte of data) {\n crc ^= byte; // XOR byte into least significant byte of crc\n for (let i = 0; i < 8; i++) {\n // For each bit in the byte\n if ((crc & 0x80) !== 0) {\n // If the leftmost bit (MSB) is set\n crc = (crc << 1) ^ polynomial; // Shift left and XOR with polynomial\n }\n else {\n crc <<= 1; // Just shift left\n }\n crc &= 0xff; // Ensure CRC remains 8-bit\n }\n }\n return crc;\n};\n","import {\n ALL_FORMATS,\n BlobSource,\n CanvasSink,\n Input,\n ReadableStreamSource,\n UrlSource,\n} from 'mediabunny'\n\nexport default function createVideoEngine({\n canvas,\n ctx,\n events,\n timeupdateInterval = 250,\n avSyncTolerance = 0.12,\n dropLateFrames = false,\n poster = '',\n preflightRange = false,\n}) {\n let input = null\n let videoSink = null\n let videoIterator = null\n\n let nextFrame = null\n let rafId = 0\n let asyncId = 0\n\n let _width = 0\n let _height = 0\n let _duration = Number.NaN\n\n let audioClock = null\n let lastTimeUpdate = 0\n let stalled = false\n let playbackRate = 1\n let posterDrawn = false\n\n function normalizeSource(src) {\n if (typeof src === 'string')\n return new UrlSource(src)\n if (src instanceof Blob)\n return new BlobSource(src)\n if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream)\n return new ReadableStreamSource(src)\n return src\n }\n\n async function preflight(url) {\n if (!preflightRange || typeof url !== 'string')\n return true\n try {\n const res = await fetch(url, { method: 'HEAD' })\n const acceptRanges = res.headers.get('accept-ranges')\n if (!acceptRanges || acceptRanges === 'none') {\n events.emit('error', new Event('RangeNotSupported'))\n return false\n }\n return true\n }\n catch (e) {\n console.warn('preflight failed', e)\n return true\n }\n }\n\n function drawPoster() {\n if (!poster || posterDrawn)\n return\n const img = new Image()\n img.onload = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n canvas.width = img.naturalWidth || canvas.width\n canvas.height = img.naturalHeight || canvas.height\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n posterDrawn = true\n }\n img.src = poster\n }\n\n async function stopIterator() {\n await videoIterator?.return()\n videoIterator = null\n }\n\n function clear() {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n }\n\n async function load(src, onMetadata) {\n asyncId++\n const id = asyncId\n\n await stopIterator()\n clear()\n posterDrawn = false\n\n if (!(await preflight(src)))\n return\n\n const source = normalizeSource(src)\n if (!source) {\n drawPoster()\n return\n }\n\n input = new Input({\n source,\n formats: ALL_FORMATS,\n })\n\n _duration = await input.computeDuration()\n if (id !== asyncId)\n return\n\n const videoTrack = await input.getPrimaryVideoTrack()\n if (!videoTrack) {\n videoSink = null\n _width = 0\n _height = 0\n canvas.width = 0\n canvas.height = 0\n drawPoster()\n if (onMetadata)\n onMetadata()\n return\n }\n\n if (videoTrack.codec === null || !(await videoTrack.canDecode())) {\n videoSink = null\n _width = 0\n _height = 0\n canvas.width = 0\n canvas.height = 0\n clear()\n drawPoster()\n if (onMetadata)\n onMetadata()\n return\n }\n\n const transparent = await videoTrack.canBeTransparent()\n videoSink = new CanvasSink(videoTrack, {\n poolSize: 2,\n fit: 'contain',\n alpha: transparent,\n })\n\n _width = videoTrack.displayWidth\n _height = videoTrack.displayHeight\n\n canvas.width = _width\n canvas.height = _height\n\n if (onMetadata)\n onMetadata()\n\n await resetIterator(0)\n }\n\n async function resetIterator(time) {\n await stopIterator()\n\n if (!videoSink)\n return\n\n videoIterator = videoSink.canvases(time)\n\n const first = (await videoIterator.next()).value ?? null\n const second = (await videoIterator.next()).value ?? null\n\n nextFrame = second\n\n if (first) {\n ctx.drawImage(first.canvas, 0, 0)\n events.emit('loadeddata')\n }\n else {\n drawPoster()\n }\n }\n\n async function updateNextFrame(localId) {\n if (!videoIterator)\n return\n\n while (true) {\n const frame = (await videoIterator.next()).value ?? null\n if (!frame)\n return\n if (localId !== asyncId)\n return\n\n const t = audioClock.currentTime\n if (dropLateFrames) {\n const tolerance = Math.max(0.06, avSyncTolerance / Math.max(1, playbackRate))\n if (frame.timestamp < t - tolerance) {\n continue\n }\n if (frame.timestamp <= t + tolerance) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(frame.canvas, 0, 0)\n }\n else {\n nextFrame = frame\n return\n }\n }\n else {\n if (frame.timestamp <= t) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(frame.canvas, 0, 0)\n }\n else {\n nextFrame = frame\n return\n }\n }\n }\n }\n\n function render() {\n if (!audioClock)\n return\n\n const t = audioClock.currentTime\n const now = Date.now()\n if (now - lastTimeUpdate >= timeupdateInterval) {\n events.emit('timeupdate')\n lastTimeUpdate = now\n }\n\n if (Number.isFinite(_duration) && t >= _duration) {\n stop()\n stalled = false\n events.emit('ended')\n events.emit('pause')\n events.emit('canplay')\n return\n }\n\n if (nextFrame && nextFrame.timestamp <= t) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(nextFrame.canvas, 0, 0)\n nextFrame = null\n updateNextFrame(asyncId)\n if (stalled) {\n events.emit('canplay')\n events.emit('playing')\n stalled = false\n }\n }\n else if (!nextFrame) {\n updateNextFrame(asyncId)\n if (!nextFrame && Number.isFinite(_duration) && t < _duration && !stalled) {\n stalled = true\n events.emit('waiting')\n }\n }\n\n rafId = requestAnimationFrame(render)\n }\n\n function start(audioEngine) {\n audioClock = audioEngine\n asyncId++\n stalled = false\n updateNextFrame(asyncId)\n rafId = requestAnimationFrame(render)\n }\n\n function stop() {\n cancelAnimationFrame(rafId)\n }\n\n async function seek(time) {\n asyncId++\n await resetIterator(time)\n }\n\n function setPlaybackRate(rate) {\n playbackRate = Math.max(0.1, Number(rate) || 1)\n }\n\n function destroy() {\n asyncId++\n stop()\n stopIterator()\n posterDrawn = false\n input = null\n videoSink = null\n }\n\n return {\n load,\n start,\n stop,\n seek,\n setPlaybackRate,\n destroy,\n\n get width() {\n return _width\n },\n get height() {\n return _height\n },\n get duration() {\n return _duration\n },\n }\n}\n","export default function clamp(v, min, max) {\n return Math.max(min, Math.min(max, Number(v) || 0))\n}\n","export function createVideoEventTarget() {\n const listeners = new Map()\n\n function addEventListener(type, fn) {\n if (!listeners.has(type))\n listeners.set(type, [])\n listeners.get(type).push(fn)\n }\n\n function removeEventListener(type, fn) {\n const list = listeners.get(type)\n if (!list)\n return\n const i = list.indexOf(fn)\n if (i >= 0)\n list.splice(i, 1)\n }\n\n function emit(type, detail) {\n const evt = new Event(type)\n evt.detail = detail\n const list = listeners.get(type)\n if (list)\n list.forEach(fn => fn(evt))\n }\n\n return { addEventListener, removeEventListener, emit }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"} \ No newline at end of file +{"mappings":"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","sources":["packages/artplayer-proxy-mediabunny/src/index.js","packages/artplayer-proxy-mediabunny/src/VideoShim.js","packages/artplayer-proxy-mediabunny/src/MediaBunnyEngine.js","packages/artplayer-proxy-mediabunny/src/AudioEngine.js","node_modules/mediabunny/dist/modules/src/index.js","node_modules/mediabunny/dist/modules/src/codec.js","node_modules/mediabunny/dist/modules/src/misc.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js","node_modules/mediabunny/dist/modules/src/source.js","node_modules/@parcel/node-resolver-core/lib/_empty.js","node_modules/mediabunny/dist/modules/src/input.js","node_modules/mediabunny/dist/modules/src/input-format.js","node_modules/mediabunny/dist/modules/src/isobmff/isobmff-demuxer.js","node_modules/mediabunny/dist/modules/src/codec-data.js","node_modules/mediabunny/dist/modules/src/demuxer.js","node_modules/mediabunny/dist/modules/src/input-track.js","node_modules/mediabunny/dist/modules/src/custom-coder.js","node_modules/mediabunny/dist/modules/src/media-sink.js","node_modules/mediabunny/dist/modules/src/packet.js","node_modules/mediabunny/dist/modules/src/pcm.js","node_modules/mediabunny/dist/modules/src/sample.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/metadata.js","node_modules/mediabunny/dist/modules/src/reader.js","node_modules/mediabunny/dist/modules/src/matroska/ebml.js","node_modules/mediabunny/dist/modules/src/matroska/matroska-demuxer.js","node_modules/mediabunny/dist/modules/src/matroska/matroska-misc.js","node_modules/mediabunny/dist/modules/src/mp3/mp3-demuxer.js","node_modules/mediabunny/dist/modules/shared/mp3-misc.js","node_modules/mediabunny/dist/modules/src/id3.js","node_modules/mediabunny/dist/modules/src/mp3/mp3-reader.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-demuxer.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-misc.js","node_modules/mediabunny/dist/modules/src/ogg/ogg-reader.js","node_modules/mediabunny/dist/modules/src/wave/wave-demuxer.js","node_modules/mediabunny/dist/modules/src/adts/adts-reader.js","node_modules/mediabunny/dist/modules/src/adts/adts-demuxer.js","node_modules/mediabunny/dist/modules/src/flac/flac-demuxer.js","node_modules/mediabunny/dist/modules/src/flac/flac-misc.js","packages/artplayer-proxy-mediabunny/src/VideoEngine.js","packages/artplayer-proxy-mediabunny/src/EventTarget.js"],"sourcesContent":["/**\n * ArtPlayer MediaBunny Proxy\n * Main entry point\n */\nimport VideoShim from './VideoShim.js'\n\nexport default function artplayerProxyMediabunny(option = {}) {\n return (art) => {\n const { constructor } = art\n const { createElement } = constructor.utils\n\n // Create canvas element\n const canvas = createElement('canvas')\n const ctx = canvas.getContext('2d')\n\n // Create video shim\n const shim = new VideoShim({\n art,\n canvas,\n ctx,\n option,\n })\n\n // Proxy canvas methods to shim\n const originalCanvasMethods = {}\n for (const prop in canvas) {\n if (typeof canvas[prop] === 'function') {\n originalCanvasMethods[prop] = canvas[prop].bind(canvas)\n }\n }\n\n // Get all properties from shim instance and prototype\n const propertyNames = new Set([\n ...Object.getOwnPropertyNames(shim),\n ...Object.getOwnPropertyNames(Object.getPrototypeOf(shim)),\n ])\n\n // Add shim properties to canvas\n for (const prop of propertyNames) {\n if (prop === 'constructor') continue\n if (!(prop in canvas)) {\n Object.defineProperty(canvas, prop, {\n get() {\n const value = shim[prop]\n return typeof value === 'function' ? value.bind(shim) : value\n },\n set(v) {\n shim[prop] = v\n },\n configurable: true,\n enumerable: true,\n })\n }\n }\n\n // Restore original canvas methods\n for (const prop in originalCanvasMethods) {\n canvas[prop] = (...args) => originalCanvasMethods[prop](...args)\n }\n\n // Handle resize\n function resize() {\n const player = art.template?.$player\n if (!player || art.option.autoSize) return\n\n Object.assign(canvas.style, {\n width: '100%',\n height: '100%',\n objectFit: 'contain',\n })\n }\n\n art.on('resize', resize)\n art.on('video:loadedmetadata', resize)\n\n // Cleanup on destroy\n art.on('destroy', () => {\n shim.destroy()\n })\n\n return canvas\n }\n}\n\nif (typeof window !== 'undefined') {\n window.artplayerProxyMediabunny = artplayerProxyMediabunny\n}\n","/**\n * Video Element Shim\n * Simulates HTMLVideoElement interface for MediaBunny\n */\nimport MediaBunnyEngine from './MediaBunnyEngine.js'\nimport EventTarget from './EventTarget.js'\n\nfunction clamp(v, min, max) {\n return Math.max(min, Math.min(max, Number(v) || 0))\n}\n\nexport default class VideoShim {\n constructor({ art, canvas, ctx, option }) {\n this.art = art\n this.canvas = canvas\n this.option = option\n\n // Event system\n this.events = new EventTarget()\n \n // MediaBunny engine\n this.engine = new MediaBunnyEngine({ canvas, ctx, events: this.events, option })\n\n // Internal state\n this._src = null\n this._volume = option.volume ?? 0.7\n this._muted = !!option.muted\n this._playbackRate = 1\n\n // Apply initial volume\n this.engine.setVolume(this._volume, this._muted)\n\n // Forward events to ArtPlayer\n this.setupEventForwarding()\n\n // Auto-load source\n if (option.source) {\n this.src = option.source\n } else if (art.option?.url) {\n this.src = art.option.url\n }\n }\n\n setupEventForwarding() {\n const { events: artEvents } = this.art.constructor.config\n artEvents.forEach((name) => {\n this.events.addEventListener(name, (e) => {\n this.art.emit(`video:${e.type}`, e)\n })\n })\n }\n\n // Event methods\n addEventListener(type, fn) {\n this.events.addEventListener(type, fn)\n }\n\n removeEventListener(type, fn) {\n this.events.removeEventListener(type, fn)\n }\n\n // Source\n get src() {\n return this._src\n }\n\n set src(v) {\n this._src = v\n if (v) this.engine.load(v)\n }\n\n get currentSrc() {\n return this._src\n }\n\n // Time\n get currentTime() {\n return this.engine.currentTime\n }\n\n set currentTime(t) {\n this.engine.seek(Number(t) || 0)\n }\n\n get duration() {\n return this.engine.duration\n }\n\n // Buffered/Played/Seekable\n get buffered() {\n return this.createTimeRanges(0, this.engine.duration)\n }\n\n get played() {\n return this.createTimeRanges(0, this.engine.currentTime)\n }\n\n get seekable() {\n return this.createTimeRanges(0, this.engine.duration)\n }\n\n createTimeRanges(start, end) {\n const duration = this.engine.duration\n if (!duration || Number.isNaN(duration) || end <= 0) {\n return { length: 0, start: () => 0, end: () => 0 }\n }\n return {\n length: 1,\n start: () => start,\n end: () => end,\n }\n }\n\n // Playback state\n get paused() {\n return this.engine.paused\n }\n\n get playing() {\n return !this.engine.paused && !this.engine.ended\n }\n\n get ended() {\n return this.engine.ended\n }\n\n get seeking() {\n return this.engine.seeking\n }\n\n // Ready state\n get readyState() {\n return this.engine.readyState\n }\n\n get networkState() {\n return this.engine.networkState\n }\n\n get error() {\n return this.engine.error\n }\n\n // Playback rate\n get playbackRate() {\n return this._playbackRate\n }\n\n set playbackRate(v) {\n const rate = Number(v)\n if (Number.isNaN(rate) || rate <= 0) return\n \n this._playbackRate = rate\n this.engine.setPlaybackRate(rate)\n this.events.emit('ratechange')\n }\n\n // Volume\n get volume() {\n return this._volume\n }\n\n set volume(v) {\n this._volume = clamp(v, 0, 1)\n this._muted = false\n this.engine.setVolume(this._volume, this._muted)\n this.events.emit('volumechange')\n }\n\n get muted() {\n return this._muted\n }\n\n set muted(v) {\n this._muted = !!v\n this.engine.setVolume(this._volume, this._muted)\n this.events.emit('volumechange')\n }\n\n // Playback methods\n play() {\n return this.engine.play()\n }\n\n pause() {\n this.engine.pause()\n }\n\n load() {\n if (this._src) this.engine.load(this._src)\n }\n\n // Video dimensions\n get videoWidth() {\n return this.engine.videoWidth\n }\n\n get videoHeight() {\n return this.engine.videoHeight\n }\n\n // Other properties\n get poster() {\n return this.option.poster || ''\n }\n\n set poster(v) {\n this.option.poster = v\n }\n\n get autoplay() {\n return this.option.autoplay || false\n }\n\n set autoplay(v) {}\n\n get loop() {\n return this.option.loop || false\n }\n\n set loop(v) {}\n\n get controls() {\n return false\n }\n\n set controls(v) {}\n\n get playsInline() {\n return true\n }\n\n set playsInline(v) {}\n\n get crossOrigin() {\n return this.option.crossOrigin || ''\n }\n\n set crossOrigin(v) {}\n\n get preload() {\n return 'auto'\n }\n\n set preload(v) {}\n\n get defaultMuted() {\n return false\n }\n\n set defaultMuted(v) {}\n\n get defaultPlaybackRate() {\n return 1\n }\n\n set defaultPlaybackRate(v) {}\n\n // Methods\n canPlayType(_type) {\n return 'maybe'\n }\n\n getBoundingClientRect() {\n return this.canvas.getBoundingClientRect()\n }\n\n requestVideoFrameCallback(callback) {\n const id = requestAnimationFrame((time) => {\n callback(time, {\n presentationTime: this.engine.currentTime,\n expectedDisplayTime: time + 16.6,\n width: this.engine.videoWidth,\n height: this.engine.videoHeight,\n mediaTime: this.engine.currentTime,\n presentedFrames: 0,\n processingDuration: 0,\n captureTime: time,\n receiveTime: time,\n rtpTimestamp: 0,\n })\n })\n return id\n }\n\n cancelVideoFrameCallback(id) {\n cancelAnimationFrame(id)\n }\n\n setAttribute(name, value) {\n if (name === 'src') {\n this.src = value\n } else if (name === 'autoplay') {\n this.autoplay = value\n } else if (name === 'loop') {\n this.loop = value\n } else if (name === 'muted') {\n this.muted = true\n } else {\n this.canvas.setAttribute(name, value)\n }\n }\n\n destroy() {\n this.engine.destroy()\n }\n}\n","/**\n * Main MediaBunny Engine\n * Coordinates audio and video playback\n */\nimport AudioEngine from './AudioEngine.js'\nimport VideoEngine from './VideoEngine.js'\n\nexport default class MediaBunnyEngine {\n constructor({ canvas, ctx, events, option = {} }) {\n this.events = events\n this.option = option\n \n // Create audio and video engines\n this.audio = new AudioEngine(events)\n this.video = new VideoEngine({\n canvas,\n ctx,\n events,\n timeupdateInterval: option.timeupdateInterval ?? 250,\n avSyncTolerance: option.avSyncTolerance ?? 0.12,\n dropLateFrames: option.dropLateFrames ?? false,\n poster: option.poster ?? '',\n preflightRange: option.preflightRange ?? false,\n })\n\n // Playback state\n this.paused = true\n this.ended = false\n this.readyState = 0\n this.networkState = 0\n this.error = null\n this.seeking = false\n this.loadSeq = 0\n\n // Listen to ended event\n events.addEventListener?.('ended', () => {\n this.ended = true\n this.paused = true\n })\n }\n\n async load(src) {\n const id = ++this.loadSeq\n \n this.pause()\n this.ended = false\n this.error = null\n this.networkState = 2 // NETWORK_LOADING\n this.readyState = 0 // HAVE_NOTHING\n \n setTimeout(() => this.events.emit('waiting'), 0)\n setTimeout(() => this.events.emit('loadstart'), 0)\n\n const loadTimeout = Number.isFinite(this.option.loadTimeout)\n ? this.option.loadTimeout\n : 12000\n\n try {\n await Promise.race([\n this.performLoad(src, id),\n loadTimeout > 0 ? this.createTimeout(loadTimeout) : Promise.resolve(),\n ])\n } catch (err) {\n if (id !== this.loadSeq) return\n \n this.loadSeq++\n this.error = { code: 4, message: err.message }\n this.networkState = 3 // NETWORK_NO_SOURCE\n this.events.emit('error')\n }\n }\n\n async performLoad(src, id) {\n let videoMetadataLoaded = false\n let audioMetadataLoaded = false\n\n const checkMetadata = () => {\n if (videoMetadataLoaded && audioMetadataLoaded) {\n this.readyState = 1 // HAVE_METADATA\n this.events.emit('loadedmetadata')\n this.events.emit('durationchange')\n }\n }\n\n try {\n await Promise.all([\n this.video.load(src, () => {\n if (id !== this.loadSeq) return\n videoMetadataLoaded = true\n checkMetadata()\n }),\n this.audio.load(src, () => {\n if (id !== this.loadSeq) return\n audioMetadataLoaded = true\n checkMetadata()\n }),\n ])\n\n if (id !== this.loadSeq) return\n\n this.readyState = 4 // HAVE_ENOUGH_DATA\n this.networkState = 1 // NETWORK_IDLE\n this.events.emit('loadeddata')\n this.events.emit('canplay')\n this.events.emit('canplaythrough')\n } catch (err) {\n if (id !== this.loadSeq) return\n \n this.error = { code: 4, message: err.message }\n this.networkState = 3\n this.events.emit('error')\n console.error('MediaBunny load error:', err)\n }\n }\n\n createTimeout(ms) {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Load timeout')), ms)\n })\n }\n\n async play() {\n if (!this.paused) return\n\n if (this.ended) {\n this.ended = false\n await this.seek(0)\n }\n\n this.paused = false\n \n await this.audio.play()\n this.video.start(this.audio)\n \n this.events.emit('play')\n this.events.emit('playing')\n }\n\n pause() {\n if (this.paused) return\n\n this.paused = true\n \n this.audio.pause()\n this.video.stop()\n \n this.events.emit('pause')\n }\n\n async seek(time) {\n const shouldResume = !this.paused\n \n this.ended = false\n this.seeking = true\n \n this.events.emit('seeking')\n this.events.emit('waiting')\n \n this.pause()\n \n await Promise.all([\n this.audio.seek(time),\n this.video.seek(time),\n ])\n \n this.seeking = false\n this.events.emit('seeked')\n \n if (shouldResume && !this.ended) {\n await this.play()\n }\n }\n\n setVolume(volume, muted) {\n this.audio.setVolume(volume, muted)\n }\n\n setPlaybackRate(rate) {\n this.audio.setPlaybackRate(rate)\n this.video.setPlaybackRate(rate)\n }\n\n destroy() {\n this.pause()\n this.audio.destroy()\n this.video.destroy()\n }\n\n // Getters\n get currentTime() {\n return this.audio.currentTime\n }\n\n get duration() {\n return this.audio.duration || this.video.duration\n }\n\n get videoWidth() {\n return this.video.width\n }\n\n get videoHeight() {\n return this.video.height\n }\n}\n","/**\n * Audio Engine for MediaBunny\n * Handles audio playback using Web Audio API\n */\nimport {\n ALL_FORMATS,\n AudioBufferSink,\n BlobSource,\n Input,\n ReadableStreamSource,\n UrlSource,\n} from 'mediabunny'\n\nexport default class AudioEngine {\n constructor(events) {\n this.events = events\n \n // MediaBunny instances\n this.input = null\n this.audioSink = null\n this.audioIterator = null\n \n // Web Audio API\n this.audioContext = null\n this.gainNode = null\n \n // Playback state\n this.audioContextStartTime = 0\n this.playbackTimeAtStart = 0\n this.latestScheduledEndTime = 0\n this.duration = Number.NaN\n this.paused = true\n \n // Audio settings\n this.volume = 0.7\n this.muted = false\n this.playbackRate = 1\n \n // Async control\n this.asyncId = 0\n this.queuedNodes = new Set()\n }\n\n get currentTime() {\n if (this.paused) return this.playbackTimeAtStart\n \n return (\n (this.audioContext.currentTime - this.audioContextStartTime) * this.playbackRate\n + this.playbackTimeAtStart\n )\n }\n\n normalizeSource(src) {\n if (typeof src === 'string') return new UrlSource(src)\n if (src instanceof Blob) return new BlobSource(src)\n if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) {\n return new ReadableStreamSource(src)\n }\n return src\n }\n\n ensureAudioContext(sampleRate) {\n if (this.audioContext) return\n\n const AudioContext = window.AudioContext || window.webkitAudioContext\n \n try {\n this.audioContext = new AudioContext({ sampleRate })\n } catch {\n this.audioContext = new AudioContext()\n }\n\n this.gainNode = this.audioContext.createGain()\n this.gainNode.connect(this.audioContext.destination)\n this.updateGain()\n }\n\n updateGain() {\n if (!this.gainNode) return\n const v = this.muted ? 0 : this.volume\n this.gainNode.gain.value = v * v\n }\n\n stopQueuedNodes() {\n this.queuedNodes.forEach(node => node.stop())\n this.queuedNodes.clear()\n }\n\n async stopIterator() {\n await this.audioIterator?.return()\n this.audioIterator = null\n }\n\n async load(src, onMetadata) {\n const id = ++this.asyncId\n\n await this.stopIterator()\n this.stopQueuedNodes()\n\n this.paused = true\n this.playbackTimeAtStart = 0\n this.audioContextStartTime = 0\n\n const source = this.normalizeSource(src)\n if (!source) return\n\n this.input = new Input({\n source,\n formats: ALL_FORMATS,\n })\n\n this.duration = await this.input.computeDuration()\n if (id !== this.asyncId) return\n\n const audioTrack = await this.input.getPrimaryAudioTrack()\n if (!audioTrack) {\n this.audioSink = null\n this.ensureAudioContext()\n onMetadata?.()\n return\n }\n\n if (audioTrack.codec === null || !(await audioTrack.canDecode())) {\n this.audioSink = null\n this.ensureAudioContext()\n onMetadata?.()\n return\n }\n\n this.ensureAudioContext(audioTrack.sampleRate)\n this.audioSink = new AudioBufferSink(audioTrack)\n\n onMetadata?.()\n }\n\n async runIterator(localId) {\n if (!this.audioSink) return\n\n await this.stopIterator()\n this.audioIterator = this.audioSink.buffers(this.currentTime)\n\n while (true) {\n if (localId !== this.asyncId || this.paused) return\n\n const nextPromise = this.audioIterator.next()\n\n // Monitor for buffer starvation\n const checkStarvation = setInterval(() => {\n if (localId !== this.asyncId || this.paused) {\n clearInterval(checkStarvation)\n return\n }\n \n if (\n this.audioContext.state === 'running' &&\n this.audioContext.currentTime >= this.latestScheduledEndTime - 0.2\n ) {\n this.audioContext.suspend()\n this.events.emit('waiting')\n }\n }, 50)\n\n let result\n try {\n result = await nextPromise\n } catch (e) {\n console.error('Audio iterator error:', e)\n break\n } finally {\n clearInterval(checkStarvation)\n }\n\n if (localId !== this.asyncId || this.paused) return\n\n // Resume if was suspended\n if (this.audioContext.state === 'suspended') {\n await this.audioContext.resume()\n this.events.emit('canplay')\n this.events.emit('playing')\n }\n\n if (result.done) break\n\n const { buffer, timestamp } = result.value\n\n // Schedule audio buffer\n const node = this.audioContext.createBufferSource()\n node.buffer = buffer\n node.connect(this.gainNode)\n node.playbackRate.value = this.playbackRate\n\n const startAt =\n this.audioContextStartTime +\n (timestamp - this.playbackTimeAtStart) / this.playbackRate\n\n const duration = buffer.duration\n const endAt = startAt + duration / this.playbackRate\n\n if (endAt > this.latestScheduledEndTime) {\n this.latestScheduledEndTime = endAt\n }\n\n if (startAt >= this.audioContext.currentTime) {\n node.start(startAt)\n } else {\n node.start(\n this.audioContext.currentTime,\n (this.audioContext.currentTime - startAt) * this.playbackRate\n )\n }\n\n this.queuedNodes.add(node)\n node.onended = () => this.queuedNodes.delete(node)\n }\n }\n\n async play() {\n if (!this.paused) return\n\n if (!this.audioContext) {\n this.ensureAudioContext()\n }\n\n if (this.audioContext.state === 'suspended') {\n await this.audioContext.resume()\n }\n\n this.audioContextStartTime = this.audioContext.currentTime\n this.latestScheduledEndTime = this.audioContextStartTime\n this.paused = false\n\n const id = ++this.asyncId\n this.runIterator(id)\n }\n\n pause() {\n if (this.paused) return\n\n this.playbackTimeAtStart = this.currentTime\n this.paused = true\n\n this.stopIterator()\n this.stopQueuedNodes()\n }\n\n async seek(time) {\n this.playbackTimeAtStart = Math.max(0, time)\n this.audioContextStartTime = this.audioContext.currentTime\n this.latestScheduledEndTime = this.audioContextStartTime\n\n const id = ++this.asyncId\n if (!this.paused) {\n this.runIterator(id)\n }\n }\n\n setVolume(volume, muted) {\n this.volume = volume\n this.muted = muted\n this.updateGain()\n }\n\n setPlaybackRate(rate) {\n if (rate === this.playbackRate) return\n\n if (!this.paused) {\n this.playbackTimeAtStart = this.currentTime\n this.audioContextStartTime = this.audioContext.currentTime\n }\n\n this.playbackRate = rate\n\n if (!this.paused) {\n const id = ++this.asyncId\n this.runIterator(id)\n }\n }\n\n destroy() {\n this.asyncId++\n this.pause()\n this.audioContext?.close()\n this.audioContext = null\n this.input = null\n this.audioSink = null\n }\n}\n","/*!\n * Copyright (c) 2025-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/// \n/// \nexport { Output, } from './output.js';\nexport { OutputFormat, AdtsOutputFormat, FlacOutputFormat, IsobmffOutputFormat, MkvOutputFormat, MovOutputFormat, Mp3OutputFormat, Mp4OutputFormat, 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 { 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, BufferTarget, FilePathTarget, NullTarget, StreamTarget, } from './target.js';\nexport { ALL_TRACK_TYPES, } from './output.js';\nexport { Source, BlobSource, BufferSource, FilePathSource, StreamSource, ReadableStreamSource, UrlSource, } from './source.js';\nexport { InputFormat, AdtsInputFormat, IsobmffInputFormat, MatroskaInputFormat, Mp3InputFormat, Mp4InputFormat, OggInputFormat, QuickTimeInputFormat, WaveInputFormat, WebMInputFormat, FlacInputFormat, ALL_FORMATS, ADTS, MATROSKA, MP3, MP4, OGG, QTFF, WAVE, WEBM, FLAC, } from './input-format.js';\nexport { Input, InputDisposedError, } from './input.js';\nexport { InputTrack, InputVideoTrack, InputAudioTrack, } from './input-track.js';\nexport { EncodedPacket, } from './packet.js';\nexport { AudioSample, VideoSample, } from './sample.js';\nexport { AudioBufferSink, AudioSampleSink, BaseMediaSampleSink, CanvasSink, EncodedPacketSink, VideoSampleSink, } from './media-sink.js';\nexport { Conversion, } from './conversion.js';\nexport { CustomVideoDecoder, CustomVideoEncoder, CustomAudioDecoder, CustomAudioEncoder, registerDecoder, registerEncoder, } from './custom-coder.js';\nexport { RichImageData, AttachedFile, } from './metadata.js';\n// 🐡🦔\n","/*!\n * Copyright (c) 2025-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, COLOR_PRIMARIES_MAP, MATRIX_COEFFICIENTS_MAP, TRANSFER_CHARACTERISTICS_MAP, assert, 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];\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\nconst AVC_LEVEL_TABLE = [\n { maxMacroblocks: 99, maxBitrate: 64000, level: 0x0A }, // Level 1\n { maxMacroblocks: 396, maxBitrate: 192000, level: 0x0B }, // Level 1.1\n { maxMacroblocks: 396, maxBitrate: 384000, level: 0x0C }, // Level 1.2\n { maxMacroblocks: 396, maxBitrate: 768000, level: 0x0D }, // Level 1.3\n { maxMacroblocks: 396, maxBitrate: 2000000, level: 0x14 }, // Level 2\n { maxMacroblocks: 792, maxBitrate: 4000000, level: 0x15 }, // Level 2.1\n { maxMacroblocks: 1620, maxBitrate: 4000000, level: 0x16 }, // Level 2.2\n { maxMacroblocks: 1620, maxBitrate: 10000000, level: 0x1E }, // Level 3\n { maxMacroblocks: 3600, maxBitrate: 14000000, level: 0x1F }, // Level 3.1\n { maxMacroblocks: 5120, maxBitrate: 20000000, level: 0x20 }, // Level 3.2\n { maxMacroblocks: 8192, maxBitrate: 20000000, level: 0x28 }, // Level 4\n { maxMacroblocks: 8192, maxBitrate: 50000000, level: 0x29 }, // Level 4.1\n { maxMacroblocks: 8704, maxBitrate: 50000000, level: 0x2A }, // Level 4.2\n { maxMacroblocks: 22080, maxBitrate: 135000000, level: 0x32 }, // Level 5\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x33 }, // Level 5.1\n { maxMacroblocks: 36864, maxBitrate: 240000000, level: 0x34 }, // Level 5.2\n { maxMacroblocks: 139264, maxBitrate: 240000000, level: 0x3C }, // Level 6\n { maxMacroblocks: 139264, maxBitrate: 480000000, level: 0x3D }, // Level 6.1\n { maxMacroblocks: 139264, maxBitrate: 800000000, 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 (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 const audioSpecificConfig = parseAacAudioSpecificConfig(codecDescription);\n return `mp4a.40.${audioSpecificConfig.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 && PCM_AUDIO_CODECS.includes(codec)) {\n return codec;\n }\n throw new TypeError(`Unhandled codec '${codec}'.`);\n};\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 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.startsWith('mp4a.40') || codecString === 'mp4a.67') {\n return 'aac';\n }\n else if (codecString === 'mp3'\n || codecString === 'mp4a.69'\n || codecString === 'mp4a.6B'\n || codecString === 'mp4a.6b') {\n return 'mp3';\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 === '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 WebCodecs 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.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 = ['mp4a', 'mp3', 'opus', 'vorbis', 'flac', 'ulaw', 'alaw', 'pcm'];\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 WebCodecs 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 if (!metadata.decoderConfig.description) {\n throw new TypeError('Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be'\n + ' an AudioSpecificConfig as specified in ISO 14496-3.');\n }\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('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) 2025-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 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};\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 // Ensure we're byte-aligned\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/** 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 }\n async acquire() {\n let resolver;\n const nextPromise = new Promise((resolve) => {\n resolver = resolve;\n });\n const currentPromiseAlias = this.currentPromise;\n this.currentPromise = nextPromise;\n await currentPromiseAlias;\n return resolver;\n }\n}\nexport const bytesToHexString = (bytes) => {\n return [...bytes].map(x => x.toString(16).padStart(2, '0')).join('');\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 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 format. */\nconst 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 console.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 new Promise(resolve => setTimeout(resolve, 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 numerator: sign * currNumerator,\n denominator: 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 numerator: sign * currNumerator,\n denominator: 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 && (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 && (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};\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","/*!\n * Copyright (c) 2025-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, binarySearchLessOrEqual, closedIntervalsOverlap, isNumber, isWebKit, mergeRequestInit, promiseWithResolvers, retriedFetch, toDataView, toUint8Array, } from './misc.js';\nimport * as nodeAlias from './node.js';\nimport { InputDisposedError } from './input.js';\nconst node = typeof nodeAlias !== 'undefined'\n ? nodeAlias // Aliasing it prevents some bundler warnings\n : undefined;\n/**\n * The source base class, representing a resource from which bytes can be read.\n * @group Input sources\n * @public\n */\nexport class Source {\n constructor() {\n /** @internal */\n this._disposed = false;\n /** @internal */\n this._sizePromise = null;\n /** Called each time data is retrieved from the source. Will be called with the retrieved range (end exclusive). */\n this.onread = null;\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n *\n * Returns null if the source is unsized.\n */\n async getSizeOrNull() {\n if (this._disposed) {\n throw new InputDisposedError();\n }\n return this._sizePromise ??= Promise.resolve(this._retrieveSize());\n }\n /**\n * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call\n * will retrieve the size.\n *\n * Throws an error if the source is unsized.\n */\n async getSize() {\n if (this._disposed) {\n throw new InputDisposedError();\n }\n const result = await this.getSizeOrNull();\n if (result === null) {\n throw new Error('Cannot determine the size of an unsized source.');\n }\n return result;\n }\n}\n/**\n * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory.\n * @group Input sources\n * @public\n */\nexport class BufferSource extends Source {\n /**\n * Creates a new {@link BufferSource} backed by the specified `ArrayBuffer`, `SharedArrayBuffer`,\n * or `ArrayBufferView`.\n */\n constructor(buffer) {\n if (!(buffer instanceof ArrayBuffer)\n && !(typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer)\n && !ArrayBuffer.isView(buffer)) {\n throw new TypeError('buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.');\n }\n super();\n /** @internal */\n this._onreadCalled = false;\n this._bytes = toUint8Array(buffer);\n this._view = toDataView(buffer);\n }\n /** @internal */\n _retrieveSize() {\n return this._bytes.byteLength;\n }\n /** @internal */\n _read() {\n if (!this._onreadCalled) {\n // We just say the first read retrives all bytes from the source (which, I mean, it does)\n this.onread?.(0, this._bytes.byteLength);\n this._onreadCalled = true;\n }\n return {\n bytes: this._bytes,\n view: this._view,\n offset: 0,\n };\n }\n /** @internal */\n _dispose() { }\n}\n/**\n * A source backed by a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). Since a\n * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) is also a `Blob`, this is the source to use when\n * reading files off the disk.\n * @group Input sources\n * @public\n */\nexport class BlobSource extends Source {\n /**\n * Creates a new {@link BlobSource} backed by the specified\n * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob).\n */\n constructor(blob, options = {}) {\n if (!(blob instanceof Blob)) {\n throw new TypeError('blob must be a Blob.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._readers = new WeakMap();\n this._blob = blob;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (8 * 2 ** 20 /* 8 MiB */),\n maxWorkerCount: 4,\n runWorker: this._runWorker.bind(this),\n prefetchProfile: PREFETCH_PROFILES.fileSystem,\n });\n }\n /** @internal */\n _retrieveSize() {\n const size = this._blob.size;\n this._orchestrator.fileSize = size;\n return size;\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n let reader = this._readers.get(worker);\n if (reader === undefined) {\n // https://github.com/Vanilagy/mediabunny/issues/184\n // WebKit has critical bugs with blob.stream():\n // - WebKitBlobResource error 1 when streaming large files\n // - Memory buildup and reload loops on iOS (network process crashes)\n // - ReadableStream stalls under backpressure (especially video)\n // Affects Safari and all iOS browsers (Chrome, Firefox, etc.).\n // Use arrayBuffer() fallback for WebKit browsers.\n if ('stream' in this._blob && !isWebKit()) {\n // Get a reader of the blob starting at the required offset, and then keep it around\n const slice = this._blob.slice(worker.currentPos);\n reader = slice.stream().getReader();\n }\n else {\n // We'll need to use more primitive ways\n reader = null;\n }\n this._readers.set(worker, reader);\n }\n while (worker.currentPos < worker.targetPos && !worker.aborted) {\n if (reader) {\n const { done, value } = await reader.read();\n if (done) {\n this._orchestrator.forgetWorker(worker);\n throw new Error('Blob reader stopped unexpectedly before all requested data was read.');\n }\n if (worker.aborted) {\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + value.length);\n this._orchestrator.supplyWorkerData(worker, value);\n }\n else {\n const data = await this._blob.slice(worker.currentPos, worker.targetPos).arrayBuffer();\n if (worker.aborted) {\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + data.byteLength);\n this._orchestrator.supplyWorkerData(worker, new Uint8Array(data));\n }\n }\n worker.running = false;\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n }\n}\nconst URL_SOURCE_MIN_LOAD_AMOUNT = 0.5 * 2 ** 20; // 0.5 MiB\nconst DEFAULT_RETRY_DELAY = ((previousAttempts, error, src) => {\n // Check if this could be a CORS error. If so, we cannot recover from it and\n // should not attempt to retry.\n // CORS errors are intentionally not opaque, so we need to rely on heuristics.\n const couldBeCorsError = error instanceof Error && (error.message.includes('Failed to fetch') // Chrome\n || error.message.includes('Load failed') // Safari\n || error.message.includes('NetworkError when attempting to fetch resource') // Firefox\n );\n if (couldBeCorsError) {\n let originOfSrc = null;\n // Checking if the origin is different, because only then a CORS error could originate\n try {\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n originOfSrc = new URL(src instanceof Request ? src.url : src, window.location.href).origin;\n }\n }\n catch {\n // URL parse failed\n }\n // If user is offline, it is probably not a CORS error.\n const isOnline = typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true;\n if (isOnline && originOfSrc !== null && originOfSrc !== window.location.origin) {\n console.warn(`Request will not be retried because a CORS error was suspected due to different origins. You can`\n + ` modify this behavior by providing your own function for the 'getRetryDelay' option.`);\n return null;\n }\n }\n return Math.min(2 ** (previousAttempts - 2), 16);\n});\n/**\n * A source backed by a URL. This is useful for reading data from the network. Requests will be made using an optimized\n * reading and prefetching pattern to minimize request count and latency.\n * @group Input sources\n * @public\n */\nexport class UrlSource extends Source {\n /** Creates a new {@link UrlSource} backed by the resource at the specified URL. */\n constructor(url, options = {}) {\n if (typeof url !== 'string'\n && !(url instanceof URL)\n && !(typeof Request !== 'undefined' && url instanceof Request)) {\n throw new TypeError('url must be a string, URL or Request.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.requestInit !== undefined && (!options.requestInit || typeof options.requestInit !== 'object')) {\n throw new TypeError('options.requestInit, when provided, must be an object.');\n }\n if (options.getRetryDelay !== undefined && typeof options.getRetryDelay !== 'function') {\n throw new TypeError('options.getRetryDelay, when provided, must be a function.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n if (options.fetchFn !== undefined && typeof options.fetchFn !== 'function') {\n throw new TypeError('options.fetchFn, when provided, must be a function.');\n // Won't bother validating this function beyond this\n }\n super();\n /** @internal */\n this._existingResponses = new WeakMap();\n this._url = url;\n this._options = options;\n this._getRetryDelay = options.getRetryDelay ?? DEFAULT_RETRY_DELAY;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (64 * 2 ** 20 /* 64 MiB */),\n // Most files in the real-world have a single sequential access pattern, but having two in parallel can\n // also happen\n maxWorkerCount: 2,\n runWorker: this._runWorker.bind(this),\n prefetchProfile: PREFETCH_PROFILES.network,\n });\n }\n /** @internal */\n async _retrieveSize() {\n // Retrieving the resource size for UrlSource is optimized: Almost always (= always), the first bytes we have to\n // read are the start of the file. This means it's smart to combine size fetching with fetching the start of the\n // file. We additionally use this step to probe if the server supports range requests, killing three birds with\n // one stone.\n const abortController = new AbortController();\n const response = await retriedFetch(this._options.fetchFn ?? fetch, this._url, mergeRequestInit(this._options.requestInit ?? {}, {\n headers: {\n // We could also send a non-range request to request the same bytes (all of them), but doing it like\n // this is an easy way to check if the server supports range requests in the first place\n Range: 'bytes=0-',\n },\n signal: abortController.signal,\n }), this._getRetryDelay, () => this._disposed);\n if (!response.ok) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`);\n }\n let worker;\n let fileSize;\n if (response.status === 206) {\n fileSize = this._getTotalLengthFromRangeResponse(response);\n worker = this._orchestrator.createWorker(0, Math.min(fileSize, URL_SOURCE_MIN_LOAD_AMOUNT));\n }\n else {\n // Server probably returned a 200.\n const contentLength = response.headers.get('Content-Length');\n if (contentLength) {\n fileSize = Number(contentLength);\n worker = this._orchestrator.createWorker(0, fileSize);\n this._orchestrator.options.maxCacheSize = Infinity; // 🤷\n console.warn('HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has'\n + ' to be downloaded. For efficient media file streaming across a network, please make sure your'\n + ' server supports range requests.');\n }\n else {\n throw new Error(`HTTP response (status ${response.status}) must surface Content-Length header.`);\n }\n }\n this._orchestrator.fileSize = fileSize;\n this._existingResponses.set(worker, { response, abortController });\n this._orchestrator.runWorker(worker);\n return fileSize;\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n // The outer loop is for resuming a request if it dies mid-response\n while (true) {\n const existing = this._existingResponses.get(worker);\n this._existingResponses.delete(worker);\n let abortController = existing?.abortController;\n let response = existing?.response;\n if (!abortController) {\n abortController = new AbortController();\n response = await retriedFetch(this._options.fetchFn ?? fetch, this._url, mergeRequestInit(this._options.requestInit ?? {}, {\n headers: {\n Range: `bytes=${worker.currentPos}-`,\n },\n signal: abortController.signal,\n }), this._getRetryDelay, () => this._disposed);\n }\n assert(response);\n if (!response.ok) {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n throw new Error(`Error fetching ${String(this._url)}: ${response.status} ${response.statusText}`);\n }\n if (worker.currentPos > 0 && response.status !== 206) {\n throw new Error('HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media'\n + ' file streaming across a network, please make sure your server supports range requests.');\n }\n if (!response.body) {\n throw new Error('Missing HTTP response body stream. The used fetch function must provide the response body as a'\n + ' ReadableStream.');\n }\n const reader = response.body.getReader();\n while (true) {\n if (worker.currentPos >= worker.targetPos || worker.aborted) {\n abortController.abort();\n worker.running = false;\n return;\n }\n let readResult;\n try {\n readResult = await reader.read();\n }\n catch (error) {\n if (this._disposed) {\n // No need to try to retry\n throw error;\n }\n const retryDelayInSeconds = this._getRetryDelay(1, error, this._url);\n if (retryDelayInSeconds !== null) {\n console.error('Error while reading response stream. Attempting to resume.', error);\n await new Promise(resolve => setTimeout(resolve, 1000 * retryDelayInSeconds));\n break;\n }\n else {\n throw error;\n }\n }\n if (worker.aborted) {\n break;\n }\n const { done, value } = readResult;\n if (done) {\n if (worker.currentPos >= worker.targetPos) {\n // All data was delivered, we're good\n this._orchestrator.forgetWorker(worker);\n worker.running = false;\n return;\n }\n // The response stopped early, before the target. This can happen if server decides to cap range\n // requests arbitrarily, even if the request had an uncapped end. In this case, let's fetch the rest\n // of the data using a new request.\n break;\n }\n this.onread?.(worker.currentPos, worker.currentPos + value.length);\n this._orchestrator.supplyWorkerData(worker, value);\n }\n if (worker.aborted) {\n break;\n }\n }\n worker.running = false;\n // The previous UrlSource had logic for circumventing https://issues.chromium.org/issues/436025873; I haven't\n // been able to observe this bug with the new UrlSource (maybe because we're using response streaming), so the\n // logic for that has vanished for now. Leaving a comment here if this becomes relevant again.\n }\n /** @internal */\n _getTotalLengthFromRangeResponse(response) {\n const contentRange = response.headers.get('Content-Range');\n if (contentRange) {\n const match = /\\/(\\d+)/.exec(contentRange);\n if (match) {\n return Number(match[1]);\n }\n }\n const contentLength = response.headers.get('Content-Length');\n if (contentLength) {\n return Number(contentLength);\n }\n else {\n throw new Error('Partial HTTP response (status 206) must surface either Content-Range or'\n + ' Content-Length header.');\n }\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n }\n}\n/**\n * A source backed by a path to a file. Intended for server-side usage in Node, Bun, or Deno.\n *\n * Make sure to call `.dispose()` on the corresponding {@link Input} when done to explicitly free the internal file\n * handle acquired by this source.\n * @group Input sources\n * @public\n */\nexport class FilePathSource extends Source {\n /** Creates a new {@link FilePathSource} backed by 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 (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._fileHandle = null;\n // Let's back this source with a StreamSource, makes the implementation very simple\n this._streamSource = new StreamSource({\n getSize: async () => {\n this._fileHandle = await node.fs.open(filePath, 'r');\n const stats = await this._fileHandle.stat();\n return stats.size;\n },\n read: async (start, end) => {\n assert(this._fileHandle);\n const buffer = new Uint8Array(end - start);\n await this._fileHandle.read(buffer, 0, end - start, start);\n return buffer;\n },\n maxCacheSize: options.maxCacheSize,\n prefetchProfile: 'fileSystem',\n });\n }\n /** @internal */\n _read(start, end) {\n return this._streamSource._read(start, end);\n }\n /** @internal */\n _retrieveSize() {\n return this._streamSource._retrieveSize();\n }\n /** @internal */\n _dispose() {\n this._streamSource._dispose();\n void this._fileHandle?.close();\n this._fileHandle = null;\n }\n}\n/**\n * A general-purpose, callback-driven source that can get its data from anywhere.\n * @group Input sources\n * @public\n */\nexport class StreamSource extends Source {\n /** Creates a new {@link StreamSource} whose behavior is specified by `options`. */\n constructor(options) {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (typeof options.getSize !== 'function') {\n throw new TypeError('options.getSize must be a function.');\n }\n if (typeof options.read !== 'function') {\n throw new TypeError('options.read must be a function.');\n }\n if (options.dispose !== undefined && typeof options.dispose !== 'function') {\n throw new TypeError('options.dispose, when provided, must be a function.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n if (options.prefetchProfile && !['none', 'fileSystem', 'network'].includes(options.prefetchProfile)) {\n throw new TypeError('options.prefetchProfile, when provided, must be one of \\'none\\', \\'fileSystem\\' or \\'network\\'.');\n }\n super();\n this._options = options;\n this._orchestrator = new ReadOrchestrator({\n maxCacheSize: options.maxCacheSize ?? (8 * 2 ** 20 /* 8 MiB */),\n maxWorkerCount: 2, // Fixed for now, *should* be fine\n prefetchProfile: PREFETCH_PROFILES[options.prefetchProfile ?? 'none'],\n runWorker: this._runWorker.bind(this),\n });\n }\n /** @internal */\n _retrieveSize() {\n const result = this._options.getSize();\n if (result instanceof Promise) {\n return result.then((size) => {\n if (!Number.isInteger(size) || size < 0) {\n throw new TypeError('options.getSize must return or resolve to a non-negative integer.');\n }\n this._orchestrator.fileSize = size;\n return size;\n });\n }\n else {\n if (!Number.isInteger(result) || result < 0) {\n throw new TypeError('options.getSize must return or resolve to a non-negative integer.');\n }\n this._orchestrator.fileSize = result;\n return result;\n }\n }\n /** @internal */\n _read(start, end) {\n return this._orchestrator.read(start, end);\n }\n /** @internal */\n async _runWorker(worker) {\n while (worker.currentPos < worker.targetPos && !worker.aborted) {\n const originalCurrentPos = worker.currentPos;\n const originalTargetPos = worker.targetPos;\n let data = this._options.read(worker.currentPos, originalTargetPos);\n if (data instanceof Promise)\n data = await data;\n if (worker.aborted) {\n break;\n }\n if (data instanceof Uint8Array) {\n data = toUint8Array(data); // Normalize things like Node.js Buffer to Uint8Array\n if (data.length !== originalTargetPos - worker.currentPos) {\n // Yes, we're that strict\n throw new Error(`options.read returned a Uint8Array with unexpected length: Requested ${originalTargetPos - worker.currentPos} bytes, but got ${data.length}.`);\n }\n this.onread?.(worker.currentPos, worker.currentPos + data.length);\n this._orchestrator.supplyWorkerData(worker, data);\n }\n else if (data instanceof ReadableStream) {\n const reader = data.getReader();\n while (worker.currentPos < originalTargetPos && !worker.aborted) {\n const { done, value } = await reader.read();\n if (done) {\n if (worker.currentPos < originalTargetPos) {\n // Yes, we're *that* strict\n throw new Error(`ReadableStream returned by options.read ended before supplying enough data.`\n + ` Requested ${originalTargetPos - originalCurrentPos} bytes, but got ${worker.currentPos - originalCurrentPos}`);\n }\n break;\n }\n if (!(value instanceof Uint8Array)) {\n throw new TypeError('ReadableStream returned by options.read must yield Uint8Array chunks.');\n }\n if (worker.aborted) {\n break;\n }\n const data = toUint8Array(value); // Normalize things like Node.js Buffer to Uint8Array\n this.onread?.(worker.currentPos, worker.currentPos + data.length);\n this._orchestrator.supplyWorkerData(worker, data);\n }\n }\n else {\n throw new TypeError('options.read must return or resolve to a Uint8Array or a ReadableStream.');\n }\n }\n worker.running = false;\n }\n /** @internal */\n _dispose() {\n this._orchestrator.dispose();\n this._options.dispose?.();\n }\n}\n/**\n * A source backed by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) of\n * `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally\n * streaming in input files that are still being constructed and whose size we don't yet know, like for example the\n * output chunks of [MediaRecorder](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder).\n *\n * This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the\n * lack of random file access. You should only use this source with sequential access patterns, such as reading all\n * packets from start to end. This source does not work well with random access patterns unless you increase its\n * max cache size.\n *\n * @group Input sources\n * @public\n */\nexport class ReadableStreamSource extends Source {\n /** Creates a new {@link ReadableStreamSource} backed by the specified `ReadableStream`. */\n constructor(stream, options = {}) {\n if (!(stream instanceof ReadableStream)) {\n throw new TypeError('stream must be a ReadableStream.');\n }\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.maxCacheSize !== undefined\n && (!isNumber(options.maxCacheSize) || options.maxCacheSize < 0)) {\n throw new TypeError('options.maxCacheSize, when provided, must be a non-negative number.');\n }\n super();\n /** @internal */\n this._reader = null;\n /** @internal */\n this._cache = [];\n /** @internal */\n this._pendingSlices = [];\n /** @internal */\n this._currentIndex = 0;\n /** @internal */\n this._targetIndex = 0;\n /** @internal */\n this._maxRequestedIndex = 0;\n /** @internal */\n this._endIndex = null;\n /** @internal */\n this._pulling = false;\n this._stream = stream;\n this._maxCacheSize = options.maxCacheSize ?? (16 * 2 ** 20 /* 16 MiB */);\n }\n /** @internal */\n _retrieveSize() {\n return this._endIndex; // Starts out as null, meaning this source is unsized\n }\n /** @internal */\n _read(start, end) {\n if (this._endIndex !== null && end > this._endIndex) {\n return null;\n }\n this._maxRequestedIndex = Math.max(this._maxRequestedIndex, end);\n const cacheStartIndex = binarySearchLessOrEqual(this._cache, start, x => x.start);\n const cacheStartEntry = cacheStartIndex !== -1 ? this._cache[cacheStartIndex] : null;\n if (cacheStartEntry && cacheStartEntry.start <= start && end <= cacheStartEntry.end) {\n // The request can be satisfied with a single cache entry\n return {\n bytes: cacheStartEntry.bytes,\n view: cacheStartEntry.view,\n offset: cacheStartEntry.start,\n };\n }\n let lastEnd = start;\n const bytes = new Uint8Array(end - start);\n if (cacheStartIndex !== -1) {\n // Walk over the cache to see if we can satisfy the request using multiple cache entries\n for (let i = cacheStartIndex; i < this._cache.length; i++) {\n const cacheEntry = this._cache[i];\n if (cacheEntry.start >= end) {\n break;\n }\n const cappedStart = Math.max(start, cacheEntry.start);\n if (cappedStart > lastEnd) {\n // We're too far behind\n this._throwDueToCacheMiss();\n }\n const cappedEnd = Math.min(end, cacheEntry.end);\n if (cappedStart < cappedEnd) {\n bytes.set(cacheEntry.bytes.subarray(cappedStart - cacheEntry.start, cappedEnd - cacheEntry.start), cappedStart - start);\n lastEnd = cappedEnd;\n }\n }\n }\n if (lastEnd === end) {\n return {\n bytes,\n view: toDataView(bytes),\n offset: start,\n };\n }\n // We need to pull more data\n if (this._currentIndex > lastEnd) {\n // We're too far behind\n this._throwDueToCacheMiss();\n }\n const { promise, resolve, reject } = promiseWithResolvers();\n this._pendingSlices.push({\n start,\n end,\n bytes,\n resolve,\n reject,\n });\n this._targetIndex = Math.max(this._targetIndex, end);\n // Start pulling from the stream if we're not already doing it\n if (!this._pulling) {\n this._pulling = true;\n void this._pull()\n .catch((error) => {\n this._pulling = false;\n if (this._pendingSlices.length > 0) {\n this._pendingSlices.forEach(x => x.reject(error)); // Make sure to propagate any errors\n this._pendingSlices.length = 0;\n }\n else {\n throw error; // So it doesn't get swallowed\n }\n });\n }\n return promise;\n }\n /** @internal */\n _throwDueToCacheMiss() {\n throw new Error('Read is before the cached region. With ReadableStreamSource, you must access the data more'\n + ' sequentially or increase the size of its cache.');\n }\n /** @internal */\n async _pull() {\n this._reader ??= this._stream.getReader();\n // This is the loop that keeps pulling data from the stream until a target index is reached, filling requests\n // in the process\n while (this._currentIndex < this._targetIndex && !this._disposed) {\n const { done, value } = await this._reader.read();\n if (done) {\n for (const pendingSlice of this._pendingSlices) {\n pendingSlice.resolve(null);\n }\n this._pendingSlices.length = 0;\n this._endIndex = this._currentIndex; // We know how long the file is now!\n break;\n }\n const startIndex = this._currentIndex;\n const endIndex = this._currentIndex + value.byteLength;\n // Fill the pending slices with the data\n for (let i = 0; i < this._pendingSlices.length; i++) {\n const pendingSlice = this._pendingSlices[i];\n const cappedStart = Math.max(startIndex, pendingSlice.start);\n const cappedEnd = Math.min(endIndex, pendingSlice.end);\n if (cappedStart < cappedEnd) {\n pendingSlice.bytes.set(value.subarray(cappedStart - startIndex, cappedEnd - startIndex), cappedStart - pendingSlice.start);\n if (cappedEnd === pendingSlice.end) {\n // Pending slice fully filled\n pendingSlice.resolve({\n bytes: pendingSlice.bytes,\n view: toDataView(pendingSlice.bytes),\n offset: pendingSlice.start,\n });\n this._pendingSlices.splice(i, 1);\n i--;\n }\n }\n }\n this._cache.push({\n start: startIndex,\n end: endIndex,\n bytes: value,\n view: toDataView(value),\n age: 0, // Unused\n });\n // Do cache eviction, based on the distance from the last-requested index. It's important that we do it like\n // this and not based on where the reader is at, because if the reader is fast, we'll unnecessarily evict\n // data that we still might need.\n while (this._cache.length > 0) {\n const firstEntry = this._cache[0];\n const distance = this._maxRequestedIndex - firstEntry.end;\n if (distance <= this._maxCacheSize) {\n break;\n }\n this._cache.shift();\n }\n this._currentIndex += value.byteLength;\n }\n this._pulling = false;\n }\n /** @internal */\n _dispose() {\n this._pendingSlices.length = 0;\n this._cache.length = 0;\n }\n}\nconst PREFETCH_PROFILES = {\n none: (start, end) => ({ start, end }),\n fileSystem: (start, end) => {\n const padding = 2 ** 16;\n start = Math.floor((start - padding) / padding) * padding;\n end = Math.ceil((end + padding) / padding) * padding;\n return { start, end };\n },\n network: (start, end, workers) => {\n // Add a slight bit of start padding because backwards reading is painful\n const paddingStart = 2 ** 16;\n start = Math.max(0, Math.floor((start - paddingStart) / paddingStart) * paddingStart);\n // Remote resources have extreme latency (relatively speaking), so the benefit from intelligent\n // prefetching is great. The network prefetch strategy is as follows: When we notice\n // successive reads to a worker's read region, we prefetch more data at the end of that region,\n // growing exponentially (up to a cap). This performs well for real-world use cases: Either we read a\n // small part of the file once and then never need it again, in which case the requested about of data\n // is small. Or, we're repeatedly doing a sequential access pattern (common in media files), in which\n // case we can become more and more confident to prefetch more and more data.\n for (const worker of workers) {\n const maxExtensionAmount = 8 * 2 ** 20; // 8 MiB\n // When the read region cross the threshold point, we trigger a prefetch. This point is typically\n // in the middle of the worker's read region, or a fixed offset from the end if the region has grown\n // really large.\n const thresholdPoint = Math.max((worker.startPos + worker.targetPos) / 2, worker.targetPos - maxExtensionAmount);\n if (closedIntervalsOverlap(start, end, thresholdPoint, worker.targetPos)) {\n const size = worker.targetPos - worker.startPos;\n // If we extend by maxExtensionAmount\n const a = Math.ceil((size + 1) / maxExtensionAmount) * maxExtensionAmount;\n // If we extend to the next power of 2\n const b = 2 ** Math.ceil(Math.log2(size + 1));\n const extent = Math.min(b, a);\n end = Math.max(end, worker.startPos + extent);\n }\n }\n end = Math.max(end, start + URL_SOURCE_MIN_LOAD_AMOUNT);\n return {\n start,\n end,\n };\n },\n};\n/**\n * Godclass for orchestrating complex, cached read operations. The reading model is as follows: Any reading task is\n * delegated to a *worker*, which is a sequential reader positioned somewhere along the file. All workers run in\n * parallel and can be stopped and resumed in their forward movement. When read requests come in, this orchestrator will\n * first try to satisfy the request with only the cached data. If this isn't possible, workers are spun up for all\n * missing parts (or existing workers are repurposed), and these workers will then fill the holes in the data as they\n * march along the file.\n */\nclass ReadOrchestrator {\n constructor(options) {\n this.options = options;\n this.fileSize = null;\n this.nextAge = 0; // Used for LRU eviction of both cache entries and workers\n this.workers = [];\n this.cache = [];\n this.currentCacheSize = 0;\n this.disposed = false;\n }\n read(innerStart, innerEnd) {\n assert(this.fileSize !== null);\n const prefetchRange = this.options.prefetchProfile(innerStart, innerEnd, this.workers);\n const outerStart = Math.max(prefetchRange.start, 0);\n const outerEnd = Math.min(prefetchRange.end, this.fileSize);\n assert(outerStart <= innerStart && innerEnd <= outerEnd);\n let result = null;\n const innerCacheStartIndex = binarySearchLessOrEqual(this.cache, innerStart, x => x.start);\n const innerStartEntry = innerCacheStartIndex !== -1 ? this.cache[innerCacheStartIndex] : null;\n // See if the read request can be satisfied by a single cache entry\n if (innerStartEntry && innerStartEntry.start <= innerStart && innerEnd <= innerStartEntry.end) {\n innerStartEntry.age = this.nextAge++;\n result = {\n bytes: innerStartEntry.bytes,\n view: innerStartEntry.view,\n offset: innerStartEntry.start,\n };\n // Can't return yet though, still need to check if the prefetch range might lie outside the cached area\n }\n const outerCacheStartIndex = binarySearchLessOrEqual(this.cache, outerStart, x => x.start);\n const bytes = result ? null : new Uint8Array(innerEnd - innerStart);\n let contiguousBytesWriteEnd = 0; // Used to track if the cache is able to completely cover the bytes\n let lastEnd = outerStart;\n // The \"holes\" in the cache (the parts we need to load)\n const outerHoles = [];\n // Loop over the cache and build up the list of holes\n if (outerCacheStartIndex !== -1) {\n for (let i = outerCacheStartIndex; i < this.cache.length; i++) {\n const entry = this.cache[i];\n if (entry.start >= outerEnd) {\n break;\n }\n if (entry.end <= outerStart) {\n continue;\n }\n const cappedOuterStart = Math.max(outerStart, entry.start);\n const cappedOuterEnd = Math.min(outerEnd, entry.end);\n assert(cappedOuterStart <= cappedOuterEnd);\n if (lastEnd < cappedOuterStart) {\n outerHoles.push({ start: lastEnd, end: cappedOuterStart });\n }\n lastEnd = cappedOuterEnd;\n if (bytes) {\n const cappedInnerStart = Math.max(innerStart, entry.start);\n const cappedInnerEnd = Math.min(innerEnd, entry.end);\n if (cappedInnerStart < cappedInnerEnd) {\n const relativeOffset = cappedInnerStart - innerStart;\n // Fill the relevant section of the bytes with the cached data\n bytes.set(entry.bytes.subarray(cappedInnerStart - entry.start, cappedInnerEnd - entry.start), relativeOffset);\n if (relativeOffset === contiguousBytesWriteEnd) {\n contiguousBytesWriteEnd = cappedInnerEnd - innerStart;\n }\n }\n }\n entry.age = this.nextAge++;\n }\n if (lastEnd < outerEnd) {\n outerHoles.push({ start: lastEnd, end: outerEnd });\n }\n }\n else {\n outerHoles.push({ start: outerStart, end: outerEnd });\n }\n if (bytes && contiguousBytesWriteEnd >= bytes.length) {\n // Multiple cache entries were able to completely cover the requested bytes!\n result = {\n bytes,\n view: toDataView(bytes),\n offset: innerStart,\n };\n }\n if (outerHoles.length === 0) {\n assert(result);\n return result;\n }\n // We need to read more data, so now we're in async land\n const { promise, resolve, reject } = promiseWithResolvers();\n const innerHoles = [];\n for (const outerHole of outerHoles) {\n const cappedStart = Math.max(innerStart, outerHole.start);\n const cappedEnd = Math.min(innerEnd, outerHole.end);\n if (cappedStart === outerHole.start && cappedEnd === outerHole.end) {\n innerHoles.push(outerHole); // Can reuse without allocating a new object\n }\n else if (cappedStart < cappedEnd) {\n innerHoles.push({ start: cappedStart, end: cappedEnd });\n }\n }\n // Fire off workers to take care of patching the holes\n for (const outerHole of outerHoles) {\n const pendingSlice = bytes && {\n start: innerStart,\n bytes,\n holes: innerHoles,\n resolve,\n reject,\n };\n let workerFound = false;\n for (const worker of this.workers) {\n // A small tolerance in the case that the requested region is *just* after the target position of an\n // existing worker. In that case, it's probably more efficient to repurpose that worker than to spawn\n // another one so close to it\n const gapTolerance = 2 ** 17;\n // This check also implies worker.currentPos <= outerHole.start, a critical condition\n if (closedIntervalsOverlap(outerHole.start - gapTolerance, outerHole.start, worker.currentPos, worker.targetPos)) {\n worker.targetPos = Math.max(worker.targetPos, outerHole.end); // Update the worker's target position\n workerFound = true;\n if (pendingSlice && !worker.pendingSlices.includes(pendingSlice)) {\n worker.pendingSlices.push(pendingSlice);\n }\n if (!worker.running) {\n // Kick it off if it's idle\n this.runWorker(worker);\n }\n break;\n }\n }\n if (!workerFound) {\n // We need to spawn a new worker\n const newWorker = this.createWorker(outerHole.start, outerHole.end);\n if (pendingSlice) {\n newWorker.pendingSlices = [pendingSlice];\n }\n this.runWorker(newWorker);\n }\n }\n if (!result) {\n assert(bytes);\n result = promise.then(bytes => ({\n bytes,\n view: toDataView(bytes),\n offset: innerStart,\n }));\n }\n else {\n // The requested region was satisfied by the cache, but the entire prefetch region was not\n }\n return result;\n }\n createWorker(startPos, targetPos) {\n const worker = {\n startPos,\n currentPos: startPos,\n targetPos,\n running: false,\n // Due to async shenanigans, it can happen that workers are started after disposal. In this case, instead of\n // simply not creating the worker, we allow it to run but immediately label it as aborted, so it can then\n // shut itself down.\n aborted: this.disposed,\n pendingSlices: [],\n age: this.nextAge++,\n };\n this.workers.push(worker);\n // LRU eviction of the other workers\n while (this.workers.length > this.options.maxWorkerCount) {\n let oldestIndex = 0;\n let oldestWorker = this.workers[0];\n for (let i = 1; i < this.workers.length; i++) {\n const worker = this.workers[i];\n if (worker.age < oldestWorker.age) {\n oldestIndex = i;\n oldestWorker = worker;\n }\n }\n if (oldestWorker.running && oldestWorker.pendingSlices.length > 0) {\n break;\n }\n oldestWorker.aborted = true;\n this.workers.splice(oldestIndex, 1);\n }\n return worker;\n }\n runWorker(worker) {\n assert(!worker.running);\n assert(worker.currentPos < worker.targetPos);\n worker.running = true;\n worker.age = this.nextAge++;\n void this.options.runWorker(worker)\n .catch((error) => {\n worker.running = false;\n if (worker.pendingSlices.length > 0) {\n worker.pendingSlices.forEach(x => x.reject(error)); // Make sure to propagate any errors\n worker.pendingSlices.length = 0;\n }\n else {\n throw error; // So it doesn't get swallowed\n }\n });\n }\n /** Called by a worker when it has read some data. */\n supplyWorkerData(worker, bytes) {\n assert(!worker.aborted);\n const start = worker.currentPos;\n const end = start + bytes.length;\n this.insertIntoCache({\n start,\n end,\n bytes,\n view: toDataView(bytes),\n age: this.nextAge++,\n });\n worker.currentPos += bytes.length;\n worker.targetPos = Math.max(worker.targetPos, worker.currentPos); // In case it overshoots\n // Now, let's see if we can use the read bytes to fill any pending slice\n for (let i = 0; i < worker.pendingSlices.length; i++) {\n const pendingSlice = worker.pendingSlices[i];\n const clampedStart = Math.max(start, pendingSlice.start);\n const clampedEnd = Math.min(end, pendingSlice.start + pendingSlice.bytes.length);\n if (clampedStart < clampedEnd) {\n pendingSlice.bytes.set(bytes.subarray(clampedStart - start, clampedEnd - start), clampedStart - pendingSlice.start);\n }\n for (let j = 0; j < pendingSlice.holes.length; j++) {\n // The hole is intentionally not modified here if the read section starts somewhere in the middle of\n // the hole. We don't need to do \"hole splitting\", since the workers are spawned *by* the holes,\n // meaning there's always a worker which will consume the hole left to right.\n const hole = pendingSlice.holes[j];\n if (start <= hole.start && end > hole.start) {\n hole.start = end;\n }\n if (hole.end <= hole.start) {\n pendingSlice.holes.splice(j, 1);\n j--;\n }\n }\n if (pendingSlice.holes.length === 0) {\n // The slice has been fulfilled, everything has been read. Let's resolve the promise\n pendingSlice.resolve(pendingSlice.bytes);\n worker.pendingSlices.splice(i, 1);\n i--;\n }\n }\n // Remove other idle workers if we \"ate\" into their territory\n for (let i = 0; i < this.workers.length; i++) {\n const otherWorker = this.workers[i];\n if (worker === otherWorker || otherWorker.running) {\n continue;\n }\n if (closedIntervalsOverlap(start, end, otherWorker.currentPos, otherWorker.targetPos)) {\n this.workers.splice(i, 1);\n i--;\n }\n }\n }\n forgetWorker(worker) {\n const index = this.workers.indexOf(worker);\n assert(index !== -1);\n this.workers.splice(index, 1);\n }\n insertIntoCache(entry) {\n if (this.options.maxCacheSize === 0) {\n return; // No caching\n }\n let insertionIndex = binarySearchLessOrEqual(this.cache, entry.start, x => x.start) + 1;\n if (insertionIndex > 0) {\n const previous = this.cache[insertionIndex - 1];\n if (previous.end >= entry.end) {\n // Previous entry swallows the one to be inserted; we don't need to do anything\n return;\n }\n if (previous.end > entry.start) {\n // Partial overlap with the previous entry, let's join\n const joined = new Uint8Array(entry.end - previous.start);\n joined.set(previous.bytes, 0);\n joined.set(entry.bytes, entry.start - previous.start);\n this.currentCacheSize += entry.end - previous.end;\n previous.bytes = joined;\n previous.view = toDataView(joined);\n previous.end = entry.end;\n // Do the rest of the logic with the previous entry instead\n insertionIndex--;\n entry = previous;\n }\n else {\n this.cache.splice(insertionIndex, 0, entry);\n this.currentCacheSize += entry.bytes.length;\n }\n }\n else {\n this.cache.splice(insertionIndex, 0, entry);\n this.currentCacheSize += entry.bytes.length;\n }\n for (let i = insertionIndex + 1; i < this.cache.length; i++) {\n const next = this.cache[i];\n if (entry.end <= next.start) {\n // Even if they touch, we don't wanna merge them, no need\n break;\n }\n if (entry.end >= next.end) {\n // The inserted entry completely swallows the next entry\n this.cache.splice(i, 1);\n this.currentCacheSize -= next.bytes.length;\n i--;\n continue;\n }\n // Partial overlap, let's join\n const joined = new Uint8Array(next.end - entry.start);\n joined.set(entry.bytes, 0);\n joined.set(next.bytes, next.start - entry.start);\n this.currentCacheSize -= entry.end - next.start; // Subtract the overlap\n entry.bytes = joined;\n entry.view = toDataView(joined);\n entry.end = next.end;\n this.cache.splice(i, 1);\n break; // After the join case, we're done: the next entry cannot possibly overlap with the inserted one.\n }\n // LRU eviction of cache entries\n while (this.currentCacheSize > this.options.maxCacheSize) {\n let oldestIndex = 0;\n let oldestEntry = this.cache[0];\n for (let i = 1; i < this.cache.length; i++) {\n const entry = this.cache[i];\n if (entry.age < oldestEntry.age) {\n oldestIndex = i;\n oldestEntry = entry;\n }\n }\n if (this.currentCacheSize - oldestEntry.bytes.length <= this.options.maxCacheSize) {\n // Don't evict if it would shrink the cache below the max size\n break;\n }\n this.cache.splice(oldestIndex, 1);\n this.currentCacheSize -= oldestEntry.bytes.length;\n }\n }\n dispose() {\n for (const worker of this.workers) {\n worker.aborted = true;\n }\n this.workers.length = 0;\n this.cache.length = 0;\n this.disposed = true;\n }\n}\n","\"use strict\";","/*!\n * Copyright (c) 2025-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 { InputFormat } from './input-format.js';\nimport { assert, polyfillSymbolDispose } from './misc.js';\nimport { Reader } from './reader.js';\nimport { Source } from './source.js';\npolyfillSymbolDispose();\n/**\n * Represents an input media file. This is the root object from which all media read operations start.\n * @group Input files & tracks\n * @public\n */\nexport class Input {\n /** True if the input has been disposed. */\n get disposed() {\n return this._disposed;\n }\n /**\n * Creates a new input file from the specified options. No reading operations will be performed until methods are\n * called on this instance.\n */\n constructor(options) {\n /** @internal */\n this._demuxerPromise = null;\n /** @internal */\n this._format = null;\n /** @internal */\n this._disposed = false;\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (!Array.isArray(options.formats) || options.formats.some(x => !(x instanceof InputFormat))) {\n throw new TypeError('options.formats must be an array of InputFormat.');\n }\n if (!(options.source instanceof Source)) {\n throw new TypeError('options.source must be a Source.');\n }\n if (options.source._disposed) {\n throw new Error('options.source must not be disposed.');\n }\n this._formats = options.formats;\n this._source = options.source;\n this._reader = new Reader(options.source);\n }\n /** @internal */\n _getDemuxer() {\n return this._demuxerPromise ??= (async () => {\n this._reader.fileSize = await this._source.getSizeOrNull();\n for (const format of this._formats) {\n const canRead = await format._canReadInput(this);\n if (canRead) {\n this._format = format;\n return format._createDemuxer(this);\n }\n }\n throw new Error('Input has an unsupported or unrecognizable format.');\n })();\n }\n /**\n * Returns the source from which this input file reads its data. This is the same source that was passed to the\n * constructor.\n */\n get source() {\n return this._source;\n }\n /**\n * Returns the format of the input file. You can compare this result directly to the {@link InputFormat} singletons\n * or use `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true\n * for both MKV and WebM).\n */\n async getFormat() {\n await this._getDemuxer();\n assert(this._format);\n return this._format;\n }\n /**\n * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among\n * all tracks.\n */\n async computeDuration() {\n const demuxer = await this._getDemuxer();\n return demuxer.computeDuration();\n }\n /** Returns the list of all tracks of this input file. */\n async getTracks() {\n const demuxer = await this._getDemuxer();\n return demuxer.getTracks();\n }\n /** Returns the list of all video tracks of this input file. */\n async getVideoTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isVideoTrack());\n }\n /** Returns the list of all audio tracks of this input file. */\n async getAudioTracks() {\n const tracks = await this.getTracks();\n return tracks.filter(x => x.isAudioTrack());\n }\n /** Returns the primary video track of this input file, or null if there are no video tracks. */\n async getPrimaryVideoTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isVideoTrack()) ?? null;\n }\n /** Returns the primary audio track of this input file, or null if there are no audio tracks. */\n async getPrimaryAudioTrack() {\n const tracks = await this.getTracks();\n return tracks.find(x => x.isAudioTrack()) ?? null;\n }\n /** Returns the full MIME type of this input file, including track codecs. */\n async getMimeType() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMimeType();\n }\n /**\n * Returns descriptive metadata tags about the media file, such as title, author, date, cover art, or other\n * attached files.\n */\n async getMetadataTags() {\n const demuxer = await this._getDemuxer();\n return demuxer.getMetadataTags();\n }\n /**\n * Disposes this input and frees connected resources. When an input is disposed, ongoing read operations will be\n * canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink\n * operations will be canceled. Disallowed and canceled operations will throw an {@link InputDisposedError}.\n *\n * You are expected not to use an input after disposing it. While some operations may still work, it is not\n * specified and may change in any future update.\n */\n dispose() {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._source._disposed = true;\n this._source._dispose();\n }\n /**\n * Calls `.dispose()` on the input, implementing the `Disposable` interface for use with\n * JavaScript Explicit Resource Management features.\n */\n [Symbol.dispose]() {\n this.dispose();\n }\n}\n/**\n * Thrown when an operation was prevented because the corresponding {@link Input} has been disposed.\n * @group Input files & tracks\n * @public\n */\nexport class InputDisposedError extends Error {\n /** Creates a new {@link InputDisposedError}. */\n constructor(message = 'Input has been disposed.') {\n super(message);\n this.name = 'InputDisposedError';\n }\n}\n","/*!\n * Copyright (c) 2025-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 { IsobmffDemuxer } from './isobmff/isobmff-demuxer.js';\nimport { EBMLId, MAX_HEADER_SIZE, MIN_HEADER_SIZE, readAsciiString, readElementHeader, readElementSize, readUnsignedInt, readVarIntSize, } from './matroska/ebml.js';\nimport { MatroskaDemuxer } from './matroska/matroska-demuxer.js';\nimport { Mp3Demuxer } from './mp3/mp3-demuxer.js';\nimport { FRAME_HEADER_SIZE } from '../shared/mp3-misc.js';\nimport { ID3_V2_HEADER_SIZE, readId3V2Header } from './id3.js';\nimport { readNextFrameHeader } from './mp3/mp3-reader.js';\nimport { OggDemuxer } from './ogg/ogg-demuxer.js';\nimport { WaveDemuxer } from './wave/wave-demuxer.js';\nimport { MAX_FRAME_HEADER_SIZE, MIN_FRAME_HEADER_SIZE, readFrameHeader } from './adts/adts-reader.js';\nimport { AdtsDemuxer } from './adts/adts-demuxer.js';\nimport { readAscii } from './reader.js';\nimport { FlacDemuxer } from './flac/flac-demuxer.js';\n/**\n * Base class representing an input media file format.\n * @group Input formats\n * @public\n */\nexport class InputFormat {\n}\n/**\n * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files.\n * @group Input formats\n * @public\n */\nexport class IsobmffInputFormat extends InputFormat {\n /** @internal */\n async _getMajorBrand(input) {\n let slice = input._reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return null;\n slice.skip(4);\n const fourCc = readAscii(slice, 4);\n if (fourCc !== 'ftyp') {\n return null;\n }\n return readAscii(slice, 4);\n }\n /** @internal */\n _createDemuxer(input) {\n return new IsobmffDemuxer(input);\n }\n}\n/**\n * MPEG-4 Part 14 (MP4) file format.\n *\n * Do not instantiate this class; use the {@link MP4} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class Mp4InputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return !!majorBrand && majorBrand !== 'qt ';\n }\n get name() {\n return 'MP4';\n }\n get mimeType() {\n return 'video/mp4';\n }\n}\n/**\n * QuickTime File Format (QTFF), often called MOV.\n *\n * Do not instantiate this class; use the {@link QTFF} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class QuickTimeInputFormat extends IsobmffInputFormat {\n /** @internal */\n async _canReadInput(input) {\n const majorBrand = await this._getMajorBrand(input);\n return majorBrand === 'qt ';\n }\n get name() {\n return 'QuickTime File Format';\n }\n get mimeType() {\n return 'video/quicktime';\n }\n}\n/**\n * Matroska file format.\n *\n * Do not instantiate this class; use the {@link MATROSKA} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class MatroskaInputFormat extends InputFormat {\n /** @internal */\n async isSupportedEBMLOfDocType(input, desiredDocType) {\n let headerSlice = input._reader.requestSlice(0, MAX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice)\n return false;\n const varIntSize = readVarIntSize(headerSlice);\n if (varIntSize === null) {\n return false;\n }\n if (varIntSize < 1 || varIntSize > 8) {\n return false;\n }\n const id = readUnsignedInt(headerSlice, varIntSize);\n if (id !== EBMLId.EBML) {\n return false;\n }\n const dataSize = readElementSize(headerSlice);\n if (dataSize === null) {\n return false; // Miss me with that shit\n }\n let dataSlice = input._reader.requestSlice(headerSlice.filePos, dataSize);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (!dataSlice)\n return false;\n const startPos = headerSlice.filePos;\n while (dataSlice.filePos <= startPos + dataSize - MIN_HEADER_SIZE) {\n const header = readElementHeader(dataSlice);\n if (!header)\n break;\n const { id, size } = header;\n const dataStartPos = dataSlice.filePos;\n if (size === null)\n return false;\n switch (id) {\n case EBMLId.EBMLVersion:\n {\n const ebmlVersion = readUnsignedInt(dataSlice, size);\n if (ebmlVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.EBMLReadVersion:\n {\n const ebmlReadVersion = readUnsignedInt(dataSlice, size);\n if (ebmlReadVersion !== 1) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocType:\n {\n const docType = readAsciiString(dataSlice, size);\n if (docType !== desiredDocType) {\n return false;\n }\n }\n ;\n break;\n case EBMLId.DocTypeVersion:\n {\n const docTypeVersion = readUnsignedInt(dataSlice, size);\n if (docTypeVersion > 4) { // Support up to Matroska v4\n return false;\n }\n }\n ;\n break;\n }\n dataSlice.filePos = dataStartPos + size;\n }\n return true;\n }\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'matroska');\n }\n /** @internal */\n _createDemuxer(input) {\n return new MatroskaDemuxer(input);\n }\n get name() {\n return 'Matroska';\n }\n get mimeType() {\n return 'video/x-matroska';\n }\n}\n/**\n * WebM file format, based on Matroska.\n *\n * Do not instantiate this class; use the {@link WEBM} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class WebMInputFormat extends MatroskaInputFormat {\n /** @internal */\n _canReadInput(input) {\n return this.isSupportedEBMLOfDocType(input, 'webm');\n }\n get name() {\n return 'WebM';\n }\n get mimeType() {\n return 'video/webm';\n }\n}\n/**\n * MP3 file format.\n *\n * Do not instantiate this class; use the {@link MP3} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class Mp3InputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 10);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n let currentPos = 0;\n let id3V2HeaderFound = false;\n while (true) {\n let slice = input._reader.requestSlice(currentPos, ID3_V2_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const id3V2Header = readId3V2Header(slice);\n if (!id3V2Header) {\n break;\n }\n id3V2HeaderFound = true;\n currentPos = slice.filePos + id3V2Header.size;\n }\n const firstResult = await readNextFrameHeader(input._reader, currentPos, currentPos + 4096);\n if (!firstResult) {\n return false;\n }\n if (id3V2HeaderFound) {\n // If there was an ID3v2 tag at the start, we can be pretty sure this is MP3 by now\n return true;\n }\n currentPos = firstResult.startPos + firstResult.header.totalSize;\n // Fine, we found one frame header, but we're still not entirely sure this is MP3. Let's check if we can find\n // another header right after it:\n const secondResult = await readNextFrameHeader(input._reader, currentPos, currentPos + FRAME_HEADER_SIZE);\n if (!secondResult) {\n return false;\n }\n const firstHeader = firstResult.header;\n const secondHeader = secondResult.header;\n // In a well-formed MP3 file, we'd expect these two frames to share some similarities:\n if (firstHeader.channel !== secondHeader.channel || firstHeader.sampleRate !== secondHeader.sampleRate) {\n return false;\n }\n // We have found two matching consecutive MP3 frames, a strong indicator that this is an MP3 file\n return true;\n }\n /** @internal */\n _createDemuxer(input) {\n return new Mp3Demuxer(input);\n }\n get name() {\n return 'MP3';\n }\n get mimeType() {\n return 'audio/mpeg';\n }\n}\n/**\n * WAVE file format, based on RIFF.\n *\n * Do not instantiate this class; use the {@link WAVE} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class WaveInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const riffType = readAscii(slice, 4);\n if (riffType !== 'RIFF' && riffType !== 'RIFX' && riffType !== 'RF64') {\n return false;\n }\n slice.skip(4);\n const format = readAscii(slice, 4);\n return format === 'WAVE';\n }\n /** @internal */\n _createDemuxer(input) {\n return new WaveDemuxer(input);\n }\n get name() {\n return 'WAVE';\n }\n get mimeType() {\n return 'audio/wav';\n }\n}\n/**\n * Ogg file format.\n *\n * Do not instantiate this class; use the {@link OGG} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class OggInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n return readAscii(slice, 4) === 'OggS';\n }\n /** @internal */\n _createDemuxer(input) {\n return new OggDemuxer(input);\n }\n get name() {\n return 'Ogg';\n }\n get mimeType() {\n return 'application/ogg';\n }\n}\n/**\n * FLAC file format.\n *\n * Do not instantiate this class; use the {@link FLAC} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class FlacInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSlice(0, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n return readAscii(slice, 4) === 'fLaC';\n }\n get name() {\n return 'FLAC';\n }\n get mimeType() {\n return 'audio/flac';\n }\n /** @internal */\n _createDemuxer(input) {\n return new FlacDemuxer(input);\n }\n}\n/**\n * ADTS file format.\n *\n * Do not instantiate this class; use the {@link ADTS} singleton instead.\n *\n * @group Input formats\n * @public\n */\nexport class AdtsInputFormat extends InputFormat {\n /** @internal */\n async _canReadInput(input) {\n let slice = input._reader.requestSliceRange(0, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const firstHeader = readFrameHeader(slice);\n if (!firstHeader) {\n return false;\n }\n slice = input._reader.requestSliceRange(firstHeader.frameLength, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return false;\n const secondHeader = readFrameHeader(slice);\n if (!secondHeader) {\n return false;\n }\n return firstHeader.objectType === secondHeader.objectType\n && firstHeader.samplingFrequencyIndex === secondHeader.samplingFrequencyIndex\n && firstHeader.channelConfiguration === secondHeader.channelConfiguration;\n }\n /** @internal */\n _createDemuxer(input) {\n return new AdtsDemuxer(input);\n }\n get name() {\n return 'ADTS';\n }\n get mimeType() {\n return 'audio/aac';\n }\n}\n/**\n * MP4 input format singleton.\n * @group Input formats\n * @public\n */\nexport const MP4 = /* #__PURE__ */ new Mp4InputFormat();\n/**\n * QuickTime File Format input format singleton.\n * @group Input formats\n * @public\n */\nexport const QTFF = /* #__PURE__ */ new QuickTimeInputFormat();\n/**\n * Matroska input format singleton.\n * @group Input formats\n * @public\n */\nexport const MATROSKA = /* #__PURE__ */ new MatroskaInputFormat();\n/**\n * WebM input format singleton.\n * @group Input formats\n * @public\n */\nexport const WEBM = /* #__PURE__ */ new WebMInputFormat();\n/**\n * MP3 input format singleton.\n * @group Input formats\n * @public\n */\nexport const MP3 = /* #__PURE__ */ new Mp3InputFormat();\n/**\n * WAVE input format singleton.\n * @group Input formats\n * @public\n */\nexport const WAVE = /* #__PURE__ */ new WaveInputFormat();\n/**\n * Ogg input format singleton.\n * @group Input formats\n * @public\n */\nexport const OGG = /* #__PURE__ */ new OggInputFormat();\n/**\n * ADTS input format singleton.\n * @group Input formats\n * @public\n */\nexport const ADTS = /* #__PURE__ */ new AdtsInputFormat();\n/**\n * FLAC input format singleton.\n * @group Input formats\n * @public\n */\nexport const FLAC = /* #__PURE__ */ new FlacInputFormat();\n/**\n * List of all input format singletons. If you don't need to support all input formats, you should specify the\n * formats individually for better tree shaking.\n * @group Input formats\n * @public\n */\nexport const ALL_FORMATS = [MP4, QTFF, MATROSKA, WEBM, WAVE, OGG, FLAC, MP3, ADTS];\n","/*!\n * Copyright (c) 2025-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 { extractAudioCodecString, extractVideoCodecString, OPUS_SAMPLE_RATE, parseAacAudioSpecificConfig, parsePcmCodec, PCM_AUDIO_CODECS, } from '../codec.js';\nimport { extractAv1CodecInfoFromPacket, extractVp9CodecInfoFromPacket, FlacBlockType, } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { assert, binarySearchExact, binarySearchLessOrEqual, Bitstream, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundToMultiple, textDecoder, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, toDataView, roundIfAlmostInteger, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { buildIsobmffMimeType } from './isobmff-misc.js';\nimport { MAX_BOX_HEADER_SIZE, MIN_BOX_HEADER_SIZE, readBoxHeader, readDataBox, readFixed_16_16, readFixed_2_30, readIsomVariableInteger, readMetadataStringShort, } from './isobmff-reader.js';\nimport { readBytes, readF64Be, readI16Be, readI32Be, readI64Be, readU16Be, readU24Be, readU32Be, readU64Be, readU8, readAscii, } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION, RichImageData } from '../metadata.js';\nexport class IsobmffDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.moovSlice = null;\n this.currentTrack = null;\n this.tracks = [];\n this.metadataPromise = null;\n this.movieTimescale = -1;\n this.movieDurationInTimescale = -1;\n this.isQuickTime = false;\n this.metadataTags = {};\n this.currentMetadataKeys = null;\n this.isFragmented = false;\n this.fragmentTrackDefaults = [];\n this.currentFragment = null;\n /**\n * Caches the last fragment that was read. Based on the assumption that there will be multiple reads to the\n * same fragment in quick succession.\n */\n this.lastReadFragment = null;\n this.reader = input._reader;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks.map(track => track.inputTrack);\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.inputTrack.getCodecParameterString()));\n return buildIsobmffMimeType({\n isQuickTime: this.isQuickTime,\n hasVideo: this.tracks.some(x => x.info?.type === 'video'),\n hasAudio: this.tracks.some(x => x.info?.type === 'audio'),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n readMetadata() {\n return this.metadataPromise ??= (async () => {\n let currentPos = 0;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const startPos = currentPos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n if (boxInfo.name === 'ftyp') {\n const majorBrand = readAscii(slice, 4);\n this.isQuickTime = majorBrand === 'qt ';\n }\n else if (boxInfo.name === 'moov') {\n // Found moov, load it\n let moovSlice = this.reader.requestSlice(slice.filePos, boxInfo.contentSize);\n if (moovSlice instanceof Promise)\n moovSlice = await moovSlice;\n if (!moovSlice)\n break;\n this.moovSlice = moovSlice;\n this.readContiguousBoxes(this.moovSlice);\n // Put default tracks first\n this.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));\n for (const track of this.tracks) {\n // Modify the edit list offset based on the previous segment durations. They are in different\n // timescales, so we first convert to seconds and then into the track timescale.\n const previousSegmentDurationsInSeconds = track.editListPreviousSegmentDurations / this.movieTimescale;\n track.editListOffset -= Math.round(previousSegmentDurationsInSeconds * track.timescale);\n }\n break;\n }\n currentPos = startPos + boxInfo.totalSize;\n }\n if (this.isFragmented && this.reader.fileSize !== null) {\n // The last 4 bytes may contain the size of the mfra box at the end of the file\n let lastWordSlice = this.reader.requestSlice(this.reader.fileSize - 4, 4);\n if (lastWordSlice instanceof Promise)\n lastWordSlice = await lastWordSlice;\n assert(lastWordSlice);\n const lastWord = readU32Be(lastWordSlice);\n const potentialMfraPos = this.reader.fileSize - lastWord;\n if (potentialMfraPos >= 0 && potentialMfraPos <= this.reader.fileSize - MAX_BOX_HEADER_SIZE) {\n let mfraHeaderSlice = this.reader.requestSliceRange(potentialMfraPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (mfraHeaderSlice instanceof Promise)\n mfraHeaderSlice = await mfraHeaderSlice;\n if (mfraHeaderSlice) {\n const boxInfo = readBoxHeader(mfraHeaderSlice);\n if (boxInfo && boxInfo.name === 'mfra') {\n // We found the mfra box, allowing for much better random access. Let's parse it.\n let mfraSlice = this.reader.requestSlice(mfraHeaderSlice.filePos, boxInfo.contentSize);\n if (mfraSlice instanceof Promise)\n mfraSlice = await mfraSlice;\n if (mfraSlice) {\n this.readContiguousBoxes(mfraSlice);\n }\n }\n }\n }\n }\n })();\n }\n getSampleTableForTrack(internalTrack) {\n if (internalTrack.sampleTable) {\n return internalTrack.sampleTable;\n }\n const sampleTable = {\n sampleTimingEntries: [],\n sampleCompositionTimeOffsets: [],\n sampleSizes: [],\n keySampleIndices: null,\n chunkOffsets: [],\n sampleToChunk: [],\n presentationTimestamps: null,\n presentationTimestampIndexMap: null,\n };\n internalTrack.sampleTable = sampleTable;\n assert(this.moovSlice);\n const stblContainerSlice = this.moovSlice.slice(internalTrack.sampleTableByteOffset);\n this.currentTrack = internalTrack;\n this.traverseBox(stblContainerSlice);\n this.currentTrack = null;\n const isPcmCodec = internalTrack.info?.type === 'audio'\n && internalTrack.info.codec\n && PCM_AUDIO_CODECS.includes(internalTrack.info.codec);\n if (isPcmCodec && sampleTable.sampleCompositionTimeOffsets.length === 0) {\n // If the audio has PCM samples, the way the samples are defined in the sample table is somewhat\n // suboptimal: Each individual audio sample is its own sample, meaning we can have 48000 samples per second.\n // Because we treat each sample as its own atomic unit that can be decoded, this would lead to a huge\n // amount of very short samples for PCM audio. So instead, we make a transformation: If the audio is in PCM,\n // we say that each chunk (that normally holds many samples) now is one big sample. We can this because\n // the samples in the chunk are contiguous and the format is PCM, so the entire chunk as one thing still\n // encodes valid audio information.\n assert(internalTrack.info?.type === 'audio');\n const pcmInfo = parsePcmCodec(internalTrack.info.codec);\n const newSampleTimingEntries = [];\n const newSampleSizes = [];\n for (let i = 0; i < sampleTable.sampleToChunk.length; i++) {\n const chunkEntry = sampleTable.sampleToChunk[i];\n const nextEntry = sampleTable.sampleToChunk[i + 1];\n const chunkCount = (nextEntry ? nextEntry.startChunkIndex : sampleTable.chunkOffsets.length)\n - chunkEntry.startChunkIndex;\n for (let j = 0; j < chunkCount; j++) {\n const startSampleIndex = chunkEntry.startSampleIndex + j * chunkEntry.samplesPerChunk;\n const endSampleIndex = startSampleIndex + chunkEntry.samplesPerChunk; // Exclusive, outside of chunk\n const startTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, startSampleIndex, x => x.startIndex);\n const startTimingEntry = sampleTable.sampleTimingEntries[startTimingEntryIndex];\n const endTimingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, endSampleIndex, x => x.startIndex);\n const endTimingEntry = sampleTable.sampleTimingEntries[endTimingEntryIndex];\n const firstSampleTimestamp = startTimingEntry.startDecodeTimestamp\n + (startSampleIndex - startTimingEntry.startIndex) * startTimingEntry.delta;\n const lastSampleTimestamp = endTimingEntry.startDecodeTimestamp\n + (endSampleIndex - endTimingEntry.startIndex) * endTimingEntry.delta;\n const delta = lastSampleTimestamp - firstSampleTimestamp;\n const lastSampleTimingEntry = last(newSampleTimingEntries);\n if (lastSampleTimingEntry && lastSampleTimingEntry.delta === delta) {\n lastSampleTimingEntry.count++;\n }\n else {\n // One sample for the entire chunk\n newSampleTimingEntries.push({\n startIndex: chunkEntry.startChunkIndex + j,\n startDecodeTimestamp: firstSampleTimestamp,\n count: 1,\n delta,\n });\n }\n // Instead of determining the chunk's size by looping over the samples sizes in the sample table, we\n // can directly compute it as we know how many PCM frames are in this chunk, and the size of each\n // PCM frame. This also improves compatibility with some files which fail to write proper sample\n // size values into their sample tables in the PCM case.\n const chunkSize = chunkEntry.samplesPerChunk\n * pcmInfo.sampleSize\n * internalTrack.info.numberOfChannels;\n newSampleSizes.push(chunkSize);\n }\n chunkEntry.startSampleIndex = chunkEntry.startChunkIndex;\n chunkEntry.samplesPerChunk = 1;\n }\n sampleTable.sampleTimingEntries = newSampleTimingEntries;\n sampleTable.sampleSizes = newSampleSizes;\n }\n if (sampleTable.sampleCompositionTimeOffsets.length > 0) {\n // If composition time offsets are defined, we must build a list of all presentation timestamps and then\n // sort them\n sampleTable.presentationTimestamps = [];\n for (const entry of sampleTable.sampleTimingEntries) {\n for (let i = 0; i < entry.count; i++) {\n sampleTable.presentationTimestamps.push({\n presentationTimestamp: entry.startDecodeTimestamp + i * entry.delta,\n sampleIndex: entry.startIndex + i,\n });\n }\n }\n for (const entry of sampleTable.sampleCompositionTimeOffsets) {\n for (let i = 0; i < entry.count; i++) {\n const sampleIndex = entry.startIndex + i;\n const sample = sampleTable.presentationTimestamps[sampleIndex];\n if (!sample) {\n continue;\n }\n sample.presentationTimestamp += entry.offset;\n }\n }\n sampleTable.presentationTimestamps.sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n sampleTable.presentationTimestampIndexMap = Array(sampleTable.presentationTimestamps.length).fill(-1);\n for (let i = 0; i < sampleTable.presentationTimestamps.length; i++) {\n sampleTable.presentationTimestampIndexMap[sampleTable.presentationTimestamps[i].sampleIndex] = i;\n }\n }\n else {\n // If they're not defined, we can simply use the decode timestamps as presentation timestamps\n }\n return sampleTable;\n }\n async readFragment(startPos) {\n if (this.lastReadFragment?.moofOffset === startPos) {\n return this.lastReadFragment;\n }\n let headerSlice = this.reader.requestSliceRange(startPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const moofBoxInfo = readBoxHeader(headerSlice);\n assert(moofBoxInfo?.name === 'moof');\n let entireSlice = this.reader.requestSlice(startPos, moofBoxInfo.totalSize);\n if (entireSlice instanceof Promise)\n entireSlice = await entireSlice;\n assert(entireSlice);\n this.traverseBox(entireSlice);\n const fragment = this.lastReadFragment;\n assert(fragment && fragment.moofOffset === startPos);\n for (const [, trackData] of fragment.trackData) {\n const track = trackData.track;\n const { fragmentPositionCache } = track;\n if (!trackData.startTimestampIsFinal) {\n // It may be that some tracks don't define the base decode time, i.e. when the fragment begins. This\n // we'll need to figure out the start timestamp another way. We'll compute the timestamp by accessing\n // the lookup entries and fragment cache, which works out nicely with the lookup algorithm: If these\n // exist, then the lookup will automatically start at the furthest possible point. If they don't, the\n // lookup starts sequentially from the start, incrementally summing up all fragment durations. It's sort\n // of implicit, but it ends up working nicely.\n const lookupEntry = track.fragmentLookupTable.find(x => x.moofOffset === fragment.moofOffset);\n if (lookupEntry) {\n // There's a lookup entry, let's use its timestamp\n offsetFragmentTrackDataByTimestamp(trackData, lookupEntry.timestamp);\n }\n else {\n const lastCacheIndex = binarySearchLessOrEqual(fragmentPositionCache, fragment.moofOffset - 1, x => x.moofOffset);\n if (lastCacheIndex !== -1) {\n // Let's use the timestamp of the previous fragment in the cache\n const lastCache = fragmentPositionCache[lastCacheIndex];\n offsetFragmentTrackDataByTimestamp(trackData, lastCache.endTimestamp);\n }\n else {\n // We're the first fragment I guess, \"offset by 0\"\n }\n }\n trackData.startTimestampIsFinal = true;\n }\n // Let's remember that a fragment with a given timestamp is here, speeding up future lookups if no\n // lookup table exists\n const insertionIndex = binarySearchLessOrEqual(fragmentPositionCache, trackData.startTimestamp, x => x.startTimestamp);\n if (insertionIndex === -1\n || fragmentPositionCache[insertionIndex].moofOffset !== fragment.moofOffset) {\n fragmentPositionCache.splice(insertionIndex + 1, 0, {\n moofOffset: fragment.moofOffset,\n startTimestamp: trackData.startTimestamp,\n endTimestamp: trackData.endTimestamp,\n });\n }\n }\n return fragment;\n }\n readContiguousBoxes(slice) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_BOX_HEADER_SIZE) {\n const foundBox = this.traverseBox(slice);\n if (!foundBox) {\n break;\n }\n }\n }\n // eslint-disable-next-line @stylistic/generator-star-spacing\n *iterateContiguousBoxes(slice) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_BOX_HEADER_SIZE) {\n const startPos = slice.filePos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n yield { boxInfo, slice };\n slice.filePos = startPos + boxInfo.totalSize;\n }\n }\n traverseBox(slice) {\n const startPos = slice.filePos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n return false;\n }\n const contentStartPos = slice.filePos;\n const boxEndPos = startPos + boxInfo.totalSize;\n switch (boxInfo.name) {\n case 'mdia':\n case 'minf':\n case 'dinf':\n case 'mfra':\n case 'edts':\n {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'mvhd':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n if (version === 1) {\n slice.skip(8 + 8);\n this.movieTimescale = readU32Be(slice);\n this.movieDurationInTimescale = readU64Be(slice);\n }\n else {\n slice.skip(4 + 4);\n this.movieTimescale = readU32Be(slice);\n this.movieDurationInTimescale = readU32Be(slice);\n }\n }\n ;\n break;\n case 'trak':\n {\n const track = {\n id: -1,\n demuxer: this,\n inputTrack: null,\n disposition: {\n ...DEFAULT_TRACK_DISPOSITION,\n },\n info: null,\n timescale: -1,\n durationInMovieTimescale: -1,\n durationInMediaTimescale: -1,\n rotation: 0,\n internalCodecId: null,\n name: null,\n languageCode: UNDETERMINED_LANGUAGE,\n sampleTableByteOffset: -1,\n sampleTable: null,\n fragmentLookupTable: [],\n currentFragmentState: null,\n fragmentPositionCache: [],\n editListPreviousSegmentDurations: 0,\n editListOffset: 0,\n };\n this.currentTrack = track;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n if (track.id !== -1 && track.timescale !== -1 && track.info !== null) {\n if (track.info.type === 'video' && track.info.width !== -1) {\n const videoTrack = track;\n track.inputTrack = new InputVideoTrack(this.input, new IsobmffVideoTrackBacking(videoTrack));\n this.tracks.push(track);\n }\n else if (track.info.type === 'audio' && track.info.numberOfChannels !== -1) {\n const audioTrack = track;\n track.inputTrack = new InputAudioTrack(this.input, new IsobmffAudioTrackBacking(audioTrack));\n this.tracks.push(track);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case 'tkhd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n const flags = readU24Be(slice);\n // Spec says disabled tracks are to be treated like they don't exist, but in practice, they are treated\n // more like non-default tracks.\n const trackEnabled = !!(flags & 0x1);\n track.disposition.default = trackEnabled;\n // Skip over creation & modification time to reach the track ID\n if (version === 0) {\n slice.skip(8);\n track.id = readU32Be(slice);\n slice.skip(4);\n track.durationInMovieTimescale = readU32Be(slice);\n }\n else if (version === 1) {\n slice.skip(16);\n track.id = readU32Be(slice);\n slice.skip(4);\n track.durationInMovieTimescale = readU64Be(slice);\n }\n else {\n throw new Error(`Incorrect track header version ${version}.`);\n }\n slice.skip(2 * 4 + 2 + 2 + 2 + 2);\n const matrix = [\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n readFixed_16_16(slice),\n readFixed_16_16(slice),\n readFixed_2_30(slice),\n ];\n const rotation = normalizeRotation(roundToMultiple(extractRotationFromMatrix(matrix), 90));\n assert(rotation === 0 || rotation === 90 || rotation === 180 || rotation === 270);\n track.rotation = rotation;\n }\n ;\n break;\n case 'elst':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n slice.skip(3); // Flags\n let relevantEntryFound = false;\n let previousSegmentDurations = 0;\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const segmentDuration = version === 1\n ? readU64Be(slice)\n : readU32Be(slice);\n const mediaTime = version === 1\n ? readI64Be(slice)\n : readI32Be(slice);\n const mediaRate = readFixed_16_16(slice);\n if (segmentDuration === 0) {\n // Don't care\n continue;\n }\n if (relevantEntryFound) {\n console.warn('Unsupported edit list: multiple edits are not currently supported. Only using first edit.');\n break;\n }\n if (mediaTime === -1) {\n previousSegmentDurations += segmentDuration;\n continue;\n }\n if (mediaRate !== 1) {\n console.warn('Unsupported edit list entry: media rate must be 1.');\n break;\n }\n track.editListPreviousSegmentDurations = previousSegmentDurations;\n track.editListOffset = mediaTime;\n relevantEntryFound = true;\n }\n }\n ;\n break;\n case 'mdhd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n const version = readU8(slice);\n slice.skip(3); // Flags\n if (version === 0) {\n slice.skip(8);\n track.timescale = readU32Be(slice);\n track.durationInMediaTimescale = readU32Be(slice);\n }\n else if (version === 1) {\n slice.skip(16);\n track.timescale = readU32Be(slice);\n track.durationInMediaTimescale = readU64Be(slice);\n }\n let language = readU16Be(slice);\n if (language > 0) {\n track.languageCode = '';\n for (let i = 0; i < 3; i++) {\n track.languageCode = String.fromCharCode(0x60 + (language & 0b11111)) + track.languageCode;\n language >>= 5;\n }\n if (!isIso639Dash2LanguageCode(track.languageCode)) {\n // Sometimes the bytes are garbage\n track.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n }\n ;\n break;\n case 'hdlr':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n slice.skip(8); // Version + flags + pre-defined\n const handlerType = readAscii(slice, 4);\n if (handlerType === 'vide') {\n track.info = {\n type: 'video',\n width: -1,\n height: -1,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n avcType: null,\n avcCodecInfo: null,\n hevcCodecInfo: null,\n vp9CodecInfo: null,\n av1CodecInfo: null,\n };\n }\n else if (handlerType === 'soun') {\n track.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case 'stbl':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n track.sampleTableByteOffset = startPos;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'stsd':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (track.info === null || track.sampleTable) {\n break;\n }\n const stsdVersion = readU8(slice);\n slice.skip(3); // Flags\n const entries = readU32Be(slice);\n for (let i = 0; i < entries; i++) {\n const sampleBoxStartPos = slice.filePos;\n const sampleBoxInfo = readBoxHeader(slice);\n if (!sampleBoxInfo) {\n break;\n }\n track.internalCodecId = sampleBoxInfo.name;\n const lowercaseBoxName = sampleBoxInfo.name.toLowerCase();\n if (track.info.type === 'video') {\n if (lowercaseBoxName === 'avc1' || lowercaseBoxName === 'avc3') {\n track.info.codec = 'avc';\n track.info.avcType = lowercaseBoxName === 'avc1' ? 1 : 3;\n }\n else if (lowercaseBoxName === 'hvc1' || lowercaseBoxName === 'hev1') {\n track.info.codec = 'hevc';\n }\n else if (lowercaseBoxName === 'vp08') {\n track.info.codec = 'vp8';\n }\n else if (lowercaseBoxName === 'vp09') {\n track.info.codec = 'vp9';\n }\n else if (lowercaseBoxName === 'av01') {\n track.info.codec = 'av1';\n }\n else {\n console.warn(`Unsupported video codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n slice.skip(6 * 1 + 2 + 2 + 2 + 3 * 4);\n track.info.width = readU16Be(slice);\n track.info.height = readU16Be(slice);\n slice.skip(4 + 4 + 4 + 2 + 32 + 2 + 2);\n this.readContiguousBoxes(slice.slice(slice.filePos, (sampleBoxStartPos + sampleBoxInfo.totalSize) - slice.filePos));\n }\n else {\n if (lowercaseBoxName === 'mp4a') {\n // We don't know the codec yet (might be AAC, might be MP3), need to read the esds box\n }\n else if (lowercaseBoxName === 'opus') {\n track.info.codec = 'opus';\n }\n else if (lowercaseBoxName === 'flac') {\n track.info.codec = 'flac';\n }\n else if (lowercaseBoxName === 'twos'\n || lowercaseBoxName === 'sowt'\n || lowercaseBoxName === 'raw '\n || lowercaseBoxName === 'in24'\n || lowercaseBoxName === 'in32'\n || lowercaseBoxName === 'fl32'\n || lowercaseBoxName === 'fl64'\n || lowercaseBoxName === 'lpcm'\n || lowercaseBoxName === 'ipcm' // ISO/IEC 23003-5\n || lowercaseBoxName === 'fpcm' // \"\n ) {\n // It's PCM\n // developer.apple.com/documentation/quicktime-file-format/sound_sample_descriptions/\n }\n else if (lowercaseBoxName === 'ulaw') {\n track.info.codec = 'ulaw';\n }\n else if (lowercaseBoxName === 'alaw') {\n track.info.codec = 'alaw';\n }\n else {\n console.warn(`Unsupported audio codec (sample entry type '${sampleBoxInfo.name}').`);\n }\n slice.skip(6 * 1 + 2);\n const version = readU16Be(slice);\n slice.skip(3 * 2);\n let channelCount = readU16Be(slice);\n let sampleSize = readU16Be(slice);\n slice.skip(2 * 2);\n // Can't use fixed16_16 as that's signed\n let sampleRate = readU32Be(slice) / 0x10000;\n if (stsdVersion === 0 && version > 0) {\n // Additional QuickTime fields\n if (version === 1) {\n slice.skip(4);\n sampleSize = 8 * readU32Be(slice);\n slice.skip(2 * 4);\n }\n else if (version === 2) {\n slice.skip(4);\n sampleRate = readF64Be(slice);\n channelCount = readU32Be(slice);\n slice.skip(4); // Always 0x7f000000\n sampleSize = readU32Be(slice);\n const flags = readU32Be(slice);\n slice.skip(2 * 4);\n if (lowercaseBoxName === 'lpcm') {\n const bytesPerSample = (sampleSize + 7) >> 3;\n const isFloat = Boolean(flags & 1);\n const isBigEndian = Boolean(flags & 2);\n const sFlags = flags & 4 ? -1 : 0; // I guess it means \"signed flags\" or something?\n if (sampleSize > 0 && sampleSize <= 64) {\n if (isFloat) {\n if (sampleSize === 32) {\n track.info.codec = isBigEndian ? 'pcm-f32be' : 'pcm-f32';\n }\n }\n else {\n if (sFlags & (1 << (bytesPerSample - 1))) {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-s8';\n }\n else if (bytesPerSample === 2) {\n track.info.codec = isBigEndian ? 'pcm-s16be' : 'pcm-s16';\n }\n else if (bytesPerSample === 3) {\n track.info.codec = isBigEndian ? 'pcm-s24be' : 'pcm-s24';\n }\n else if (bytesPerSample === 4) {\n track.info.codec = isBigEndian ? 'pcm-s32be' : 'pcm-s32';\n }\n }\n else {\n if (bytesPerSample === 1) {\n track.info.codec = 'pcm-u8';\n }\n }\n }\n }\n if (track.info.codec === null) {\n console.warn('Unsupported PCM format.');\n }\n }\n }\n }\n if (track.info.codec === 'opus') {\n sampleRate = OPUS_SAMPLE_RATE; // Always the same\n }\n track.info.numberOfChannels = channelCount;\n track.info.sampleRate = sampleRate;\n // PCM codec assignments\n if (lowercaseBoxName === 'twos') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'twos'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'sowt') {\n if (sampleSize === 8) {\n track.info.codec = 'pcm-s8';\n }\n else if (sampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else {\n console.warn(`Unsupported sample size ${sampleSize} for codec 'sowt'.`);\n track.info.codec = null;\n }\n }\n else if (lowercaseBoxName === 'raw ') {\n track.info.codec = 'pcm-u8';\n }\n else if (lowercaseBoxName === 'in24') {\n track.info.codec = 'pcm-s24be';\n }\n else if (lowercaseBoxName === 'in32') {\n track.info.codec = 'pcm-s32be';\n }\n else if (lowercaseBoxName === 'fl32') {\n track.info.codec = 'pcm-f32be';\n }\n else if (lowercaseBoxName === 'fl64') {\n track.info.codec = 'pcm-f64be';\n }\n else if (lowercaseBoxName === 'ipcm') {\n track.info.codec = 'pcm-s16be'; // Placeholder, will be adjusted by the pcmC box\n }\n else if (lowercaseBoxName === 'fpcm') {\n track.info.codec = 'pcm-f32be'; // Placeholder, will be adjusted by the pcmC box\n }\n this.readContiguousBoxes(slice.slice(slice.filePos, (sampleBoxStartPos + sampleBoxInfo.totalSize) - slice.filePos));\n }\n }\n }\n ;\n break;\n case 'avcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info);\n track.info.codecDescription = readBytes(slice, boxInfo.contentSize);\n }\n ;\n break;\n case 'hvcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info);\n track.info.codecDescription = readBytes(slice, boxInfo.contentSize);\n }\n ;\n break;\n case 'vpcC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n slice.skip(4); // Version + flags\n const profile = readU8(slice);\n const level = readU8(slice);\n const thirdByte = readU8(slice);\n const bitDepth = thirdByte >> 4;\n const chromaSubsampling = (thirdByte >> 1) & 0b111;\n const videoFullRangeFlag = thirdByte & 1;\n const colourPrimaries = readU8(slice);\n const transferCharacteristics = readU8(slice);\n const matrixCoefficients = readU8(slice);\n track.info.vp9CodecInfo = {\n profile,\n level,\n bitDepth,\n chromaSubsampling,\n videoFullRangeFlag,\n colourPrimaries,\n transferCharacteristics,\n matrixCoefficients,\n };\n }\n ;\n break;\n case 'av1C':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n slice.skip(1); // Marker + version\n const secondByte = readU8(slice);\n const profile = secondByte >> 5;\n const level = secondByte & 0b11111;\n const thirdByte = readU8(slice);\n const tier = thirdByte >> 7;\n const highBitDepth = (thirdByte >> 6) & 1;\n const twelveBit = (thirdByte >> 5) & 1;\n const monochrome = (thirdByte >> 4) & 1;\n const chromaSubsamplingX = (thirdByte >> 3) & 1;\n const chromaSubsamplingY = (thirdByte >> 2) & 1;\n const chromaSamplePosition = thirdByte & 0b11;\n // Logic from https://aomediacodec.github.io/av1-spec/av1-spec.pdf\n const bitDepth = profile === 2 && highBitDepth ? (twelveBit ? 12 : 10) : (highBitDepth ? 10 : 8);\n track.info.av1CodecInfo = {\n profile,\n level,\n tier,\n bitDepth,\n monochrome,\n chromaSubsamplingX,\n chromaSubsamplingY,\n chromaSamplePosition,\n };\n }\n ;\n break;\n case 'colr':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'video');\n const colourType = readAscii(slice, 4);\n if (colourType !== 'nclx') {\n break;\n }\n const colourPrimaries = readU16Be(slice);\n const transferCharacteristics = readU16Be(slice);\n const matrixCoefficients = readU16Be(slice);\n const fullRangeFlag = Boolean(readU8(slice) & 0x80);\n track.info.colorSpace = {\n primaries: COLOR_PRIMARIES_MAP_INVERSE[colourPrimaries],\n transfer: TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics],\n matrix: MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients],\n fullRange: fullRangeFlag,\n };\n }\n ;\n break;\n case 'wave':\n {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'esds':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(4); // Version + flags\n const tag = readU8(slice);\n assert(tag === 0x03); // ES Descriptor\n readIsomVariableInteger(slice); // Length\n slice.skip(2); // ES ID\n const mixed = readU8(slice);\n const streamDependenceFlag = (mixed & 0x80) !== 0;\n const urlFlag = (mixed & 0x40) !== 0;\n const ocrStreamFlag = (mixed & 0x20) !== 0;\n if (streamDependenceFlag) {\n slice.skip(2);\n }\n if (urlFlag) {\n const urlLength = readU8(slice);\n slice.skip(urlLength);\n }\n if (ocrStreamFlag) {\n slice.skip(2);\n }\n const decoderConfigTag = readU8(slice);\n assert(decoderConfigTag === 0x04); // DecoderConfigDescriptor\n const decoderConfigDescriptorLength = readIsomVariableInteger(slice); // Length\n const payloadStart = slice.filePos;\n const objectTypeIndication = readU8(slice);\n if (objectTypeIndication === 0x40 || objectTypeIndication === 0x67) {\n track.info.codec = 'aac';\n track.info.aacCodecInfo = { isMpeg2: objectTypeIndication === 0x67 };\n }\n else if (objectTypeIndication === 0x69 || objectTypeIndication === 0x6b) {\n track.info.codec = 'mp3';\n }\n else if (objectTypeIndication === 0xdd) {\n track.info.codec = 'vorbis'; // \"nonstandard, gpac uses it\" - FFmpeg\n }\n else {\n console.warn(`Unsupported audio codec (objectTypeIndication ${objectTypeIndication}) - discarding track.`);\n }\n slice.skip(1 + 3 + 4 + 4);\n if (decoderConfigDescriptorLength > slice.filePos - payloadStart) {\n // There's a DecoderSpecificInfo at the end, let's read it\n const decoderSpecificInfoTag = readU8(slice);\n assert(decoderSpecificInfoTag === 0x05); // DecoderSpecificInfo\n const decoderSpecificInfoLength = readIsomVariableInteger(slice);\n track.info.codecDescription = readBytes(slice, decoderSpecificInfoLength);\n if (track.info.codec === 'aac') {\n // Let's try to deduce more accurate values directly from the AudioSpecificConfig:\n const audioSpecificConfig = parseAacAudioSpecificConfig(track.info.codecDescription);\n if (audioSpecificConfig.numberOfChannels !== null) {\n track.info.numberOfChannels = audioSpecificConfig.numberOfChannels;\n }\n if (audioSpecificConfig.sampleRate !== null) {\n track.info.sampleRate = audioSpecificConfig.sampleRate;\n }\n }\n }\n }\n ;\n break;\n case 'enda':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n const littleEndian = readU16Be(slice) & 0xff; // 0xff is from FFmpeg\n if (littleEndian) {\n if (track.info.codec === 'pcm-s16be') {\n track.info.codec = 'pcm-s16';\n }\n else if (track.info.codec === 'pcm-s24be') {\n track.info.codec = 'pcm-s24';\n }\n else if (track.info.codec === 'pcm-s32be') {\n track.info.codec = 'pcm-s32';\n }\n else if (track.info.codec === 'pcm-f32be') {\n track.info.codec = 'pcm-f32';\n }\n else if (track.info.codec === 'pcm-f64be') {\n track.info.codec = 'pcm-f64';\n }\n }\n }\n ;\n break;\n case 'pcmC':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(1 + 3); // Version + flags\n // ISO/IEC 23003-5\n const formatFlags = readU8(slice);\n const isLittleEndian = Boolean(formatFlags & 0x01);\n const pcmSampleSize = readU8(slice);\n if (track.info.codec === 'pcm-s16be') {\n // ipcm\n if (isLittleEndian) {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 16) {\n track.info.codec = 'pcm-s16be';\n }\n else if (pcmSampleSize === 24) {\n track.info.codec = 'pcm-s24be';\n }\n else if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-s32be';\n }\n else {\n console.warn(`Invalid ipcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n else if (track.info.codec === 'pcm-f32be') {\n // fpcm\n if (isLittleEndian) {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n else {\n if (pcmSampleSize === 32) {\n track.info.codec = 'pcm-f32be';\n }\n else if (pcmSampleSize === 64) {\n track.info.codec = 'pcm-f64be';\n }\n else {\n console.warn(`Invalid fpcm sample size ${pcmSampleSize}.`);\n track.info.codec = null;\n }\n }\n }\n break;\n }\n ;\n case 'dOps':\n { // Used for Opus audio\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(1); // Version\n // https://www.opus-codec.org/docs/opus_in_isobmff.html\n const outputChannelCount = readU8(slice);\n const preSkip = readU16Be(slice);\n const inputSampleRate = readU32Be(slice);\n const outputGain = readI16Be(slice);\n const channelMappingFamily = readU8(slice);\n let channelMappingTable;\n if (channelMappingFamily !== 0) {\n channelMappingTable = readBytes(slice, 2 + outputChannelCount);\n }\n else {\n channelMappingTable = new Uint8Array(0);\n }\n // https://datatracker.ietf.org/doc/html/draft-ietf-codec-oggopus-06\n const description = new Uint8Array(8 + 1 + 1 + 2 + 4 + 2 + 1 + channelMappingTable.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x4f707573, false); // 'Opus'\n view.setUint32(4, 0x48656164, false); // 'Head'\n view.setUint8(8, 1); // Version\n view.setUint8(9, outputChannelCount);\n view.setUint16(10, preSkip, true);\n view.setUint32(12, inputSampleRate, true);\n view.setInt16(16, outputGain, true);\n view.setUint8(18, channelMappingFamily);\n description.set(channelMappingTable, 19);\n track.info.codecDescription = description;\n track.info.numberOfChannels = outputChannelCount;\n // Don't copy the input sample rate, irrelevant, and output sample rate is fixed\n }\n ;\n break;\n case 'dfLa':\n { // Used for FLAC audio\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.info?.type === 'audio');\n slice.skip(4); // Version + flags\n // https://datatracker.ietf.org/doc/rfc9639/\n const BLOCK_TYPE_MASK = 0x7f;\n const LAST_METADATA_BLOCK_FLAG_MASK = 0x80;\n const startPos = slice.filePos;\n while (slice.filePos < boxEndPos) {\n const flagAndType = readU8(slice);\n const metadataBlockLength = readU24Be(slice);\n const type = flagAndType & BLOCK_TYPE_MASK;\n // It's a STREAMINFO block; let's extract the actual sample rate and channel count\n if (type === FlacBlockType.STREAMINFO) {\n slice.skip(10);\n // Extract sample rate and channel count\n const word = readU32Be(slice);\n const sampleRate = word >>> 12;\n const numberOfChannels = ((word >> 9) & 0b111) + 1;\n track.info.sampleRate = sampleRate;\n track.info.numberOfChannels = numberOfChannels;\n slice.skip(20);\n }\n else {\n // Simply skip ahead to the next block\n slice.skip(metadataBlockLength);\n }\n if (flagAndType & LAST_METADATA_BLOCK_FLAG_MASK) {\n break;\n }\n }\n const endPos = slice.filePos;\n slice.filePos = startPos;\n const bytes = readBytes(slice, endPos - startPos);\n const description = new Uint8Array(4 + bytes.byteLength);\n const view = new DataView(description.buffer);\n view.setUint32(0, 0x664c6143, false); // 'fLaC'\n description.set(bytes, 4);\n // Set the codec description to be 'fLaC' + all metadata blocks\n track.info.codecDescription = description;\n }\n ;\n break;\n case 'stts':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n let currentIndex = 0;\n let currentTimestamp = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = readU32Be(slice);\n const sampleDelta = readU32Be(slice);\n track.sampleTable.sampleTimingEntries.push({\n startIndex: currentIndex,\n startDecodeTimestamp: currentTimestamp,\n count: sampleCount,\n delta: sampleDelta,\n });\n currentIndex += sampleCount;\n currentTimestamp += sampleCount * sampleDelta;\n }\n }\n ;\n break;\n case 'ctts':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(1 + 3); // Version + flags\n const entryCount = readU32Be(slice);\n let sampleIndex = 0;\n for (let i = 0; i < entryCount; i++) {\n const sampleCount = readU32Be(slice);\n const sampleOffset = readI32Be(slice);\n track.sampleTable.sampleCompositionTimeOffsets.push({\n startIndex: sampleIndex,\n count: sampleCount,\n offset: sampleOffset,\n });\n sampleIndex += sampleCount;\n }\n }\n ;\n break;\n case 'stsz':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const sampleSize = readU32Be(slice);\n const sampleCount = readU32Be(slice);\n if (sampleSize === 0) {\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = readU32Be(slice);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n else {\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stz2':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n slice.skip(3); // Reserved\n const fieldSize = readU8(slice); // in bits\n const sampleCount = readU32Be(slice);\n const bytes = readBytes(slice, Math.ceil(sampleCount * fieldSize / 8));\n const bitstream = new Bitstream(bytes);\n for (let i = 0; i < sampleCount; i++) {\n const sampleSize = bitstream.readBits(fieldSize);\n track.sampleTable.sampleSizes.push(sampleSize);\n }\n }\n ;\n break;\n case 'stss':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n track.sampleTable.keySampleIndices = [];\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const sampleIndex = readU32Be(slice) - 1; // Convert to 0-indexed\n track.sampleTable.keySampleIndices.push(sampleIndex);\n }\n if (track.sampleTable.keySampleIndices[0] !== 0) {\n // Some files don't mark the first sample a key sample, which is basically almost always incorrect.\n // Here, we correct for that mistake:\n track.sampleTable.keySampleIndices.unshift(0);\n }\n }\n ;\n break;\n case 'stsc':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4);\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const startChunkIndex = readU32Be(slice) - 1; // Convert to 0-indexed\n const samplesPerChunk = readU32Be(slice);\n const sampleDescriptionIndex = readU32Be(slice);\n track.sampleTable.sampleToChunk.push({\n startSampleIndex: -1,\n startChunkIndex,\n samplesPerChunk,\n sampleDescriptionIndex,\n });\n }\n let startSampleIndex = 0;\n for (let i = 0; i < track.sampleTable.sampleToChunk.length; i++) {\n track.sampleTable.sampleToChunk[i].startSampleIndex = startSampleIndex;\n if (i < track.sampleTable.sampleToChunk.length - 1) {\n const nextChunk = track.sampleTable.sampleToChunk[i + 1];\n const chunkCount = nextChunk.startChunkIndex\n - track.sampleTable.sampleToChunk[i].startChunkIndex;\n startSampleIndex += chunkCount * track.sampleTable.sampleToChunk[i].samplesPerChunk;\n }\n }\n }\n ;\n break;\n case 'stco':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = readU32Be(slice);\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'co64':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n if (!track.sampleTable) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const chunkOffset = readU64Be(slice);\n track.sampleTable.chunkOffsets.push(chunkOffset);\n }\n }\n ;\n break;\n case 'mvex':\n {\n this.isFragmented = true;\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n ;\n break;\n case 'mehd':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n const fragmentDuration = version === 1 ? readU64Be(slice) : readU32Be(slice);\n this.movieDurationInTimescale = fragmentDuration;\n }\n ;\n break;\n case 'trex':\n {\n slice.skip(4); // Version + flags\n const trackId = readU32Be(slice);\n const defaultSampleDescriptionIndex = readU32Be(slice);\n const defaultSampleDuration = readU32Be(slice);\n const defaultSampleSize = readU32Be(slice);\n const defaultSampleFlags = readU32Be(slice);\n // We store these separately rather than in the tracks since the tracks may not exist yet\n this.fragmentTrackDefaults.push({\n trackId,\n defaultSampleDescriptionIndex,\n defaultSampleDuration,\n defaultSampleSize,\n defaultSampleFlags,\n });\n }\n ;\n break;\n case 'tfra':\n {\n const version = readU8(slice);\n slice.skip(3); // Flags\n const trackId = readU32Be(slice);\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n break;\n }\n const word = readU32Be(slice);\n const lengthSizeOfTrafNum = (word & 0b110000) >> 4;\n const lengthSizeOfTrunNum = (word & 0b001100) >> 2;\n const lengthSizeOfSampleNum = word & 0b000011;\n const functions = [readU8, readU16Be, readU24Be, readU32Be];\n const readTrafNum = functions[lengthSizeOfTrafNum];\n const readTrunNum = functions[lengthSizeOfTrunNum];\n const readSampleNum = functions[lengthSizeOfSampleNum];\n const numberOfEntries = readU32Be(slice);\n for (let i = 0; i < numberOfEntries; i++) {\n const time = version === 1 ? readU64Be(slice) : readU32Be(slice);\n const moofOffset = version === 1 ? readU64Be(slice) : readU32Be(slice);\n readTrafNum(slice);\n readTrunNum(slice);\n readSampleNum(slice);\n track.fragmentLookupTable.push({\n timestamp: time,\n moofOffset,\n });\n }\n // Sort by timestamp in case it's not naturally sorted\n track.fragmentLookupTable.sort((a, b) => a.timestamp - b.timestamp);\n // Remove multiple entries for the same time\n for (let i = 0; i < track.fragmentLookupTable.length - 1; i++) {\n const entry1 = track.fragmentLookupTable[i];\n const entry2 = track.fragmentLookupTable[i + 1];\n if (entry1.timestamp === entry2.timestamp) {\n track.fragmentLookupTable.splice(i + 1, 1);\n i--;\n }\n }\n }\n ;\n break;\n case 'moof':\n {\n this.currentFragment = {\n moofOffset: startPos,\n moofSize: boxInfo.totalSize,\n implicitBaseDataOffset: startPos,\n trackData: new Map(),\n };\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n this.lastReadFragment = this.currentFragment;\n this.currentFragment = null;\n }\n ;\n break;\n case 'traf':\n {\n assert(this.currentFragment);\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n // It is possible that there is no current track, for example when we don't care about the track\n // referenced in the track fragment header.\n if (this.currentTrack) {\n const trackData = this.currentFragment.trackData.get(this.currentTrack.id);\n if (trackData) {\n const { currentFragmentState } = this.currentTrack;\n assert(currentFragmentState);\n if (currentFragmentState.startTimestamp !== null) {\n offsetFragmentTrackDataByTimestamp(trackData, currentFragmentState.startTimestamp);\n trackData.startTimestampIsFinal = true;\n }\n }\n this.currentTrack.currentFragmentState = null;\n this.currentTrack = null;\n }\n }\n ;\n break;\n case 'tfhd':\n {\n assert(this.currentFragment);\n slice.skip(1); // Version\n const flags = readU24Be(slice);\n const baseDataOffsetPresent = Boolean(flags & 0x000001);\n const sampleDescriptionIndexPresent = Boolean(flags & 0x000002);\n const defaultSampleDurationPresent = Boolean(flags & 0x000008);\n const defaultSampleSizePresent = Boolean(flags & 0x000010);\n const defaultSampleFlagsPresent = Boolean(flags & 0x000020);\n const durationIsEmpty = Boolean(flags & 0x010000);\n const defaultBaseIsMoof = Boolean(flags & 0x020000);\n const trackId = readU32Be(slice);\n const track = this.tracks.find(x => x.id === trackId);\n if (!track) {\n // We don't care about this track\n break;\n }\n const defaults = this.fragmentTrackDefaults.find(x => x.trackId === trackId);\n this.currentTrack = track;\n track.currentFragmentState = {\n baseDataOffset: this.currentFragment.implicitBaseDataOffset,\n sampleDescriptionIndex: defaults?.defaultSampleDescriptionIndex ?? null,\n defaultSampleDuration: defaults?.defaultSampleDuration ?? null,\n defaultSampleSize: defaults?.defaultSampleSize ?? null,\n defaultSampleFlags: defaults?.defaultSampleFlags ?? null,\n startTimestamp: null,\n };\n if (baseDataOffsetPresent) {\n track.currentFragmentState.baseDataOffset = readU64Be(slice);\n }\n else if (defaultBaseIsMoof) {\n track.currentFragmentState.baseDataOffset = this.currentFragment.moofOffset;\n }\n if (sampleDescriptionIndexPresent) {\n track.currentFragmentState.sampleDescriptionIndex = readU32Be(slice);\n }\n if (defaultSampleDurationPresent) {\n track.currentFragmentState.defaultSampleDuration = readU32Be(slice);\n }\n if (defaultSampleSizePresent) {\n track.currentFragmentState.defaultSampleSize = readU32Be(slice);\n }\n if (defaultSampleFlagsPresent) {\n track.currentFragmentState.defaultSampleFlags = readU32Be(slice);\n }\n if (durationIsEmpty) {\n track.currentFragmentState.defaultSampleDuration = 0;\n }\n }\n ;\n break;\n case 'tfdt':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(track.currentFragmentState);\n const version = readU8(slice);\n slice.skip(3); // Flags\n const baseMediaDecodeTime = version === 0 ? readU32Be(slice) : readU64Be(slice);\n track.currentFragmentState.startTimestamp = baseMediaDecodeTime;\n }\n ;\n break;\n case 'trun':\n {\n const track = this.currentTrack;\n if (!track) {\n break;\n }\n assert(this.currentFragment);\n assert(track.currentFragmentState);\n if (this.currentFragment.trackData.has(track.id)) {\n console.warn('Can\\'t have two trun boxes for the same track in one fragment. Ignoring...');\n break;\n }\n const version = readU8(slice);\n const flags = readU24Be(slice);\n const dataOffsetPresent = Boolean(flags & 0x000001);\n const firstSampleFlagsPresent = Boolean(flags & 0x000004);\n const sampleDurationPresent = Boolean(flags & 0x000100);\n const sampleSizePresent = Boolean(flags & 0x000200);\n const sampleFlagsPresent = Boolean(flags & 0x000400);\n const sampleCompositionTimeOffsetsPresent = Boolean(flags & 0x000800);\n const sampleCount = readU32Be(slice);\n let dataOffset = track.currentFragmentState.baseDataOffset;\n if (dataOffsetPresent) {\n dataOffset += readI32Be(slice);\n }\n let firstSampleFlags = null;\n if (firstSampleFlagsPresent) {\n firstSampleFlags = readU32Be(slice);\n }\n let currentOffset = dataOffset;\n if (sampleCount === 0) {\n // Don't associate the fragment with the track if it has no samples, this simplifies other code\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n break;\n }\n let currentTimestamp = 0;\n const trackData = {\n track,\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n samples: [],\n presentationTimestamps: [],\n startTimestampIsFinal: false,\n };\n this.currentFragment.trackData.set(track.id, trackData);\n for (let i = 0; i < sampleCount; i++) {\n let sampleDuration;\n if (sampleDurationPresent) {\n sampleDuration = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleDuration !== null);\n sampleDuration = track.currentFragmentState.defaultSampleDuration;\n }\n let sampleSize;\n if (sampleSizePresent) {\n sampleSize = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleSize !== null);\n sampleSize = track.currentFragmentState.defaultSampleSize;\n }\n let sampleFlags;\n if (sampleFlagsPresent) {\n sampleFlags = readU32Be(slice);\n }\n else {\n assert(track.currentFragmentState.defaultSampleFlags !== null);\n sampleFlags = track.currentFragmentState.defaultSampleFlags;\n }\n if (i === 0 && firstSampleFlags !== null) {\n sampleFlags = firstSampleFlags;\n }\n let sampleCompositionTimeOffset = 0;\n if (sampleCompositionTimeOffsetsPresent) {\n if (version === 0) {\n sampleCompositionTimeOffset = readU32Be(slice);\n }\n else {\n sampleCompositionTimeOffset = readI32Be(slice);\n }\n }\n const isKeyFrame = !(sampleFlags & 0x00010000);\n trackData.samples.push({\n presentationTimestamp: currentTimestamp + sampleCompositionTimeOffset,\n duration: sampleDuration,\n byteOffset: currentOffset,\n byteSize: sampleSize,\n isKeyFrame,\n });\n currentOffset += sampleSize;\n currentTimestamp += sampleDuration;\n }\n trackData.presentationTimestamps = trackData.samples\n .map((x, i) => ({ presentationTimestamp: x.presentationTimestamp, sampleIndex: i }))\n .sort((a, b) => a.presentationTimestamp - b.presentationTimestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentSample = trackData.samples[currentEntry.sampleIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentSample.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentSample.presentationTimestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update sample durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentSample.duration = nextEntry.presentationTimestamp - currentEntry.presentationTimestamp;\n }\n }\n const firstSample = trackData.samples[trackData.presentationTimestamps[0].sampleIndex];\n const lastSample = trackData.samples[last(trackData.presentationTimestamps).sampleIndex];\n trackData.startTimestamp = firstSample.presentationTimestamp;\n trackData.endTimestamp = lastSample.presentationTimestamp + lastSample.duration;\n this.currentFragment.implicitBaseDataOffset = currentOffset;\n }\n ;\n break;\n // Metadata section\n // https://exiftool.org/TagNames/QuickTime.html\n // https://mp4workshop.com/about\n case 'udta':\n { // Contains either movie metadata or track metadata\n const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n for (const { boxInfo, slice } of iterator) {\n if (boxInfo.name !== 'meta' && !this.currentTrack) {\n const startPos = slice.filePos;\n this.metadataTags.raw ??= {};\n if (boxInfo.name[0] === '©') {\n // https://mp4workshop.com/about\n // Box name starting with © indicates \"international text\"\n this.metadataTags.raw[boxInfo.name] ??= readMetadataStringShort(slice);\n }\n else {\n this.metadataTags.raw[boxInfo.name] ??= readBytes(slice, boxInfo.contentSize);\n }\n slice.filePos = startPos;\n }\n switch (boxInfo.name) {\n case 'meta':\n {\n slice.skip(-boxInfo.headerSize);\n this.traverseBox(slice);\n }\n ;\n break;\n case '©nam':\n case 'name':\n {\n if (this.currentTrack) {\n this.currentTrack.name = textDecoder.decode(readBytes(slice, boxInfo.contentSize));\n }\n else {\n this.metadataTags.title ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©des':\n {\n if (!this.currentTrack) {\n this.metadataTags.description ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©ART':\n {\n if (!this.currentTrack) {\n this.metadataTags.artist ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©alb':\n {\n if (!this.currentTrack) {\n this.metadataTags.album ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case 'albr':\n {\n if (!this.currentTrack) {\n this.metadataTags.albumArtist ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©gen':\n {\n if (!this.currentTrack) {\n this.metadataTags.genre ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©day':\n {\n if (!this.currentTrack) {\n const date = new Date(readMetadataStringShort(slice));\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n }\n ;\n break;\n case '©cmt':\n {\n if (!this.currentTrack) {\n this.metadataTags.comment ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n case '©lyr':\n {\n if (!this.currentTrack) {\n this.metadataTags.lyrics ??= readMetadataStringShort(slice);\n }\n }\n ;\n break;\n }\n }\n }\n ;\n break;\n case 'meta':\n {\n if (this.currentTrack) {\n break; // Only care about movie-level metadata for now\n }\n // The 'meta' box comes in two flavors, one with flags/version and one without. To know which is which,\n // let's read the next 4 bytes, which are either the version or the size of the first subbox.\n const word = readU32Be(slice);\n const isQuickTime = word !== 0;\n this.currentMetadataKeys = new Map();\n if (isQuickTime) {\n this.readContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n }\n else {\n this.readContiguousBoxes(slice.slice(contentStartPos + 4, boxInfo.contentSize - 4));\n }\n this.currentMetadataKeys = null;\n }\n ;\n break;\n case 'keys':\n {\n if (!this.currentMetadataKeys) {\n break;\n }\n slice.skip(4); // Version + flags\n const entryCount = readU32Be(slice);\n for (let i = 0; i < entryCount; i++) {\n const keySize = readU32Be(slice);\n slice.skip(4); // Key namespace\n const keyName = textDecoder.decode(readBytes(slice, keySize - 8));\n this.currentMetadataKeys.set(i + 1, keyName);\n }\n }\n ;\n break;\n case 'ilst':\n {\n if (!this.currentMetadataKeys) {\n break;\n }\n const iterator = this.iterateContiguousBoxes(slice.slice(contentStartPos, boxInfo.contentSize));\n for (const { boxInfo, slice } of iterator) {\n let metadataKey = boxInfo.name;\n // Interpret the box name as a u32be\n const nameAsNumber = (metadataKey.charCodeAt(0) << 24)\n + (metadataKey.charCodeAt(1) << 16)\n + (metadataKey.charCodeAt(2) << 8)\n + metadataKey.charCodeAt(3);\n if (this.currentMetadataKeys.has(nameAsNumber)) {\n // An entry exists for this number\n metadataKey = this.currentMetadataKeys.get(nameAsNumber);\n }\n const data = readDataBox(slice);\n this.metadataTags.raw ??= {};\n this.metadataTags.raw[metadataKey] ??= data;\n switch (metadataKey) {\n case '©nam':\n case 'titl':\n case 'com.apple.quicktime.title':\n case 'title':\n {\n if (typeof data === 'string') {\n this.metadataTags.title ??= data;\n }\n }\n ;\n break;\n case '©des':\n case 'desc':\n case 'dscp':\n case 'com.apple.quicktime.description':\n case 'description':\n {\n if (typeof data === 'string') {\n this.metadataTags.description ??= data;\n }\n }\n ;\n break;\n case '©ART':\n case 'com.apple.quicktime.artist':\n case 'artist':\n {\n if (typeof data === 'string') {\n this.metadataTags.artist ??= data;\n }\n }\n ;\n break;\n case '©alb':\n case 'albm':\n case 'com.apple.quicktime.album':\n case 'album':\n {\n if (typeof data === 'string') {\n this.metadataTags.album ??= data;\n }\n }\n ;\n break;\n case 'aART':\n case 'album_artist':\n {\n if (typeof data === 'string') {\n this.metadataTags.albumArtist ??= data;\n }\n }\n ;\n break;\n case '©cmt':\n case 'com.apple.quicktime.comment':\n case 'comment':\n {\n if (typeof data === 'string') {\n this.metadataTags.comment ??= data;\n }\n }\n ;\n break;\n case '©gen':\n case 'gnre':\n case 'com.apple.quicktime.genre':\n case 'genre':\n {\n if (typeof data === 'string') {\n this.metadataTags.genre ??= data;\n }\n }\n ;\n break;\n case '©lyr':\n case 'lyrics':\n {\n if (typeof data === 'string') {\n this.metadataTags.lyrics ??= data;\n }\n }\n ;\n break;\n case '©day':\n case 'rldt':\n case 'com.apple.quicktime.creationdate':\n case 'date':\n {\n if (typeof data === 'string') {\n const date = new Date(data);\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n }\n ;\n break;\n case 'covr':\n case 'com.apple.quicktime.artwork':\n {\n if (data instanceof RichImageData) {\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data: data.data,\n kind: 'coverFront',\n mimeType: data.mimeType,\n });\n }\n else if (data instanceof Uint8Array) {\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data,\n kind: 'coverFront',\n mimeType: 'image/*',\n });\n }\n }\n ;\n break;\n case 'track':\n {\n if (typeof data === 'string') {\n const parts = data.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 this.metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n }\n ;\n break;\n case 'trkn':\n {\n if (data instanceof Uint8Array && data.length >= 6) {\n const view = toDataView(data);\n const trackNumber = view.getUint16(2, false);\n const tracksTotal = view.getUint16(4, false);\n if (trackNumber > 0) {\n this.metadataTags.trackNumber ??= trackNumber;\n }\n if (tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n }\n ;\n break;\n case 'disc':\n case 'disk':\n {\n if (data instanceof Uint8Array && data.length >= 6) {\n const view = toDataView(data);\n const discNumber = view.getUint16(2, false);\n const discNumberMax = view.getUint16(4, false);\n if (discNumber > 0) {\n this.metadataTags.discNumber ??= discNumber;\n }\n if (discNumberMax > 0) {\n this.metadataTags.discsTotal ??= discNumberMax;\n }\n }\n }\n ;\n break;\n }\n }\n }\n ;\n break;\n }\n slice.filePos = boxEndPos;\n return true;\n }\n}\nclass IsobmffTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToSampleIndex = new WeakMap();\n this.packetToFragmentLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getInternalCodecId() {\n return this.internalTrack.internalCodecId;\n }\n getName() {\n return this.internalTrack.name;\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n getTimeResolution() {\n return this.internalTrack.timescale;\n }\n getDisposition() {\n return this.internalTrack.disposition;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n async getFirstPacket(options) {\n const regularPacket = await this.fetchPacketForSampleIndex(0, options);\n if (regularPacket || !this.internalTrack.demuxer.isFragmented) {\n // If there's a non-fragmented packet, always prefer that\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n mapTimestampIntoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundIfAlmostInteger(timestamp * this.internalTrack.timescale) + this.internalTrack.editListOffset;\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { sampleIndex: -1, correctSampleFound: false };\n }\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.presentationTimestamp);\n const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1;\n const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { sampleIndex, correctSampleFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n return this.fetchPacketForSampleIndex(regularSampleIndex + 1, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performFragmentedLookup(locationInFragment.fragment, (fragment) => {\n if (fragment === locationInFragment.fragment) {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (locationInFragment.sampleIndex + 1 < trackData.samples.length) {\n // We can simply take the next sample in the fragment\n return {\n sampleIndex: locationInFragment.sampleIndex + 1,\n correctSampleFound: true,\n };\n }\n }\n else {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n sampleIndex: 0,\n correctSampleFound: true,\n };\n }\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.mapTimestampIntoTimescale(timestamp);\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleIndex = getKeyframeSampleIndexForTimestamp(sampleTable, timestampInTimescale);\n const regularPacket = await this.fetchPacketForSampleIndex(sampleIndex, options);\n if (!sampleTableIsEmpty(sampleTable) || !this.internalTrack.demuxer.isFragmented) {\n // Prefer the non-fragmented packet\n return regularPacket;\n }\n return this.performFragmentedLookup(null, (fragment) => {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { sampleIndex: -1, correctSampleFound: false };\n }\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const sample = trackData.samples[x.sampleIndex];\n return sample.isKeyFrame && x.presentationTimestamp <= timestampInTimescale;\n });\n const sampleIndex = index !== -1 ? trackData.presentationTimestamps[index].sampleIndex : -1;\n const correctSampleFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { sampleIndex, correctSampleFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const regularSampleIndex = this.packetToSampleIndex.get(packet);\n if (regularSampleIndex !== undefined) {\n // Prefer the non-fragmented packet\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const nextKeyFrameSampleIndex = getNextKeyframeIndexForSample(sampleTable, regularSampleIndex);\n return this.fetchPacketForSampleIndex(nextKeyFrameSampleIndex, options);\n }\n const locationInFragment = this.packetToFragmentLocation.get(packet);\n if (locationInFragment === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performFragmentedLookup(locationInFragment.fragment, (fragment) => {\n if (fragment === locationInFragment.fragment) {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const nextKeyFrameIndex = trackData.samples.findIndex((x, i) => x.isKeyFrame && i > locationInFragment.sampleIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the fragment\n return {\n sampleIndex: nextKeyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n else {\n const trackData = fragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const keyFrameIndex = trackData.samples.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n sampleIndex: keyFrameIndex,\n correctSampleFound: true,\n };\n }\n }\n return {\n sampleIndex: -1,\n correctSampleFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the lookup entries\n Infinity, options);\n }\n async fetchPacketForSampleIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const sampleTable = this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack);\n const sampleInfo = getSampleInfo(sampleTable, sampleIndex);\n if (!sampleInfo) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.internalTrack.demuxer.reader.requestSlice(sampleInfo.sampleOffset, sampleInfo.sampleSize);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, sampleInfo.sampleSize);\n }\n const timestamp = (sampleInfo.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = sampleInfo.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, sampleInfo.isKeyFrame ? 'key' : 'delta', timestamp, duration, sampleIndex, sampleInfo.sampleSize);\n this.packetToSampleIndex.set(packet, sampleIndex);\n return packet;\n }\n async fetchPacketInFragment(fragment, sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const trackData = fragment.trackData.get(this.internalTrack.id);\n const fragmentSample = trackData.samples[sampleIndex];\n assert(fragmentSample);\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.internalTrack.demuxer.reader.requestSlice(fragmentSample.byteOffset, fragmentSample.byteSize);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, fragmentSample.byteSize);\n }\n const timestamp = (fragmentSample.presentationTimestamp - this.internalTrack.editListOffset)\n / this.internalTrack.timescale;\n const duration = fragmentSample.duration / this.internalTrack.timescale;\n const packet = new EncodedPacket(data, fragmentSample.isKeyFrame ? 'key' : 'delta', timestamp, duration, fragment.moofOffset + sampleIndex, fragmentSample.byteSize);\n this.packetToFragmentLocation.set(packet, { fragment, sampleIndex });\n return packet;\n }\n /** Looks for a packet in the fragments while trying to load as few fragments as possible to retrieve it. */\n async performFragmentedLookup(\n // The fragment where we start looking\n startFragment, \n // This function returns the best-matching sample in a given fragment\n getMatchInFragment, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct sample will not come after it\n latestTimestamp, options) {\n const demuxer = this.internalTrack.demuxer;\n let currentFragment = null;\n let bestFragment = null;\n let bestSampleIndex = -1;\n if (startFragment) {\n const { sampleIndex, correctSampleFound } = getMatchInFragment(startFragment);\n if (correctSampleFound) {\n return this.fetchPacketInFragment(startFragment, sampleIndex, options);\n }\n if (sampleIndex !== -1) {\n bestFragment = startFragment;\n bestSampleIndex = sampleIndex;\n }\n }\n // Search for a lookup entry; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct fragment (or at least nearby).\n const lookupEntryIndex = binarySearchLessOrEqual(this.internalTrack.fragmentLookupTable, searchTimestamp, x => x.timestamp);\n const lookupEntry = lookupEntryIndex !== -1\n ? this.internalTrack.fragmentLookupTable[lookupEntryIndex]\n : null;\n const positionCacheIndex = binarySearchLessOrEqual(this.internalTrack.fragmentPositionCache, searchTimestamp, x => x.startTimestamp);\n const positionCacheEntry = positionCacheIndex !== -1\n ? this.internalTrack.fragmentPositionCache[positionCacheIndex]\n : null;\n const lookupEntryPosition = Math.max(lookupEntry?.moofOffset ?? 0, positionCacheEntry?.moofOffset ?? 0) || null;\n let currentPos;\n if (!startFragment) {\n currentPos = lookupEntryPosition ?? 0;\n }\n else {\n if (lookupEntryPosition === null || startFragment.moofOffset >= lookupEntryPosition) {\n currentPos = startFragment.moofOffset + startFragment.moofSize;\n currentFragment = startFragment;\n }\n else {\n // Use the lookup entry\n currentPos = lookupEntryPosition;\n }\n }\n while (true) {\n if (currentFragment) {\n const trackData = currentFragment.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n }\n // Load the header\n let slice = demuxer.reader.requestSliceRange(currentPos, MIN_BOX_HEADER_SIZE, MAX_BOX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const boxStartPos = currentPos;\n const boxInfo = readBoxHeader(slice);\n if (!boxInfo) {\n break;\n }\n if (boxInfo.name === 'moof') {\n currentFragment = await demuxer.readFragment(boxStartPos);\n const { sampleIndex, correctSampleFound } = getMatchInFragment(currentFragment);\n if (correctSampleFound) {\n return this.fetchPacketInFragment(currentFragment, sampleIndex, options);\n }\n if (sampleIndex !== -1) {\n bestFragment = currentFragment;\n bestSampleIndex = sampleIndex;\n }\n }\n currentPos = boxStartPos + boxInfo.totalSize;\n }\n // Catch faulty lookup table entries\n if (lookupEntry && (!bestFragment || bestFragment.moofOffset < lookupEntry.moofOffset)) {\n // The lookup table entry lied to us! We found a lookup entry but no fragment there that satisfied\n // the match. In this case, let's search again but using the lookup entry before that.\n const previousLookupEntry = this.internalTrack.fragmentLookupTable[lookupEntryIndex - 1];\n assert(!previousLookupEntry || previousLookupEntry.timestamp < lookupEntry.timestamp);\n const newSearchTimestamp = previousLookupEntry?.timestamp ?? -Infinity;\n return this.performFragmentedLookup(null, getMatchInFragment, newSearchTimestamp, latestTimestamp, options);\n }\n if (bestFragment) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n return this.fetchPacketInFragment(bestFragment, bestSampleIndex, options);\n }\n return null;\n }\n}\nclass IsobmffVideoTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async canBeTransparent() {\n return false;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n if (this.internalTrack.info.codec === 'vp9' && !this.internalTrack.info.vp9CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.vp9CodecInfo = firstPacket && extractVp9CodecInfoFromPacket(firstPacket.data);\n }\n else if (this.internalTrack.info.codec === 'av1' && !this.internalTrack.info.av1CodecInfo) {\n const firstPacket = await this.getFirstPacket({});\n this.internalTrack.info.av1CodecInfo = firstPacket && extractAv1CodecInfoFromPacket(firstPacket.data);\n }\n return {\n codec: extractVideoCodecString(this.internalTrack.info),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass IsobmffAudioTrackBacking extends IsobmffTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString(this.internalTrack.info),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\nconst getSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n return sampleTable.presentationTimestamps[index].sampleIndex;\n }\n else {\n const index = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, timescaleUnits, x => x.startDecodeTimestamp);\n if (index === -1) {\n return -1;\n }\n const entry = sampleTable.sampleTimingEntries[index];\n return entry.startIndex\n + Math.min(Math.floor((timescaleUnits - entry.startDecodeTimestamp) / entry.delta), entry.count - 1);\n }\n};\nconst getKeyframeSampleIndexForTimestamp = (sampleTable, timescaleUnits) => {\n if (!sampleTable.keySampleIndices) {\n // Every sample is a keyframe\n return getSampleIndexForTimestamp(sampleTable, timescaleUnits);\n }\n if (sampleTable.presentationTimestamps) {\n const index = binarySearchLessOrEqual(sampleTable.presentationTimestamps, timescaleUnits, x => x.presentationTimestamp);\n if (index === -1) {\n return -1;\n }\n // Walk the samples in presentation order until we find one that's a keyframe\n for (let i = index; i >= 0; i--) {\n const sampleIndex = sampleTable.presentationTimestamps[i].sampleIndex;\n const isKeyFrame = binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1;\n if (isKeyFrame) {\n return sampleIndex;\n }\n }\n return -1;\n }\n else {\n const sampleIndex = getSampleIndexForTimestamp(sampleTable, timescaleUnits);\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index] ?? -1;\n }\n};\nconst getSampleInfo = (sampleTable, sampleIndex) => {\n const timingEntryIndex = binarySearchLessOrEqual(sampleTable.sampleTimingEntries, sampleIndex, x => x.startIndex);\n const timingEntry = sampleTable.sampleTimingEntries[timingEntryIndex];\n if (!timingEntry || timingEntry.startIndex + timingEntry.count <= sampleIndex) {\n return null;\n }\n const decodeTimestamp = timingEntry.startDecodeTimestamp\n + (sampleIndex - timingEntry.startIndex) * timingEntry.delta;\n let presentationTimestamp = decodeTimestamp;\n const offsetEntryIndex = binarySearchLessOrEqual(sampleTable.sampleCompositionTimeOffsets, sampleIndex, x => x.startIndex);\n const offsetEntry = sampleTable.sampleCompositionTimeOffsets[offsetEntryIndex];\n if (offsetEntry && sampleIndex - offsetEntry.startIndex < offsetEntry.count) {\n presentationTimestamp += offsetEntry.offset;\n }\n const sampleSize = sampleTable.sampleSizes[Math.min(sampleIndex, sampleTable.sampleSizes.length - 1)];\n const chunkEntryIndex = binarySearchLessOrEqual(sampleTable.sampleToChunk, sampleIndex, x => x.startSampleIndex);\n const chunkEntry = sampleTable.sampleToChunk[chunkEntryIndex];\n assert(chunkEntry);\n const chunkIndex = chunkEntry.startChunkIndex\n + Math.floor((sampleIndex - chunkEntry.startSampleIndex) / chunkEntry.samplesPerChunk);\n const chunkOffset = sampleTable.chunkOffsets[chunkIndex];\n const startSampleIndexOfChunk = chunkEntry.startSampleIndex\n + (chunkIndex - chunkEntry.startChunkIndex) * chunkEntry.samplesPerChunk;\n let chunkSize = 0;\n let sampleOffset = chunkOffset;\n if (sampleTable.sampleSizes.length === 1) {\n sampleOffset += sampleSize * (sampleIndex - startSampleIndexOfChunk);\n chunkSize += sampleSize * chunkEntry.samplesPerChunk;\n }\n else {\n for (let i = startSampleIndexOfChunk; i < startSampleIndexOfChunk + chunkEntry.samplesPerChunk; i++) {\n const sampleSize = sampleTable.sampleSizes[i];\n if (i < sampleIndex) {\n sampleOffset += sampleSize;\n }\n chunkSize += sampleSize;\n }\n }\n let duration = timingEntry.delta;\n if (sampleTable.presentationTimestamps) {\n // In order to accurately compute the duration, we need to take the duration to the next sample in presentation\n // order, not in decode order\n const presentationIndex = sampleTable.presentationTimestampIndexMap[sampleIndex];\n assert(presentationIndex !== undefined);\n if (presentationIndex < sampleTable.presentationTimestamps.length - 1) {\n const nextEntry = sampleTable.presentationTimestamps[presentationIndex + 1];\n const nextPresentationTimestamp = nextEntry.presentationTimestamp;\n duration = nextPresentationTimestamp - presentationTimestamp;\n }\n }\n return {\n presentationTimestamp,\n duration,\n sampleOffset,\n sampleSize,\n chunkOffset,\n chunkSize,\n isKeyFrame: sampleTable.keySampleIndices\n ? binarySearchExact(sampleTable.keySampleIndices, sampleIndex, x => x) !== -1\n : true,\n };\n};\nconst getNextKeyframeIndexForSample = (sampleTable, sampleIndex) => {\n if (!sampleTable.keySampleIndices) {\n return sampleIndex + 1;\n }\n const index = binarySearchLessOrEqual(sampleTable.keySampleIndices, sampleIndex, x => x);\n return sampleTable.keySampleIndices[index + 1] ?? -1;\n};\nconst offsetFragmentTrackDataByTimestamp = (trackData, timestamp) => {\n trackData.startTimestamp += timestamp;\n trackData.endTimestamp += timestamp;\n for (const sample of trackData.samples) {\n sample.presentationTimestamp += timestamp;\n }\n for (const entry of trackData.presentationTimestamps) {\n entry.presentationTimestamp += timestamp;\n }\n};\n/** Extracts the rotation component from a transformation matrix, in degrees. */\nconst extractRotationFromMatrix = (matrix) => {\n const [m11, , , m21] = matrix;\n const scaleX = Math.hypot(m11, m21);\n const cosTheta = m11 / scaleX;\n const sinTheta = m21 / scaleX;\n // Invert the rotation because matrices are post-multiplied in ISOBMFF\n const result = -Math.atan2(sinTheta, cosTheta) * (180 / Math.PI);\n if (!Number.isFinite(result)) {\n // Can happen if the entire matrix is 0, for example\n return 0;\n }\n return result;\n};\nconst sampleTableIsEmpty = (sampleTable) => {\n return sampleTable.sampleSizes.length === 0;\n};\n","/*!\n * Copyright (c) 2025-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 { VP9_LEVEL_TABLE } from './codec.js';\nimport { assert, assertNever, base64ToBytes, Bitstream, bytesToBase64, keyValueIterator, getUint24, last, readExpGolomb, readSignedExpGolomb, textDecoder, textEncoder, toDataView, toUint8Array, getChromiumVersion, isChromium, } from './misc.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[\"IDR\"] = 5] = \"IDR\";\n AvcNalUnitType[AvcNalUnitType[\"SEI\"] = 6] = \"SEI\";\n AvcNalUnitType[AvcNalUnitType[\"SPS\"] = 7] = \"SPS\";\n AvcNalUnitType[AvcNalUnitType[\"PPS\"] = 8] = \"PPS\";\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[\"PREFIX_SEI_NUT\"] = 39] = \"PREFIX_SEI_NUT\";\n HevcNalUnitType[HevcNalUnitType[\"SUFFIX_SEI_NUT\"] = 40] = \"SUFFIX_SEI_NUT\";\n})(HevcNalUnitType || (HevcNalUnitType = {}));\n/** Finds all NAL units in an AVC packet in Annex B format. */\nexport const findNalUnitsInAnnexB = (packetData) => {\n const nalUnits = [];\n let i = 0;\n while (i < packetData.length) {\n let startCodePos = -1;\n let startCodeLength = 0;\n for (let j = i; j < packetData.length - 3; j++) {\n // Check for 3-byte start code (0x000001)\n if (packetData[j] === 0 && packetData[j + 1] === 0 && packetData[j + 2] === 1) {\n startCodePos = j;\n startCodeLength = 3;\n break;\n }\n // Check for 4-byte start code (0x00000001)\n if (j < packetData.length - 4\n && packetData[j] === 0\n && packetData[j + 1] === 0\n && packetData[j + 2] === 0\n && packetData[j + 3] === 1) {\n startCodePos = j;\n startCodeLength = 4;\n break;\n }\n }\n if (startCodePos === -1) {\n break; // No more start codes found\n }\n // If this isn't the first start code, extract the previous NAL unit\n if (i > 0 && startCodePos > i) {\n const nalData = packetData.subarray(i, startCodePos);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n i = startCodePos + startCodeLength;\n }\n // Extract the last NAL unit if there is one\n if (i < packetData.length) {\n const nalData = packetData.subarray(i);\n if (nalData.length > 0) {\n nalUnits.push(nalData);\n }\n }\n return nalUnits;\n};\n/** Finds all NAL units in an AVC packet in length-prefixed format. */\nconst findNalUnitsInLengthPrefixed = (packetData, lengthSize) => {\n const nalUnits = [];\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 if (lengthSize === 4) {\n nalUnitLength = dataView.getUint32(offset, false);\n }\n else {\n assertNever(lengthSize);\n assert(false);\n }\n offset += lengthSize;\n const nalUnit = packetData.subarray(offset, offset + nalUnitLength);\n nalUnits.push(nalUnit);\n offset += nalUnitLength;\n }\n return nalUnits;\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};\n/** Converts an AVC packet in Annex B format to length-prefixed format. */\nexport const transformAnnexBToLengthPrefixed = (packetData) => {\n const NAL_UNIT_LENGTH_SIZE = 4;\n const nalUnits = findNalUnitsInAnnexB(packetData);\n if (nalUnits.length === 0) {\n // If no NAL units were found, it's not valid Annex B data\n return null;\n }\n let totalSize = 0;\n for (const nalUnit of nalUnits) {\n totalSize += NAL_UNIT_LENGTH_SIZE + nalUnit.byteLength;\n }\n const avccData = new Uint8Array(totalSize);\n const dataView = new DataView(avccData.buffer);\n let offset = 0;\n // Write each NAL unit with its length prefix\n for (const nalUnit of nalUnits) {\n const length = nalUnit.byteLength;\n dataView.setUint32(offset, length, false);\n offset += 4;\n avccData.set(nalUnit, offset);\n offset += nalUnit.byteLength;\n }\n return avccData;\n};\nexport const extractAvcNalUnits = (packetData, 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 findNalUnitsInLengthPrefixed(packetData, lengthSize);\n }\n else {\n // Stream is in Annex B format\n return findNalUnitsInAnnexB(packetData);\n }\n};\nconst extractNalUnitTypeForAvc = (data) => {\n return data[0] & 0x1F;\n};\n/** Builds an AvcDecoderConfigurationRecord from an AVC packet in Annex B format. */\nexport const extractAvcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.PPS);\n const spsExtUnits = nalUnits.filter(unit => extractNalUnitTypeForAvc(unit) === AvcNalUnitType.SPS_EXT);\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 console.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 console.error('Error deserializing AVC Decoder Configuration Record:', error);\n return null;\n }\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 let chromaFormatIdc = null;\n let bitDepthLumaMinus8 = null;\n let bitDepthChromaMinus8 = null;\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 bitstream.skipBits(1); // separate_colour_plane_flag\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 readExpGolomb(bitstream); // pic_width_in_mbs_minus1\n readExpGolomb(bitstream); // pic_height_in_map_units_minus1\n const frameMbsOnlyFlag = bitstream.readBits(1);\n return {\n profileIdc,\n constraintFlags,\n levelIdc,\n frameMbsOnlyFlag,\n chromaFormatIdc,\n bitDepthLumaMinus8,\n bitDepthChromaMinus8,\n };\n }\n catch (error) {\n console.error('Error parsing AVC SPS:', error);\n return null;\n }\n};\nexport const extractHevcNalUnits = (packetData, 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 findNalUnitsInLengthPrefixed(packetData, lengthSize);\n }\n else {\n // Stream is in Annex B format\n return findNalUnitsInAnnexB(packetData);\n }\n};\nexport const extractNalUnitTypeForHevc = (data) => {\n return (data[0] >> 1) & 0x3F;\n};\n/** Builds a HevcDecoderConfigurationRecord from an HEVC packet in Annex B format. */\nexport const extractHevcDecoderConfigurationRecord = (packetData) => {\n try {\n const nalUnits = findNalUnitsInAnnexB(packetData);\n const vpsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.VPS_NUT);\n const spsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SPS_NUT);\n const ppsUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PPS_NUT);\n const seiUnits = nalUnits.filter(unit => extractNalUnitTypeForHevc(unit) === HevcNalUnitType.PREFIX_SEI_NUT\n || extractNalUnitTypeForHevc(unit) === HevcNalUnitType.SUFFIX_SEI_NUT);\n if (spsUnits.length === 0 || ppsUnits.length === 0)\n return null;\n const sps = spsUnits[0];\n const bitstream = new Bitstream(removeEmulationPreventionBytes(sps));\n bitstream.skipBits(16); // NAL header\n bitstream.readBits(4); // sps_video_parameter_set_id\n const sps_max_sub_layers_minus1 = bitstream.readBits(3);\n const sps_temporal_id_nesting_flag = 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, sps_max_sub_layers_minus1);\n readExpGolomb(bitstream); // sps_seq_parameter_set_id\n const chroma_format_idc = readExpGolomb(bitstream);\n if (chroma_format_idc === 3)\n bitstream.skipBits(1); // separate_colour_plane_flag\n readExpGolomb(bitstream); // pic_width_in_luma_samples\n readExpGolomb(bitstream); // pic_height_in_luma_samples\n if (bitstream.readBits(1)) { // conformance_window_flag\n readExpGolomb(bitstream); // conf_win_left_offset\n readExpGolomb(bitstream); // conf_win_right_offset\n readExpGolomb(bitstream); // conf_win_top_offset\n readExpGolomb(bitstream); // conf_win_bottom_offset\n }\n const bit_depth_luma_minus8 = readExpGolomb(bitstream);\n const bit_depth_chroma_minus8 = readExpGolomb(bitstream);\n readExpGolomb(bitstream); // log2_max_pic_order_cnt_lsb_minus4\n const sps_sub_layer_ordering_info_present_flag = bitstream.readBits(1);\n const maxNum = sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1;\n for (let i = maxNum; i <= sps_max_sub_layers_minus1; i++) {\n readExpGolomb(bitstream); // sps_max_dec_pic_buffering_minus1[i]\n 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 num_short_term_ref_pic_sets = readExpGolomb(bitstream);\n skipAllStRefPicSets(bitstream, num_short_term_ref_pic_sets);\n if (bitstream.readBits(1)) { // long_term_ref_pics_present_flag\n const num_long_term_ref_pics_sps = readExpGolomb(bitstream);\n for (let i = 0; i < num_long_term_ref_pics_sps; 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 min_spatial_segmentation_idc = 0;\n if (bitstream.readBits(1)) { // vui_parameters_present_flag\n min_spatial_segmentation_idc = parseVuiForMinSpatialSegmentationIdc(bitstream, sps_max_sub_layers_minus1);\n }\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]),\n nalUnits: seiUnits,\n },\n ]\n : []),\n ];\n const record = {\n configurationVersion: 1,\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 minSpatialSegmentationIdc: min_spatial_segmentation_idc,\n parallelismType,\n chromaFormatIdc: chroma_format_idc,\n bitDepthLumaMinus8: bit_depth_luma_minus8,\n bitDepthChromaMinus8: bit_depth_chroma_minus8,\n avgFrameRate: 0,\n constantFrameRate: 0,\n numTemporalLayers: sps_max_sub_layers_minus1 + 1,\n temporalIdNested: sps_temporal_id_nesting_flag,\n lengthSizeMinusOne: 3,\n arrays,\n };\n return record;\n }\n catch (error) {\n console.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 parseVuiForMinSpatialSegmentationIdc = (bitstream, sps_max_sub_layers_minus1) => {\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 bitstream.readBits(16); // sar_width\n bitstream.readBits(16); // sar_height\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 bitstream.readBits(1); // video_full_range_flag\n if (bitstream.readBits(1)) {\n bitstream.readBits(8); // colour_primaries\n bitstream.readBits(8); // transfer_characteristics\n bitstream.readBits(8); // matrix_coeffs\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 skipHrdParameters(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 const min_spatial_segmentation_idc = readExpGolomb(bitstream);\n // skip the rest\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 return min_spatial_segmentation_idc;\n }\n return 0;\n};\nconst skipHrdParameters = (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};\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 const nalUnits = extractAvcNalUnits(packetData, decoderConfig);\n let isKeyframe = nalUnits.some(x => extractNalUnitTypeForAvc(x) === AvcNalUnitType.IDR);\n if (!isKeyframe && (!isChromium() || getChromiumVersion() >= 144)) {\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 for (const nalUnit of nalUnits) {\n const type = extractNalUnitTypeForAvc(nalUnit);\n if (type !== AvcNalUnitType.SEI) {\n continue;\n }\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 isKeyframe = true;\n break;\n }\n }\n pos += payloadSize;\n } while (pos < bytes.length - 1);\n }\n }\n return isKeyframe ? 'key' : 'delta';\n }\n ;\n case 'hevc':\n {\n const nalUnits = extractHevcNalUnits(packetData, decoderConfig);\n const isKeyframe = nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return HevcNalUnitType.BLA_W_LP <= type && type <= HevcNalUnitType.RSV_IRAP_VCL23;\n });\n return isKeyframe ? 'key' : '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 * Copyright (c) 2025-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 Demuxer {\n constructor(input) {\n this.input = input;\n }\n}\n","/*!\n * Copyright (c) 2025-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 { determineVideoPacketType } from './codec-data.js';\nimport { customAudioDecoders, customVideoDecoders } from './custom-coder.js';\nimport { EncodedPacketSink } from './media-sink.js';\nimport { assert } from './misc.js';\nimport { EncodedPacket } from './packet.js';\n/**\n * Represents a media track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputTrack {\n /** @internal */\n constructor(input, backing) {\n this.input = input;\n this._backing = backing;\n }\n /** Returns true if and only if this track is a video track. */\n isVideoTrack() {\n return this instanceof InputVideoTrack;\n }\n /** Returns true if and only if this track is an audio track. */\n isAudioTrack() {\n return this instanceof InputAudioTrack;\n }\n /** The unique ID of this track in the input file. */\n get id() {\n return this._backing.getId();\n }\n /**\n * The identifier of the codec used internally by the container. It is not homogenized by Mediabunny\n * and depends entirely on the container format.\n *\n * This field can be used to determine the codec of a track in case Mediabunny doesn't know that codec.\n *\n * - For ISOBMFF files, this field returns the name of the Sample Description Box (e.g. `'avc1'`).\n * - For Matroska files, this field returns the value of the `CodecID` element.\n * - For WAVE files, this field returns the value of the format tag in the `'fmt '` chunk.\n * - For ADTS files, this field contains the `MPEG-4 Audio Object Type`.\n * - In all other cases, this field is `null`.\n */\n get internalCodecId() {\n return this._backing.getInternalCodecId();\n }\n /**\n * The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined).\n */\n get languageCode() {\n return this._backing.getLanguageCode();\n }\n /** A user-defined name for this track. */\n get name() {\n return this._backing.getName();\n }\n /**\n * A positive number x such that all timestamps and durations of all packets of this track are\n * integer multiples of 1/x.\n */\n get timeResolution() {\n return this._backing.getTimeResolution();\n }\n /** The track's disposition, i.e. information about its intended usage. */\n get disposition() {\n return this._backing.getDisposition();\n }\n /**\n * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value\n * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples\n * with a negative timestamp should not be presented.\n */\n getFirstTimestamp() {\n return this._backing.getFirstTimestamp();\n }\n /** Returns the end timestamp of the last packet of this track, in seconds. */\n computeDuration() {\n return this._backing.computeDuration();\n }\n /**\n * Computes aggregate packet statistics for this track, such as average packet rate or bitrate.\n *\n * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have\n * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all\n * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the\n * entire file.\n */\n async computePacketStats(targetPacketCount = Infinity) {\n const sink = new EncodedPacketSink(this);\n let startTimestamp = Infinity;\n let endTimestamp = -Infinity;\n let packetCount = 0;\n let totalPacketBytes = 0;\n for await (const packet of sink.packets(undefined, undefined, { metadataOnly: true })) {\n if (packetCount >= targetPacketCount\n // This additional condition is needed to produce correct results with out-of-presentation-order packets\n && packet.timestamp >= endTimestamp) {\n break;\n }\n startTimestamp = Math.min(startTimestamp, packet.timestamp);\n endTimestamp = Math.max(endTimestamp, packet.timestamp + packet.duration);\n packetCount++;\n totalPacketBytes += packet.byteLength;\n }\n return {\n packetCount,\n averagePacketRate: packetCount\n ? Number((packetCount / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n averageBitrate: packetCount\n ? Number((8 * totalPacketBytes / (endTimestamp - startTimestamp)).toPrecision(16))\n : 0,\n };\n }\n}\n/**\n * Represents a video track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputVideoTrack extends InputTrack {\n /** @internal */\n constructor(input, backing) {\n super(input, backing);\n this._backing = backing;\n }\n get type() {\n return 'video';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The width in pixels of the track's coded samples, before any transformations or rotations. */\n get codedWidth() {\n return this._backing.getCodedWidth();\n }\n /** The height in pixels of the track's coded samples, before any transformations or rotations. */\n get codedHeight() {\n return this._backing.getCodedHeight();\n }\n /** The angle in degrees by which the track's frames should be rotated (clockwise). */\n get rotation() {\n return this._backing.getRotation();\n }\n /** The width in pixels of the track's frames after rotation. */\n get displayWidth() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedWidth() : this._backing.getCodedHeight();\n }\n /** The height in pixels of the track's frames after rotation. */\n get displayHeight() {\n const rotation = this._backing.getRotation();\n return rotation % 180 === 0 ? this._backing.getCodedHeight() : this._backing.getCodedWidth();\n }\n /** Returns the color space of the track's samples. */\n getColorSpace() {\n return this._backing.getColorSpace();\n }\n /** If this method returns true, the track's samples use a high dynamic range (HDR). */\n async hasHighDynamicRange() {\n const colorSpace = await this._backing.getColorSpace();\n return colorSpace.primaries === 'bt2020' || colorSpace.primaries === 'smpte432'\n || colorSpace.transfer === 'pg' || colorSpace.transfer === 'hlg'\n || colorSpace.matrix === 'bt2020-ncl';\n }\n /** Checks if this track may contain transparent samples with alpha data. */\n canBeTransparent() {\n return this._backing.canBeTransparent();\n }\n /**\n * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the\n * track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns\n * null if the track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customVideoDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (typeof VideoDecoder === 'undefined') {\n return false;\n }\n const support = await VideoDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (packet.isMetadataOnly) {\n throw new TypeError('packet must not be metadata-only to determine its type.');\n }\n if (this.codec === null) {\n return null;\n }\n const decoderConfig = await this.getDecoderConfig();\n assert(decoderConfig);\n return determineVideoPacketType(this.codec, decoderConfig, packet.data);\n }\n}\n/**\n * Represents an audio track in an input file.\n * @group Input files & tracks\n * @public\n */\nexport class InputAudioTrack extends InputTrack {\n /** @internal */\n constructor(input, backing) {\n super(input, backing);\n this._backing = backing;\n }\n get type() {\n return 'audio';\n }\n get codec() {\n return this._backing.getCodec();\n }\n /** The number of audio channels in the track. */\n get numberOfChannels() {\n return this._backing.getNumberOfChannels();\n }\n /** The track's audio sample rate in hertz. */\n get sampleRate() {\n return this._backing.getSampleRate();\n }\n /**\n * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the\n * track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns\n * null if the track's codec is unknown.\n */\n getDecoderConfig() {\n return this._backing.getDecoderConfig();\n }\n async getCodecParameterString() {\n const decoderConfig = await this._backing.getDecoderConfig();\n return decoderConfig?.codec ?? null;\n }\n async canDecode() {\n try {\n const decoderConfig = await this._backing.getDecoderConfig();\n if (!decoderConfig) {\n return false;\n }\n const codec = this._backing.getCodec();\n assert(codec !== null);\n if (customAudioDecoders.some(x => x.supports(codec, decoderConfig))) {\n return true;\n }\n if (decoderConfig.codec.startsWith('pcm-')) {\n return true; // Since we decode it ourselves\n }\n else {\n if (typeof AudioDecoder === 'undefined') {\n return false;\n }\n const support = await AudioDecoder.isConfigSupported(decoderConfig);\n return support.supported === true;\n }\n }\n catch (error) {\n console.error('Error during decodability check:', error);\n return false;\n }\n }\n async determinePacketType(packet) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n if (this.codec === null) {\n return null;\n }\n return 'key'; // No audio codec with delta packets\n }\n}\n","/*!\n * Copyright (c) 2025-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/**\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 console.warn('Video decoder already registered.');\n return;\n }\n customVideoDecoders.push(casted);\n }\n else if (decoder.prototype instanceof CustomAudioDecoder) {\n const casted = decoder;\n if (customAudioDecoders.includes(casted)) {\n console.warn('Audio decoder already registered.');\n return;\n }\n customAudioDecoders.push(casted);\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 console.warn('Video encoder already registered.');\n return;\n }\n customVideoEncoders.push(casted);\n }\n else if (encoder.prototype instanceof CustomAudioEncoder) {\n const casted = encoder;\n if (customAudioEncoders.includes(casted)) {\n console.warn('Audio encoder already registered.');\n return;\n }\n customAudioEncoders.push(casted);\n }\n else {\n throw new TypeError('Encoder must be a CustomVideoEncoder or CustomAudioEncoder.');\n }\n};\n","/*!\n * Copyright (c) 2025-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 { parsePcmCodec, PCM_AUDIO_CODECS } from './codec.js';\nimport { deserializeAvcDecoderConfigurationRecord, determineVideoPacketType, extractHevcNalUnits, extractNalUnitTypeForHevc, HevcNalUnitType, parseAvcSps, } from './codec-data.js';\nimport { customVideoDecoders, customAudioDecoders } from './custom-coder.js';\nimport { InputDisposedError } from './input.js';\nimport { InputAudioTrack, InputTrack, InputVideoTrack } from './input-track.js';\nimport { assert, assertNever, CallSerializer, getInt24, getUint24, insertSorted, isChromium, isFirefox, isNumber, isWebKit, last, mapAsyncGenerator, promiseWithResolvers, toAsyncIterator, toDataView, toUint8Array, validateAnyIterable, } from './misc.js';\nimport { EncodedPacket } from './packet.js';\nimport { fromAlaw, fromUlaw } from './pcm.js';\nimport { AudioSample, clampCropRectangle, validateCropRectangle, VideoSample } from './sample.js';\nconst validatePacketRetrievalOptions = (options) => {\n if (!options || typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.metadataOnly !== undefined && typeof options.metadataOnly !== 'boolean') {\n throw new TypeError('options.metadataOnly, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets !== undefined && typeof options.verifyKeyPackets !== 'boolean') {\n throw new TypeError('options.verifyKeyPackets, when defined, must be a boolean.');\n }\n if (options.verifyKeyPackets && options.metadataOnly) {\n throw new TypeError('options.verifyKeyPackets and options.metadataOnly cannot be enabled together.');\n }\n};\nconst validateTimestamp = (timestamp) => {\n if (!isNumber(timestamp)) {\n throw new TypeError('timestamp must be a number.'); // It can be non-finite, that's fine\n }\n};\nconst maybeFixPacketType = (track, promise, options) => {\n if (options.verifyKeyPackets) {\n return promise.then(async (packet) => {\n if (!packet || packet.type === 'delta') {\n return packet;\n }\n const determinedType = await track.determinePacketType(packet);\n if (determinedType) {\n // @ts-expect-error Technically readonly\n packet.type = determinedType;\n }\n return packet;\n });\n }\n else {\n return promise;\n }\n};\n/**\n * Sink for retrieving encoded packets from an input track.\n * @group Media sinks\n * @public\n */\nexport class EncodedPacketSink {\n /** Creates a new {@link EncodedPacketSink} for the given {@link InputTrack}. */\n constructor(track) {\n if (!(track instanceof InputTrack)) {\n throw new TypeError('track must be an InputTrack.');\n }\n this._track = track;\n }\n /**\n * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very\n * likely to be a key packet.\n */\n getFirstPacket(options = {}) {\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getFirstPacket(options), options);\n }\n /**\n * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet\n * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be\n * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp\n * is before the first packet in the track.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n getPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getPacket(timestamp, options), options);\n }\n /**\n * Retrieves the packet following the given packet (in decode order), or null if the given packet is the\n * last packet.\n */\n getNextPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n return maybeFixPacketType(this._track, this._track._backing.getNextPacket(packet, options), options);\n }\n /**\n * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last\n * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet\n * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's\n * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first\n * key packet in the track.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getKeyPacket(timestamp, options = {}) {\n validateTimestamp(timestamp);\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n if (!options.verifyKeyPackets) {\n return this._track._backing.getKeyPacket(timestamp, options);\n }\n const packet = await this._track._backing.getKeyPacket(timestamp, options);\n if (!packet) {\n return packet;\n }\n assert(packet.type === 'key');\n const determinedType = await this._track.determinePacketType(packet);\n if (determinedType === 'delta') {\n // Try returning the previous key packet (in hopes that it's actually a key packet)\n return this.getKeyPacket(packet.timestamp - 1 / this._track.timeResolution, options);\n }\n return packet;\n }\n /**\n * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last\n * key packet.\n *\n * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`.\n */\n async getNextKeyPacket(packet, options = {}) {\n if (!(packet instanceof EncodedPacket)) {\n throw new TypeError('packet must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n if (!options.verifyKeyPackets) {\n return this._track._backing.getNextKeyPacket(packet, options);\n }\n const nextPacket = await this._track._backing.getNextKeyPacket(packet, options);\n if (!nextPacket) {\n return nextPacket;\n }\n assert(nextPacket.type === 'key');\n const determinedType = await this._track.determinePacketType(nextPacket);\n if (determinedType === 'delta') {\n // Try returning the next key packet (in hopes that it's actually a key packet)\n return this.getNextKeyPacket(nextPacket, options);\n }\n return nextPacket;\n }\n /**\n * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this\n * method will intelligently preload packets based on the speed of the consumer.\n *\n * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded.\n * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded.\n */\n packets(startPacket, endPacket, options = {}) {\n if (startPacket !== undefined && !(startPacket instanceof EncodedPacket)) {\n throw new TypeError('startPacket must be an EncodedPacket.');\n }\n if (startPacket !== undefined && startPacket.isMetadataOnly && !options?.metadataOnly) {\n throw new TypeError('startPacket can only be metadata-only if options.metadataOnly is enabled.');\n }\n if (endPacket !== undefined && !(endPacket instanceof EncodedPacket)) {\n throw new TypeError('endPacket must be an EncodedPacket.');\n }\n validatePacketRetrievalOptions(options);\n if (this._track.input._disposed) {\n throw new InputDisposedError();\n }\n const packetQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const timestamps = [];\n // The queue should always be big enough to hold 1 second worth of packets\n const maxQueueSize = () => Math.max(2, timestamps.length);\n // The following is the \"pump\" process that keeps pumping packets into the queue\n (async () => {\n let packet = startPacket ?? await this.getFirstPacket(options);\n while (packet && !terminated && !this._track.input._disposed) {\n if (endPacket && packet.sequenceNumber >= endPacket?.sequenceNumber) {\n break;\n }\n if (packetQueue.length > maxQueueSize()) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n packetQueue.push(packet);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n packet = await this.getNextPacket(packet, options);\n }\n ended = true;\n onQueueNotEmpty();\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n throw outOfBandError;\n }\n else if (packetQueue.length > 0) {\n const value = packetQueue.shift();\n const now = performance.now();\n timestamps.push(now);\n while (timestamps.length > 0 && now - timestamps[0] >= 1000) {\n timestamps.shift();\n }\n onQueueDequeue();\n return { value, done: false };\n }\n else if (ended) {\n return { value: undefined, done: true };\n }\n else {\n await queueNotEmpty;\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nclass DecoderWrapper {\n constructor(onSample, onError) {\n this.onSample = onSample;\n this.onError = onError;\n }\n}\n/**\n * Base class for decoded media sample sinks.\n * @group Media sinks\n * @public\n */\nexport class BaseMediaSampleSink {\n /** @internal */\n mediaSamplesInRange(startTimestamp = 0, endTimestamp = Infinity) {\n validateTimestamp(startTimestamp);\n validateTimestamp(endTimestamp);\n const sampleQueue = [];\n let firstSampleQueued = false;\n let lastSample = null;\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let ended = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (sample.timestamp >= endTimestamp) {\n ended = true;\n }\n if (ended) {\n sample.close();\n return;\n }\n if (lastSample) {\n if (sample.timestamp > startTimestamp) {\n // We don't know ahead of time what the first first is. This is because the first first is the\n // last first whose timestamp is less than or equal to the start timestamp. Therefore we need to\n // wait for the first first after the start timestamp, and then we'll know that the previous\n // first was the first first.\n sampleQueue.push(lastSample);\n firstSampleQueued = true;\n }\n else {\n lastSample.close();\n }\n }\n if (sample.timestamp >= startTimestamp) {\n sampleQueue.push(sample);\n firstSampleQueued = true;\n }\n lastSample = firstSampleQueued ? null : sample;\n if (sampleQueue.length > 0) {\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n const keyPacket = await packetSink.getKeyPacket(startTimestamp, { verifyKeyPackets: true })\n ?? await packetSink.getFirstPacket();\n let currentPacket = keyPacket;\n let endPacket = undefined;\n if (endTimestamp < Infinity) {\n // When an end timestamp is set, we cannot simply use that for the packet iterator due to out-of-order\n // frames (B-frames). Instead, we'll need to keep decoding packets until we get a frame that exceeds\n // this end time. However, we can still put a bound on it: Since key frames are by definition never\n // out of order, we can stop at the first key frame after the end timestamp.\n const packet = await packetSink.getPacket(endTimestamp);\n const keyPacket = !packet\n ? null\n : packet.type === 'key' && packet.timestamp === endTimestamp\n ? packet\n : await packetSink.getNextKeyPacket(packet, { verifyKeyPackets: true });\n if (keyPacket) {\n endPacket = keyPacket;\n }\n }\n const packets = packetSink.packets(keyPacket ?? undefined, endPacket);\n await packets.next(); // Skip the start packet as we already have it\n while (currentPacket && !ended && !this._track.input._disposed) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n if (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n continue;\n }\n decoder.decode(currentPacket);\n const packetResult = await packets.next();\n if (packetResult.done) {\n break;\n }\n currentPacket = packetResult.value;\n }\n await packets.return();\n if (!terminated && !this._track.input._disposed) {\n await decoder.flush();\n }\n decoder.close();\n if (!firstSampleQueued && lastSample) {\n sampleQueue.push(lastSample);\n }\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n const closeSamples = () => {\n lastSample?.close();\n for (const sample of sampleQueue) {\n sample.close();\n }\n };\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n closeSamples();\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n closeSamples();\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n ended = true;\n onQueueDequeue();\n onQueueNotEmpty();\n closeSamples();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n /** @internal */\n mediaSamplesAtTimestamps(timestamps) {\n validateAnyIterable(timestamps);\n const timestampIterator = toAsyncIterator(timestamps);\n const timestampsOfInterest = [];\n const sampleQueue = [];\n let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers();\n let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers();\n let decoderIsFlushed = false;\n let terminated = false;\n // This stores errors that are \"out of band\" in the sense that they didn't occur in the normal flow of this\n // method but instead in a different context. This error should not go unnoticed and must be bubbled up to\n // the consumer.\n let outOfBandError = null;\n const pushToQueue = (sample) => {\n sampleQueue.push(sample);\n onQueueNotEmpty();\n ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers());\n };\n // The following is the \"pump\" process that keeps pumping packets into the decoder\n (async () => {\n const decoderError = new Error();\n const decoder = await this._createDecoder((sample) => {\n onQueueDequeue();\n if (terminated) {\n sample.close();\n return;\n }\n let sampleUses = 0;\n while (timestampsOfInterest.length > 0\n && sample.timestamp - timestampsOfInterest[0] > -1e-10 // Give it a little epsilon\n ) {\n sampleUses++;\n timestampsOfInterest.shift();\n }\n if (sampleUses > 0) {\n for (let i = 0; i < sampleUses; i++) {\n // Clone the sample if we need to emit it multiple times\n pushToQueue((i < sampleUses - 1 ? sample.clone() : sample));\n }\n }\n else {\n sample.close();\n }\n }, (error) => {\n if (!outOfBandError) {\n error.stack = decoderError.stack; // Provide a more useful stack trace\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const packetSink = this._createPacketSink();\n let lastPacket = null;\n let lastKeyPacket = null;\n // The end sequence number (inclusive) in the next batch of packets that will be decoded. The batch starts\n // at the last key frame and goes until this sequence number.\n let maxSequenceNumber = -1;\n const decodePackets = async () => {\n assert(lastKeyPacket);\n // Start at the current key packet\n let currentPacket = lastKeyPacket;\n decoder.decode(currentPacket);\n while (currentPacket.sequenceNumber < maxSequenceNumber) {\n const maxQueueSize = computeMaxQueueSize(sampleQueue.length);\n while (sampleQueue.length + decoder.getDecodeQueueSize() > maxQueueSize && !terminated) {\n ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers());\n await queueDequeue;\n }\n if (terminated) {\n break;\n }\n const nextPacket = await packetSink.getNextPacket(currentPacket);\n assert(nextPacket);\n decoder.decode(nextPacket);\n currentPacket = nextPacket;\n }\n maxSequenceNumber = -1;\n };\n const flushDecoder = async () => {\n await decoder.flush();\n // We don't expect this list to have any elements in it anymore, but in case it does, let's emit\n // nulls for every remaining element, then clear it.\n for (let i = 0; i < timestampsOfInterest.length; i++) {\n pushToQueue(null);\n }\n timestampsOfInterest.length = 0;\n };\n for await (const timestamp of timestampIterator) {\n validateTimestamp(timestamp);\n if (terminated || this._track.input._disposed) {\n break;\n }\n const targetPacket = await packetSink.getPacket(timestamp);\n const keyPacket = targetPacket && await packetSink.getKeyPacket(timestamp, { verifyKeyPackets: true });\n if (!keyPacket) {\n if (maxSequenceNumber !== -1) {\n await decodePackets();\n await flushDecoder();\n }\n pushToQueue(null);\n lastPacket = null;\n continue;\n }\n // Check if the key packet has changed or if we're going back in time\n if (lastPacket\n && (keyPacket.sequenceNumber !== lastKeyPacket.sequenceNumber\n || targetPacket.timestamp < lastPacket.timestamp)) {\n await decodePackets();\n await flushDecoder(); // Always flush here, improves decoder compatibility\n }\n timestampsOfInterest.push(targetPacket.timestamp);\n maxSequenceNumber = Math.max(targetPacket.sequenceNumber, maxSequenceNumber);\n lastPacket = targetPacket;\n lastKeyPacket = keyPacket;\n }\n if (!terminated && !this._track.input._disposed) {\n if (maxSequenceNumber !== -1) {\n // We still need to decode packets\n await decodePackets();\n }\n await flushDecoder();\n }\n decoder.close();\n decoderIsFlushed = true;\n onQueueNotEmpty(); // To unstuck the generator\n })().catch((error) => {\n if (!outOfBandError) {\n outOfBandError = error;\n onQueueNotEmpty();\n }\n });\n const track = this._track;\n const closeSamples = () => {\n for (const sample of sampleQueue) {\n sample?.close();\n }\n };\n return {\n async next() {\n while (true) {\n if (track.input._disposed) {\n closeSamples();\n throw new InputDisposedError();\n }\n else if (terminated) {\n return { value: undefined, done: true };\n }\n else if (outOfBandError) {\n closeSamples();\n throw outOfBandError;\n }\n else if (sampleQueue.length > 0) {\n const value = sampleQueue.shift();\n assert(value !== undefined);\n onQueueDequeue();\n return { value, done: false };\n }\n else if (!decoderIsFlushed) {\n await queueNotEmpty;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n },\n async return() {\n terminated = true;\n onQueueDequeue();\n onQueueNotEmpty();\n closeSamples();\n return { value: undefined, done: true };\n },\n async throw(error) {\n throw error;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n }\n}\nconst computeMaxQueueSize = (decodedSampleQueueSize) => {\n // If we have decoded samples lying around, limit the total queue size to a small value (decoded samples can use up\n // a lot of memory). If not, we're fine with a much bigger queue of encoded packets waiting to be decoded. In fact,\n // some decoders only start flushing out decoded chunks when the packet queue is large enough.\n return decodedSampleQueueSize === 0 ? 40 : 8;\n};\nclass VideoDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig, rotation, timeResolution) {\n super(onSample, onError);\n this.codec = codec;\n this.decoderConfig = decoderConfig;\n this.rotation = rotation;\n this.timeResolution = timeResolution;\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n this.inputTimestamps = []; // Timestamps input into the decoder, sorted.\n this.sampleQueue = []; // Safari-specific thing, check usage.\n this.currentPacketIndex = 0;\n this.raslSkipped = false; // For HEVC stuff\n // Alpha stuff\n this.alphaDecoder = null;\n this.alphaHadKeyframe = false;\n this.colorQueue = [];\n this.alphaQueue = [];\n this.merger = null;\n this.mergerCreationFailed = false;\n this.decodedAlphaChunkCount = 0;\n this.alphaDecoderQueueSize = 0;\n /** Each value is the number of decoded alpha chunks at which a null alpha frame should be added. */\n this.nullAlphaFrameQueue = [];\n this.currentAlphaPacketIndex = 0;\n this.alphaRaslSkipped = false; // For HEVC stuff\n const MatchingCustomDecoder = customVideoDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof VideoSample)) {\n throw new TypeError('The argument passed to onSample must be a VideoSample.');\n }\n this.finalizeAndEmitSample(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n const colorHandler = (frame) => {\n if (this.alphaQueue.length > 0) {\n // Even when no alpha data is present (most of the time), there will be nulls in this queue\n const alphaFrame = this.alphaQueue.shift();\n assert(alphaFrame !== undefined);\n this.mergeAlpha(frame, alphaFrame);\n }\n else {\n this.colorQueue.push(frame);\n }\n };\n if (codec === 'avc' && this.decoderConfig.description && isChromium()) {\n // Chromium has/had a bug with playing interlaced AVC (https://issues.chromium.org/issues/456919096)\n // which can be worked around by requesting that software decoding be used. So, here we peek into the\n // AVC description, if present, and switch to software decoding if we find interlaced content.\n const record = deserializeAvcDecoderConfigurationRecord(toUint8Array(this.decoderConfig.description));\n if (record && record.sequenceParameterSets.length > 0) {\n const sps = parseAvcSps(record.sequenceParameterSets[0]);\n if (sps && sps.frameMbsOnlyFlag === 0) {\n this.decoderConfig = {\n ...this.decoderConfig,\n hardwareAcceleration: 'prefer-software',\n };\n }\n }\n }\n this.decoder = new VideoDecoder({\n output: (frame) => {\n try {\n colorHandler(frame);\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: onError,\n });\n this.decoder.configure(this.decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return Math.max(this.decoder.decodeQueueSize, this.alphaDecoder?.decodeQueueSize ?? 0);\n }\n }\n decode(packet) {\n if (this.codec === 'hevc' && this.currentPacketIndex > 0 && !this.raslSkipped) {\n if (this.hasHevcRaslPicture(packet.data)) {\n return; // Drop\n }\n this.raslSkipped = true;\n }\n this.currentPacketIndex++;\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n if (!isWebKit()) {\n insertSorted(this.inputTimestamps, packet.timestamp, x => x);\n }\n this.decoder.decode(packet.toEncodedVideoChunk());\n this.decodeAlphaData(packet);\n }\n }\n decodeAlphaData(packet) {\n if (!packet.sideData.alpha || this.mergerCreationFailed) {\n // No alpha side data in the packet, most common case\n this.pushNullAlphaFrame();\n return;\n }\n if (!this.merger) {\n try {\n this.merger = new ColorAlphaMerger();\n }\n catch (error) {\n console.error('Due to an error, only color data will be decoded.', error);\n this.mergerCreationFailed = true;\n this.decodeAlphaData(packet); // Go again\n return;\n }\n }\n // Check if we need to set up the alpha decoder\n if (!this.alphaDecoder) {\n const alphaHandler = (frame) => {\n this.alphaDecoderQueueSize--;\n if (this.colorQueue.length > 0) {\n const colorFrame = this.colorQueue.shift();\n assert(colorFrame !== undefined);\n this.mergeAlpha(colorFrame, frame);\n }\n else {\n this.alphaQueue.push(frame);\n }\n // Check if any null frames have been queued for this point\n this.decodedAlphaChunkCount++;\n while (this.nullAlphaFrameQueue.length > 0\n && this.nullAlphaFrameQueue[0] === this.decodedAlphaChunkCount) {\n this.nullAlphaFrameQueue.shift();\n if (this.colorQueue.length > 0) {\n const colorFrame = this.colorQueue.shift();\n assert(colorFrame !== undefined);\n this.mergeAlpha(colorFrame, null);\n }\n else {\n this.alphaQueue.push(null);\n }\n }\n };\n this.alphaDecoder = new VideoDecoder({\n output: (frame) => {\n try {\n alphaHandler(frame);\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: this.onError,\n });\n this.alphaDecoder.configure(this.decoderConfig);\n }\n const type = determineVideoPacketType(this.codec, this.decoderConfig, packet.sideData.alpha);\n // Alpha packets might follow a different key frame rhythm than the main packets. Therefore, before we start\n // decoding, we must first find a packet that's actually a key frame. Until then, we treat the image as opaque.\n if (!this.alphaHadKeyframe) {\n this.alphaHadKeyframe = type === 'key';\n }\n if (this.alphaHadKeyframe) {\n // Same RASL skipping logic as for color, unlikely to be hit (since who uses HEVC with separate alpha??) but\n // here for symmetry.\n if (this.codec === 'hevc' && this.currentAlphaPacketIndex > 0 && !this.alphaRaslSkipped) {\n if (this.hasHevcRaslPicture(packet.sideData.alpha)) {\n this.pushNullAlphaFrame();\n return;\n }\n this.alphaRaslSkipped = true;\n }\n this.currentAlphaPacketIndex++;\n this.alphaDecoder.decode(packet.alphaToEncodedVideoChunk(type ?? packet.type));\n this.alphaDecoderQueueSize++;\n }\n else {\n this.pushNullAlphaFrame();\n }\n }\n pushNullAlphaFrame() {\n if (this.alphaDecoderQueueSize === 0) {\n // Easy\n this.alphaQueue.push(null);\n }\n else {\n // There are still alpha chunks being decoded, so pushing `null` immediately would result in out-of-order\n // data and be incorrect. Instead, we need to enqueue a \"null frame\" for when the current decoder workload\n // has finished.\n this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount + this.alphaDecoderQueueSize);\n }\n }\n /**\n * If we're using HEVC, we need to make sure to skip any RASL slices that follow a non-IDR key frame such as\n * CRA_NUT. This is because RASL slices cannot be decoded without data before the CRA_NUT. Browsers behave\n * differently here: Chromium drops the packets, Safari throws a decoder error. Either way, it's not good\n * and causes bugs upstream. So, let's take the dropping into our own hands.\n */\n hasHevcRaslPicture(packetData) {\n const nalUnits = extractHevcNalUnits(packetData, this.decoderConfig);\n return nalUnits.some((x) => {\n const type = extractNalUnitTypeForHevc(x);\n return type === HevcNalUnitType.RASL_N || type === HevcNalUnitType.RASL_R;\n });\n }\n /** Handler for the WebCodecs VideoDecoder for ironing out browser differences. */\n sampleHandler(sample) {\n if (isWebKit()) {\n // For correct B-frame handling, we don't just hand over the frames directly but instead add them to\n // a queue, because we want to ensure frames are emitted in presentation order. We flush the queue\n // each time we receive a frame with a timestamp larger than the highest we've seen so far, as we\n // can sure that is not a B-frame. Typically, WebCodecs automatically guarantees that frames are\n // emitted in presentation order, but Safari doesn't always follow this rule.\n if (this.sampleQueue.length > 0 && (sample.timestamp >= last(this.sampleQueue).timestamp)) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n insertSorted(this.sampleQueue, sample, x => x.timestamp);\n }\n else {\n // Assign it the next earliest timestamp from the input. We do this because browsers, by spec, are\n // required to emit decoded frames in presentation order *while* retaining the timestamp of their\n // originating EncodedVideoChunk. For files with B-frames but no out-of-order timestamps (like a\n // missing ctts box, for example), this causes a mismatch. We therefore fix the timestamps and\n // ensure they are sorted by doing this.\n const timestamp = this.inputTimestamps.shift();\n // There's no way we'd have more decoded frames than encoded packets we passed in. Actually, the\n // correspondence should be 1:1.\n assert(timestamp !== undefined);\n sample.setTimestamp(timestamp);\n this.finalizeAndEmitSample(sample);\n }\n }\n finalizeAndEmitSample(sample) {\n // Round the timestamps to the time resolution\n sample.setTimestamp(Math.round(sample.timestamp * this.timeResolution) / this.timeResolution);\n sample.setDuration(Math.round(sample.duration * this.timeResolution) / this.timeResolution);\n sample.setRotation(this.rotation);\n this.onSample(sample);\n }\n mergeAlpha(color, alpha) {\n if (!alpha) {\n // Nothing needs to be merged\n const finalSample = new VideoSample(color);\n this.sampleHandler(finalSample);\n return;\n }\n assert(this.merger);\n this.merger.update(color, alpha);\n color.close();\n alpha.close();\n const finalFrame = new VideoFrame(this.merger.canvas, {\n timestamp: color.timestamp,\n duration: color.duration ?? undefined,\n });\n const finalSample = new VideoSample(finalFrame);\n this.sampleHandler(finalSample);\n }\n async flush() {\n if (this.customDecoder) {\n await this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n await Promise.all([\n this.decoder.flush(),\n this.alphaDecoder?.flush(),\n ]);\n this.colorQueue.forEach(x => x.close());\n this.colorQueue.length = 0;\n this.alphaQueue.forEach(x => x?.close());\n this.alphaQueue.length = 0;\n this.alphaHadKeyframe = false;\n this.decodedAlphaChunkCount = 0;\n this.alphaDecoderQueueSize = 0;\n this.nullAlphaFrameQueue.length = 0;\n this.currentAlphaPacketIndex = 0;\n this.alphaRaslSkipped = false;\n }\n if (isWebKit()) {\n for (const sample of this.sampleQueue) {\n this.finalizeAndEmitSample(sample);\n }\n this.sampleQueue.length = 0;\n }\n this.currentPacketIndex = 0;\n this.raslSkipped = false;\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n this.alphaDecoder?.close();\n this.colorQueue.forEach(x => x.close());\n this.colorQueue.length = 0;\n this.alphaQueue.forEach(x => x?.close());\n this.alphaQueue.length = 0;\n this.merger?.close();\n }\n for (const sample of this.sampleQueue) {\n sample.close();\n }\n this.sampleQueue.length = 0;\n }\n}\n/** Utility class that merges together color and alpha information using simple WebGL 2 shaders. */\nclass ColorAlphaMerger {\n constructor() {\n // Canvas will be resized later\n if (typeof OffscreenCanvas !== 'undefined') {\n // Prefer OffscreenCanvas for Worker environments\n this.canvas = new OffscreenCanvas(300, 150);\n }\n else {\n this.canvas = document.createElement('canvas');\n }\n const gl = this.canvas.getContext('webgl2', {\n premultipliedAlpha: false,\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.program = this.createProgram();\n this.vao = this.createVAO();\n this.colorTexture = this.createTexture();\n this.alphaTexture = this.createTexture();\n this.gl.useProgram(this.program);\n this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_colorTexture'), 0);\n this.gl.uniform1i(this.gl.getUniformLocation(this.program, 'u_alphaTexture'), 1);\n }\n createProgram() {\n const vertexShader = 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 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_colorTexture;\n\t\t\tuniform sampler2D u_alphaTexture;\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\tvec3 color = texture(u_colorTexture, v_texCoord).rgb;\n\t\t\t\tfloat alpha = texture(u_alphaTexture, v_texCoord).r;\n\t\t\t\tfragColor = vec4(color, alpha);\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 const shader = this.gl.createShader(type);\n this.gl.shaderSource(shader, source);\n this.gl.compileShader(shader);\n return shader;\n }\n createVAO() {\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.program, 'a_position');\n const texCoordLocation = this.gl.getAttribLocation(this.program, '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 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 update(color, alpha) {\n if (color.displayWidth !== this.canvas.width || color.displayHeight !== this.canvas.height) {\n this.canvas.width = color.displayWidth;\n this.canvas.height = color.displayHeight;\n }\n this.gl.activeTexture(this.gl.TEXTURE0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.colorTexture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, color);\n this.gl.activeTexture(this.gl.TEXTURE1);\n this.gl.bindTexture(this.gl.TEXTURE_2D, this.alphaTexture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, alpha);\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 }\n close() {\n this.gl.getExtension('WEBGL_lose_context')?.loseContext();\n this.gl = null;\n }\n}\n/**\n * A sink that retrieves decoded video samples (video frames) from a video track.\n * @group Media sinks\n * @public\n */\nexport class VideoSampleSink extends BaseMediaSampleSink {\n /** Creates a new {@link VideoSampleSink} for the given {@link InputVideoTrack}. */\n constructor(videoTrack) {\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n super();\n this._track = videoTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._track.canDecode())) {\n throw new Error('This video track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._track.codec;\n const rotation = this._track.rotation;\n const decoderConfig = await this._track.getDecoderConfig();\n const timeResolution = this._track.timeResolution;\n assert(codec && decoderConfig);\n return new VideoDecoderWrapper(onSample, onError, codec, decoderConfig, rotation, timeResolution);\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._track);\n }\n /**\n * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns\n * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method\n * will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than\n * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation\n * metadata.\n *\n * This sink will yield `HTMLCanvasElement`s when in a DOM context, and `OffscreenCanvas`es otherwise.\n *\n * @group Media sinks\n * @public\n */\nexport class CanvasSink {\n /** Creates a new {@link CanvasSink} for the given {@link InputVideoTrack}. */\n constructor(videoTrack, options = {}) {\n /** @internal */\n this._nextCanvasIndex = 0;\n if (!(videoTrack instanceof InputVideoTrack)) {\n throw new TypeError('videoTrack must be an InputVideoTrack.');\n }\n if (options && typeof options !== 'object') {\n throw new TypeError('options must be an object.');\n }\n if (options.alpha !== undefined && typeof options.alpha !== 'boolean') {\n throw new TypeError('options.alpha, when provided, must be a boolean.');\n }\n if (options.width !== undefined && (!Number.isInteger(options.width) || options.width <= 0)) {\n throw new TypeError('options.width, when defined, 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 defined, 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.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 if (options.poolSize !== undefined\n && (typeof options.poolSize !== 'number' || !Number.isInteger(options.poolSize) || options.poolSize < 0)) {\n throw new TypeError('poolSize must be a non-negative integer.');\n }\n const rotation = options.rotation ?? videoTrack.rotation;\n const [rotatedWidth, rotatedHeight] = rotation % 180 === 0\n ? [videoTrack.codedWidth, videoTrack.codedHeight]\n : [videoTrack.codedHeight, videoTrack.codedWidth];\n const crop = options.crop;\n if (crop) {\n clampCropRectangle(crop, rotatedWidth, rotatedHeight);\n }\n let [width, height] = crop\n ? [crop.width, crop.height]\n : [rotatedWidth, rotatedHeight];\n const originalAspectRatio = width / height;\n // If width and height aren't defined together, deduce the missing value using the aspect ratio\n if (options.width !== undefined && options.height === undefined) {\n width = options.width;\n height = Math.round(width / originalAspectRatio);\n }\n else if (options.width === undefined && options.height !== undefined) {\n height = options.height;\n width = Math.round(height * originalAspectRatio);\n }\n else if (options.width !== undefined && options.height !== undefined) {\n width = options.width;\n height = options.height;\n }\n this._videoTrack = videoTrack;\n this._alpha = options.alpha ?? false;\n this._width = width;\n this._height = height;\n this._rotation = rotation;\n this._crop = crop;\n this._fit = options.fit ?? 'fill';\n this._videoSampleSink = new VideoSampleSink(videoTrack);\n this._canvasPool = Array.from({ length: options.poolSize ?? 0 }, () => null);\n }\n /** @internal */\n _videoSampleToWrappedCanvas(sample) {\n let canvas = this._canvasPool[this._nextCanvasIndex];\n let canvasIsNew = false;\n if (!canvas) {\n if (typeof document !== 'undefined') {\n // Prefer an HTMLCanvasElement\n canvas = document.createElement('canvas');\n canvas.width = this._width;\n canvas.height = this._height;\n }\n else {\n canvas = new OffscreenCanvas(this._width, this._height);\n }\n if (this._canvasPool.length > 0) {\n this._canvasPool[this._nextCanvasIndex] = canvas;\n }\n canvasIsNew = true;\n }\n if (this._canvasPool.length > 0) {\n this._nextCanvasIndex = (this._nextCanvasIndex + 1) % this._canvasPool.length;\n }\n const context = canvas.getContext('2d', {\n alpha: this._alpha || isFirefox(), // Firefox has VideoFrame glitches with opaque canvases\n });\n assert(context);\n context.resetTransform();\n if (!canvasIsNew) {\n if (!this._alpha && isFirefox()) {\n context.fillStyle = 'black';\n context.fillRect(0, 0, this._width, this._height);\n }\n else {\n context.clearRect(0, 0, this._width, this._height);\n }\n }\n sample.drawWithFit(context, {\n fit: this._fit,\n rotation: this._rotation,\n crop: this._crop,\n });\n const result = {\n canvas,\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically,\n * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given\n * timestamp. Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getCanvas(timestamp) {\n validateTimestamp(timestamp);\n const sample = await this._videoSampleSink.getSample(timestamp);\n return sample && this._videoSampleToWrappedCanvas(sample);\n }\n /**\n * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This\n * method will intelligently pre-decode a few frames ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive).\n */\n canvases(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._videoSampleSink.samples(startTimestamp, endTimestamp), sample => this._videoSampleToWrappedCanvas(sample));\n }\n /**\n * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized\n * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is\n * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if\n * no frame is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n canvasesAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._videoSampleSink.samplesAtTimestamps(timestamps), sample => sample && this._videoSampleToWrappedCanvas(sample));\n }\n}\nclass AudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, codec, decoderConfig) {\n super(onSample, onError);\n this.decoder = null;\n this.customDecoder = null;\n this.customDecoderCallSerializer = new CallSerializer();\n this.customDecoderQueueSize = 0;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) packet timestamps.\n this.currentTimestamp = null;\n const sampleHandler = (sample) => {\n if (this.currentTimestamp === null\n || Math.abs(sample.timestamp - this.currentTimestamp) >= sample.duration) {\n // We need to sync with the sample timestamp again\n this.currentTimestamp = sample.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += sample.duration;\n if (sample.numberOfFrames === 0) {\n // We skip zero-data (empty) AudioSamples. These are sometimes emitted, for example, by Firefox when it\n // decodes Vorbis (at the start).\n sample.close();\n return;\n }\n // Round the timestamp to the sample rate\n const sampleRate = decoderConfig.sampleRate;\n sample.setTimestamp(Math.round(preciseTimestamp * sampleRate) / sampleRate);\n onSample(sample);\n };\n const MatchingCustomDecoder = customAudioDecoders.find(x => x.supports(codec, decoderConfig));\n if (MatchingCustomDecoder) {\n // @ts-expect-error \"Can't create instance of abstract class 🤓\"\n this.customDecoder = new MatchingCustomDecoder();\n // @ts-expect-error It's technically readonly\n this.customDecoder.codec = codec;\n // @ts-expect-error It's technically readonly\n this.customDecoder.config = decoderConfig;\n // @ts-expect-error It's technically readonly\n this.customDecoder.onSample = (sample) => {\n if (!(sample instanceof AudioSample)) {\n throw new TypeError('The argument passed to onSample must be an AudioSample.');\n }\n sampleHandler(sample);\n };\n void this.customDecoderCallSerializer.call(() => this.customDecoder.init());\n }\n else {\n this.decoder = new AudioDecoder({\n output: (data) => {\n try {\n sampleHandler(new AudioSample(data));\n }\n catch (error) {\n this.onError(error);\n }\n },\n error: onError,\n });\n this.decoder.configure(decoderConfig);\n }\n }\n getDecodeQueueSize() {\n if (this.customDecoder) {\n return this.customDecoderQueueSize;\n }\n else {\n assert(this.decoder);\n return this.decoder.decodeQueueSize;\n }\n }\n decode(packet) {\n if (this.customDecoder) {\n this.customDecoderQueueSize++;\n void this.customDecoderCallSerializer\n .call(() => this.customDecoder.decode(packet))\n .then(() => this.customDecoderQueueSize--);\n }\n else {\n assert(this.decoder);\n this.decoder.decode(packet.toEncodedAudioChunk());\n }\n }\n flush() {\n if (this.customDecoder) {\n return this.customDecoderCallSerializer.call(() => this.customDecoder.flush());\n }\n else {\n assert(this.decoder);\n return this.decoder.flush();\n }\n }\n close() {\n if (this.customDecoder) {\n void this.customDecoderCallSerializer.call(() => this.customDecoder.close());\n }\n else {\n assert(this.decoder);\n this.decoder.close();\n }\n }\n}\n// There are a lot of PCM variants not natively supported by the browser and by AudioData. Therefore we need a simple\n// decoder that maps any input PCM format into a PCM format supported by the browser.\nclass PcmAudioDecoderWrapper extends DecoderWrapper {\n constructor(onSample, onError, decoderConfig) {\n super(onSample, onError);\n this.decoderConfig = decoderConfig;\n // Internal state to accumulate a precise current timestamp based on audio durations, not the (potentially\n // inaccurate) packet timestamps.\n this.currentTimestamp = null;\n assert(PCM_AUDIO_CODECS.includes(decoderConfig.codec));\n this.codec = decoderConfig.codec;\n const { dataType, sampleSize, littleEndian } = parsePcmCodec(this.codec);\n this.inputSampleSize = sampleSize;\n switch (sampleSize) {\n case 1:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint8(byteOffset) - 2 ** 7;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt8(byteOffset);\n }\n else if (dataType === 'ulaw') {\n this.readInputValue = (view, byteOffset) => fromUlaw(view.getUint8(byteOffset));\n }\n else if (dataType === 'alaw') {\n this.readInputValue = (view, byteOffset) => fromAlaw(view.getUint8(byteOffset));\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 2:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint16(byteOffset, littleEndian) - 2 ** 15;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt16(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 3:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => getUint24(view, byteOffset, littleEndian) - 2 ** 23;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => getInt24(view, byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 4:\n {\n if (dataType === 'unsigned') {\n this.readInputValue = (view, byteOffset) => view.getUint32(byteOffset, littleEndian) - 2 ** 31;\n }\n else if (dataType === 'signed') {\n this.readInputValue = (view, byteOffset) => view.getInt32(byteOffset, littleEndian);\n }\n else if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat32(byteOffset, littleEndian);\n }\n else {\n assert(false);\n }\n }\n ;\n break;\n case 8:\n {\n if (dataType === 'float') {\n this.readInputValue = (view, byteOffset) => view.getFloat64(byteOffset, 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 switch (sampleSize) {\n case 1:\n {\n if (dataType === 'ulaw' || dataType === 'alaw') {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n else {\n this.outputSampleSize = 1;\n this.outputFormat = 'u8';\n this.writeOutputValue = (view, byteOffset, value) => view.setUint8(byteOffset, value + 2 ** 7);\n }\n }\n ;\n break;\n case 2:\n {\n this.outputSampleSize = 2;\n this.outputFormat = 's16';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt16(byteOffset, value, true);\n }\n ;\n break;\n case 3:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 's32';\n // From https://www.w3.org/TR/webcodecs:\n // AudioData containing 24-bit samples SHOULD store those samples in s32 or f32. When samples are\n // stored in s32, each sample MUST be left-shifted by 8 bits.\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value << 8, true);\n }\n ;\n break;\n case 4:\n {\n this.outputSampleSize = 4;\n if (dataType === 'float') {\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n else {\n this.outputFormat = 's32';\n this.writeOutputValue = (view, byteOffset, value) => view.setInt32(byteOffset, value, true);\n }\n }\n ;\n break;\n case 8:\n {\n this.outputSampleSize = 4;\n this.outputFormat = 'f32';\n this.writeOutputValue = (view, byteOffset, value) => view.setFloat32(byteOffset, value, true);\n }\n ;\n break;\n default:\n {\n assertNever(sampleSize);\n assert(false);\n }\n ;\n }\n ;\n }\n getDecodeQueueSize() {\n return 0;\n }\n decode(packet) {\n const inputView = toDataView(packet.data);\n const numberOfFrames = packet.byteLength / this.decoderConfig.numberOfChannels / this.inputSampleSize;\n const outputBufferSize = numberOfFrames * this.decoderConfig.numberOfChannels * this.outputSampleSize;\n const outputBuffer = new ArrayBuffer(outputBufferSize);\n const outputView = new DataView(outputBuffer);\n for (let i = 0; i < numberOfFrames * this.decoderConfig.numberOfChannels; i++) {\n const inputIndex = i * this.inputSampleSize;\n const outputIndex = i * this.outputSampleSize;\n const value = this.readInputValue(inputView, inputIndex);\n this.writeOutputValue(outputView, outputIndex, value);\n }\n const preciseDuration = numberOfFrames / this.decoderConfig.sampleRate;\n if (this.currentTimestamp === null || Math.abs(packet.timestamp - this.currentTimestamp) >= preciseDuration) {\n // We need to sync with the packet timestamp again\n this.currentTimestamp = packet.timestamp;\n }\n const preciseTimestamp = this.currentTimestamp;\n this.currentTimestamp += preciseDuration;\n const audioSample = new AudioSample({\n format: this.outputFormat,\n data: outputBuffer,\n numberOfChannels: this.decoderConfig.numberOfChannels,\n sampleRate: this.decoderConfig.sampleRate,\n numberOfFrames,\n timestamp: preciseTimestamp,\n });\n this.onSample(audioSample);\n }\n async flush() {\n // Do nothing\n }\n close() {\n // Do nothing\n }\n}\n/**\n * Sink for retrieving decoded audio samples from an audio track.\n * @group Media sinks\n * @public\n */\nexport class AudioSampleSink extends BaseMediaSampleSink {\n /** Creates a new {@link AudioSampleSink} for the given {@link InputAudioTrack}. */\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n super();\n this._track = audioTrack;\n }\n /** @internal */\n async _createDecoder(onSample, onError) {\n if (!(await this._track.canDecode())) {\n throw new Error('This audio track cannot be decoded by this browser. Make sure to check decodability before using'\n + ' a track.');\n }\n const codec = this._track.codec;\n const decoderConfig = await this._track.getDecoderConfig();\n assert(codec && decoderConfig);\n if (PCM_AUDIO_CODECS.includes(decoderConfig.codec)) {\n return new PcmAudioDecoderWrapper(onSample, onError, decoderConfig);\n }\n else {\n return new AudioDecoderWrapper(onSample, onError, codec, decoderConfig);\n }\n }\n /** @internal */\n _createPacketSink() {\n return new EncodedPacketSink(this._track);\n }\n /**\n * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getSample(timestamp) {\n validateTimestamp(timestamp);\n for await (const sample of this.mediaSamplesAtTimestamps([timestamp])) {\n return sample;\n }\n throw new Error('Internal error: Iterator returned nothing.');\n }\n /**\n * Creates an async iterator that yields the audio samples of this track in presentation order. This method\n * will intelligently pre-decode a few samples ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive).\n */\n samples(startTimestamp = 0, endTimestamp = Infinity) {\n return this.mediaSamplesInRange(startTimestamp, endTimestamp);\n }\n /**\n * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may\n * yield null if no sample is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n samplesAtTimestamps(timestamps) {\n return this.mediaSamplesAtTimestamps(timestamps);\n }\n}\n/**\n * A sink that retrieves decoded audio samples from an audio track and converts them to `AudioBuffer` instances. This is\n * often more useful than directly retrieving audio samples, as audio buffers can be directly used with the\n * Web Audio API.\n * @group Media sinks\n * @public\n */\nexport class AudioBufferSink {\n /** Creates a new {@link AudioBufferSink} for the given {@link InputAudioTrack}. */\n constructor(audioTrack) {\n if (!(audioTrack instanceof InputAudioTrack)) {\n throw new TypeError('audioTrack must be an InputAudioTrack.');\n }\n this._audioSampleSink = new AudioSampleSink(audioTrack);\n }\n /** @internal */\n _audioSampleToWrappedArrayBuffer(sample) {\n const result = {\n buffer: sample.toAudioBuffer(),\n timestamp: sample.timestamp,\n duration: sample.duration,\n };\n sample.close();\n return result;\n }\n /**\n * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns\n * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp.\n * Returns null if the timestamp is before the track's first timestamp.\n *\n * @param timestamp - The timestamp used for retrieval, in seconds.\n */\n async getBuffer(timestamp) {\n validateTimestamp(timestamp);\n const data = await this._audioSampleSink.getSample(timestamp);\n return data && this._audioSampleToWrappedArrayBuffer(data);\n }\n /**\n * Creates an async iterator that yields audio buffers of this track in presentation order. This method\n * will intelligently pre-decode a few buffers ahead to enable fast iteration.\n *\n * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive).\n * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive).\n */\n buffers(startTimestamp = 0, endTimestamp = Infinity) {\n return mapAsyncGenerator(this._audioSampleSink.samples(startTimestamp, endTimestamp), data => this._audioSampleToWrappedArrayBuffer(data));\n }\n /**\n * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method\n * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most\n * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may\n * yield null if no buffer is available for a given timestamp.\n *\n * @param timestamps - An iterable or async iterable of timestamps in seconds.\n */\n buffersAtTimestamps(timestamps) {\n return mapAsyncGenerator(this._audioSampleSink.samplesAtTimestamps(timestamps), data => data && this._audioSampleToWrappedArrayBuffer(data));\n }\n}\n","/*!\n * Copyright (c) 2025-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 /** The encoded data of this packet. */\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 updating timing information. */\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?.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 return new EncodedPacket(this.data, this.type, options?.timestamp ?? this.timestamp, options?.duration ?? this.duration, this.sequenceNumber, this.byteLength);\n }\n}\n","/*!\n * Copyright (c) 2025-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// https://github.com/dystopiancode/pcm-g711/blob/master/pcm-g711/g711.c\nexport const toUlaw = (s16) => {\n const MULAW_MAX = 0x1FFF;\n const MULAW_BIAS = 33;\n let number = s16;\n let mask = 0x1000;\n let sign = 0;\n let position = 12;\n let lsb = 0;\n if (number < 0) {\n number = -number;\n sign = 0x80;\n }\n number += MULAW_BIAS;\n if (number > MULAW_MAX) {\n number = MULAW_MAX;\n }\n while ((number & mask) !== mask && position >= 5) {\n mask >>= 1;\n position--;\n }\n lsb = (number >> (position - 4)) & 0x0f;\n return ~(sign | ((position - 5) << 4) | lsb) & 0xFF;\n};\nexport const fromUlaw = (u8) => {\n const MULAW_BIAS = 33;\n let sign = 0;\n let position = 0;\n let number = ~u8;\n if (number & 0x80) {\n number &= ~(1 << 7);\n sign = -1;\n }\n position = ((number & 0xF0) >> 4) + 5;\n const decoded = ((1 << position) | ((number & 0x0F) << (position - 4))\n | (1 << (position - 5))) - MULAW_BIAS;\n return (sign === 0) ? decoded : -decoded;\n};\nexport const toAlaw = (s16) => {\n const ALAW_MAX = 0xFFF;\n let mask = 0x800;\n let sign = 0;\n let position = 11;\n let lsb = 0;\n let number = s16;\n if (number < 0) {\n number = -number;\n sign = 0x80;\n }\n if (number > ALAW_MAX) {\n number = ALAW_MAX;\n }\n while ((number & mask) !== mask && position >= 5) {\n mask >>= 1;\n position--;\n }\n lsb = (number >> ((position === 4) ? 1 : (position - 4))) & 0x0f;\n return (sign | ((position - 4) << 4) | lsb) ^ 0x55;\n};\nexport const fromAlaw = (u8) => {\n let sign = 0x00;\n let position = 0;\n let number = u8 ^ 0x55;\n if (number & 0x80) {\n number &= ~(1 << 7);\n sign = -1;\n }\n position = ((number & 0xF0) >> 4) + 4;\n let decoded = 0;\n if (position !== 4) {\n decoded = ((1 << position) | ((number & 0x0F) << (position - 4))\n | (1 << (position - 5)));\n }\n else {\n decoded = (number << 1) | 1;\n }\n return (sign === 0) ? decoded : -decoded;\n};\n","/*!\n * Copyright (c) 2025-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, clamp, isAllowSharedBufferSource, SECOND_TO_MICROSECOND_FACTOR, toDataView, toUint8Array, isFirefox, polyfillSymbolDispose, } from './misc.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 = Date.now();\n if (value.type === 'video') {\n if (now - lastVideoGcErrorLog >= 1000) {\n // This error is annoying but oh so important\n console.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 console.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 * 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 after rotation. */\n get displayWidth() {\n return this.rotation % 180 === 0 ? this.codedWidth : this.codedHeight;\n }\n /** The height of the frame in pixels after rotation. */\n get displayHeight() {\n return this.rotation % 180 === 0 ? this.codedHeight : this.codedWidth;\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 (!('format' in init) || typeof init.format !== 'string') {\n throw new TypeError('init.format must be a string.');\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 this._data = toUint8Array(data).slice(); // Copy it\n this.format = init.format;\n this.codedWidth = init.codedWidth;\n this.codedHeight = init.codedHeight;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace(init.colorSpace);\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 this._data = data;\n this.format = data.format;\n // Copying the display dimensions here, assuming no innate VideoFrame rotation\n this.codedWidth = data.displayWidth;\n this.codedHeight = data.displayHeight;\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 this.timestamp = init?.timestamp ?? data.timestamp / 1e6;\n this.duration = init?.duration ?? (data.duration ?? 0) / 1e6;\n this.colorSpace = 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 assert(context);\n // Draw it to a canvas\n context.drawImage(data, 0, 0);\n this._data = canvas;\n this.format = 'RGBX';\n this.codedWidth = width;\n this.codedHeight = height;\n this.rotation = init.rotation ?? 0;\n this.timestamp = init.timestamp;\n this.duration = init.duration ?? 0;\n this.colorSpace = new VideoColorSpace({\n matrix: 'rgb',\n primaries: 'bt709',\n transfer: 'iec61966-2-1',\n fullRange: true,\n });\n }\n else {\n throw new TypeError('Invalid data type: Must be a BufferSource or CanvasImageSource.');\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 (isVideoFrame(this._data)) {\n return new VideoSample(this._data.clone(), {\n timestamp: this.timestamp,\n duration: this.duration,\n rotation: this.rotation,\n });\n }\n else if (this._data instanceof Uint8Array) {\n return new VideoSample(this._data.slice(), {\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 });\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 });\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 (isVideoFrame(this._data)) {\n this._data.close();\n }\n else {\n this._data = null; // GC that shit\n }\n this._closed = true;\n }\n /** Returns the number of bytes required to hold this video sample's pixel data. */\n allocationSize() {\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n return this._data.allocationSize();\n }\n else if (this._data instanceof Uint8Array) {\n return this._data.byteLength;\n }\n else {\n return this.codedWidth * this.codedHeight * 4; // RGBX\n }\n }\n /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */\n async copyTo(destination) {\n if (!isAllowSharedBufferSource(destination)) {\n throw new TypeError('destination must be an ArrayBuffer or an ArrayBuffer view.');\n }\n if (this._closed) {\n throw new Error('VideoSample is closed.');\n }\n assert(this._data !== null);\n if (isVideoFrame(this._data)) {\n await this._data.copyTo(destination);\n }\n else if (this._data instanceof Uint8Array) {\n const dest = toUint8Array(destination);\n dest.set(this._data);\n }\n else {\n const canvas = this._data;\n const context = canvas.getContext('2d');\n assert(context);\n const imageData = context.getImageData(0, 0, this.codedWidth, this.codedHeight);\n const dest = toUint8Array(destination);\n dest.set(imageData.data);\n }\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 (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 });\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.codedWidth, this.codedHeight]\n : [this.codedHeight, this.codedWidth];\n if (options.crop) {\n clampCropRectangle(options.crop, 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.codedHeight - sx - sWidth,\n sHeight,\n sWidth,\n ];\n }\n else if (rotation === 180) {\n [sx, sy] = [\n this.codedWidth - sx - sWidth,\n this.codedHeight - sy - sHeight,\n ];\n }\n else if (rotation === 270) {\n [sx, sy, sWidth, sHeight] = [\n this.codedWidth - 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 will\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 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 /** 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 /** Calls `.close()`. */\n [Symbol.dispose]() {\n this.close();\n }\n}\nconst isVideoFrame = (x) => {\n return typeof VideoFrame !== 'undefined' && x instanceof VideoFrame;\n};\nexport const clampCropRectangle = (crop, outerWidth, outerHeight) => {\n crop.left = Math.min(crop.left, outerWidth);\n crop.top = Math.min(crop.top, outerHeight);\n crop.width = Math.min(crop.width, outerWidth - crop.left);\n crop.height = Math.min(crop.height, outerHeight - crop.top);\n assert(crop.width >= 0);\n assert(crop.height >= 0);\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 AUDIO_SAMPLE_FORMATS = new Set(['f32', 'f32-planar', 's16', 's16-planar', 's32', 's32-planar', 'u8', 'u8-planar']);\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 /**\n * Creates a new {@link AudioSample}, either from an existing\n * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) or from raw bytes specified in\n * {@link AudioSampleInit}.\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 {\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 { planeIndex, format, frameCount: optFrameCount, frameOffset: optFrameOffset } = options;\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 (destIsPlanar) {\n if (destFormat === 'f32-planar') {\n // Simple, since the browser must support f32-planar, we can just delegate here\n this._data.copyTo(destination, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n }\n else {\n // Allocate temporary buffer for f32-planar data\n const tempBuffer = new ArrayBuffer(copyFrameCount * 4);\n const tempArray = new Float32Array(tempBuffer);\n this._data.copyTo(tempArray, {\n planeIndex,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n // Convert each f32 sample to destination format\n const tempView = new DataView(tempBuffer);\n for (let i = 0; i < copyFrameCount; i++) {\n const destOffset = i * destBytesPerSample;\n const sample = tempView.getFloat32(i * 4, true);\n writeFn(destView, destOffset, sample);\n }\n }\n }\n else {\n // Destination is interleaved.\n // Allocate a temporary Float32Array to hold one channel's worth of data.\n const numCh = numChannels;\n const temp = new Float32Array(copyFrameCount);\n for (let ch = 0; ch < numCh; ch++) {\n this._data.copyTo(temp, {\n planeIndex: ch,\n frameOffset,\n frameCount: copyFrameCount,\n format: 'f32-planar',\n });\n for (let i = 0; i < copyFrameCount; i++) {\n const destIndex = i * numCh + ch;\n const destOffset = destIndex * destBytesPerSample;\n writeFn(destView, destOffset, temp[i]);\n }\n }\n }\n }\n else {\n const uint8Data = this._data;\n const srcView = toDataView(uint8Data);\n const srcFormat = this.format;\n const readFn = getReadFunction(srcFormat);\n const srcBytesPerSample = getBytesPerSample(srcFormat);\n const srcIsPlanar = formatIsPlanar(srcFormat);\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 (isAudioData(this._data)) {\n const sample = new AudioSample(this._data.clone());\n sample.setTimestamp(this.timestamp); // Make sure the timestamp is precise (beyond microsecond accuracy)\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 * 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 (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 (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 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 }\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 /** 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};\n","/*!\n * Copyright (c) 2025-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 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};\n","/*!\n * Copyright (c) 2025-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) 2025-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/**\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 throw new TypeError('Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, 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 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.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) 2025-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, toDataView } from './misc.js';\nexport class Reader {\n constructor(source) {\n this.source = source;\n }\n requestSlice(start, length) {\n if (this.source._disposed) {\n throw new InputDisposedError();\n }\n if (this.fileSize !== null && start + length > this.fileSize) {\n return null;\n }\n const end = start + length;\n const result = this.source._read(start, end);\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 (this.fileSize !== null) {\n return this.requestSlice(start, clamp(this.fileSize - 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 const handleFileSize = (fileSize) => {\n assert(fileSize !== null); // The slice couldn't fit, meaning we must know the file size now\n return this.requestSlice(start, clamp(fileSize - start, minLength, maxLength));\n };\n const promisedFileSize = this.source._retrieveSize();\n if (promisedFileSize instanceof Promise) {\n return promisedFileSize.then(handleFileSize);\n }\n else {\n return handleFileSize(promisedFileSize);\n }\n };\n if (promisedAttempt instanceof Promise) {\n return promisedAttempt.then(handleAttempt);\n }\n else {\n return handleAttempt(promisedAttempt);\n }\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};\n","/*!\n * Copyright (c) 2025-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 { 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[\"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 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 return width;\n};\nexport const readVarInt = (slice) => {\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 // 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 const id = readUnsignedInt(slice, size);\n return id;\n};\nexport const readElementSize = (slice) => {\n let size = readU8(slice);\n if (size === 0xff) {\n size = null;\n }\n else {\n slice.skip(-1);\n size = readVarInt(slice);\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 size = null;\n }\n }\n return size;\n};\nexport const readElementHeader = (slice) => {\n const id = readElementId(slice);\n if (id === null) {\n return null;\n }\n const size = readElementSize(slice);\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 '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 === null) {\n throw new Error('Undefined element size is used in a place where it is not supported.');\n }\n}\n;\n","/*!\n * Copyright (c) 2025-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 { extractAv1CodecInfoFromPacket, extractAvcDecoderConfigurationRecord, extractHevcDecoderConfigurationRecord, extractVp9CodecInfoFromPacket, } from '../codec-data.js';\nimport { extractAudioCodecString, extractVideoCodecString, OPUS_SAMPLE_RATE, } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack, InputVideoTrack, } from '../input-track.js';\nimport { AttachedFile, DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, binarySearchLessOrEqual, COLOR_PRIMARIES_MAP_INVERSE, findLastIndex, isIso639Dash2LanguageCode, last, MATRIX_COEFFICIENTS_MAP_INVERSE, normalizeRotation, roundIfAlmostInteger, TRANSFER_CHARACTERISTICS_MAP_INVERSE, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { assertDefinedSize, CODEC_STRING_MAP, EBMLId, LEVEL_0_AND_1_EBML_IDS, LEVEL_1_EBML_IDS, MAX_HEADER_SIZE, MIN_HEADER_SIZE, readAsciiString, readUnicodeString, readElementHeader, readElementId, readFloat, readUnsignedInt, readVarInt, resync, searchForNextElementId, readUnsignedBigInt, } from './ebml.js';\nimport { buildMatroskaMimeType } from './matroska-misc.js';\nimport { FileSlice, readBytes, readI16Be, readU8 } from '../reader.js';\nvar BlockLacing;\n(function (BlockLacing) {\n BlockLacing[BlockLacing[\"None\"] = 0] = \"None\";\n BlockLacing[BlockLacing[\"Xiph\"] = 1] = \"Xiph\";\n BlockLacing[BlockLacing[\"FixedSize\"] = 2] = \"FixedSize\";\n BlockLacing[BlockLacing[\"Ebml\"] = 3] = \"Ebml\";\n})(BlockLacing || (BlockLacing = {}));\nvar ContentEncodingScope;\n(function (ContentEncodingScope) {\n ContentEncodingScope[ContentEncodingScope[\"Block\"] = 1] = \"Block\";\n ContentEncodingScope[ContentEncodingScope[\"Private\"] = 2] = \"Private\";\n ContentEncodingScope[ContentEncodingScope[\"Next\"] = 4] = \"Next\";\n})(ContentEncodingScope || (ContentEncodingScope = {}));\nvar ContentCompAlgo;\n(function (ContentCompAlgo) {\n ContentCompAlgo[ContentCompAlgo[\"Zlib\"] = 0] = \"Zlib\";\n ContentCompAlgo[ContentCompAlgo[\"Bzlib\"] = 1] = \"Bzlib\";\n ContentCompAlgo[ContentCompAlgo[\"lzo1x\"] = 2] = \"lzo1x\";\n ContentCompAlgo[ContentCompAlgo[\"HeaderStripping\"] = 3] = \"HeaderStripping\";\n})(ContentCompAlgo || (ContentCompAlgo = {}));\nconst METADATA_ELEMENTS = [\n { id: EBMLId.SeekHead, flag: 'seekHeadSeen' },\n { id: EBMLId.Info, flag: 'infoSeen' },\n { id: EBMLId.Tracks, flag: 'tracksSeen' },\n { id: EBMLId.Cues, flag: 'cuesSeen' },\n];\nconst MAX_RESYNC_LENGTH = 10 * 2 ** 20; // 10 MiB\nexport class MatroskaDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.readMetadataPromise = null;\n this.segments = [];\n this.currentSegment = null;\n this.currentTrack = null;\n this.currentCluster = null;\n this.currentBlock = null;\n this.currentBlockAdditional = null;\n this.currentCueTime = null;\n this.currentDecodingInstruction = null;\n this.currentTagTargetIsMovie = true;\n this.currentSimpleTagName = null;\n this.currentAttachedFile = null;\n this.isWebM = false;\n this.reader = input._reader;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getTracks() {\n await this.readMetadata();\n return this.segments.flatMap(segment => segment.tracks.map(track => track.inputTrack));\n }\n async getMimeType() {\n await this.readMetadata();\n const tracks = await this.getTracks();\n const codecStrings = await Promise.all(tracks.map(x => x.getCodecParameterString()));\n return buildMatroskaMimeType({\n isWebM: this.isWebM,\n hasVideo: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'video')),\n hasAudio: this.segments.some(segment => segment.tracks.some(x => x.info?.type === 'audio')),\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getMetadataTags() {\n await this.readMetadata();\n // Load metadata tags from each segment lazily (only once)\n for (const segment of this.segments) {\n if (!segment.metadataTagsCollected) {\n if (this.reader.fileSize !== null) {\n await this.loadSegmentMetadata(segment);\n }\n else {\n // The seeking would be too crazy, let's not\n }\n segment.metadataTagsCollected = true;\n }\n }\n // This is kinda handwavy, and how we handle multiple segments isn't suuuuper well-defined anyway; so we just\n // shallow-merge metadata tags from all (usually just one) segments.\n let metadataTags = {};\n for (const segment of this.segments) {\n metadataTags = { ...metadataTags, ...segment.metadataTags };\n }\n return metadataTags;\n }\n readMetadata() {\n return this.readMetadataPromise ??= (async () => {\n let currentPos = 0;\n // Loop over all top-level elements in the file\n while (true) {\n let slice = this.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 header = readElementHeader(slice);\n if (!header) {\n break; // Zero padding at the end of the file triggers this, for example\n }\n const id = header.id;\n let size = header.size;\n const dataStartPos = slice.filePos;\n if (id === EBMLId.EBML) {\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n this.readContiguousElements(slice);\n }\n else if (id === EBMLId.Segment) { // Segment found!\n await this.readSegment(dataStartPos, size);\n if (size === null) {\n // Segment sizes can be undefined (common in livestreamed files), so assume this is the last\n // and only segment\n break;\n }\n if (this.reader.fileSize === null) {\n break; // Stop at the first segment\n }\n }\n else if (id === EBMLId.Cluster) {\n if (this.reader.fileSize === null) {\n break; // Shouldn't be reached anyway, since we stop at the first segment\n }\n // Clusters are not a top-level element in Matroska, but some files contain a Segment whose size\n // doesn't contain any of the clusters that follow it. In the case, we apply the following logic: if\n // we find a top-level cluster, attribute it to the previous segment.\n if (size === null) {\n // Just in case this is one of those weird sizeless clusters, let's do our best and still try to\n // determine its size.\n const nextElementPos = await searchForNextElementId(this.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, this.reader.fileSize);\n size = nextElementPos.pos - dataStartPos;\n }\n const lastSegment = last(this.segments);\n if (lastSegment) {\n // Extend the previous segment's size\n lastSegment.elementEndPos = dataStartPos + size;\n }\n }\n assertDefinedSize(size);\n currentPos = dataStartPos + size;\n }\n })();\n }\n async readSegment(segmentDataStart, dataSize) {\n this.currentSegment = {\n seekHeadSeen: false,\n infoSeen: false,\n tracksSeen: false,\n cuesSeen: false,\n tagsSeen: false,\n attachmentsSeen: false,\n timestampScale: -1,\n timestampFactor: -1,\n duration: -1,\n seekEntries: [],\n tracks: [],\n cuePoints: [],\n dataStartPos: segmentDataStart,\n elementEndPos: dataSize === null\n ? null // Assume it goes until the end of the file\n : segmentDataStart + dataSize,\n clusterSeekStartPos: segmentDataStart,\n lastReadCluster: null,\n metadataTags: {},\n metadataTagsCollected: false,\n };\n this.segments.push(this.currentSegment);\n let currentPos = segmentDataStart;\n while (this.currentSegment.elementEndPos === null || currentPos < this.currentSegment.elementEndPos) {\n let slice = this.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 elementStartPos = currentPos;\n const header = readElementHeader(slice);\n if (!header || (!LEVEL_1_EBML_IDS.includes(header.id) && header.id !== EBMLId.Void)) {\n // Potential junk. Let's try to resync\n const nextPos = await resync(this.reader, elementStartPos, LEVEL_1_EBML_IDS, Math.min(this.currentSegment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH));\n if (nextPos) {\n currentPos = nextPos;\n continue;\n }\n else {\n break; // Resync failed\n }\n }\n const { id, size } = header;\n const dataStartPos = slice.filePos;\n const metadataElementIndex = METADATA_ELEMENTS.findIndex(x => x.id === id);\n if (metadataElementIndex !== -1) {\n const field = METADATA_ELEMENTS[metadataElementIndex].flag;\n this.currentSegment[field] = true;\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n this.readContiguousElements(slice);\n }\n }\n else if (id === EBMLId.Tags || id === EBMLId.Attachments) {\n // Metadata found at the beginning of the segment, great, let's parse it\n if (id === EBMLId.Tags) {\n this.currentSegment.tagsSeen = true;\n }\n else {\n this.currentSegment.attachmentsSeen = true;\n }\n assertDefinedSize(size);\n let slice = this.reader.requestSlice(dataStartPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n this.readContiguousElements(slice);\n }\n }\n else if (id === EBMLId.Cluster) {\n this.currentSegment.clusterSeekStartPos = elementStartPos;\n break; // Stop at the first cluster\n }\n if (size === null) {\n break;\n }\n else {\n currentPos = dataStartPos + size;\n }\n }\n // Sort the seek entries by file position so reading them exhibits a sequential pattern\n this.currentSegment.seekEntries.sort((a, b) => a.segmentPosition - b.segmentPosition);\n if (this.reader.fileSize !== null) {\n // Use the seek head to read missing metadata elements\n for (const seekEntry of this.currentSegment.seekEntries) {\n const target = METADATA_ELEMENTS.find(x => x.id === seekEntry.id);\n if (!target) {\n continue;\n }\n if (this.currentSegment[target.flag])\n continue;\n let slice = this.reader.requestSliceRange(segmentDataStart + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n continue;\n const header = readElementHeader(slice);\n if (!header)\n continue;\n const { id, size } = header;\n if (id !== target.id)\n continue;\n assertDefinedSize(size);\n this.currentSegment[target.flag] = true;\n let dataSlice = this.reader.requestSlice(slice.filePos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (!dataSlice)\n continue;\n this.readContiguousElements(dataSlice);\n }\n }\n if (this.currentSegment.timestampScale === -1) {\n // TimestampScale element is missing. Technically an invalid file, but let's default to the typical value,\n // which is 1e6.\n this.currentSegment.timestampScale = 1e6;\n this.currentSegment.timestampFactor = 1e9 / 1e6;\n }\n // Put default tracks first\n this.currentSegment.tracks.sort((a, b) => Number(b.disposition.default) - Number(a.disposition.default));\n // Now, let's distribute the cue points to the tracks\n const idToTrack = new Map(this.currentSegment.tracks.map(x => [x.id, x]));\n // Assign cue points to their respective tracks\n for (const cuePoint of this.currentSegment.cuePoints) {\n const track = idToTrack.get(cuePoint.trackId);\n if (track) {\n track.cuePoints.push(cuePoint);\n }\n }\n for (const track of this.currentSegment.tracks) {\n // Sort cue points by time\n track.cuePoints.sort((a, b) => a.time - b.time);\n // Remove multiple cue points for the same time\n for (let i = 0; i < track.cuePoints.length - 1; i++) {\n const cuePoint1 = track.cuePoints[i];\n const cuePoint2 = track.cuePoints[i + 1];\n if (cuePoint1.time === cuePoint2.time) {\n track.cuePoints.splice(i + 1, 1);\n i--;\n }\n }\n }\n let trackWithMostCuePoints = null;\n let maxCuePointCount = -Infinity;\n for (const track of this.currentSegment.tracks) {\n if (track.cuePoints.length > maxCuePointCount) {\n maxCuePointCount = track.cuePoints.length;\n trackWithMostCuePoints = track;\n }\n }\n // For every track that has received 0 cue points (can happen, often only the video track receives cue points),\n // we still want to have better seeking. Therefore, let's give it the cue points of the track with the most cue\n // points, which should provide us with the most fine-grained seeking.\n for (const track of this.currentSegment.tracks) {\n if (track.cuePoints.length === 0) {\n track.cuePoints = trackWithMostCuePoints.cuePoints;\n }\n }\n this.currentSegment = null;\n }\n async readCluster(startPos, segment) {\n if (segment.lastReadCluster?.elementStartPos === startPos) {\n return segment.lastReadCluster;\n }\n let headerSlice = this.reader.requestSliceRange(startPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const elementStartPos = startPos;\n const elementHeader = readElementHeader(headerSlice);\n assert(elementHeader);\n const id = elementHeader.id;\n assert(id === EBMLId.Cluster);\n let size = elementHeader.size;\n const dataStartPos = headerSlice.filePos;\n if (size === null) {\n // The cluster's size is undefined (can happen in livestreamed files). We'd still like to know the size of\n // it, so we have no other choice but to iterate over the EBML structure until we find an element at level\n // 0 or 1, indicating the end of the cluster (all elements inside the cluster are at level 2).\n const nextElementPos = await searchForNextElementId(this.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = nextElementPos.pos - dataStartPos;\n }\n // Load the entire cluster\n let dataSlice = this.reader.requestSlice(dataStartPos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n const cluster = {\n segment,\n elementStartPos,\n elementEndPos: dataStartPos + size,\n dataStartPos,\n timestamp: -1,\n trackData: new Map(),\n };\n this.currentCluster = cluster;\n if (dataSlice) {\n // Read the children of the cluster, stopping early at level 0 or 1 EBML elements. We do this because some\n // clusters have incorrect sizes that are too large\n const endPos = this.readContiguousElements(dataSlice, LEVEL_0_AND_1_EBML_IDS);\n cluster.elementEndPos = endPos;\n }\n for (const [, trackData] of cluster.trackData) {\n const track = trackData.track;\n // This must hold, as track datas only get created if a block for that track is encountered\n assert(trackData.blocks.length > 0);\n let hasLacedBlocks = false;\n for (let i = 0; i < trackData.blocks.length; i++) {\n const block = trackData.blocks[i];\n block.timestamp += cluster.timestamp;\n hasLacedBlocks ||= block.lacing !== BlockLacing.None;\n }\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n for (let i = 0; i < trackData.presentationTimestamps.length; i++) {\n const currentEntry = trackData.presentationTimestamps[i];\n const currentBlock = trackData.blocks[currentEntry.blockIndex];\n if (trackData.firstKeyFrameTimestamp === null && currentBlock.isKeyFrame) {\n trackData.firstKeyFrameTimestamp = currentBlock.timestamp;\n }\n if (i < trackData.presentationTimestamps.length - 1) {\n // Update block durations based on presentation order\n const nextEntry = trackData.presentationTimestamps[i + 1];\n currentBlock.duration = nextEntry.timestamp - currentBlock.timestamp;\n }\n else if (currentBlock.duration === 0) {\n if (track.defaultDuration != null) {\n if (currentBlock.lacing === BlockLacing.None) {\n currentBlock.duration = track.defaultDuration;\n }\n else {\n // Handled by the lace resolution code\n }\n }\n }\n }\n if (hasLacedBlocks) {\n // Perform lace resolution. Here, we expand each laced block into multiple blocks where each contains\n // one frame of the lace. We do this after determining block timestamps so we can properly distribute\n // the block's duration across the laced frames.\n this.expandLacedBlocks(trackData.blocks, track);\n // Recompute since blocks have changed\n trackData.presentationTimestamps = trackData.blocks\n .map((block, i) => ({ timestamp: block.timestamp, blockIndex: i }))\n .sort((a, b) => a.timestamp - b.timestamp);\n }\n const firstBlock = trackData.blocks[trackData.presentationTimestamps[0].blockIndex];\n const lastBlock = trackData.blocks[last(trackData.presentationTimestamps).blockIndex];\n trackData.startTimestamp = firstBlock.timestamp;\n trackData.endTimestamp = lastBlock.timestamp + lastBlock.duration;\n // Let's remember that a cluster with a given timestamp is here, speeding up future lookups if no cues exist\n const insertionIndex = binarySearchLessOrEqual(track.clusterPositionCache, trackData.startTimestamp, x => x.startTimestamp);\n if (insertionIndex === -1\n || track.clusterPositionCache[insertionIndex].elementStartPos !== elementStartPos) {\n track.clusterPositionCache.splice(insertionIndex + 1, 0, {\n elementStartPos: cluster.elementStartPos,\n startTimestamp: trackData.startTimestamp,\n });\n }\n }\n segment.lastReadCluster = cluster;\n return cluster;\n }\n getTrackDataInCluster(cluster, trackNumber) {\n let trackData = cluster.trackData.get(trackNumber);\n if (!trackData) {\n const track = cluster.segment.tracks.find(x => x.id === trackNumber);\n if (!track) {\n return null;\n }\n trackData = {\n track,\n startTimestamp: 0,\n endTimestamp: 0,\n firstKeyFrameTimestamp: null,\n blocks: [],\n presentationTimestamps: [],\n };\n cluster.trackData.set(trackNumber, trackData);\n }\n return trackData;\n }\n expandLacedBlocks(blocks, track) {\n // https://www.matroska.org/technical/notes.html#block-lacing\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const originalBlock = blocks[blockIndex];\n if (originalBlock.lacing === BlockLacing.None) {\n continue;\n }\n // Decode the block data if it hasn't been decoded yet (needed for lacing expansion)\n if (!originalBlock.decoded) {\n originalBlock.data = this.decodeBlockData(track, originalBlock.data);\n originalBlock.decoded = true;\n }\n const slice = FileSlice.tempFromBytes(originalBlock.data);\n const frameSizes = [];\n const frameCount = readU8(slice) + 1;\n switch (originalBlock.lacing) {\n case BlockLacing.Xiph:\n {\n let totalUsedSize = 0;\n // Xiph lacing, just like in Ogg\n for (let i = 0; i < frameCount - 1; i++) {\n let frameSize = 0;\n while (slice.bufferPos < slice.length) {\n const value = readU8(slice);\n frameSize += value;\n if (value < 255) {\n frameSizes.push(frameSize);\n totalUsedSize += frameSize;\n break;\n }\n }\n }\n // Compute the last frame's size from whatever's left\n frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize));\n }\n ;\n break;\n case BlockLacing.FixedSize:\n {\n // Fixed size lacing: all frames have same size\n const totalDataSize = slice.length - 1; // Minus the frame count byte\n const frameSize = Math.floor(totalDataSize / frameCount);\n for (let i = 0; i < frameCount; i++) {\n frameSizes.push(frameSize);\n }\n }\n ;\n break;\n case BlockLacing.Ebml:\n {\n // EBML lacing: first size absolute, subsequent ones are coded as signed differences from the last\n const firstResult = readVarInt(slice);\n assert(firstResult !== null); // Assume it's not an invalid VINT\n let currentSize = firstResult;\n frameSizes.push(currentSize);\n let totalUsedSize = currentSize;\n for (let i = 1; i < frameCount - 1; i++) {\n const startPos = slice.bufferPos;\n const diffResult = readVarInt(slice);\n assert(diffResult !== null);\n const unsignedDiff = diffResult;\n const width = slice.bufferPos - startPos;\n const bias = (1 << (width * 7 - 1)) - 1; // Typo-corrected version of 2^((7*n)-1)^-1\n const diff = unsignedDiff - bias;\n currentSize += diff;\n frameSizes.push(currentSize);\n totalUsedSize += currentSize;\n }\n // Compute the last frame's size from whatever's left\n frameSizes.push(slice.length - (slice.bufferPos + totalUsedSize));\n }\n ;\n break;\n default: assert(false);\n }\n assert(frameSizes.length === frameCount);\n blocks.splice(blockIndex, 1); // Remove the original block\n const blockDuration = originalBlock.duration || frameCount * (track.defaultDuration ?? 0);\n // Now, let's insert each frame as its own block\n for (let i = 0; i < frameCount; i++) {\n const frameSize = frameSizes[i];\n const frameData = readBytes(slice, frameSize);\n // Distribute timestamps evenly across the block duration\n const frameTimestamp = originalBlock.timestamp + (blockDuration * i / frameCount);\n const frameDuration = blockDuration / frameCount;\n blocks.splice(blockIndex + i, 0, {\n timestamp: frameTimestamp,\n duration: frameDuration,\n isKeyFrame: originalBlock.isKeyFrame,\n data: frameData,\n lacing: BlockLacing.None,\n decoded: true,\n mainAdditional: originalBlock.mainAdditional,\n });\n }\n blockIndex += frameCount; // Skip the blocks we just added\n blockIndex--;\n }\n }\n async loadSegmentMetadata(segment) {\n for (const seekEntry of segment.seekEntries) {\n if (seekEntry.id === EBMLId.Tags && !segment.tagsSeen) {\n // We need to load the tags\n }\n else if (seekEntry.id === EBMLId.Attachments && !segment.attachmentsSeen) {\n // We need to load the attachments\n }\n else {\n continue;\n }\n let slice = this.reader.requestSliceRange(segment.dataStartPos + seekEntry.segmentPosition, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n continue;\n const header = readElementHeader(slice);\n if (!header || header.id !== seekEntry.id)\n continue;\n const { size } = header;\n assertDefinedSize(size);\n assert(!this.currentSegment);\n this.currentSegment = segment;\n let dataSlice = this.reader.requestSlice(slice.filePos, size);\n if (dataSlice instanceof Promise)\n dataSlice = await dataSlice;\n if (dataSlice) {\n this.readContiguousElements(dataSlice);\n }\n this.currentSegment = null;\n // Mark as seen\n if (seekEntry.id === EBMLId.Tags) {\n segment.tagsSeen = true;\n }\n else if (seekEntry.id === EBMLId.Attachments) {\n segment.attachmentsSeen = true;\n }\n }\n }\n readContiguousElements(slice, stopIds) {\n const startIndex = slice.filePos;\n while (slice.filePos - startIndex <= slice.length - MIN_HEADER_SIZE) {\n const startPos = slice.filePos;\n const foundElement = this.traverseElement(slice, stopIds);\n if (!foundElement) {\n return startPos;\n }\n }\n return slice.filePos;\n }\n traverseElement(slice, stopIds) {\n const header = readElementHeader(slice);\n if (!header) {\n return false;\n }\n if (stopIds && stopIds.includes(header.id)) {\n return false;\n }\n const { id, size } = header;\n const dataStartPos = slice.filePos;\n assertDefinedSize(size);\n switch (id) {\n case EBMLId.DocType:\n {\n this.isWebM = readAsciiString(slice, size) === 'webm';\n }\n ;\n break;\n case EBMLId.Seek:\n {\n if (!this.currentSegment)\n break;\n const seekEntry = { id: -1, segmentPosition: -1 };\n this.currentSegment.seekEntries.push(seekEntry);\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (seekEntry.id === -1 || seekEntry.segmentPosition === -1) {\n this.currentSegment.seekEntries.pop();\n }\n }\n ;\n break;\n case EBMLId.SeekID:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.id = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.SeekPosition:\n {\n const lastSeekEntry = this.currentSegment?.seekEntries[this.currentSegment.seekEntries.length - 1];\n if (!lastSeekEntry)\n break;\n lastSeekEntry.segmentPosition = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.TimestampScale:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.timestampScale = readUnsignedInt(slice, size);\n this.currentSegment.timestampFactor = 1e9 / this.currentSegment.timestampScale;\n }\n ;\n break;\n case EBMLId.Duration:\n {\n if (!this.currentSegment)\n break;\n this.currentSegment.duration = readFloat(slice, size);\n }\n ;\n break;\n case EBMLId.TrackEntry:\n {\n if (!this.currentSegment)\n break;\n this.currentTrack = {\n id: -1,\n segment: this.currentSegment,\n demuxer: this,\n clusterPositionCache: [],\n cuePoints: [],\n disposition: {\n ...DEFAULT_TRACK_DISPOSITION,\n },\n inputTrack: null,\n codecId: null,\n codecPrivate: null,\n defaultDuration: null,\n name: null,\n languageCode: UNDETERMINED_LANGUAGE,\n decodingInstructions: [],\n info: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentTrack.decodingInstructions.some((instruction) => {\n return instruction.data?.type !== 'decompress'\n || instruction.scope !== ContentEncodingScope.Block\n || instruction.data.algorithm !== ContentCompAlgo.HeaderStripping;\n })) {\n console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`);\n this.currentTrack = null;\n }\n if (this.currentTrack\n && this.currentTrack.id !== -1\n && this.currentTrack.codecId\n && this.currentTrack.info) {\n const slashIndex = this.currentTrack.codecId.indexOf('/');\n const codecIdWithoutSuffix = slashIndex === -1\n ? this.currentTrack.codecId\n : this.currentTrack.codecId.slice(0, slashIndex);\n if (this.currentTrack.info.type === 'video'\n && this.currentTrack.info.width !== -1\n && this.currentTrack.info.height !== -1) {\n if (this.currentTrack.codecId === CODEC_STRING_MAP.avc) {\n this.currentTrack.info.codec = 'avc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.hevc) {\n this.currentTrack.info.codec = 'hevc';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp8) {\n this.currentTrack.info.codec = 'vp8';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vp9) {\n this.currentTrack.info.codec = 'vp9';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.av1) {\n this.currentTrack.info.codec = 'av1';\n }\n const videoTrack = this.currentTrack;\n const inputTrack = new InputVideoTrack(this.input, new MatroskaVideoTrackBacking(videoTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n else if (this.currentTrack.info.type === 'audio'\n && this.currentTrack.info.numberOfChannels !== -1\n && this.currentTrack.info.sampleRate !== -1) {\n if (codecIdWithoutSuffix === CODEC_STRING_MAP.aac) {\n this.currentTrack.info.codec = 'aac';\n this.currentTrack.info.aacCodecInfo = {\n isMpeg2: this.currentTrack.codecId.includes('MPEG2'),\n };\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === CODEC_STRING_MAP.mp3) {\n this.currentTrack.info.codec = 'mp3';\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.opus) {\n this.currentTrack.info.codec = 'opus';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n this.currentTrack.info.sampleRate = OPUS_SAMPLE_RATE; // Always the same\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.vorbis) {\n this.currentTrack.info.codec = 'vorbis';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (codecIdWithoutSuffix === CODEC_STRING_MAP.flac) {\n this.currentTrack.info.codec = 'flac';\n this.currentTrack.info.codecDescription = this.currentTrack.codecPrivate;\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/LIT') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/INT/BIG') {\n if (this.currentTrack.info.bitDepth === 8) {\n this.currentTrack.info.codec = 'pcm-u8';\n }\n else if (this.currentTrack.info.bitDepth === 16) {\n this.currentTrack.info.codec = 'pcm-s16be';\n }\n else if (this.currentTrack.info.bitDepth === 24) {\n this.currentTrack.info.codec = 'pcm-s24be';\n }\n else if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-s32be';\n }\n }\n else if (this.currentTrack.codecId === 'A_PCM/FLOAT/IEEE') {\n if (this.currentTrack.info.bitDepth === 32) {\n this.currentTrack.info.codec = 'pcm-f32';\n }\n else if (this.currentTrack.info.bitDepth === 64) {\n this.currentTrack.info.codec = 'pcm-f64';\n }\n }\n const audioTrack = this.currentTrack;\n const inputTrack = new InputAudioTrack(this.input, new MatroskaAudioTrackBacking(audioTrack));\n this.currentTrack.inputTrack = inputTrack;\n this.currentSegment.tracks.push(this.currentTrack);\n }\n }\n this.currentTrack = null;\n }\n ;\n break;\n case EBMLId.TrackNumber:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.id = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.TrackType:\n {\n if (!this.currentTrack)\n break;\n const type = readUnsignedInt(slice, size);\n if (type === 1) {\n this.currentTrack.info = {\n type: 'video',\n width: -1,\n height: -1,\n rotation: 0,\n codec: null,\n codecDescription: null,\n colorSpace: null,\n alphaMode: false,\n };\n }\n else if (type === 2) {\n this.currentTrack.info = {\n type: 'audio',\n numberOfChannels: -1,\n sampleRate: -1,\n bitDepth: -1,\n codec: null,\n codecDescription: null,\n aacCodecInfo: null,\n };\n }\n }\n ;\n break;\n case EBMLId.FlagEnabled:\n {\n if (!this.currentTrack)\n break;\n const enabled = readUnsignedInt(slice, size);\n if (!enabled) {\n this.currentSegment.tracks.pop();\n this.currentTrack = null;\n }\n }\n ;\n break;\n case EBMLId.FlagDefault:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.default = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagForced:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.forced = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagOriginal:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.original = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagHearingImpaired:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.hearingImpaired = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagVisualImpaired:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.visuallyImpaired = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.FlagCommentary:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.disposition.commentary = !!readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CodecID:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecId = readAsciiString(slice, size);\n }\n ;\n break;\n case EBMLId.CodecPrivate:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.codecPrivate = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.DefaultDuration:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.defaultDuration\n = this.currentTrack.segment.timestampFactor * readUnsignedInt(slice, size) / 1e9;\n }\n ;\n break;\n case EBMLId.Name:\n {\n if (!this.currentTrack)\n break;\n this.currentTrack.name = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.Language:\n {\n if (!this.currentTrack)\n break;\n if (this.currentTrack.languageCode !== UNDETERMINED_LANGUAGE) {\n // LanguageBCP47 was present, which takes precedence\n break;\n }\n this.currentTrack.languageCode = readAsciiString(slice, size);\n if (!isIso639Dash2LanguageCode(this.currentTrack.languageCode)) {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.LanguageBCP47:\n {\n if (!this.currentTrack)\n break;\n const bcp47 = readAsciiString(slice, size);\n const languageSubtag = bcp47.split('-')[0];\n if (languageSubtag) {\n // Technically invalid, for now: The language subtag might be a language code from ISO 639-1,\n // ISO 639-2, ISO 639-3, ISO 639-5 or some other thing (source: Wikipedia). But, `languageCode` is\n // documented as ISO 639-2. Changing the definition would be a breaking change. This will get\n // cleaned up in the future by defining languageCode to be BCP 47 instead.\n this.currentTrack.languageCode = languageSubtag;\n }\n else {\n this.currentTrack.languageCode = UNDETERMINED_LANGUAGE;\n }\n }\n ;\n break;\n case EBMLId.Video:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.PixelWidth:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.width = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.PixelHeight:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.height = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.AlphaMode:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.alphaMode = readUnsignedInt(slice, size) === 1;\n }\n ;\n break;\n case EBMLId.Colour:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.currentTrack.info.colorSpace = {};\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.MatrixCoefficients:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const matrixCoefficients = readUnsignedInt(slice, size);\n const mapped = MATRIX_COEFFICIENTS_MAP_INVERSE[matrixCoefficients] ?? null;\n this.currentTrack.info.colorSpace.matrix = mapped;\n }\n ;\n break;\n case EBMLId.Range:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n this.currentTrack.info.colorSpace.fullRange = readUnsignedInt(slice, size) === 2;\n }\n ;\n break;\n case EBMLId.TransferCharacteristics:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const transferCharacteristics = readUnsignedInt(slice, size);\n const mapped = TRANSFER_CHARACTERISTICS_MAP_INVERSE[transferCharacteristics] ?? null;\n this.currentTrack.info.colorSpace.transfer = mapped;\n }\n ;\n break;\n case EBMLId.Primaries:\n {\n if (this.currentTrack?.info?.type !== 'video' || !this.currentTrack.info.colorSpace)\n break;\n const primaries = readUnsignedInt(slice, size);\n const mapped = COLOR_PRIMARIES_MAP_INVERSE[primaries] ?? null;\n this.currentTrack.info.colorSpace.primaries = mapped;\n }\n ;\n break;\n case EBMLId.Projection:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.ProjectionPoseRoll:\n {\n if (this.currentTrack?.info?.type !== 'video')\n break;\n const rotation = readFloat(slice, size);\n const flippedRotation = -rotation; // Convert counter-clockwise to clockwise\n try {\n this.currentTrack.info.rotation = normalizeRotation(flippedRotation);\n }\n catch {\n // It wasn't a valid rotation\n }\n }\n ;\n break;\n case EBMLId.Audio:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.SamplingFrequency:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.sampleRate = readFloat(slice, size);\n }\n ;\n break;\n case EBMLId.Channels:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.numberOfChannels = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.BitDepth:\n {\n if (this.currentTrack?.info?.type !== 'audio')\n break;\n this.currentTrack.info.bitDepth = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CuePoint:\n {\n if (!this.currentSegment)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n this.currentCueTime = null;\n }\n ;\n break;\n case EBMLId.CueTime:\n {\n this.currentCueTime = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CueTrackPositions:\n {\n if (this.currentCueTime === null)\n break;\n assert(this.currentSegment);\n const cuePoint = { time: this.currentCueTime, trackId: -1, clusterPosition: -1 };\n this.currentSegment.cuePoints.push(cuePoint);\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (cuePoint.trackId === -1 || cuePoint.clusterPosition === -1) {\n this.currentSegment.cuePoints.pop();\n }\n }\n ;\n break;\n case EBMLId.CueTrack:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n lastCuePoint.trackId = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.CueClusterPosition:\n {\n const lastCuePoint = this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length - 1];\n if (!lastCuePoint)\n break;\n assert(this.currentSegment);\n lastCuePoint.clusterPosition = this.currentSegment.dataStartPos + readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.Timestamp:\n {\n if (!this.currentCluster)\n break;\n this.currentCluster.timestamp = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.SimpleBlock:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = readVarInt(slice);\n if (trackNumber === null)\n break;\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n if (!trackData)\n break; // Not a track we care about\n const relativeTimestamp = readI16Be(slice);\n const flags = readU8(slice);\n const lacing = (flags >> 1) & 0x3; // If the block is laced, we'll expand it later\n let isKeyFrame = !!(flags & 0x80);\n if (trackData.track.info?.type === 'audio' && trackData.track.info.codec) {\n // Some files don't mark their audio packets as key packets (I'm looking at you, Firefox). But, we\n // can fix this in most cases: if we recognize the codec of the track, then we know every packet is\n // necessarily a key packet, no matter what the container says.\n // https://github.com/Vanilagy/mediabunny/issues/192\n isKeyFrame = true;\n }\n const blockData = readBytes(slice, size - (slice.filePos - dataStartPos));\n const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0;\n trackData.blocks.push({\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0, // Will set later\n isKeyFrame,\n data: blockData,\n lacing,\n decoded: !hasDecodingInstructions,\n mainAdditional: null,\n });\n }\n ;\n break;\n case EBMLId.BlockGroup:\n {\n if (!this.currentCluster)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n this.currentBlock = null;\n }\n ;\n break;\n case EBMLId.Block:\n {\n if (!this.currentCluster)\n break;\n const trackNumber = readVarInt(slice);\n if (trackNumber === null)\n break;\n const trackData = this.getTrackDataInCluster(this.currentCluster, trackNumber);\n if (!trackData)\n break;\n const relativeTimestamp = readI16Be(slice);\n const flags = readU8(slice);\n const lacing = (flags >> 1) & 0x3; // If the block is laced, we'll expand it later\n const blockData = readBytes(slice, size - (slice.filePos - dataStartPos));\n const hasDecodingInstructions = trackData.track.decodingInstructions.length > 0;\n this.currentBlock = {\n timestamp: relativeTimestamp, // We'll add the cluster's timestamp to this later\n duration: 0, // Will set later\n isKeyFrame: true,\n data: blockData,\n lacing,\n decoded: !hasDecodingInstructions,\n mainAdditional: null,\n };\n trackData.blocks.push(this.currentBlock);\n }\n ;\n break;\n case EBMLId.BlockAdditions:\n {\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.BlockMore:\n {\n if (!this.currentBlock)\n break;\n this.currentBlockAdditional = {\n addId: 1,\n data: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentBlockAdditional.data && this.currentBlockAdditional.addId === 1) {\n this.currentBlock.mainAdditional = this.currentBlockAdditional.data;\n }\n this.currentBlockAdditional = null;\n }\n ;\n break;\n case EBMLId.BlockAdditional:\n {\n if (!this.currentBlockAdditional)\n break;\n this.currentBlockAdditional.data = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.BlockAddID:\n {\n if (!this.currentBlockAdditional)\n break;\n this.currentBlockAdditional.addId = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.BlockDuration:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.duration = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ReferenceBlock:\n {\n if (!this.currentBlock)\n break;\n this.currentBlock.isKeyFrame = false;\n // We ignore the actual value here, we just use the reference as an indicator for \"not a key frame\".\n // This is in line with FFmpeg's behavior.\n }\n ;\n break;\n case EBMLId.Tag:\n {\n this.currentTagTargetIsMovie = true;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.Targets:\n {\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.TargetTypeValue:\n {\n const targetTypeValue = readUnsignedInt(slice, size);\n if (targetTypeValue !== 50) {\n this.currentTagTargetIsMovie = false;\n }\n }\n ;\n break;\n case EBMLId.TagTrackUID:\n case EBMLId.TagEditionUID:\n case EBMLId.TagChapterUID:\n case EBMLId.TagAttachmentUID:\n {\n this.currentTagTargetIsMovie = false;\n }\n ;\n break;\n case EBMLId.SimpleTag:\n {\n if (!this.currentTagTargetIsMovie)\n break;\n this.currentSimpleTagName = null;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.TagName:\n {\n this.currentSimpleTagName = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.TagString:\n {\n if (!this.currentSimpleTagName)\n break;\n const value = readUnicodeString(slice, size);\n this.processTagValue(this.currentSimpleTagName, value);\n }\n ;\n break;\n case EBMLId.TagBinary:\n {\n if (!this.currentSimpleTagName)\n break;\n const value = readBytes(slice, size);\n this.processTagValue(this.currentSimpleTagName, value);\n }\n ;\n break;\n case EBMLId.AttachedFile:\n {\n if (!this.currentSegment)\n break;\n this.currentAttachedFile = {\n fileUid: null,\n fileName: null,\n fileMediaType: null,\n fileData: null,\n fileDescription: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n const tags = this.currentSegment.metadataTags;\n if (this.currentAttachedFile.fileUid && this.currentAttachedFile.fileData) {\n // All attached files get surfaced in the `raw` metadata tags\n tags.raw ??= {};\n tags.raw[this.currentAttachedFile.fileUid.toString()] = new AttachedFile(this.currentAttachedFile.fileData, this.currentAttachedFile.fileMediaType ?? undefined, this.currentAttachedFile.fileName ?? undefined, this.currentAttachedFile.fileDescription ?? undefined);\n }\n // Only process image attachments\n if (this.currentAttachedFile.fileMediaType?.startsWith('image/') && this.currentAttachedFile.fileData) {\n const fileName = this.currentAttachedFile.fileName;\n let kind = 'unknown';\n if (fileName) {\n const lowerName = fileName.toLowerCase();\n if (lowerName.startsWith('cover.')) {\n kind = 'coverFront';\n }\n else if (lowerName.startsWith('back.')) {\n kind = 'coverBack';\n }\n }\n tags.images ??= [];\n tags.images.push({\n data: this.currentAttachedFile.fileData,\n mimeType: this.currentAttachedFile.fileMediaType,\n kind,\n name: this.currentAttachedFile.fileName ?? undefined,\n description: this.currentAttachedFile.fileDescription ?? undefined,\n });\n }\n this.currentAttachedFile = null;\n }\n ;\n break;\n case EBMLId.FileUID:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileUid = readUnsignedBigInt(slice, size);\n }\n ;\n break;\n case EBMLId.FileName:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileName = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.FileMediaType:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileMediaType = readAsciiString(slice, size);\n }\n ;\n break;\n case EBMLId.FileData:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileData = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.FileDescription:\n {\n if (!this.currentAttachedFile)\n break;\n this.currentAttachedFile.fileDescription = readUnicodeString(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncodings:\n {\n if (!this.currentTrack)\n break;\n this.readContiguousElements(slice.slice(dataStartPos, size));\n // \"**MUST** start with the `ContentEncoding` with the highest `ContentEncodingOrder`\"\n this.currentTrack.decodingInstructions.sort((a, b) => b.order - a.order);\n }\n ;\n break;\n case EBMLId.ContentEncoding:\n {\n this.currentDecodingInstruction = {\n order: 0,\n scope: ContentEncodingScope.Block,\n data: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n if (this.currentDecodingInstruction.data) {\n this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction);\n }\n this.currentDecodingInstruction = null;\n }\n ;\n break;\n case EBMLId.ContentEncodingOrder:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.order = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncodingScope:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.scope = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentCompression:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.data = {\n type: 'decompress',\n algorithm: ContentCompAlgo.Zlib,\n settings: null,\n };\n this.readContiguousElements(slice.slice(dataStartPos, size));\n }\n ;\n break;\n case EBMLId.ContentCompAlgo:\n {\n if (this.currentDecodingInstruction?.data?.type !== 'decompress')\n break;\n this.currentDecodingInstruction.data.algorithm = readUnsignedInt(slice, size);\n }\n ;\n break;\n case EBMLId.ContentCompSettings:\n {\n if (this.currentDecodingInstruction?.data?.type !== 'decompress')\n break;\n this.currentDecodingInstruction.data.settings = readBytes(slice, size);\n }\n ;\n break;\n case EBMLId.ContentEncryption:\n {\n if (!this.currentDecodingInstruction)\n break;\n this.currentDecodingInstruction.data = {\n type: 'decrypt',\n };\n }\n ;\n break;\n }\n slice.filePos = dataStartPos + size;\n return true;\n }\n decodeBlockData(track, rawData) {\n assert(track.decodingInstructions.length > 0); // This method shouldn't be called otherwise\n let currentData = rawData;\n for (const instruction of track.decodingInstructions) {\n assert(instruction.data);\n switch (instruction.data.type) {\n case 'decompress':\n {\n switch (instruction.data.algorithm) {\n case ContentCompAlgo.HeaderStripping:\n {\n if (instruction.data.settings && instruction.data.settings.length > 0) {\n const prefix = instruction.data.settings;\n const newData = new Uint8Array(prefix.length + currentData.length);\n newData.set(prefix, 0);\n newData.set(currentData, prefix.length);\n currentData = newData;\n }\n }\n ;\n break;\n default:\n {\n // Unhandled\n }\n ;\n }\n }\n ;\n break;\n default:\n {\n // Unhandled\n }\n ;\n }\n }\n return currentData;\n }\n processTagValue(name, value) {\n if (!this.currentSegment?.metadataTags)\n return;\n const metadataTags = this.currentSegment.metadataTags;\n metadataTags.raw ??= {};\n metadataTags.raw[name] ??= value;\n if (typeof value === 'string') {\n switch (name.toLowerCase()) {\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 'album_artist':\n {\n metadataTags.albumArtist ??= value;\n }\n ;\n break;\n case 'genre':\n {\n metadataTags.genre ??= 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 '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 'track_number':\n case 'part_number':\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 'disc_number':\n case 'disc':\n {\n const discParts = value.split('/');\n const discNum = Number.parseInt(discParts[0], 10);\n const discsTotal = discParts[1] && Number.parseInt(discParts[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 }\n }\n }\n}\nclass MatroskaTrackBacking {\n constructor(internalTrack) {\n this.internalTrack = internalTrack;\n this.packetToClusterLocation = new WeakMap();\n }\n getId() {\n return this.internalTrack.id;\n }\n getCodec() {\n throw new Error('Not implemented on base class.');\n }\n getInternalCodecId() {\n return this.internalTrack.codecId;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return this.internalTrack.name;\n }\n getLanguageCode() {\n return this.internalTrack.languageCode;\n }\n async getFirstTimestamp() {\n const firstPacket = await this.getFirstPacket({ metadataOnly: true });\n return firstPacket?.timestamp ?? 0;\n }\n getTimeResolution() {\n return this.internalTrack.segment.timestampFactor;\n }\n getDisposition() {\n return this.internalTrack.disposition;\n }\n async getFirstPacket(options) {\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n intoTimescale(timestamp) {\n // Do a little rounding to catch cases where the result is very close to an integer. If it is, it's likely\n // that the number was originally an integer divided by the timescale. For stability, it's best\n // to return the integer in this case.\n return roundIfAlmostInteger(timestamp * this.internalTrack.segment.timestampFactor);\n }\n async getPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { blockIndex: -1, correctBlockFound: false };\n }\n const index = binarySearchLessOrEqual(trackData.presentationTimestamps, timestampInTimescale, x => x.timestamp);\n const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1;\n const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { blockIndex, correctBlockFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performClusterLookup(locationInCluster.cluster, (cluster) => {\n if (cluster === locationInCluster.cluster) {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (locationInCluster.blockIndex + 1 < trackData.blocks.length) {\n // We can simply take the next block in the cluster\n return {\n blockIndex: locationInCluster.blockIndex + 1,\n correctBlockFound: true,\n };\n }\n }\n else {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData) {\n return {\n blockIndex: 0,\n correctBlockFound: true,\n };\n }\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n async getKeyPacket(timestamp, options) {\n const timestampInTimescale = this.intoTimescale(timestamp);\n return this.performClusterLookup(null, (cluster) => {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (!trackData) {\n return { blockIndex: -1, correctBlockFound: false };\n }\n const index = findLastIndex(trackData.presentationTimestamps, (x) => {\n const block = trackData.blocks[x.blockIndex];\n return block.isKeyFrame && x.timestamp <= timestampInTimescale;\n });\n const blockIndex = index !== -1 ? trackData.presentationTimestamps[index].blockIndex : -1;\n const correctBlockFound = index !== -1 && timestampInTimescale < trackData.endTimestamp;\n return { blockIndex, correctBlockFound };\n }, timestampInTimescale, timestampInTimescale, options);\n }\n async getNextKeyPacket(packet, options) {\n const locationInCluster = this.packetToClusterLocation.get(packet);\n if (locationInCluster === undefined) {\n throw new Error('Packet was not created from this track.');\n }\n return this.performClusterLookup(locationInCluster.cluster, (cluster) => {\n if (cluster === locationInCluster.cluster) {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const nextKeyFrameIndex = trackData.blocks.findIndex((x, i) => x.isKeyFrame && i > locationInCluster.blockIndex);\n if (nextKeyFrameIndex !== -1) {\n // We can simply take the next key frame in the cluster\n return {\n blockIndex: nextKeyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n else {\n const trackData = cluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.firstKeyFrameTimestamp !== null) {\n const keyFrameIndex = trackData.blocks.findIndex(x => x.isKeyFrame);\n assert(keyFrameIndex !== -1); // There must be one\n return {\n blockIndex: keyFrameIndex,\n correctBlockFound: true,\n };\n }\n }\n return {\n blockIndex: -1,\n correctBlockFound: false,\n };\n }, -Infinity, // Use -Infinity as a search timestamp to avoid using the cues\n Infinity, options);\n }\n async fetchPacketInCluster(cluster, blockIndex, options) {\n if (blockIndex === -1) {\n return null;\n }\n const trackData = cluster.trackData.get(this.internalTrack.id);\n const block = trackData.blocks[blockIndex];\n assert(block);\n // Perform lazy decoding if needed\n if (!block.decoded) {\n block.data = this.internalTrack.demuxer.decodeBlockData(this.internalTrack, block.data);\n block.decoded = true;\n }\n const data = options.metadataOnly ? PLACEHOLDER_DATA : block.data;\n const timestamp = block.timestamp / this.internalTrack.segment.timestampFactor;\n const duration = block.duration / this.internalTrack.segment.timestampFactor;\n const sideData = {};\n if (block.mainAdditional && this.internalTrack.info?.type === 'video' && this.internalTrack.info.alphaMode) {\n sideData.alpha = options.metadataOnly ? PLACEHOLDER_DATA : block.mainAdditional;\n sideData.alphaByteLength = block.mainAdditional.byteLength;\n }\n const packet = new EncodedPacket(data, block.isKeyFrame ? 'key' : 'delta', timestamp, duration, cluster.dataStartPos + blockIndex, block.data.byteLength, sideData);\n this.packetToClusterLocation.set(packet, { cluster, blockIndex });\n return packet;\n }\n /** Looks for a packet in the clusters while trying to load as few clusters as possible to retrieve it. */\n async performClusterLookup(\n // The cluster where we start looking\n startCluster, \n // This function returns the best-matching block in a given cluster\n getMatchInCluster, \n // The timestamp with which we can search the lookup table\n searchTimestamp, \n // The timestamp for which we know the correct block will not come after it\n latestTimestamp, options) {\n const { demuxer, segment } = this.internalTrack;\n let currentCluster = null;\n let bestCluster = null;\n let bestBlockIndex = -1;\n if (startCluster) {\n const { blockIndex, correctBlockFound } = getMatchInCluster(startCluster);\n if (correctBlockFound) {\n return this.fetchPacketInCluster(startCluster, blockIndex, options);\n }\n if (blockIndex !== -1) {\n bestCluster = startCluster;\n bestBlockIndex = blockIndex;\n }\n }\n // Search for a cue point; this way, we won't need to start searching from the start of the file\n // but can jump right into the correct cluster (or at least nearby).\n const cuePointIndex = binarySearchLessOrEqual(this.internalTrack.cuePoints, searchTimestamp, x => x.time);\n const cuePoint = cuePointIndex !== -1\n ? this.internalTrack.cuePoints[cuePointIndex]\n : null;\n // Also check the position cache\n const positionCacheIndex = binarySearchLessOrEqual(this.internalTrack.clusterPositionCache, searchTimestamp, x => x.startTimestamp);\n const positionCacheEntry = positionCacheIndex !== -1\n ? this.internalTrack.clusterPositionCache[positionCacheIndex]\n : null;\n const lookupEntryPosition = Math.max(cuePoint?.clusterPosition ?? 0, positionCacheEntry?.elementStartPos ?? 0) || null;\n let currentPos;\n if (!startCluster) {\n currentPos = lookupEntryPosition ?? segment.clusterSeekStartPos;\n }\n else {\n if (lookupEntryPosition === null || startCluster.elementStartPos >= lookupEntryPosition) {\n currentPos = startCluster.elementEndPos;\n currentCluster = startCluster;\n }\n else {\n // Use the lookup entry\n currentPos = lookupEntryPosition;\n }\n }\n while (segment.elementEndPos === null || currentPos <= segment.elementEndPos - MIN_HEADER_SIZE) {\n if (currentCluster) {\n const trackData = currentCluster.trackData.get(this.internalTrack.id);\n if (trackData && trackData.startTimestamp > latestTimestamp) {\n // We're already past the upper bound, no need to keep searching\n break;\n }\n }\n // Load the header\n let slice = demuxer.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 elementStartPos = currentPos;\n const elementHeader = readElementHeader(slice);\n if (!elementHeader\n || (!LEVEL_1_EBML_IDS.includes(elementHeader.id) && elementHeader.id !== EBMLId.Void)) {\n // There's an element here that shouldn't be here. Might be garbage. In this case, let's\n // try and resync to the next valid element.\n const nextPos = await resync(demuxer.reader, elementStartPos, LEVEL_1_EBML_IDS, Math.min(segment.elementEndPos ?? Infinity, elementStartPos + MAX_RESYNC_LENGTH));\n if (nextPos) {\n currentPos = nextPos;\n continue;\n }\n else {\n break; // Resync failed\n }\n }\n const id = elementHeader.id;\n let size = elementHeader.size;\n const dataStartPos = slice.filePos;\n if (id === EBMLId.Cluster) {\n currentCluster = await demuxer.readCluster(elementStartPos, segment);\n // readCluster computes the proper size even if it's undefined in the header, so let's use that instead\n size = currentCluster.elementEndPos - dataStartPos;\n const { blockIndex, correctBlockFound } = getMatchInCluster(currentCluster);\n if (correctBlockFound) {\n return this.fetchPacketInCluster(currentCluster, blockIndex, options);\n }\n if (blockIndex !== -1) {\n bestCluster = currentCluster;\n bestBlockIndex = blockIndex;\n }\n }\n if (size === null) {\n // Undefined element size (can happen in livestreamed files). In this case, we need to do some\n // searching to determine the actual size of the element.\n assert(id !== EBMLId.Cluster); // Undefined cluster sizes are fixed further up\n // Search for the next element at level 0 or 1\n const nextElementPos = await searchForNextElementId(demuxer.reader, dataStartPos, LEVEL_0_AND_1_EBML_IDS, segment.elementEndPos);\n size = nextElementPos.pos - dataStartPos;\n }\n const endPos = dataStartPos + size;\n if (segment.elementEndPos === null) {\n // Check the next element. If it's a new segment, we know this segment ends here. The new\n // segment is just ignored, since we're likely in a livestreamed file and thus only care about\n // the first segment.\n let slice = demuxer.reader.requestSliceRange(endPos, MIN_HEADER_SIZE, MAX_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const elementId = readElementId(slice);\n if (elementId === EBMLId.Segment) {\n segment.elementEndPos = endPos; // We now know the segment's size\n break;\n }\n }\n currentPos = endPos;\n }\n // Catch faulty cue points\n if (cuePoint && (!bestCluster || bestCluster.elementStartPos < cuePoint.clusterPosition)) {\n // The cue point lied to us! We found a cue point but no cluster there that satisfied the match. In this\n // case, let's search again but using the cue point before that.\n const previousCuePoint = this.internalTrack.cuePoints[cuePointIndex - 1];\n assert(!previousCuePoint || previousCuePoint.time < cuePoint.time);\n const newSearchTimestamp = previousCuePoint?.time ?? -Infinity;\n return this.performClusterLookup(null, getMatchInCluster, newSearchTimestamp, latestTimestamp, options);\n }\n if (bestCluster) {\n // If we finished looping but didn't find a perfect match, still return the best match we found\n return this.fetchPacketInCluster(bestCluster, bestBlockIndex, options);\n }\n return null;\n }\n}\nclass MatroskaVideoTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfigPromise = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getCodedWidth() {\n return this.internalTrack.info.width;\n }\n getCodedHeight() {\n return this.internalTrack.info.height;\n }\n getRotation() {\n return this.internalTrack.info.rotation;\n }\n async getColorSpace() {\n return {\n primaries: this.internalTrack.info.colorSpace?.primaries,\n transfer: this.internalTrack.info.colorSpace?.transfer,\n matrix: this.internalTrack.info.colorSpace?.matrix,\n fullRange: this.internalTrack.info.colorSpace?.fullRange,\n };\n }\n async canBeTransparent() {\n return this.internalTrack.info.alphaMode;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfigPromise ??= (async () => {\n let firstPacket = null;\n const needsPacketForAdditionalInfo = this.internalTrack.info.codec === 'vp9'\n || this.internalTrack.info.codec === 'av1'\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'avc' && !this.internalTrack.info.codecDescription)\n // Packets are in Annex B format:\n || (this.internalTrack.info.codec === 'hevc' && !this.internalTrack.info.codecDescription);\n if (needsPacketForAdditionalInfo) {\n firstPacket = await this.getFirstPacket({});\n }\n return {\n codec: extractVideoCodecString({\n width: this.internalTrack.info.width,\n height: this.internalTrack.info.height,\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n colorSpace: this.internalTrack.info.colorSpace,\n avcType: 1, // We don't know better (or do we?) so just assume 'avc1'\n avcCodecInfo: this.internalTrack.info.codec === 'avc' && firstPacket\n ? extractAvcDecoderConfigurationRecord(firstPacket.data)\n : null,\n hevcCodecInfo: this.internalTrack.info.codec === 'hevc' && firstPacket\n ? extractHevcDecoderConfigurationRecord(firstPacket.data)\n : null,\n vp9CodecInfo: this.internalTrack.info.codec === 'vp9' && firstPacket\n ? extractVp9CodecInfoFromPacket(firstPacket.data)\n : null,\n av1CodecInfo: this.internalTrack.info.codec === 'av1' && firstPacket\n ? extractAv1CodecInfoFromPacket(firstPacket.data)\n : null,\n }),\n codedWidth: this.internalTrack.info.width,\n codedHeight: this.internalTrack.info.height,\n description: this.internalTrack.info.codecDescription ?? undefined,\n colorSpace: this.internalTrack.info.colorSpace ?? undefined,\n };\n })();\n }\n}\nclass MatroskaAudioTrackBacking extends MatroskaTrackBacking {\n constructor(internalTrack) {\n super(internalTrack);\n this.decoderConfig = null;\n this.internalTrack = internalTrack;\n }\n getCodec() {\n return this.internalTrack.info.codec;\n }\n getNumberOfChannels() {\n return this.internalTrack.info.numberOfChannels;\n }\n getSampleRate() {\n return this.internalTrack.info.sampleRate;\n }\n async getDecoderConfig() {\n if (!this.internalTrack.info.codec) {\n return null;\n }\n return this.decoderConfig ??= {\n codec: extractAudioCodecString({\n codec: this.internalTrack.info.codec,\n codecDescription: this.internalTrack.info.codecDescription,\n aacCodecInfo: this.internalTrack.info.aacCodecInfo,\n }),\n numberOfChannels: this.internalTrack.info.numberOfChannels,\n sampleRate: this.internalTrack.info.sampleRate,\n description: this.internalTrack.info.codecDescription ?? undefined,\n };\n }\n}\n","/*!\n * Copyright (c) 2025-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) 2025-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 { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { getXingOffset, INFO, XING } from '../../shared/mp3-misc.js';\nimport { ID3_V1_TAG_SIZE, ID3_V2_HEADER_SIZE, parseId3V1Tag, parseId3V2Tag, readId3V2Header, } from '../id3.js';\nimport { readNextFrameHeader } from './mp3-reader.js';\nimport { readAscii, readBytes, readU32Be } from '../reader.js';\nexport class Mp3Demuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos\n this.metadataTags = null;\n this.tracks = [];\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.lastLoadedPos = 0;\n this.nextTimestampInSamples = 0;\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n // Keep loading until we find the first frame header\n while (!this.firstFrameHeader && !this.lastSampleLoaded) {\n await this.advanceReader();\n }\n if (!this.firstFrameHeader) {\n throw new Error('No valid MP3 frame found.');\n }\n this.tracks = [new InputAudioTrack(this.input, new Mp3AudioTrackBacking(this))];\n })();\n }\n async advanceReader() {\n if (this.lastLoadedPos === 0) {\n // Let's skip all ID3v2 tags at the start of the file\n while (true) {\n let slice = this.reader.requestSlice(this.lastLoadedPos, ID3_V2_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n this.lastSampleLoaded = true;\n return;\n }\n const id3V2Header = readId3V2Header(slice);\n if (!id3V2Header) {\n break;\n }\n this.lastLoadedPos = slice.filePos + id3V2Header.size;\n }\n }\n const result = await readNextFrameHeader(this.reader, this.lastLoadedPos, this.reader.fileSize);\n if (!result) {\n this.lastSampleLoaded = true;\n return;\n }\n const header = result.header;\n this.lastLoadedPos = result.startPos + header.totalSize - 1; // -1 in case the frame is 1 byte too short\n const xingOffset = getXingOffset(header.mpegVersionId, header.channel);\n let slice = this.reader.requestSlice(result.startPos + xingOffset, 4);\n if (slice instanceof Promise)\n slice = await slice;\n if (slice) {\n const word = readU32Be(slice);\n const isXing = word === XING || word === INFO;\n if (isXing) {\n // There's no actual audio data in this frame, so let's skip it\n return;\n }\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n if (header.sampleRate !== this.firstFrameHeader.sampleRate) {\n console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${header.sampleRate} Hz.`\n + ` Might be a bug, so please report this file.`);\n }\n const sampleDuration = header.audioSamplesInFrame / this.firstFrameHeader.sampleRate;\n const sample = {\n timestamp: this.nextTimestampInSamples / this.firstFrameHeader.sampleRate,\n duration: sampleDuration,\n dataStart: result.startPos,\n dataSize: header.totalSize,\n };\n this.loadedSamples.push(sample);\n this.nextTimestampInSamples += header.audioSamplesInFrame;\n return;\n }\n async getMimeType() {\n return 'audio/mpeg';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getMetadataTags() {\n const release = await this.readingMutex.acquire();\n try {\n await this.readMetadata();\n if (this.metadataTags) {\n return this.metadataTags;\n }\n this.metadataTags = {};\n let currentPos = 0;\n let id3V2HeaderFound = false;\n while (true) {\n let headerSlice = this.reader.requestSlice(currentPos, ID3_V2_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice)\n break;\n const id3V2Header = readId3V2Header(headerSlice);\n if (!id3V2Header) {\n break;\n }\n id3V2HeaderFound = true;\n let contentSlice = this.reader.requestSlice(headerSlice.filePos, id3V2Header.size);\n if (contentSlice instanceof Promise)\n contentSlice = await contentSlice;\n if (!contentSlice)\n break;\n parseId3V2Tag(contentSlice, id3V2Header, this.metadataTags);\n currentPos = headerSlice.filePos + id3V2Header.size;\n }\n if (!id3V2HeaderFound && this.reader.fileSize !== null && this.reader.fileSize >= ID3_V1_TAG_SIZE) {\n // Try reading an ID3v1 tag at the end of the file\n let slice = this.reader.requestSlice(this.reader.fileSize - ID3_V1_TAG_SIZE, ID3_V1_TAG_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const tag = readAscii(slice, 3);\n if (tag === 'TAG') {\n parseId3V1Tag(slice, this.metadataTags);\n }\n }\n return this.metadataTags;\n }\n finally {\n release();\n }\n }\n}\nclass Mp3AudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate / this.demuxer.firstFrameHeader.audioSamplesInFrame;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'mp3';\n }\n getInternalCodecId() {\n return null;\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n return {\n codec: 'mp3',\n numberOfChannels: this.demuxer.firstFrameHeader.channel === 3 ? 1 : 2,\n sampleRate: this.demuxer.firstFrameHeader.sampleRate,\n };\n }\n async getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const sampleIndex = binarySearchExact(this.demuxer.loadedSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n const nextIndex = sampleIndex + 1;\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const index = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.timestamp);\n if (index === -1 && this.demuxer.loadedSamples.length > 0) {\n // We're before the first sample\n return null;\n }\n if (this.demuxer.lastSampleLoaded) {\n // All data is loaded, return what we found\n return this.getPacketAtIndex(index, options);\n }\n if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) {\n // The next packet also exists, we're done\n return this.getPacketAtIndex(index, options);\n }\n // Otherwise, keep loading data\n await this.demuxer.advanceReader();\n }\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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 FRAME_HEADER_SIZE = 4;\nexport const SAMPLING_RATES = [44100, 48000, 32000];\nexport const KILOBIT_RATES = [\n // lowSamplingFrequency === 0\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // layer = 0\n -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1, // layer 1\n -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1, // layer = 2\n -1, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1, // layer = 3\n // lowSamplingFrequency === 1\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // layer = 0\n -1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1, // layer = 1\n -1, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1, // layer = 2\n -1, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1, // layer = 3\n];\n/** 'Xing' */\nexport const XING = 0x58696e67;\n/** 'Info' */\nexport const INFO = 0x496e666f;\nexport const computeMp3FrameSize = (lowSamplingFrequency, layer, bitrate, sampleRate, padding) => {\n if (layer === 0) {\n return 0; // Not expected that this is hit\n }\n else if (layer === 1) {\n return Math.floor(144 * bitrate / (sampleRate << lowSamplingFrequency)) + padding;\n }\n else if (layer === 2) {\n return Math.floor(144 * bitrate / sampleRate) + padding;\n }\n else { // layer === 3\n return (Math.floor(12 * bitrate / sampleRate) + padding) * 4;\n }\n};\nexport const getXingOffset = (mpegVersionId, channel) => {\n return mpegVersionId === 3\n ? (channel === 3 ? 21 : 36)\n : (channel === 3 ? 13 : 21);\n};\nexport const readFrameHeader = (word, remainingBytes) => {\n const firstByte = word >>> 24;\n const secondByte = (word >>> 16) & 0xff;\n const thirdByte = (word >>> 8) & 0xff;\n const fourthByte = word & 0xff;\n if (firstByte !== 0xff && secondByte !== 0xff && thirdByte !== 0xff && fourthByte !== 0xff) {\n return {\n header: null,\n bytesAdvanced: 4,\n };\n }\n if (firstByte !== 0xff) {\n return { header: null, bytesAdvanced: 1 };\n }\n if ((secondByte & 0xe0) !== 0xe0) {\n return { header: null, bytesAdvanced: 1 };\n }\n let lowSamplingFrequency = 0;\n let mpeg25 = 0;\n if (secondByte & (1 << 4)) {\n lowSamplingFrequency = (secondByte & (1 << 3)) ? 0 : 1;\n }\n else {\n lowSamplingFrequency = 1;\n mpeg25 = 1;\n }\n const mpegVersionId = (secondByte >> 3) & 0x3;\n const layer = (secondByte >> 1) & 0x3;\n const bitrateIndex = (thirdByte >> 4) & 0xf;\n const frequencyIndex = ((thirdByte >> 2) & 0x3) % 3;\n const padding = (thirdByte >> 1) & 0x1;\n const channel = (fourthByte >> 6) & 0x3;\n const modeExtension = (fourthByte >> 4) & 0x3;\n const copyright = (fourthByte >> 3) & 0x1;\n const original = (fourthByte >> 2) & 0x1;\n const emphasis = fourthByte & 0x3;\n const kilobitRate = KILOBIT_RATES[lowSamplingFrequency * 16 * 4 + layer * 16 + bitrateIndex];\n if (kilobitRate === -1) {\n return { header: null, bytesAdvanced: 1 };\n }\n const bitrate = kilobitRate * 1000;\n const sampleRate = SAMPLING_RATES[frequencyIndex] >> (lowSamplingFrequency + mpeg25);\n const frameLength = computeMp3FrameSize(lowSamplingFrequency, layer, bitrate, sampleRate, padding);\n if (remainingBytes !== null && remainingBytes < frameLength) {\n // The frame doesn't fit into the rest of the file\n return { header: null, bytesAdvanced: 1 };\n }\n let audioSamplesInFrame;\n if (mpegVersionId === 3) {\n audioSamplesInFrame = layer === 3 ? 384 : 1152;\n }\n else {\n if (layer === 3) {\n audioSamplesInFrame = 384;\n }\n else if (layer === 2) {\n audioSamplesInFrame = 1152;\n }\n else {\n audioSamplesInFrame = 576;\n }\n }\n return {\n header: {\n totalSize: frameLength,\n mpegVersionId,\n layer,\n bitrate,\n frequencyIndex,\n sampleRate,\n channel,\n modeExtension,\n copyright,\n original,\n emphasis,\n audioSamplesInFrame,\n },\n bytesAdvanced: 1,\n };\n};\nexport const encodeSynchsafe = (unsynchsafed) => {\n let mask = 0x7f;\n let synchsafed = 0;\n let unsynchsafedRest = unsynchsafed;\n while ((mask ^ 0x7fffffff) !== 0) {\n synchsafed = unsynchsafedRest & ~mask;\n synchsafed <<= 1;\n synchsafed |= unsynchsafedRest & mask;\n mask = ((mask + 1) << 8) - 1;\n unsynchsafedRest = synchsafed;\n }\n return synchsafed;\n};\nexport const decodeSynchsafe = (synchsafed) => {\n let mask = 0x7f000000;\n let unsynchsafed = 0;\n while (mask !== 0) {\n unsynchsafed >>= 1;\n unsynchsafed |= synchsafed & mask;\n mask >>= 8;\n }\n return unsynchsafed;\n};\n","/*!\n * Copyright (c) 2025-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 { decodeSynchsafe, encodeSynchsafe } from '../shared/mp3-misc.js';\nimport { coalesceIndex, textDecoder, textEncoder, isIso88591Compatible, assertNever, keyValueIterator, toDataView, } from './misc.js';\nimport { readAscii, readBytes, readU32Be, readU8 } from './reader.js';\nexport var Id3V2HeaderFlags;\n(function (Id3V2HeaderFlags) {\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"Unsynchronisation\"] = 128] = \"Unsynchronisation\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"ExtendedHeader\"] = 64] = \"ExtendedHeader\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"ExperimentalIndicator\"] = 32] = \"ExperimentalIndicator\";\n Id3V2HeaderFlags[Id3V2HeaderFlags[\"Footer\"] = 16] = \"Footer\";\n})(Id3V2HeaderFlags || (Id3V2HeaderFlags = {}));\nexport var Id3V2TextEncoding;\n(function (Id3V2TextEncoding) {\n Id3V2TextEncoding[Id3V2TextEncoding[\"ISO_8859_1\"] = 0] = \"ISO_8859_1\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_16_WITH_BOM\"] = 1] = \"UTF_16_WITH_BOM\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_16_BE_NO_BOM\"] = 2] = \"UTF_16_BE_NO_BOM\";\n Id3V2TextEncoding[Id3V2TextEncoding[\"UTF_8\"] = 3] = \"UTF_8\";\n})(Id3V2TextEncoding || (Id3V2TextEncoding = {}));\nexport const ID3_V1_TAG_SIZE = 128;\nexport const ID3_V2_HEADER_SIZE = 10;\nexport const ID3_V1_GENRES = [\n 'Blues', 'Classic rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-hop', 'Jazz',\n 'Metal', 'New age', 'Oldies', 'Other', 'Pop', 'Rhythm and blues', 'Rap', 'Reggae', 'Rock',\n 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death metal', 'Pranks', 'Soundtrack',\n 'Euro-techno', 'Ambient', 'Trip-hop', 'Vocal', 'Jazz & funk', 'Fusion', 'Trance', 'Classical',\n 'Instrumental', 'Acid', 'House', 'Game', 'Sound clip', 'Gospel', 'Noise', 'Alternative rock',\n 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental pop', 'Instrumental rock',\n 'Ethnic', 'Gothic', 'Darkwave', 'Techno-industrial', 'Electronic', 'Pop-folk', 'Eurodance',\n 'Dream', 'Southern rock', 'Comedy', 'Cult', 'Gangsta', 'Top 40', 'Christian rap', 'Pop/funk',\n 'Jungle music', 'Native US', 'Cabaret', 'New wave', 'Psychedelic', 'Rave', 'Showtunes',\n 'Trailer', 'Lo-fi', 'Tribal', 'Acid punk', 'Acid jazz', 'Polka', 'Retro', 'Musical',\n 'Rock \\'n\\' roll', 'Hard rock', 'Folk', 'Folk rock', 'National folk', 'Swing', 'Fast fusion',\n 'Bebop', 'Latin', 'Revival', 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic rock',\n 'Progressive rock', 'Psychedelic rock', 'Symphonic rock', 'Slow rock', 'Big band', 'Chorus',\n 'Easy listening', 'Acoustic', 'Humour', 'Speech', 'Chanson', 'Opera', 'Chamber music',\n 'Sonata', 'Symphony', 'Booty bass', 'Primus', 'Porn groove', 'Satire', 'Slow jam', 'Club',\n 'Tango', 'Samba', 'Folklore', 'Ballad', 'Power ballad', 'Rhythmic Soul', 'Freestyle', 'Duet',\n 'Punk rock', 'Drum solo', 'A cappella', 'Euro-house', 'Dance hall', 'Goa music', 'Drum & bass',\n 'Club-house', 'Hardcore techno', 'Terror', 'Indie', 'Britpop', 'Negerpunk', 'Polsk punk',\n 'Beat', 'Christian gangsta rap', 'Heavy metal', 'Black metal', 'Crossover',\n 'Contemporary Christian', 'Christian rock', 'Merengue', 'Salsa', 'Thrash metal', 'Anime',\n 'Jpop', 'Synthpop', 'Christmas', 'Art rock', 'Baroque', 'Bhangra', 'Big beat', 'Breakbeat',\n 'Chillout', 'Downtempo', 'Dub', 'EBM', 'Eclectic', 'Electro', 'Electroclash', 'Emo',\n 'Experimental', 'Garage', 'Global', 'IDM', 'Illbient', 'Industro-Goth', 'Jam Band',\n 'Krautrock', 'Leftfield', 'Lounge', 'Math rock', 'New romantic', 'Nu-breakz', 'Post-punk',\n 'Post-rock', 'Psytrance', 'Shoegaze', 'Space rock', 'Trop rock', 'World music', 'Neoclassical',\n 'Audiobook', 'Audio theatre', 'Neue Deutsche Welle', 'Podcast', 'Indie rock', 'G-Funk',\n 'Dubstep', 'Garage rock', 'Psybient',\n];\nexport const parseId3V1Tag = (slice, tags) => {\n const startPos = slice.filePos;\n tags.raw ??= {};\n tags.raw['TAG'] ??= readBytes(slice, ID3_V1_TAG_SIZE - 3); // Dump the whole tag into the raw metadata\n slice.filePos = startPos;\n const title = readId3V1String(slice, 30);\n if (title)\n tags.title ??= title;\n const artist = readId3V1String(slice, 30);\n if (artist)\n tags.artist ??= artist;\n const album = readId3V1String(slice, 30);\n if (album)\n tags.album ??= album;\n const yearText = readId3V1String(slice, 4);\n const year = Number.parseInt(yearText, 10);\n if (Number.isInteger(year) && year > 0) {\n tags.date ??= new Date(year, 0, 1);\n }\n const commentBytes = readBytes(slice, 30);\n let comment;\n // Check for the ID3v1.1 track number format:\n // The 29th byte (index 28) is a null terminator, and the 30th byte is the track number.\n if (commentBytes[28] === 0 && commentBytes[29] !== 0) {\n const trackNum = commentBytes[29];\n if (trackNum > 0) {\n tags.trackNumber ??= trackNum;\n }\n slice.skip(-30);\n comment = readId3V1String(slice, 28);\n slice.skip(2);\n }\n else {\n slice.skip(-30);\n comment = readId3V1String(slice, 30);\n }\n if (comment)\n tags.comment ??= comment;\n const genreIndex = readU8(slice);\n if (genreIndex < ID3_V1_GENRES.length) {\n tags.genre ??= ID3_V1_GENRES[genreIndex];\n }\n};\nexport const readId3V1String = (slice, length) => {\n const bytes = readBytes(slice, length);\n const endIndex = coalesceIndex(bytes.indexOf(0), bytes.length);\n const relevantBytes = bytes.subarray(0, endIndex);\n // Decode as ISO-8859-1\n let str = '';\n for (let i = 0; i < relevantBytes.length; i++) {\n str += String.fromCharCode(relevantBytes[i]);\n }\n return str.trimEnd(); // String also may be padded with spaces\n};\nexport const readId3V2Header = (slice) => {\n const startPos = slice.filePos;\n const tag = readAscii(slice, 3);\n const majorVersion = readU8(slice);\n const revision = readU8(slice);\n const flags = readU8(slice);\n const sizeRaw = readU32Be(slice);\n if (tag !== 'ID3' || majorVersion === 0xff || revision === 0xff || (sizeRaw & 0x80808080) !== 0) {\n slice.filePos = startPos;\n return null;\n }\n const size = decodeSynchsafe(sizeRaw);\n return { majorVersion, revision, flags, size };\n};\nexport const parseId3V2Tag = (slice, header, tags) => {\n // https://id3.org/id3v2.3.0\n if (![2, 3, 4].includes(header.majorVersion)) {\n console.warn(`Unsupported ID3v2 major version: ${header.majorVersion}`);\n return;\n }\n const bytes = readBytes(slice, header.size);\n const reader = new Id3V2Reader(header, bytes);\n if (header.flags & Id3V2HeaderFlags.Footer) {\n reader.removeFooter();\n }\n if ((header.flags & Id3V2HeaderFlags.Unsynchronisation) && header.majorVersion === 3) {\n reader.ununsynchronizeAll();\n }\n if (header.flags & Id3V2HeaderFlags.ExtendedHeader) {\n const extendedHeaderSize = reader.readU32();\n if (header.majorVersion === 3) {\n reader.pos += extendedHeaderSize; // The extended header size excludes itself\n }\n else {\n reader.pos += extendedHeaderSize - 4; // The extended header size includes itself\n }\n }\n while (reader.pos <= reader.bytes.length - reader.frameHeaderSize()) {\n const frame = reader.readId3V2Frame();\n if (!frame) {\n break;\n }\n const frameStartPos = reader.pos;\n const frameEndPos = reader.pos + frame.size;\n let frameEncrypted = false;\n let frameCompressed = false;\n let frameUnsynchronized = false;\n if (header.majorVersion === 3) {\n frameEncrypted = !!(frame.flags & (1 << 6));\n frameCompressed = !!(frame.flags & (1 << 7));\n }\n else if (header.majorVersion === 4) {\n frameEncrypted = !!(frame.flags & (1 << 2));\n frameCompressed = !!(frame.flags & (1 << 3));\n frameUnsynchronized = !!(frame.flags & (1 << 1))\n || !!(header.flags & Id3V2HeaderFlags.Unsynchronisation);\n }\n if (frameEncrypted) {\n console.warn(`Skipping encrypted ID3v2 frame ${frame.id}`);\n reader.pos = frameEndPos;\n continue;\n }\n if (frameCompressed) {\n console.warn(`Skipping compressed ID3v2 frame ${frame.id}`); // Maybe someday? Idk\n reader.pos = frameEndPos;\n continue;\n }\n if (frameUnsynchronized) {\n reader.ununsynchronizeRegion(reader.pos, frameEndPos);\n }\n tags.raw ??= {};\n if (frame.id[0] === 'T') {\n // It's a text frame, let's decode as text\n tags.raw[frame.id] ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n else {\n // For the others, let's just get the bytes\n tags.raw[frame.id] ??= reader.readBytes(frame.size);\n }\n reader.pos = frameStartPos;\n switch (frame.id) {\n case 'TIT2':\n case 'TT2':\n {\n tags.title ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TIT3':\n case 'TT3':\n {\n tags.description ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TPE1':\n case 'TP1':\n {\n tags.artist ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TALB':\n case 'TAL':\n {\n tags.album ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TPE2':\n case 'TP2':\n {\n tags.albumArtist ??= reader.readId3V2EncodingAndText(frameEndPos);\n }\n ;\n break;\n case 'TRCK':\n case 'TRK':\n {\n const trackText = reader.readId3V2EncodingAndText(frameEndPos);\n const parts = trackText.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 tags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n tags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'TPOS':\n case 'TPA':\n {\n const discText = reader.readId3V2EncodingAndText(frameEndPos);\n const parts = discText.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 tags.discNumber ??= discNum;\n }\n if (discsTotal && Number.isInteger(discsTotal) && discsTotal > 0) {\n tags.discsTotal ??= discsTotal;\n }\n }\n ;\n break;\n case 'TCON':\n case 'TCO':\n {\n const genreText = reader.readId3V2EncodingAndText(frameEndPos);\n let match = /^\\((\\d+)\\)/.exec(genreText);\n if (match) {\n const genreNumber = Number.parseInt(match[1]);\n if (ID3_V1_GENRES[genreNumber] !== undefined) {\n tags.genre ??= ID3_V1_GENRES[genreNumber];\n break;\n }\n }\n match = /^\\d+$/.exec(genreText);\n if (match) {\n const genreNumber = Number.parseInt(match[0]);\n if (ID3_V1_GENRES[genreNumber] !== undefined) {\n tags.genre ??= ID3_V1_GENRES[genreNumber];\n break;\n }\n }\n tags.genre ??= genreText;\n }\n ;\n break;\n case 'TDRC':\n case 'TDAT':\n {\n const dateText = reader.readId3V2EncodingAndText(frameEndPos);\n const date = new Date(dateText);\n if (!Number.isNaN(date.getTime())) {\n tags.date ??= date;\n }\n }\n ;\n break;\n case 'TYER':\n case 'TYE':\n {\n const yearText = reader.readId3V2EncodingAndText(frameEndPos);\n const year = Number.parseInt(yearText, 10);\n if (Number.isInteger(year)) {\n tags.date ??= new Date(year, 0, 1);\n }\n }\n ;\n break;\n case 'USLT':\n case 'ULT':\n {\n const encoding = reader.readU8();\n reader.pos += 3; // Skip language\n reader.readId3V2Text(encoding, frameEndPos); // Short content description\n tags.lyrics ??= reader.readId3V2Text(encoding, frameEndPos);\n }\n ;\n break;\n case 'COMM':\n case 'COM':\n {\n const encoding = reader.readU8();\n reader.pos += 3; // Skip language\n reader.readId3V2Text(encoding, frameEndPos); // Short content description\n tags.comment ??= reader.readId3V2Text(encoding, frameEndPos);\n }\n ;\n break;\n case 'APIC':\n case 'PIC':\n {\n const encoding = reader.readId3V2TextEncoding();\n let mimeType;\n if (header.majorVersion === 2) {\n const imageFormat = reader.readAscii(3);\n mimeType = imageFormat === 'PNG'\n ? 'image/png'\n : imageFormat === 'JPG'\n ? 'image/jpeg'\n : 'image/*';\n }\n else {\n mimeType = reader.readId3V2Text(encoding, frameEndPos);\n }\n const pictureType = reader.readU8();\n const description = reader.readId3V2Text(encoding, frameEndPos).trimEnd(); // Trim ending spaces\n const imageDataSize = frameEndPos - reader.pos;\n if (imageDataSize >= 0) {\n const imageData = reader.readBytes(imageDataSize);\n if (!tags.images)\n tags.images = [];\n tags.images.push({\n data: imageData,\n mimeType,\n kind: pictureType === 3\n ? 'coverFront'\n : pictureType === 4\n ? 'coverBack'\n : 'unknown',\n description,\n });\n }\n }\n ;\n break;\n default:\n {\n reader.pos += frame.size;\n }\n ;\n break;\n }\n reader.pos = frameEndPos;\n }\n};\n// https://id3.org/id3v2.3.0\nexport class Id3V2Reader {\n constructor(header, bytes) {\n this.header = header;\n this.bytes = bytes;\n this.pos = 0;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n frameHeaderSize() {\n return this.header.majorVersion === 2 ? 6 : 10;\n }\n ununsynchronizeAll() {\n const newBytes = [];\n for (let i = 0; i < this.bytes.length; i++) {\n const value1 = this.bytes[i];\n newBytes.push(value1);\n if (value1 === 0xff && i !== this.bytes.length - 1) {\n const value2 = this.bytes[i];\n if (value2 === 0x00) {\n i++;\n }\n }\n }\n this.bytes = new Uint8Array(newBytes);\n this.view = new DataView(this.bytes.buffer);\n }\n ununsynchronizeRegion(start, end) {\n const newBytes = [];\n for (let i = start; i < end; i++) {\n const value1 = this.bytes[i];\n newBytes.push(value1);\n if (value1 === 0xff && i !== end - 1) {\n const value2 = this.bytes[i + 1];\n if (value2 === 0x00) {\n i++;\n }\n }\n }\n const before = this.bytes.subarray(0, start);\n const after = this.bytes.subarray(end);\n this.bytes = new Uint8Array(before.length + newBytes.length + after.length);\n this.bytes.set(before, 0);\n this.bytes.set(newBytes, before.length);\n this.bytes.set(after, before.length + newBytes.length);\n this.view = new DataView(this.bytes.buffer);\n }\n removeFooter() {\n this.bytes = this.bytes.subarray(0, this.bytes.length - ID3_V2_HEADER_SIZE);\n this.view = new DataView(this.bytes.buffer);\n }\n readBytes(length) {\n const slice = this.bytes.subarray(this.pos, this.pos + length);\n this.pos += length;\n return slice;\n }\n readU8() {\n const value = this.view.getUint8(this.pos);\n this.pos += 1;\n return value;\n }\n readU16() {\n const value = this.view.getUint16(this.pos, false);\n this.pos += 2;\n return value;\n }\n readU24() {\n const high = this.view.getUint16(this.pos, false);\n const low = this.view.getUint8(this.pos + 1);\n this.pos += 3;\n return high * 0x100 + low;\n }\n readU32() {\n const value = this.view.getUint32(this.pos, false);\n this.pos += 4;\n return value;\n }\n readAscii(length) {\n let str = '';\n for (let i = 0; i < length; i++) {\n str += String.fromCharCode(this.view.getUint8(this.pos + i));\n }\n this.pos += length;\n return str;\n }\n readId3V2Frame() {\n if (this.header.majorVersion === 2) {\n const id = this.readAscii(3);\n if (id === '\\x00\\x00\\x00') {\n return null;\n }\n const size = this.readU24();\n return { id, size, flags: 0 };\n }\n else {\n const id = this.readAscii(4);\n if (id === '\\x00\\x00\\x00\\x00') {\n // We've landed in the padding section\n return null;\n }\n const sizeRaw = this.readU32();\n let size = this.header.majorVersion === 4\n ? decodeSynchsafe(sizeRaw)\n : sizeRaw;\n const flags = this.readU16();\n const headerEndPos = this.pos;\n // Some files may have incorrectly synchsafed/unsynchsafed sizes. To validate which interpretation is valid,\n // we validate a size by skipping ahead and seeing if we land at a valid frame header (or at the end of the\n // tag.\n const isSizeValid = (size) => {\n const nextPos = this.pos + size;\n if (nextPos > this.bytes.length) {\n return false;\n }\n if (nextPos <= this.bytes.length - this.frameHeaderSize()) {\n this.pos += size;\n const nextId = this.readAscii(4);\n if (nextId !== '\\x00\\x00\\x00\\x00' && !/[0-9A-Z]{4}/.test(nextId)) {\n return false;\n }\n }\n return true;\n };\n if (!isSizeValid(size)) {\n // Flip the synchsafing, and try if this one makes more sense\n const otherSize = this.header.majorVersion === 4\n ? sizeRaw\n : decodeSynchsafe(sizeRaw);\n if (isSizeValid(otherSize)) {\n size = otherSize;\n }\n }\n this.pos = headerEndPos;\n return { id, size, flags };\n }\n }\n readId3V2TextEncoding() {\n const number = this.readU8();\n if (number > 3) {\n throw new Error(`Unsupported text encoding: ${number}`);\n }\n return number;\n }\n readId3V2Text(encoding, until) {\n const startPos = this.pos;\n const data = this.readBytes(until - this.pos);\n switch (encoding) {\n case Id3V2TextEncoding.ISO_8859_1: {\n let str = '';\n for (let i = 0; i < data.length; i++) {\n const value = data[i];\n if (value === 0) {\n this.pos = startPos + i + 1;\n break;\n }\n str += String.fromCharCode(value);\n }\n return str;\n }\n case Id3V2TextEncoding.UTF_16_WITH_BOM: {\n if (data[0] === 0xff && data[1] === 0xfe) {\n const decoder = new TextDecoder('utf-16le');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(2, endIndex));\n }\n else if (data[0] === 0xfe && data[1] === 0xff) {\n const decoder = new TextDecoder('utf-16be');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(2, endIndex));\n }\n else {\n // Treat it like UTF-8, some files do this\n const endIndex = coalesceIndex(data.findIndex(x => x === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 1, data.length);\n return textDecoder.decode(data.subarray(0, endIndex));\n }\n }\n case Id3V2TextEncoding.UTF_16_BE_NO_BOM: {\n const decoder = new TextDecoder('utf-16be');\n const endIndex = coalesceIndex(data.findIndex((x, i) => x === 0 && data[i + 1] === 0 && i % 2 === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 2, data.length);\n return decoder.decode(data.subarray(0, endIndex));\n }\n case Id3V2TextEncoding.UTF_8: {\n const endIndex = coalesceIndex(data.findIndex(x => x === 0), data.length);\n this.pos = startPos + Math.min(endIndex + 1, data.length);\n return textDecoder.decode(data.subarray(0, endIndex));\n }\n }\n }\n readId3V2EncodingAndText(until) {\n if (this.pos >= until) {\n return '';\n }\n const encoding = this.readId3V2TextEncoding();\n return this.readId3V2Text(encoding, until);\n }\n}\nexport class Id3V2Writer {\n constructor(writer) {\n this.helper = new Uint8Array(8);\n this.helperView = toDataView(this.helper);\n this.writer = writer;\n }\n writeId3V2Tag(metadata) {\n const tagStartPos = this.writer.getPos();\n // Write ID3v2.4 header\n this.writeAscii('ID3');\n this.writeU8(0x04); // Version 2.4\n this.writeU8(0x00); // Revision 0\n this.writeU8(0x00); // Flags\n this.writeSynchsafeU32(0); // Size placeholder\n const framesStartPos = this.writer.getPos();\n const writtenTags = new Set();\n // Write all metadata frames\n for (const { key, value } of keyValueIterator(metadata)) {\n switch (key) {\n case 'title':\n {\n this.writeId3V2TextFrame('TIT2', value);\n writtenTags.add('TIT2');\n }\n ;\n break;\n case 'description':\n {\n this.writeId3V2TextFrame('TIT3', value);\n writtenTags.add('TIT3');\n }\n ;\n break;\n case 'artist':\n {\n this.writeId3V2TextFrame('TPE1', value);\n writtenTags.add('TPE1');\n }\n ;\n break;\n case 'album':\n {\n this.writeId3V2TextFrame('TALB', value);\n writtenTags.add('TALB');\n }\n ;\n break;\n case 'albumArtist':\n {\n this.writeId3V2TextFrame('TPE2', value);\n writtenTags.add('TPE2');\n }\n ;\n break;\n case 'trackNumber':\n {\n const string = metadata.tracksTotal !== undefined\n ? `${value}/${metadata.tracksTotal}`\n : value.toString();\n this.writeId3V2TextFrame('TRCK', string);\n writtenTags.add('TRCK');\n }\n ;\n break;\n case 'discNumber':\n {\n const string = metadata.discsTotal !== undefined\n ? `${value}/${metadata.discsTotal}`\n : value.toString();\n this.writeId3V2TextFrame('TPOS', string);\n writtenTags.add('TPOS');\n }\n ;\n break;\n case 'genre':\n {\n this.writeId3V2TextFrame('TCON', value);\n writtenTags.add('TCON');\n }\n ;\n break;\n case 'date':\n {\n this.writeId3V2TextFrame('TDRC', value.toISOString().slice(0, 10));\n writtenTags.add('TDRC');\n }\n ;\n break;\n case 'lyrics':\n {\n this.writeId3V2LyricsFrame(value);\n writtenTags.add('USLT');\n }\n ;\n break;\n case 'comment':\n {\n this.writeId3V2CommentFrame(value);\n writtenTags.add('COMM');\n }\n ;\n break;\n case 'images':\n {\n const pictureTypeMap = { coverFront: 0x03, coverBack: 0x04, unknown: 0x00 };\n for (const image of value) {\n const pictureType = pictureTypeMap[image.kind] ?? 0x00;\n const description = image.description ?? '';\n this.writeId3V2ApicFrame(image.mimeType, pictureType, description, image.data);\n }\n }\n ;\n break;\n case 'tracksTotal':\n case 'discsTotal':\n {\n // Handled with trackNumber and discNumber respectively\n }\n ;\n break;\n case 'raw':\n {\n // Handled later\n }\n ;\n break;\n default: {\n assertNever(key);\n }\n }\n }\n if (metadata.raw) {\n for (const key in metadata.raw) {\n const value = metadata.raw[key];\n if (value == null || key.length !== 4 || writtenTags.has(key)) {\n continue;\n }\n let bytes;\n if (typeof value === 'string') {\n const encoded = textEncoder.encode(value);\n bytes = new Uint8Array(encoded.byteLength + 2);\n bytes[0] = Id3V2TextEncoding.UTF_8;\n bytes.set(encoded, 1);\n // Last byte is the null terminator\n }\n else if (value instanceof Uint8Array) {\n bytes = value;\n }\n else {\n continue;\n }\n this.writeAscii(key);\n this.writeSynchsafeU32(bytes.byteLength);\n this.writeU16(0x0000);\n this.writer.write(bytes);\n }\n }\n const framesEndPos = this.writer.getPos();\n const framesSize = framesEndPos - framesStartPos;\n // Update the size field in the header (synchsafe)\n this.writer.seek(tagStartPos + 6); // Skip 'ID3' + version + revision + flags\n this.writeSynchsafeU32(framesSize);\n this.writer.seek(framesEndPos);\n return framesSize + 10; // +10 for the header size\n }\n writeU8(value) {\n this.helper[0] = value;\n this.writer.write(this.helper.subarray(0, 1));\n }\n writeU16(value) {\n this.helperView.setUint16(0, value, false);\n this.writer.write(this.helper.subarray(0, 2));\n }\n writeU32(value) {\n this.helperView.setUint32(0, value, false);\n this.writer.write(this.helper.subarray(0, 4));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n this.helper[i] = text.charCodeAt(i);\n }\n this.writer.write(this.helper.subarray(0, text.length));\n }\n writeSynchsafeU32(value) {\n this.writeU32(encodeSynchsafe(value));\n }\n writeIsoString(text) {\n const bytes = new Uint8Array(text.length + 1);\n for (let i = 0; i < text.length; i++) {\n bytes[i] = text.charCodeAt(i);\n }\n bytes[text.length] = 0x00;\n this.writer.write(bytes);\n }\n writeUtf8String(text) {\n const utf8Data = textEncoder.encode(text);\n this.writer.write(utf8Data);\n this.writeU8(0x00);\n }\n writeId3V2TextFrame(frameId, text) {\n const useIso88591 = isIso88591Compatible(text);\n const textDataLength = useIso88591 ? text.length : textEncoder.encode(text).byteLength;\n const frameSize = 1 + textDataLength + 1;\n this.writeAscii(frameId);\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n if (useIso88591) {\n this.writeIsoString(text);\n }\n else {\n this.writeUtf8String(text);\n }\n }\n writeId3V2LyricsFrame(lyrics) {\n const useIso88591 = isIso88591Compatible(lyrics);\n const shortDescription = '';\n const frameSize = 1 + 3 + shortDescription.length + 1 + lyrics.length + 1;\n this.writeAscii('USLT');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n this.writeAscii('und');\n if (useIso88591) {\n this.writeIsoString(shortDescription);\n this.writeIsoString(lyrics);\n }\n else {\n this.writeUtf8String(shortDescription);\n this.writeUtf8String(lyrics);\n }\n }\n writeId3V2CommentFrame(comment) {\n const useIso88591 = isIso88591Compatible(comment);\n const textDataLength = useIso88591 ? comment.length : textEncoder.encode(comment).byteLength;\n const shortDescription = '';\n const frameSize = 1 + 3 + shortDescription.length + 1 + textDataLength + 1;\n this.writeAscii('COMM');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n this.writeU8(0x75); // 'u'\n this.writeU8(0x6E); // 'n'\n this.writeU8(0x64); // 'd'\n if (useIso88591) {\n this.writeIsoString(shortDescription);\n this.writeIsoString(comment);\n }\n else {\n this.writeUtf8String(shortDescription);\n this.writeUtf8String(comment);\n }\n }\n writeId3V2ApicFrame(mimeType, pictureType, description, imageData) {\n const useIso88591 = isIso88591Compatible(mimeType) && isIso88591Compatible(description);\n const descriptionDataLength = useIso88591\n ? description.length\n : textEncoder.encode(description).byteLength;\n const frameSize = 1 + mimeType.length + 1 + 1 + descriptionDataLength + 1 + imageData.byteLength;\n this.writeAscii('APIC');\n this.writeSynchsafeU32(frameSize);\n this.writeU16(0x0000);\n this.writeU8(useIso88591 ? Id3V2TextEncoding.ISO_8859_1 : Id3V2TextEncoding.UTF_8);\n if (useIso88591) {\n this.writeIsoString(mimeType);\n }\n else {\n this.writeUtf8String(mimeType);\n }\n this.writeU8(pictureType);\n if (useIso88591) {\n this.writeIsoString(description);\n }\n else {\n this.writeUtf8String(description);\n }\n this.writer.write(imageData);\n }\n}\n","/*!\n * Copyright (c) 2025-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 { FRAME_HEADER_SIZE, readFrameHeader } from '../../shared/mp3-misc.js';\nimport { readU32Be } from '../reader.js';\nexport const readNextFrameHeader = async (reader, startPos, until) => {\n let currentPos = startPos;\n while (until === null || currentPos < until) {\n let slice = reader.requestSlice(currentPos, FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const word = readU32Be(slice);\n const result = readFrameHeader(word, reader.fileSize !== null ? reader.fileSize - currentPos : null);\n if (result.header) {\n return { header: result.header, startPos: currentPos };\n }\n currentPos += result.bytesAdvanced;\n }\n return null;\n};\n","/*!\n * Copyright (c) 2025-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 { OPUS_SAMPLE_RATE } from '../codec.js';\nimport { parseModesFromVorbisSetupPacket, parseOpusIdentificationHeader, readVorbisComments } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, AsyncMutex, binarySearchLessOrEqual, findLast, last, roundIfAlmostInteger, toDataView, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes } from '../reader.js';\nimport { buildOggMimeType, computeOggPageCrc, extractSampleMetadata } from './ogg-misc.js';\nimport { findNextPageHeader, MAX_PAGE_HEADER_SIZE, MAX_PAGE_SIZE, MIN_PAGE_HEADER_SIZE, readPageHeader, } from './ogg-reader.js';\nexport class OggDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.bitstreams = [];\n this.tracks = [];\n this.metadataTags = {};\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n let currentPos = 0;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const page = readPageHeader(slice);\n if (!page) {\n break;\n }\n const isBos = !!(page.headerType & 0x02);\n if (!isBos) {\n // All bos pages for all bitstreams are required to be at the start, so if the page is not bos then\n // we know we've seen all bitstreams (minus chaining)\n break;\n }\n this.bitstreams.push({\n serialNumber: page.serialNumber,\n bosPage: page,\n description: null,\n numberOfChannels: -1,\n sampleRate: -1,\n codecInfo: {\n codec: null,\n vorbisInfo: null,\n opusInfo: null,\n },\n lastMetadataPacket: null,\n });\n currentPos = page.headerStartPos + page.totalSize;\n }\n for (const bitstream of this.bitstreams) {\n const firstPacket = await this.readPacket(bitstream.bosPage, 0);\n if (!firstPacket) {\n continue;\n }\n if (\n // Check for Vorbis\n firstPacket.data.byteLength >= 7\n && firstPacket.data[0] === 0x01 // Packet type 1 = identification header\n && firstPacket.data[1] === 0x76 // 'v'\n && firstPacket.data[2] === 0x6f // 'o'\n && firstPacket.data[3] === 0x72 // 'r'\n && firstPacket.data[4] === 0x62 // 'b'\n && firstPacket.data[5] === 0x69 // 'i'\n && firstPacket.data[6] === 0x73 // 's'\n ) {\n await this.readVorbisMetadata(firstPacket, bitstream);\n }\n else if (\n // Check for Opus\n firstPacket.data.byteLength >= 8\n && firstPacket.data[0] === 0x4f // 'O'\n && firstPacket.data[1] === 0x70 // 'p'\n && firstPacket.data[2] === 0x75 // 'u'\n && firstPacket.data[3] === 0x73 // 's'\n && firstPacket.data[4] === 0x48 // 'H'\n && firstPacket.data[5] === 0x65 // 'e'\n && firstPacket.data[6] === 0x61 // 'a'\n && firstPacket.data[7] === 0x64 // 'd'\n ) {\n await this.readOpusMetadata(firstPacket, bitstream);\n }\n if (bitstream.codecInfo.codec !== null) {\n this.tracks.push(new InputAudioTrack(this.input, new OggAudioTrackBacking(bitstream, this)));\n }\n }\n })();\n }\n async readVorbisMetadata(firstPacket, bitstream) {\n let nextPacketPosition = await this.findNextPacketStart(firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n nextPacketPosition = await this.findNextPacketStart(secondPacket);\n if (!nextPacketPosition) {\n return;\n }\n const thirdPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!thirdPacket) {\n return;\n }\n if (secondPacket.data[0] !== 0x03 || thirdPacket.data[0] !== 0x05) {\n return;\n }\n const lacingValues = [];\n const addBytesToSegmentTable = (bytes) => {\n while (true) {\n lacingValues.push(Math.min(255, bytes));\n if (bytes < 255) {\n break;\n }\n bytes -= 255;\n }\n };\n addBytesToSegmentTable(firstPacket.data.length);\n addBytesToSegmentTable(secondPacket.data.length);\n // We don't add the last packet to the segment table, as it is assumed to be whatever bytes remain\n const description = new Uint8Array(1 + lacingValues.length\n + firstPacket.data.length + secondPacket.data.length + thirdPacket.data.length);\n description[0] = 2; // Num entries in the segment table\n description.set(lacingValues, 1);\n description.set(firstPacket.data, 1 + lacingValues.length);\n description.set(secondPacket.data, 1 + lacingValues.length + firstPacket.data.length);\n description.set(thirdPacket.data, 1 + lacingValues.length + firstPacket.data.length + secondPacket.data.length);\n bitstream.codecInfo.codec = 'vorbis';\n bitstream.description = description;\n bitstream.lastMetadataPacket = thirdPacket;\n const view = toDataView(firstPacket.data);\n bitstream.numberOfChannels = view.getUint8(11);\n bitstream.sampleRate = view.getUint32(12, true);\n const blockSizeByte = view.getUint8(28);\n bitstream.codecInfo.vorbisInfo = {\n blocksizes: [\n 1 << (blockSizeByte & 0xf),\n 1 << (blockSizeByte >> 4),\n ],\n modeBlockflags: parseModesFromVorbisSetupPacket(thirdPacket.data).modeBlockflags,\n };\n readVorbisComments(secondPacket.data.subarray(7), this.metadataTags); // Skip header type and 'vorbis'\n }\n async readOpusMetadata(firstPacket, bitstream) {\n // From https://datatracker.ietf.org/doc/html/rfc7845#section-5:\n // \"An Ogg Opus logical stream contains exactly two mandatory header packets: an identification header and a\n // comment header.\"\n const nextPacketPosition = await this.findNextPacketStart(firstPacket);\n if (!nextPacketPosition) {\n return;\n }\n const secondPacket = await this.readPacket(nextPacketPosition.startPage, nextPacketPosition.startSegmentIndex);\n if (!secondPacket) {\n return;\n }\n bitstream.codecInfo.codec = 'opus';\n bitstream.description = firstPacket.data;\n bitstream.lastMetadataPacket = secondPacket;\n const header = parseOpusIdentificationHeader(firstPacket.data);\n bitstream.numberOfChannels = header.outputChannelCount;\n bitstream.sampleRate = OPUS_SAMPLE_RATE; // Always the same\n bitstream.codecInfo.opusInfo = {\n preSkip: header.preSkip,\n };\n readVorbisComments(secondPacket.data.subarray(8), this.metadataTags); // Skip 'OpusTags'\n }\n async readPacket(startPage, startSegmentIndex) {\n assert(startSegmentIndex < startPage.lacingValues.length);\n let startDataOffset = 0;\n for (let i = 0; i < startSegmentIndex; i++) {\n startDataOffset += startPage.lacingValues[i];\n }\n let currentPage = startPage;\n let currentDataOffset = startDataOffset;\n let currentSegmentIndex = startSegmentIndex;\n const chunks = [];\n outer: while (true) {\n // Load the entire page data\n let pageSlice = this.reader.requestSlice(currentPage.dataStartPos, currentPage.dataSize);\n if (pageSlice instanceof Promise)\n pageSlice = await pageSlice;\n assert(pageSlice);\n const pageData = readBytes(pageSlice, currentPage.dataSize);\n while (true) {\n if (currentSegmentIndex === currentPage.lacingValues.length) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break;\n }\n const lacingValue = currentPage.lacingValues[currentSegmentIndex];\n currentDataOffset += lacingValue;\n if (lacingValue < 255) {\n chunks.push(pageData.subarray(startDataOffset, currentDataOffset));\n break outer;\n }\n currentSegmentIndex++;\n }\n // The packet extends to the next page; let's find it\n let currentPos = currentPage.headerStartPos + currentPage.totalSize;\n while (true) {\n let headerSlice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n if (!headerSlice) {\n return null;\n }\n const nextPage = readPageHeader(headerSlice);\n if (!nextPage) {\n return null;\n }\n currentPage = nextPage;\n if (currentPage.serialNumber === startPage.serialNumber) {\n break;\n }\n currentPos = currentPage.headerStartPos + currentPage.totalSize;\n }\n startDataOffset = 0;\n currentDataOffset = 0;\n currentSegmentIndex = 0;\n }\n const totalPacketSize = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const packetData = new Uint8Array(totalPacketSize);\n let offset = 0;\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n packetData.set(chunk, offset);\n offset += chunk.length;\n }\n return {\n data: packetData,\n endPage: currentPage,\n endSegmentIndex: currentSegmentIndex,\n };\n }\n async findNextPacketStart(lastPacket) {\n // If there's another segment in the same page, return it\n if (lastPacket.endSegmentIndex < lastPacket.endPage.lacingValues.length - 1) {\n return { startPage: lastPacket.endPage, startSegmentIndex: lastPacket.endSegmentIndex + 1 };\n }\n const isEos = !!(lastPacket.endPage.headerType & 0x04);\n if (isEos) {\n // The page is marked as the last page of the logical bitstream, so we won't find anything beyond it\n return null;\n }\n // Otherwise, search for the next page belonging to the same bitstream\n let currentPos = lastPacket.endPage.headerStartPos + lastPacket.endPage.totalSize;\n while (true) {\n let slice = this.reader.requestSliceRange(currentPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null;\n }\n const nextPage = readPageHeader(slice);\n if (!nextPage) {\n return null;\n }\n if (nextPage.serialNumber === lastPacket.endPage.serialNumber) {\n return { startPage: nextPage, startSegmentIndex: 0 };\n }\n currentPos = nextPage.headerStartPos + nextPage.totalSize;\n }\n }\n async getMimeType() {\n await this.readMetadata();\n const codecStrings = await Promise.all(this.tracks.map(x => x.getCodecParameterString()));\n return buildOggMimeType({\n codecStrings: codecStrings.filter(Boolean),\n });\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n const tracks = await this.getTracks();\n const trackDurations = await Promise.all(tracks.map(x => x.computeDuration()));\n return Math.max(0, ...trackDurations);\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n}\nclass OggAudioTrackBacking {\n constructor(bitstream, demuxer) {\n this.bitstream = bitstream;\n this.demuxer = demuxer;\n this.encodedPacketToMetadata = new WeakMap();\n this.sequentialScanCache = [];\n this.sequentialScanMutex = new AsyncMutex();\n // Opus always uses a fixed sample rate for its internal calculations, even if the actual rate is different\n this.internalSampleRate = bitstream.codecInfo.codec === 'opus'\n ? OPUS_SAMPLE_RATE\n : bitstream.sampleRate;\n }\n getId() {\n return this.bitstream.serialNumber;\n }\n getNumberOfChannels() {\n return this.bitstream.numberOfChannels;\n }\n getSampleRate() {\n return this.bitstream.sampleRate;\n }\n getTimeResolution() {\n return this.bitstream.sampleRate;\n }\n getCodec() {\n return this.bitstream.codecInfo.codec;\n }\n getInternalCodecId() {\n return null;\n }\n async getDecoderConfig() {\n assert(this.bitstream.codecInfo.codec);\n return {\n codec: this.bitstream.codecInfo.codec,\n numberOfChannels: this.bitstream.numberOfChannels,\n sampleRate: this.bitstream.sampleRate,\n description: this.bitstream.description ?? undefined,\n };\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n granulePositionToTimestampInSamples(granulePosition) {\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n return granulePosition - this.bitstream.codecInfo.opusInfo.preSkip;\n }\n return granulePosition;\n }\n createEncodedPacketFromOggPacket(packet, additional, options) {\n if (!packet) {\n return null;\n }\n const { durationInSamples, vorbisBlockSize } = extractSampleMetadata(packet.data, this.bitstream.codecInfo, additional.vorbisLastBlocksize);\n const encodedPacket = new EncodedPacket(options.metadataOnly ? PLACEHOLDER_DATA : packet.data, 'key', Math.max(0, additional.timestampInSamples) / this.internalSampleRate, durationInSamples / this.internalSampleRate, packet.endPage.headerStartPos + packet.endSegmentIndex, packet.data.byteLength);\n this.encodedPacketToMetadata.set(encodedPacket, {\n packet,\n timestampInSamples: additional.timestampInSamples,\n durationInSamples,\n vorbisLastBlockSize: additional.vorbisLastBlocksize,\n vorbisBlockSize,\n });\n return encodedPacket;\n }\n async getFirstPacket(options) {\n assert(this.bitstream.lastMetadataPacket);\n const packetPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);\n if (!packetPosition) {\n return null;\n }\n let timestampInSamples = 0;\n if (this.bitstream.codecInfo.codec === 'opus') {\n assert(this.bitstream.codecInfo.opusInfo);\n timestampInSamples -= this.bitstream.codecInfo.opusInfo.preSkip;\n }\n const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: null,\n }, options);\n }\n async getNextPacket(prevPacket, options) {\n const prevMetadata = this.encodedPacketToMetadata.get(prevPacket);\n if (!prevMetadata) {\n throw new Error('Packet was not created from this track.');\n }\n const packetPosition = await this.demuxer.findNextPacketStart(prevMetadata.packet);\n if (!packetPosition) {\n return null;\n }\n const timestampInSamples = prevMetadata.timestampInSamples + prevMetadata.durationInSamples;\n const packet = await this.demuxer.readPacket(packetPosition.startPage, packetPosition.startSegmentIndex);\n return this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples,\n vorbisLastBlocksize: prevMetadata.vorbisBlockSize,\n }, options);\n }\n async getPacket(timestamp, options) {\n if (this.demuxer.reader.fileSize === null) {\n // No file size known, can't do binary search, but fall back to sequential algo instead\n return this.getPacketSequential(timestamp, options);\n }\n const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);\n if (timestampInSamples === 0) {\n // Fast path for timestamp 0 - avoids binary search when playing back from the start\n return this.getFirstPacket(options);\n }\n if (timestampInSamples < 0) {\n // There's nothing here\n return null;\n }\n assert(this.bitstream.lastMetadataPacket);\n const startPosition = await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);\n if (!startPosition) {\n return null;\n }\n let lowPage = startPosition.startPage;\n let high = this.demuxer.reader.fileSize;\n const lowPages = [lowPage];\n // First, let's perform a binary serach (bisection search) on the file to find the approximate page where\n // we'll find the packet. We want to find a page whose end packet position is less than or equal to the\n // packet position we're searching for.\n // Outer loop: Does the binary serach\n outer: while (lowPage.headerStartPos + lowPage.totalSize < high) {\n const low = lowPage.headerStartPos;\n const mid = Math.floor((low + high) / 2);\n let searchStartPos = mid;\n // Inner loop: Does a linear forward scan if the page cannot be found immediately\n while (true) {\n const until = Math.min(searchStartPos + MAX_PAGE_SIZE, high - MIN_PAGE_HEADER_SIZE);\n let searchSlice = this.demuxer.reader.requestSlice(searchStartPos, until - searchStartPos);\n if (searchSlice instanceof Promise)\n searchSlice = await searchSlice;\n assert(searchSlice);\n const found = findNextPageHeader(searchSlice, until);\n if (!found) {\n high = mid + MIN_PAGE_HEADER_SIZE;\n continue outer;\n }\n let headerSlice = this.demuxer.reader.requestSliceRange(searchSlice.filePos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (headerSlice instanceof Promise)\n headerSlice = await headerSlice;\n assert(headerSlice);\n const page = readPageHeader(headerSlice);\n assert(page);\n let pageValid = false;\n if (page.serialNumber === this.bitstream.serialNumber) {\n // Serial numbers are basically random numbers, and the chance of finding a fake page with\n // matching serial number is astronomically low, so we can be pretty sure this page is legit.\n pageValid = true;\n }\n else {\n let pageSlice = this.demuxer.reader.requestSlice(page.headerStartPos, page.totalSize);\n if (pageSlice instanceof Promise)\n pageSlice = await pageSlice;\n assert(pageSlice);\n // Validate the page by checking checksum\n const bytes = readBytes(pageSlice, page.totalSize);\n const crc = computeOggPageCrc(bytes);\n pageValid = crc === page.checksum;\n }\n if (!pageValid) {\n // Keep searching for a valid page\n searchStartPos = page.headerStartPos + 4; // 'OggS' is 4 bytes\n continue;\n }\n if (pageValid && page.serialNumber !== this.bitstream.serialNumber) {\n // Page is valid but from a different bitstream, so keep searching forward until we find one\n // belonging to the our bitstream\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n const isContinuationPage = page.granulePosition === -1;\n if (isContinuationPage) {\n // No packet ends on this page - keep looking\n searchStartPos = page.headerStartPos + page.totalSize;\n continue;\n }\n // The page is valid and belongs to our bitstream; let's check its granule position to see where we\n // need to take the bisection search.\n if (this.granulePositionToTimestampInSamples(page.granulePosition) > timestampInSamples) {\n high = page.headerStartPos;\n }\n else {\n lowPage = page;\n lowPages.push(page);\n }\n continue outer;\n }\n }\n // Now we have the last page with a packet position <= the packet position we're looking for, but there\n // might be multiple pages with the packet position, in which case we actually need to find the first of\n // such pages. We'll do this in two steps: First, let's find the latest page we know with an earlier packet\n // position, and then linear scan ourselves forward until we find the correct page.\n let lowerPage = startPosition.startPage;\n for (const otherLowPage of lowPages) {\n if (otherLowPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n if (!lowerPage || otherLowPage.headerStartPos > lowerPage.headerStartPos) {\n lowerPage = otherLowPage;\n }\n }\n let currentPage = lowerPage;\n // Keep track of the pages we traversed, we need these later for backwards seeking\n const previousPages = [currentPage];\n while (true) {\n // This loop must terminate as we'll eventually reach lowPage\n if (currentPage.serialNumber === this.bitstream.serialNumber\n && currentPage.granulePosition === lowPage.granulePosition) {\n break;\n }\n const nextPos = currentPage.headerStartPos + currentPage.totalSize;\n let slice = this.demuxer.reader.requestSliceRange(nextPos, MIN_PAGE_HEADER_SIZE, MAX_PAGE_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const nextPage = readPageHeader(slice);\n assert(nextPage);\n currentPage = nextPage;\n if (currentPage.serialNumber === this.bitstream.serialNumber) {\n previousPages.push(currentPage);\n }\n }\n assert(currentPage.granulePosition !== -1);\n let currentSegmentIndex = null;\n let currentTimestampInSamples;\n let currentTimestampIsCorrect;\n // These indicate the end position of the packet that the granule position belongs to\n let endPage = currentPage;\n let endSegmentIndex = 0;\n if (currentPage.headerStartPos === startPosition.startPage.headerStartPos) {\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(0);\n currentTimestampIsCorrect = true;\n currentSegmentIndex = 0;\n }\n else {\n currentTimestampInSamples = 0; // Placeholder value! We'll refine it once we can\n currentTimestampIsCorrect = false;\n // Find the segment index of the next packet\n for (let i = currentPage.lacingValues.length - 1; i >= 0; i--) {\n const value = currentPage.lacingValues[i];\n if (value < 255) {\n // We know the last packet ended at i, so the next one starts at i + 1\n currentSegmentIndex = i + 1;\n break;\n }\n }\n // This must hold: Since this page has a granule position set, that means there must be a packet that\n // ends in this page.\n if (currentSegmentIndex === null) {\n throw new Error('Invalid page with granule position: no packets end on this page.');\n }\n endSegmentIndex = currentSegmentIndex - 1;\n const pseudopacket = {\n data: PLACEHOLDER_DATA,\n endPage,\n endSegmentIndex,\n };\n const nextPosition = await this.demuxer.findNextPacketStart(pseudopacket);\n if (nextPosition) {\n // Let's rewind a single step (packet) - this previous packet ensures that we'll correctly compute\n // the duration for the packet we're looking for.\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n assert(endPosition);\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (startPosition) {\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n }\n }\n else {\n // There is no next position, which means we're looking for the last packet in the bitstream. The\n // granule position on the last page tends to be fucky, so let's instead start the search on the\n // page before that. So let's loop until we find a packet that ends in a previous page.\n while (true) {\n const endPosition = findPreviousPacketEndPosition(previousPages, currentPage, currentSegmentIndex);\n if (!endPosition) {\n break;\n }\n const startPosition = findPacketStartPosition(previousPages, endPosition.page, endPosition.segmentIndex);\n if (!startPosition) {\n break;\n }\n currentPage = startPosition.page;\n currentSegmentIndex = startPosition.segmentIndex;\n if (endPosition.page.headerStartPos !== endPage.headerStartPos) {\n endPage = endPosition.page;\n endSegmentIndex = endPosition.segmentIndex;\n break;\n }\n }\n }\n }\n let lastEncodedPacket = null;\n let lastEncodedPacketMetadata = null;\n // Alright, now it's time for the final, granular seek: We keep iterating over packets until we've found the\n // one with the correct timestamp - i.e., the last one with a timestamp <= the timestamp we're looking for.\n while (currentPage !== null) {\n assert(currentSegmentIndex !== null);\n const packet = await this.demuxer.readPacket(currentPage, currentSegmentIndex);\n if (!packet) {\n break;\n }\n // We might need to skip the packet if it's a metadata one\n const skipPacket = currentPage.headerStartPos === startPosition.startPage.headerStartPos\n && currentSegmentIndex < startPosition.startSegmentIndex;\n if (!skipPacket) {\n let encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n let encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n if (!currentTimestampIsCorrect\n && packet.endPage.headerStartPos === endPage.headerStartPos\n && packet.endSegmentIndex === endSegmentIndex) {\n // We know this packet end timestamp can be derived from the page's granule position\n currentTimestampInSamples = this.granulePositionToTimestampInSamples(currentPage.granulePosition);\n currentTimestampIsCorrect = true;\n // Let's backpatch the packet we just created with the correct timestamp\n encodedPacket = this.createEncodedPacketFromOggPacket(packet, {\n timestampInSamples: currentTimestampInSamples - encodedPacketMetadata.durationInSamples,\n vorbisLastBlocksize: lastEncodedPacketMetadata?.vorbisBlockSize ?? null,\n }, options);\n assert(encodedPacket);\n encodedPacketMetadata = this.encodedPacketToMetadata.get(encodedPacket);\n assert(encodedPacketMetadata);\n }\n else {\n currentTimestampInSamples += encodedPacketMetadata.durationInSamples;\n }\n lastEncodedPacket = encodedPacket;\n lastEncodedPacketMetadata = encodedPacketMetadata;\n if (currentTimestampIsCorrect\n && (\n // Next timestamp will be too late\n Math.max(currentTimestampInSamples, 0) > timestampInSamples\n // This timestamp already matches\n || Math.max(encodedPacketMetadata.timestampInSamples, 0) === timestampInSamples)) {\n break;\n }\n }\n const nextPosition = await this.demuxer.findNextPacketStart(packet);\n if (!nextPosition) {\n break;\n }\n currentPage = nextPosition.startPage;\n currentSegmentIndex = nextPosition.startSegmentIndex;\n }\n return lastEncodedPacket;\n }\n // A slower but simpler and sequential algorithm for finding a packet in a file\n async getPacketSequential(timestamp, options) {\n const release = await this.sequentialScanMutex.acquire(); // Requires exclusivity because we write to a cache\n try {\n const timestampInSamples = roundIfAlmostInteger(timestamp * this.internalSampleRate);\n timestamp = timestampInSamples / this.internalSampleRate;\n const index = binarySearchLessOrEqual(this.sequentialScanCache, timestampInSamples, x => x.timestampInSamples);\n let currentPacket;\n if (index !== -1) {\n // We don't need to start from the beginning, we can start at a previous scan point\n const cacheEntry = this.sequentialScanCache[index];\n currentPacket = this.createEncodedPacketFromOggPacket(cacheEntry.packet, {\n timestampInSamples: cacheEntry.timestampInSamples,\n vorbisLastBlocksize: cacheEntry.vorbisLastBlockSize,\n }, options);\n }\n else {\n currentPacket = await this.getFirstPacket(options);\n }\n let i = 0;\n while (currentPacket && currentPacket.timestamp < timestamp) {\n const nextPacket = await this.getNextPacket(currentPacket, options);\n if (!nextPacket || nextPacket.timestamp > timestamp) {\n break;\n }\n currentPacket = nextPacket;\n i++;\n if (i === 100) {\n // Add \"checkpoints\" every once in a while to speed up subsequent random accesses\n i = 0;\n const metadata = this.encodedPacketToMetadata.get(currentPacket);\n assert(metadata);\n if (this.sequentialScanCache.length > 0) {\n // If we reach this case, we must be at the end of the cache\n assert(last(this.sequentialScanCache).timestampInSamples <= metadata.timestampInSamples);\n }\n this.sequentialScanCache.push(metadata);\n }\n }\n return currentPacket;\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n/** Finds the start position of a packet given its end position. */\nconst findPacketStartPosition = (pageList, endPage, endSegmentIndex) => {\n let page = endPage;\n let segmentIndex = endSegmentIndex;\n outer: while (true) {\n segmentIndex--;\n for (segmentIndex; segmentIndex >= 0; segmentIndex--) {\n const lacingValue = page.lacingValues[segmentIndex];\n if (lacingValue < 255) {\n segmentIndex++; // We know the last packet starts here\n break outer;\n }\n }\n assert(segmentIndex === -1);\n const pageStartsWithFreshPacket = !(page.headerType & 0x01);\n if (pageStartsWithFreshPacket) {\n // Fast exit: We know we don't need to look in the previous page\n segmentIndex = 0;\n break;\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < page.headerStartPos);\n if (!previousPage) {\n return null;\n }\n page = previousPage;\n segmentIndex = page.lacingValues.length;\n }\n assert(segmentIndex !== -1);\n if (segmentIndex === page.lacingValues.length) {\n // Wrap back around to the first segment of the next page\n const nextPage = pageList[pageList.indexOf(page) + 1];\n assert(nextPage);\n page = nextPage;\n segmentIndex = 0;\n }\n return { page, segmentIndex };\n};\n/** Finds the end position of a packet given the start position of the following packet. */\nconst findPreviousPacketEndPosition = (pageList, startPage, startSegmentIndex) => {\n if (startSegmentIndex > 0) {\n // Easy\n return { page: startPage, segmentIndex: startSegmentIndex - 1 };\n }\n const previousPage = findLast(pageList, x => x.headerStartPos < startPage.headerStartPos);\n if (!previousPage) {\n return null;\n }\n return { page: previousPage, segmentIndex: previousPage.lacingValues.length - 1 };\n};\n","/*!\n * Copyright (c) 2025-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 { parseOpusTocByte } from '../codec-data.js';\nimport { assert, ilog, toDataView } from '../misc.js';\nexport const OGGS = 0x5367674f; // 'OggS'\nconst OGG_CRC_POLYNOMIAL = 0x04c11db7;\nconst OGG_CRC_TABLE = new Uint32Array(256);\nfor (let n = 0; n < 256; n++) {\n let crc = n << 24;\n for (let k = 0; k < 8; k++) {\n crc = (crc & 0x80000000)\n ? ((crc << 1) ^ OGG_CRC_POLYNOMIAL)\n : (crc << 1);\n }\n OGG_CRC_TABLE[n] = (crc >>> 0) & 0xffffffff;\n}\nexport const computeOggPageCrc = (bytes) => {\n const view = toDataView(bytes);\n const originalChecksum = view.getUint32(22, true);\n view.setUint32(22, 0, true); // Zero out checksum field\n let crc = 0;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i];\n crc = ((crc << 8) ^ OGG_CRC_TABLE[(crc >>> 24) ^ byte]) >>> 0;\n }\n view.setUint32(22, originalChecksum, true); // Restore checksum field\n return crc;\n};\nexport const extractSampleMetadata = (data, codecInfo, vorbisLastBlocksize) => {\n let durationInSamples = 0;\n let currentBlocksize = null;\n if (data.length > 0) {\n // To know sample duration, we'll need to peak inside the packet\n if (codecInfo.codec === 'vorbis') {\n assert(codecInfo.vorbisInfo);\n const vorbisModeCount = codecInfo.vorbisInfo.modeBlockflags.length;\n const bitCount = ilog(vorbisModeCount - 1);\n const modeMask = ((1 << bitCount) - 1) << 1;\n const modeNumber = (data[0] & modeMask) >> 1;\n if (modeNumber >= codecInfo.vorbisInfo.modeBlockflags.length) {\n throw new Error('Invalid mode number.');\n }\n // In Vorbis, packet duration also depends on the blocksize of the previous packet\n let prevBlocksize = vorbisLastBlocksize;\n const blockflag = codecInfo.vorbisInfo.modeBlockflags[modeNumber];\n currentBlocksize = codecInfo.vorbisInfo.blocksizes[blockflag];\n if (blockflag === 1) {\n const prevMask = (modeMask | 0x1) + 1;\n const flag = data[0] & prevMask ? 1 : 0;\n prevBlocksize = codecInfo.vorbisInfo.blocksizes[flag];\n }\n durationInSamples = prevBlocksize !== null\n ? (prevBlocksize + currentBlocksize) >> 2\n : 0; // The first sample outputs no audio data and therefore has a duration of 0\n }\n else if (codecInfo.codec === 'opus') {\n const toc = parseOpusTocByte(data);\n durationInSamples = toc.durationInSamples;\n }\n }\n return {\n durationInSamples,\n vorbisBlockSize: currentBlocksize,\n };\n};\nexport const buildOggMimeType = (info) => {\n let string = 'audio/ogg';\n if (info.codecStrings) {\n const uniqueCodecMimeTypes = [...new Set(info.codecStrings)];\n string += `; codecs=\"${uniqueCodecMimeTypes.join(', ')}\"`;\n }\n return string;\n};\n","/*!\n * Copyright (c) 2025-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 { readI64Le, readU32Le, readU8 } from '../reader.js';\nimport { OGGS } from './ogg-misc.js';\nexport const MIN_PAGE_HEADER_SIZE = 27;\nexport const MAX_PAGE_HEADER_SIZE = 27 + 255;\nexport const MAX_PAGE_SIZE = MAX_PAGE_HEADER_SIZE + 255 * 255;\nexport const readPageHeader = (slice) => {\n const startPos = slice.filePos;\n const capturePattern = readU32Le(slice);\n if (capturePattern !== OGGS) {\n return null;\n }\n slice.skip(1); // Version\n const headerType = readU8(slice);\n const granulePosition = readI64Le(slice);\n const serialNumber = readU32Le(slice);\n const sequenceNumber = readU32Le(slice);\n const checksum = readU32Le(slice);\n const numberPageSegments = readU8(slice);\n const lacingValues = new Uint8Array(numberPageSegments);\n for (let i = 0; i < numberPageSegments; i++) {\n lacingValues[i] = readU8(slice);\n }\n const headerSize = 27 + numberPageSegments;\n const dataSize = lacingValues.reduce((a, b) => a + b, 0);\n const totalSize = headerSize + dataSize;\n return {\n headerStartPos: startPos,\n totalSize,\n dataStartPos: startPos + headerSize,\n dataSize,\n headerType,\n granulePosition,\n serialNumber,\n sequenceNumber,\n checksum,\n lacingValues,\n };\n};\nexport const findNextPageHeader = (slice, until) => {\n while (slice.filePos < until - (4 - 1)) { // Size of word minus 1\n const word = readU32Le(slice);\n const firstByte = word & 0xff;\n const secondByte = (word >>> 8) & 0xff;\n const thirdByte = (word >>> 16) & 0xff;\n const fourthByte = (word >>> 24) & 0xff;\n const O = 0x4f; // 'O'\n if (firstByte !== O && secondByte !== O && thirdByte !== O && fourthByte !== O) {\n continue;\n }\n slice.skip(-4);\n if (word === OGGS) {\n // We have found the capture pattern\n return true;\n }\n slice.skip(1);\n }\n return false;\n};\n","/*!\n * Copyright (c) 2025-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 { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { assert, UNDETERMINED_LANGUAGE } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readAscii, readBytes, readU16, readU32, readU64 } from '../reader.js';\nimport { parseId3V2Tag, readId3V2Header } from '../id3.js';\nexport var WaveFormat;\n(function (WaveFormat) {\n WaveFormat[WaveFormat[\"PCM\"] = 1] = \"PCM\";\n WaveFormat[WaveFormat[\"IEEE_FLOAT\"] = 3] = \"IEEE_FLOAT\";\n WaveFormat[WaveFormat[\"ALAW\"] = 6] = \"ALAW\";\n WaveFormat[WaveFormat[\"MULAW\"] = 7] = \"MULAW\";\n WaveFormat[WaveFormat[\"EXTENSIBLE\"] = 65534] = \"EXTENSIBLE\";\n})(WaveFormat || (WaveFormat = {}));\nexport class WaveDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.dataStart = -1;\n this.dataSize = -1;\n this.audioInfo = null;\n this.tracks = [];\n this.lastKnownPacketIndex = 0;\n this.metadataTags = {};\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n let slice = this.reader.requestSlice(0, 12);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n const riffType = readAscii(slice, 4);\n const littleEndian = riffType !== 'RIFX';\n const isRf64 = riffType === 'RF64';\n const outerChunkSize = readU32(slice, littleEndian);\n let totalFileSize = isRf64\n ? this.reader.fileSize\n : Math.min(outerChunkSize + 8, this.reader.fileSize ?? Infinity);\n const format = readAscii(slice, 4);\n if (format !== 'WAVE') {\n throw new Error('Invalid WAVE file - wrong format');\n }\n let chunksRead = 0;\n let dataChunkSize = null;\n let currentPos = slice.filePos;\n while (totalFileSize === null || currentPos < totalFileSize) {\n let slice = this.reader.requestSlice(currentPos, 8);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n break;\n const chunkId = readAscii(slice, 4);\n const chunkSize = readU32(slice, littleEndian);\n const startPos = slice.filePos;\n if (isRf64 && chunksRead === 0 && chunkId !== 'ds64') {\n throw new Error('Invalid RF64 file: First chunk must be \"ds64\".');\n }\n if (chunkId === 'fmt ') {\n await this.parseFmtChunk(startPos, chunkSize, littleEndian);\n }\n else if (chunkId === 'data') {\n dataChunkSize ??= chunkSize;\n this.dataStart = slice.filePos;\n this.dataSize = Math.min(dataChunkSize, (totalFileSize ?? Infinity) - this.dataStart);\n if (this.reader.fileSize === null) {\n break; // Stop once we hit the data chunk\n }\n }\n else if (chunkId === 'ds64') {\n // File and data chunk sizes are defined in here instead\n let ds64Slice = this.reader.requestSlice(startPos, chunkSize);\n if (ds64Slice instanceof Promise)\n ds64Slice = await ds64Slice;\n if (!ds64Slice)\n break;\n const riffChunkSize = readU64(ds64Slice, littleEndian);\n dataChunkSize = readU64(ds64Slice, littleEndian);\n totalFileSize = Math.min(riffChunkSize + 8, this.reader.fileSize ?? Infinity);\n }\n else if (chunkId === 'LIST') {\n await this.parseListChunk(startPos, chunkSize, littleEndian);\n }\n else if (chunkId === 'ID3 ' || chunkId === 'id3 ') {\n await this.parseId3Chunk(startPos, chunkSize);\n }\n currentPos = startPos + chunkSize + (chunkSize & 1); // Handle padding\n chunksRead++;\n }\n if (!this.audioInfo) {\n throw new Error('Invalid WAVE file - missing \"fmt \" chunk');\n }\n if (this.dataStart === -1) {\n throw new Error('Invalid WAVE file - missing \"data\" chunk');\n }\n const blockSize = this.audioInfo.blockSizeInBytes;\n this.dataSize = Math.floor(this.dataSize / blockSize) * blockSize;\n this.tracks.push(new InputAudioTrack(this.input, new WaveAudioTrackBacking(this)));\n })();\n }\n async parseFmtChunk(startPos, size, littleEndian) {\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n let formatTag = readU16(slice, littleEndian);\n const numChannels = readU16(slice, littleEndian);\n const sampleRate = readU32(slice, littleEndian);\n slice.skip(4); // Bytes per second\n const blockAlign = readU16(slice, littleEndian);\n let bitsPerSample;\n if (size === 14) { // Plain WAVEFORMAT\n bitsPerSample = 8;\n }\n else {\n bitsPerSample = readU16(slice, littleEndian);\n }\n // Handle WAVEFORMATEXTENSIBLE\n if (size >= 18 && formatTag !== 0x0165) {\n const cbSize = readU16(slice, littleEndian);\n const remainingSize = size - 18;\n const extensionSize = Math.min(remainingSize, cbSize);\n if (extensionSize >= 22 && formatTag === WaveFormat.EXTENSIBLE) {\n // Parse WAVEFORMATEXTENSIBLE\n slice.skip(2 + 4);\n const subFormat = readBytes(slice, 16);\n // Get actual format from subFormat GUID\n formatTag = subFormat[0] | (subFormat[1] << 8);\n }\n }\n if (formatTag === WaveFormat.MULAW || formatTag === WaveFormat.ALAW) {\n bitsPerSample = 8;\n }\n this.audioInfo = {\n format: formatTag,\n numberOfChannels: numChannels,\n sampleRate,\n sampleSizeInBytes: Math.ceil(bitsPerSample / 8),\n blockSizeInBytes: blockAlign,\n };\n }\n async parseListChunk(startPos, size, littleEndian) {\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n const infoType = readAscii(slice, 4);\n if (infoType !== 'INFO' && infoType !== 'INF0') { // exiftool.org claims INF0 can happen\n return; // Not an INFO chunk\n }\n let currentPos = slice.filePos;\n while (currentPos <= startPos + size - 8) {\n slice.filePos = currentPos;\n const chunkName = readAscii(slice, 4);\n const chunkSize = readU32(slice, littleEndian);\n const bytes = readBytes(slice, chunkSize);\n let stringLength = 0;\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i] === 0) {\n break;\n }\n stringLength++;\n }\n const value = String.fromCharCode(...bytes.subarray(0, stringLength));\n this.metadataTags.raw ??= {};\n this.metadataTags.raw[chunkName] = value;\n switch (chunkName) {\n case 'INAM':\n case 'TITL':\n {\n this.metadataTags.title ??= value;\n }\n ;\n break;\n case 'TIT3':\n {\n this.metadataTags.description ??= value;\n }\n ;\n break;\n case 'IART':\n {\n this.metadataTags.artist ??= value;\n }\n ;\n break;\n case 'IPRD':\n {\n this.metadataTags.album ??= value;\n }\n ;\n break;\n case 'IPRT':\n case 'ITRK':\n case 'TRCK':\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 this.metadataTags.trackNumber ??= trackNum;\n }\n if (tracksTotal && Number.isInteger(tracksTotal) && tracksTotal > 0) {\n this.metadataTags.tracksTotal ??= tracksTotal;\n }\n }\n ;\n break;\n case 'ICRD':\n case 'IDIT':\n {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n this.metadataTags.date ??= date;\n }\n }\n ;\n break;\n case 'YEAR':\n {\n const year = Number.parseInt(value, 10);\n if (Number.isInteger(year) && year > 0) {\n this.metadataTags.date ??= new Date(year, 0, 1);\n }\n }\n ;\n break;\n case 'IGNR':\n case 'GENR':\n {\n this.metadataTags.genre ??= value;\n }\n ;\n break;\n case 'ICMT':\n case 'CMNT':\n case 'COMM':\n {\n this.metadataTags.comment ??= value;\n }\n ;\n break;\n }\n currentPos += 8 + chunkSize + (chunkSize & 1); // Handle padding\n }\n }\n async parseId3Chunk(startPos, size) {\n // Parse ID3 tag embedded in WAV file (non-default, but used a lot in practice anyway)\n let slice = this.reader.requestSlice(startPos, size);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice)\n return; // File too short\n const id3V2Header = readId3V2Header(slice);\n if (id3V2Header) {\n // Extract the content portion (skip the 10-byte header)\n const contentSlice = slice.slice(startPos + 10, id3V2Header.size);\n parseId3V2Tag(contentSlice, id3V2Header, this.metadataTags);\n }\n }\n getCodec() {\n assert(this.audioInfo);\n if (this.audioInfo.format === WaveFormat.MULAW) {\n return 'ulaw';\n }\n if (this.audioInfo.format === WaveFormat.ALAW) {\n return 'alaw';\n }\n if (this.audioInfo.format === WaveFormat.PCM) {\n // All formats are little-endian\n if (this.audioInfo.sampleSizeInBytes === 1) {\n return 'pcm-u8';\n }\n else if (this.audioInfo.sampleSizeInBytes === 2) {\n return 'pcm-s16';\n }\n else if (this.audioInfo.sampleSizeInBytes === 3) {\n return 'pcm-s24';\n }\n else if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-s32';\n }\n }\n if (this.audioInfo.format === WaveFormat.IEEE_FLOAT) {\n if (this.audioInfo.sampleSizeInBytes === 4) {\n return 'pcm-f32';\n }\n }\n return null;\n }\n async getMimeType() {\n return 'audio/wav';\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n}\nconst PACKET_SIZE_IN_FRAMES = 2048;\nclass WaveAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return this.demuxer.getCodec();\n }\n getInternalCodecId() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.format;\n }\n async getDecoderConfig() {\n const codec = this.demuxer.getCodec();\n if (!codec) {\n return null;\n }\n assert(this.demuxer.audioInfo);\n return {\n codec,\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n };\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getPacketAtIndex(packetIndex, options) {\n assert(this.demuxer.audioInfo);\n const startOffset = packetIndex * PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes;\n if (startOffset >= this.demuxer.dataSize) {\n return null;\n }\n const sizeInBytes = Math.min(PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes, this.demuxer.dataSize - startOffset);\n if (this.demuxer.reader.fileSize === null) {\n // If the file size is unknown, we weren't able to cap the dataSize in the init logic and we instead have to\n // rely on the headers telling us how large the file is. But, these might be wrong, so let's check if the\n // requested slice actually exists.\n let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null;\n }\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(this.demuxer.dataStart + startOffset, sizeInBytes);\n if (slice instanceof Promise)\n slice = await slice;\n assert(slice);\n data = readBytes(slice, sizeInBytes);\n }\n const timestamp = packetIndex * PACKET_SIZE_IN_FRAMES / this.demuxer.audioInfo.sampleRate;\n const duration = sizeInBytes / this.demuxer.audioInfo.blockSizeInBytes / this.demuxer.audioInfo.sampleRate;\n this.demuxer.lastKnownPacketIndex = Math.max(packetIndex, timestamp);\n return new EncodedPacket(data, 'key', timestamp, duration, packetIndex, sizeInBytes);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.floor(Math.min(timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES, (this.demuxer.dataSize - 1) / (PACKET_SIZE_IN_FRAMES * this.demuxer.audioInfo.blockSizeInBytes)));\n const packet = await this.getPacketAtIndex(packetIndex, options);\n if (packet) {\n return packet;\n }\n if (packetIndex === 0) {\n return null; // Empty data chunk\n }\n assert(this.demuxer.reader.fileSize === null);\n // The file is shorter than we thought, meaning the packet we were looking for doesn't exist. So, let's find\n // the last packet by doing a sequential scan, instead.\n let currentPacket = await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex, options);\n while (currentPacket) {\n const nextPacket = await this.getNextPacket(currentPacket, options);\n if (!nextPacket) {\n break;\n }\n currentPacket = nextPacket;\n }\n return currentPacket;\n }\n getNextPacket(packet, options) {\n assert(this.demuxer.audioInfo);\n const packetIndex = Math.round(packet.timestamp * this.demuxer.audioInfo.sampleRate / PACKET_SIZE_IN_FRAMES);\n return this.getPacketAtIndex(packetIndex + 1, options);\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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 '../misc.js';\nimport { readBytes } from '../reader.js';\nexport const MIN_FRAME_HEADER_SIZE = 7;\nexport const MAX_FRAME_HEADER_SIZE = 9;\nexport const readFrameHeader = (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) 2025-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 { aacChannelMap, aacFrequencyTable } from '../codec.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchExact, binarySearchLessOrEqual, Bitstream, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { MAX_FRAME_HEADER_SIZE, MIN_FRAME_HEADER_SIZE, readFrameHeader } from './adts-reader.js';\nconst SAMPLES_PER_AAC_FRAME = 1024;\nexport class AdtsDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.metadataPromise = null;\n this.firstFrameHeader = null;\n this.loadedSamples = [];\n this.tracks = [];\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.lastLoadedPos = 0;\n this.nextTimestampInSamples = 0;\n this.reader = input._reader;\n }\n async readMetadata() {\n return this.metadataPromise ??= (async () => {\n // Keep loading until we find the first frame header\n while (!this.firstFrameHeader && !this.lastSampleLoaded) {\n await this.advanceReader();\n }\n // There has to be a frame if this demuxer got selected\n assert(this.firstFrameHeader);\n // Create the single audio track\n this.tracks = [new InputAudioTrack(this.input, new AdtsAudioTrackBacking(this))];\n })();\n }\n async advanceReader() {\n let slice = this.reader.requestSliceRange(this.lastLoadedPos, MIN_FRAME_HEADER_SIZE, MAX_FRAME_HEADER_SIZE);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n this.lastSampleLoaded = true;\n return;\n }\n const header = readFrameHeader(slice);\n if (!header) {\n this.lastSampleLoaded = true;\n return;\n }\n if (this.reader.fileSize !== null && header.startPos + header.frameLength > this.reader.fileSize) {\n // Frame doesn't fit in the rest of the file\n this.lastSampleLoaded = true;\n return;\n }\n if (!this.firstFrameHeader) {\n this.firstFrameHeader = header;\n }\n const sampleRate = aacFrequencyTable[header.samplingFrequencyIndex];\n assert(sampleRate !== undefined);\n const sampleDuration = SAMPLES_PER_AAC_FRAME / sampleRate;\n const headerSize = header.crcCheck ? MAX_FRAME_HEADER_SIZE : MIN_FRAME_HEADER_SIZE;\n const sample = {\n timestamp: this.nextTimestampInSamples / sampleRate,\n duration: sampleDuration,\n dataStart: header.startPos + headerSize,\n dataSize: header.frameLength - headerSize,\n };\n this.loadedSamples.push(sample);\n this.nextTimestampInSamples += SAMPLES_PER_AAC_FRAME;\n this.lastLoadedPos = header.startPos + header.frameLength;\n }\n async getMimeType() {\n return 'audio/aac';\n }\n async getTracks() {\n await this.readMetadata();\n return this.tracks;\n }\n async computeDuration() {\n await this.readMetadata();\n const track = this.tracks[0];\n assert(track);\n return track.computeDuration();\n }\n async getMetadataTags() {\n return {}; // No tags in this one\n }\n}\nclass AdtsAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n async getFirstTimestamp() {\n return 0;\n }\n getTimeResolution() {\n const sampleRate = this.getSampleRate();\n return sampleRate / SAMPLES_PER_AAC_FRAME;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getCodec() {\n return 'aac';\n }\n getInternalCodecId() {\n assert(this.demuxer.firstFrameHeader);\n return this.demuxer.firstFrameHeader.objectType;\n }\n getNumberOfChannels() {\n assert(this.demuxer.firstFrameHeader);\n const numberOfChannels = aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];\n assert(numberOfChannels !== undefined);\n return numberOfChannels;\n }\n getSampleRate() {\n assert(this.demuxer.firstFrameHeader);\n const sampleRate = aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];\n assert(sampleRate !== undefined);\n return sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getDecoderConfig() {\n assert(this.demuxer.firstFrameHeader);\n const bytes = new Uint8Array(3); // 19 bits max\n const bitstream = new Bitstream(bytes);\n const { objectType, samplingFrequencyIndex, channelConfiguration } = this.demuxer.firstFrameHeader;\n if (objectType > 31) {\n bitstream.writeBits(5, 31);\n bitstream.writeBits(6, objectType - 32);\n }\n else {\n bitstream.writeBits(5, objectType);\n }\n bitstream.writeBits(4, samplingFrequencyIndex); // samplingFrequencyIndex === 15 is forbidden\n bitstream.writeBits(4, channelConfiguration);\n return {\n codec: `mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,\n numberOfChannels: this.getNumberOfChannels(),\n sampleRate: this.getSampleRate(),\n description: bytes.subarray(0, Math.ceil((bitstream.pos - 1) / 8)),\n };\n }\n async getPacketAtIndex(sampleIndex, options) {\n if (sampleIndex === -1) {\n return null;\n }\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.dataStart, rawSample.dataSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.dataSize);\n }\n return new EncodedPacket(data, 'key', rawSample.timestamp, rawSample.duration, sampleIndex, rawSample.dataSize);\n }\n getFirstPacket(options) {\n return this.getPacketAtIndex(0, options);\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const sampleIndex = binarySearchExact(this.demuxer.loadedSamples, packet.timestamp, x => x.timestamp);\n if (sampleIndex === -1) {\n throw new Error('Packet was not created from this track.');\n }\n const nextIndex = sampleIndex + 1;\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n async getPacket(timestamp, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const index = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.timestamp);\n if (index === -1 && this.demuxer.loadedSamples.length > 0) {\n // We're before the first sample\n return null;\n }\n if (this.demuxer.lastSampleLoaded) {\n // All data is loaded, return what we found\n return this.getPacketAtIndex(index, options);\n }\n if (index >= 0 && index + 1 < this.demuxer.loadedSamples.length) {\n // The next packet also exists, we're done\n return this.getPacketAtIndex(index, options);\n }\n // Otherwise, keep loading data\n await this.demuxer.advanceReader();\n }\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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 { FlacBlockType, readVorbisComments } from '../codec-data.js';\nimport { Demuxer } from '../demuxer.js';\nimport { InputAudioTrack } from '../input-track.js';\nimport { assert, AsyncMutex, binarySearchLessOrEqual, Bitstream, textDecoder, UNDETERMINED_LANGUAGE, } from '../misc.js';\nimport { EncodedPacket, PLACEHOLDER_DATA } from '../packet.js';\nimport { readBytes, readU24Be, readU32Be, readU8, } from '../reader.js';\nimport { DEFAULT_TRACK_DISPOSITION } from '../metadata.js';\nimport { calculateCrc8, readBlockSize, getBlockSizeOrUncommon, readCodedNumber, readSampleRate, getSampleRateOrUncommon, } from './flac-misc.js';\nexport class FlacDemuxer extends Demuxer {\n constructor(input) {\n super(input);\n this.loadedSamples = []; // All samples from the start of the file to lastLoadedPos\n this.metadataPromise = null;\n this.track = null;\n this.metadataTags = {};\n this.audioInfo = null;\n this.lastLoadedPos = null;\n this.blockingBit = null;\n this.readingMutex = new AsyncMutex();\n this.lastSampleLoaded = false;\n this.reader = input._reader;\n }\n async computeDuration() {\n await this.readMetadata();\n assert(this.track);\n return this.track.computeDuration();\n }\n async getMetadataTags() {\n await this.readMetadata();\n return this.metadataTags;\n }\n async getTracks() {\n await this.readMetadata();\n assert(this.track);\n return [this.track];\n }\n async getMimeType() {\n return 'audio/flac';\n }\n async readMetadata() {\n let currentPos = 4; // Skip 'fLaC'\n return (this.metadataPromise ??= (async () => {\n while (this.reader.fileSize === null\n || currentPos < this.reader.fileSize) {\n let sizeSlice = this.reader.requestSlice(currentPos, 4);\n if (sizeSlice instanceof Promise)\n sizeSlice = await sizeSlice;\n currentPos += 4;\n if (sizeSlice === null) {\n throw new Error(`Metadata block at position ${currentPos} is too small! Corrupted file.`);\n }\n assert(sizeSlice);\n const byte = readU8(sizeSlice); // first bit: isLastMetadata, remaining 7 bits: metaBlockType\n const size = readU24Be(sizeSlice);\n const isLastMetadata = (byte & 0x80) !== 0;\n const metaBlockType = byte & 0x7f;\n switch (metaBlockType) {\n case FlacBlockType.STREAMINFO: {\n // Parse streaminfo block\n // https://www.rfc-editor.org/rfc/rfc9639.html#section-8.2\n let streamInfoBlock = this.reader.requestSlice(currentPos, size);\n if (streamInfoBlock instanceof Promise)\n streamInfoBlock = await streamInfoBlock;\n assert(streamInfoBlock);\n if (streamInfoBlock === null) {\n throw new Error(`StreamInfo block at position ${currentPos} is too small! Corrupted file.`);\n }\n const streamInfoBytes = readBytes(streamInfoBlock, 34);\n const bitstream = new Bitstream(streamInfoBytes);\n const minimumBlockSize = bitstream.readBits(16);\n const maximumBlockSize = bitstream.readBits(16);\n const minimumFrameSize = bitstream.readBits(24);\n const maximumFrameSize = bitstream.readBits(24);\n const sampleRate = bitstream.readBits(20);\n const numberOfChannels = bitstream.readBits(3) + 1;\n bitstream.readBits(5); // bitsPerSample - 1\n const totalSamples = bitstream.readBits(36);\n // https://www.w3.org/TR/webcodecs-flac-codec-registration/#audiodecoderconfig-description\n // description is required, and has to be the following:\n // 1. The bytes 0x66 0x4C 0x61 0x43 (\"fLaC\" in ASCII)\n // 2. A metadata block (called the STREAMINFO block) as described in section 7 of [FLAC]\n // 3. Optionaly (sic) other metadata blocks, that are not used by the specification\n bitstream.skipBits(16 * 8); // md5 hash\n const description = new Uint8Array(42);\n // 1. \"fLaC\"\n description.set(new Uint8Array([0x66, 0x4c, 0x61, 0x43]), 0);\n // 2. STREAMINFO block\n description.set(new Uint8Array([128, 0, 0, 34]), 4);\n // 3. Other metadata blocks\n description.set(streamInfoBytes, 8);\n this.audioInfo = {\n numberOfChannels,\n sampleRate,\n totalSamples,\n minimumBlockSize,\n maximumBlockSize,\n minimumFrameSize,\n maximumFrameSize,\n description,\n };\n this.track = new InputAudioTrack(this.input, new FlacAudioTrackBacking(this));\n break;\n }\n case FlacBlockType.VORBIS_COMMENT: {\n // Parse vorbis comment block\n // https://www.rfc-editor.org/rfc/rfc9639.html#name-vorbis-comment\n let vorbisCommentBlock = this.reader.requestSlice(currentPos, size);\n if (vorbisCommentBlock instanceof Promise)\n vorbisCommentBlock = await vorbisCommentBlock;\n assert(vorbisCommentBlock);\n readVorbisComments(readBytes(vorbisCommentBlock, size), this.metadataTags);\n break;\n }\n case FlacBlockType.PICTURE: {\n // Parse picture block\n // https://www.rfc-editor.org/rfc/rfc9639.html#name-picture\n let pictureBlock = this.reader.requestSlice(currentPos, size);\n if (pictureBlock instanceof Promise)\n pictureBlock = await pictureBlock;\n assert(pictureBlock);\n const pictureType = readU32Be(pictureBlock);\n const mediaTypeLength = readU32Be(pictureBlock);\n const mediaType = textDecoder.decode(readBytes(pictureBlock, mediaTypeLength));\n const descriptionLength = readU32Be(pictureBlock);\n const description = textDecoder.decode(readBytes(pictureBlock, descriptionLength));\n pictureBlock.skip(4 + 4 + 4 + 4); // Skip width, height, color depth, number of indexed colors\n const dataLength = readU32Be(pictureBlock);\n const data = readBytes(pictureBlock, dataLength);\n this.metadataTags.images ??= [];\n this.metadataTags.images.push({\n data,\n mimeType: mediaType,\n // https://www.rfc-editor.org/rfc/rfc9639.html#table13\n kind: pictureType === 3\n ? 'coverFront'\n : pictureType === 4\n ? 'coverBack'\n : 'unknown',\n description,\n });\n break;\n }\n default:\n break;\n }\n currentPos += size;\n if (isLastMetadata) {\n this.lastLoadedPos = currentPos;\n break;\n }\n }\n })());\n }\n async readNextFlacFrame({ startPos, isFirstPacket, }) {\n assert(this.audioInfo);\n // we expect that there are at least `minimumFrameSize` bytes left in the file\n // Ideally we also want to validate the next header is valid\n // to throw out an accidential sync word\n // The shortest valid FLAC header I can think of, based off the code\n // of readFlacFrameHeader:\n // 4 bytes used for bitstream from syncword to bit depth\n // 1 byte coded number\n // (uncommon values, no bytes read)\n // 1 byte crc\n // --> 6 bytes\n const minimumHeaderLength = 6;\n // If we read everything in readFlacFrameHeader, we read 16 bytes\n const maximumHeaderSize = 16;\n const maximumSliceLength = this.audioInfo.maximumFrameSize + maximumHeaderSize;\n const slice = await this.reader.requestSliceRange(startPos, this.audioInfo.minimumFrameSize, maximumSliceLength);\n if (!slice) {\n return null;\n }\n const frameHeader = this.readFlacFrameHeader({\n slice,\n isFirstPacket: isFirstPacket,\n });\n if (!frameHeader) {\n return null;\n }\n // We don't know exactly how long the packet is, we only know the `minimumFrameSize` and `maximumFrameSize`\n // The packet is over if the next 2 bytes are the sync word followed by a valid header\n // or the end of the file is reached\n // The next sync word is expected at earliest when `minimumFrameSize` is reached,\n // we can skip over anything before that\n slice.filePos = startPos + this.audioInfo.minimumFrameSize;\n while (true) {\n // Reached end of the file, packet is over\n if (slice.filePos > slice.end - minimumHeaderLength) {\n return {\n num: frameHeader.num,\n blockSize: frameHeader.blockSize,\n sampleRate: frameHeader.sampleRate,\n size: slice.end - startPos,\n isLastFrame: true,\n };\n }\n const nextByte = readU8(slice);\n if (nextByte === 0xff) {\n const positionBeforeReading = slice.filePos;\n const byteAfterNextByte = readU8(slice);\n const expected = this.blockingBit === 1 ? 0b1111_1001 : 0b1111_1000;\n if (byteAfterNextByte !== expected) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n slice.skip(-2);\n const lengthIfNextFlacFrameHeaderIsLegit = slice.filePos - startPos;\n const nextFrameHeader = this.readFlacFrameHeader({\n slice,\n isFirstPacket: false,\n });\n if (!nextFrameHeader) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n // Ensure the frameOrSampleNum is consecutive.\n // https://github.com/Vanilagy/mediabunny/issues/194\n if (this.blockingBit === 0) {\n // Case A: If the stream is fixed block size, this is the frame number, which increments by 1\n if (nextFrameHeader.num - frameHeader.num !== 1) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n }\n else {\n // Case B: If the stream is variable block size, this is the sample number, which increments by\n // amount of samples in a frame.\n if (nextFrameHeader.num - frameHeader.num !== frameHeader.blockSize) {\n slice.filePos = positionBeforeReading;\n continue;\n }\n }\n return {\n num: frameHeader.num,\n blockSize: frameHeader.blockSize,\n sampleRate: frameHeader.sampleRate,\n size: lengthIfNextFlacFrameHeaderIsLegit,\n isLastFrame: false,\n };\n }\n }\n }\n readFlacFrameHeader({ slice, isFirstPacket, }) {\n // In this function, generally it is not safe to throw errors.\n // We might end up here because we stumbled upon a syncword,\n // but the data might not actually be a FLAC frame, it might be random bitstream\n // data, in that case we should return null and continue.\n const startOffset = slice.filePos;\n // https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1\n // Each frame MUST start on a byte boundary and start with the 15-bit frame\n // sync code 0b111111111111100. Following the sync code is the blocking strategy\n // bit, which MUST NOT change during the audio stream.\n const bytes = readBytes(slice, 4);\n const bitstream = new Bitstream(bytes);\n const bits = bitstream.readBits(15);\n if (bits !== 0b111111111111100) {\n // This cannot be a valid FLAC frame, must start with the syncword\n return null;\n }\n if (this.blockingBit === null) {\n assert(isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n this.blockingBit = newBlockingBit;\n }\n else if (this.blockingBit === 1) {\n assert(!isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n if (newBlockingBit !== 1) {\n // This cannot be a valid FLAC frame, expected 1 but got 0\n return null;\n }\n }\n else if (this.blockingBit === 0) {\n assert(!isFirstPacket);\n const newBlockingBit = bitstream.readBits(1);\n if (newBlockingBit !== 0) {\n // This cannot be a valid FLAC frame, expected 0 but got 1\n return null;\n }\n }\n else {\n throw new Error('Invalid blocking bit');\n }\n const blockSizeOrUncommon = getBlockSizeOrUncommon(bitstream.readBits(4));\n if (!blockSizeOrUncommon) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n assert(this.audioInfo);\n const sampleRateOrUncommon = getSampleRateOrUncommon(bitstream.readBits(4), this.audioInfo.sampleRate);\n if (!sampleRateOrUncommon) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n bitstream.readBits(4); // channel count\n bitstream.readBits(3); // bit depth\n const reservedZero = bitstream.readBits(1); // reserved zero\n if (reservedZero !== 0) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n const num = readCodedNumber(slice);\n const blockSize = readBlockSize(slice, blockSizeOrUncommon);\n const sampleRate = readSampleRate(slice, sampleRateOrUncommon);\n if (sampleRate === null) {\n // This cannot be a valid FLAC frame, the syncword was just coincidental\n return null;\n }\n if (sampleRate !== this.audioInfo.sampleRate) {\n // This cannot be a valid FLAC frame, the sample rate is not the same as in the stream info\n return null;\n }\n const size = slice.filePos - startOffset;\n const crc = readU8(slice);\n slice.skip(-size);\n slice.skip(-1);\n const crcCalculated = calculateCrc8(readBytes(slice, size));\n if (crc !== crcCalculated) {\n // Maybe this wasn't a FLAC frame at all, the syncword was just coincidentally\n // in the bitstream\n return null;\n }\n return { num, blockSize, sampleRate };\n }\n async advanceReader() {\n await this.readMetadata();\n assert(this.lastLoadedPos !== null);\n assert(this.audioInfo);\n const startPos = this.lastLoadedPos;\n const frame = await this.readNextFlacFrame({\n startPos,\n isFirstPacket: this.loadedSamples.length === 0,\n });\n if (!frame) {\n // Unexpected case, failed to read next FLAC frame\n // handling gracefully\n this.lastSampleLoaded = true;\n return;\n }\n const lastSample = this.loadedSamples[this.loadedSamples.length - 1];\n const blockOffset = lastSample\n ? lastSample.blockOffset + lastSample.blockSize\n : 0;\n const sample = {\n blockOffset,\n blockSize: frame.blockSize,\n byteOffset: startPos,\n byteSize: frame.size,\n };\n this.lastLoadedPos = this.lastLoadedPos + frame.size;\n this.loadedSamples.push(sample);\n if (frame.isLastFrame) {\n this.lastSampleLoaded = true;\n return;\n }\n }\n}\nclass FlacAudioTrackBacking {\n constructor(demuxer) {\n this.demuxer = demuxer;\n }\n getId() {\n return 1;\n }\n getCodec() {\n return 'flac';\n }\n getInternalCodecId() {\n return null;\n }\n getNumberOfChannels() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.numberOfChannels;\n }\n async computeDuration() {\n const lastPacket = await this.getPacket(Infinity, { metadataOnly: true });\n return (lastPacket?.timestamp ?? 0) + (lastPacket?.duration ?? 0);\n }\n getSampleRate() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getName() {\n return null;\n }\n getLanguageCode() {\n return UNDETERMINED_LANGUAGE;\n }\n getTimeResolution() {\n assert(this.demuxer.audioInfo);\n return this.demuxer.audioInfo.sampleRate;\n }\n getDisposition() {\n return {\n ...DEFAULT_TRACK_DISPOSITION,\n };\n }\n async getFirstTimestamp() {\n return 0;\n }\n async getDecoderConfig() {\n assert(this.demuxer.audioInfo);\n return {\n codec: 'flac',\n numberOfChannels: this.demuxer.audioInfo.numberOfChannels,\n sampleRate: this.demuxer.audioInfo.sampleRate,\n description: this.demuxer.audioInfo.description,\n };\n }\n async getPacket(timestamp, options) {\n assert(this.demuxer.audioInfo);\n if (timestamp < 0) {\n throw new Error('Timestamp cannot be negative');\n }\n const release = await this.demuxer.readingMutex.acquire();\n try {\n while (true) {\n const packetIndex = binarySearchLessOrEqual(this.demuxer.loadedSamples, timestamp, x => x.blockOffset / this.demuxer.audioInfo.sampleRate);\n if (packetIndex === -1) {\n await this.demuxer.advanceReader();\n continue;\n }\n const packet = this.demuxer.loadedSamples[packetIndex];\n const sampleTimestamp = packet.blockOffset / this.demuxer.audioInfo.sampleRate;\n const sampleDuration = packet.blockSize / this.demuxer.audioInfo.sampleRate;\n if (sampleTimestamp + sampleDuration <= timestamp) {\n if (this.demuxer.lastSampleLoaded) {\n return this.getPacketAtIndex(this.demuxer.loadedSamples.length - 1, options);\n }\n await this.demuxer.advanceReader();\n continue;\n }\n return this.getPacketAtIndex(packetIndex, options);\n }\n }\n finally {\n release();\n }\n }\n async getNextPacket(packet, options) {\n const release = await this.demuxer.readingMutex.acquire();\n try {\n const nextIndex = packet.sequenceNumber + 1;\n if (this.demuxer.lastSampleLoaded\n && nextIndex >= this.demuxer.loadedSamples.length) {\n return null;\n }\n // Ensure the next sample exists\n while (nextIndex >= this.demuxer.loadedSamples.length\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(nextIndex, options);\n }\n finally {\n release();\n }\n }\n getKeyPacket(timestamp, options) {\n return this.getPacket(timestamp, options);\n }\n getNextKeyPacket(packet, options) {\n return this.getNextPacket(packet, options);\n }\n async getPacketAtIndex(sampleIndex, options) {\n const rawSample = this.demuxer.loadedSamples[sampleIndex];\n if (!rawSample) {\n return null;\n }\n let data;\n if (options.metadataOnly) {\n data = PLACEHOLDER_DATA;\n }\n else {\n let slice = this.demuxer.reader.requestSlice(rawSample.byteOffset, rawSample.byteSize);\n if (slice instanceof Promise)\n slice = await slice;\n if (!slice) {\n return null; // Data didn't fit into the rest of the file\n }\n data = readBytes(slice, rawSample.byteSize);\n }\n assert(this.demuxer.audioInfo);\n const timestamp = rawSample.blockOffset / this.demuxer.audioInfo.sampleRate;\n const duration = rawSample.blockSize / this.demuxer.audioInfo.sampleRate;\n return new EncodedPacket(data, 'key', timestamp, duration, sampleIndex, rawSample.byteSize);\n }\n async getFirstPacket(options) {\n // Ensure the next sample exists\n while (this.demuxer.loadedSamples.length === 0\n && !this.demuxer.lastSampleLoaded) {\n await this.demuxer.advanceReader();\n }\n return this.getPacketAtIndex(0, options);\n }\n}\n","/*!\n * Copyright (c) 2025-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, Bitstream } from '../misc.js';\nimport { readBytes, readU16Be, readU8 } from '../reader.js';\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-block-size-bits\nexport const getBlockSizeOrUncommon = (bits) => {\n if (bits === 0b0000) {\n return null;\n }\n else if (bits === 0b0001) {\n return 192;\n }\n else if (bits >= 0b0010 && bits <= 0b0101) {\n return 144 * 2 ** bits;\n }\n else if (bits === 0b0110) {\n return 'uncommon-u8';\n }\n else if (bits === 0b0111) {\n return 'uncommon-u16';\n }\n else if (bits >= 0b1000 && bits <= 0b1111) {\n return 2 ** bits;\n }\n else {\n return null;\n }\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-sample-rate-bits\nexport const getSampleRateOrUncommon = (sampleRateBits, streamInfoSampleRate) => {\n switch (sampleRateBits) {\n case 0b0000: return streamInfoSampleRate;\n case 0b0001: return 88200;\n case 0b0010: return 176400;\n case 0b0011: return 192000;\n case 0b0100: return 8000;\n case 0b0101: return 16000;\n case 0b0110: return 22050;\n case 0b0111: return 24000;\n case 0b1000: return 32000;\n case 0b1001: return 44100;\n case 0b1010: return 48000;\n case 0b1011: return 96000;\n case 0b1100: return 'uncommon-u8';\n case 0b1101: return 'uncommon-u16';\n case 0b1110: return 'uncommon-u16-10';\n default: return null;\n }\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#name-coded-number\nexport const readCodedNumber = (fileSlice) => {\n let ones = 0;\n const bitstream1 = new Bitstream(readBytes(fileSlice, 1));\n while (bitstream1.readBits(1) === 1) {\n ones++;\n }\n if (ones === 0) {\n return bitstream1.readBits(7);\n }\n const bitArray = [];\n const extraBytes = ones - 1;\n const bitstream2 = new Bitstream(readBytes(fileSlice, extraBytes));\n const firstByteBits = 8 - ones - 1;\n for (let i = 0; i < firstByteBits; i++) {\n bitArray.unshift(bitstream1.readBits(1));\n }\n for (let i = 0; i < extraBytes; i++) {\n for (let j = 0; j < 8; j++) {\n const val = bitstream2.readBits(1);\n if (j < 2) {\n continue;\n }\n bitArray.unshift(val);\n }\n }\n const encoded = bitArray.reduce((acc, bit, index) => {\n return acc | (bit << index);\n }, 0);\n return encoded;\n};\nexport const readBlockSize = (slice, blockSizeBits) => {\n if (blockSizeBits === 'uncommon-u16') {\n return readU16Be(slice) + 1;\n }\n else if (blockSizeBits === 'uncommon-u8') {\n return readU8(slice) + 1;\n }\n else if (typeof blockSizeBits === 'number') {\n return blockSizeBits;\n }\n else {\n assertNever(blockSizeBits);\n assert(false);\n }\n};\nexport const readSampleRate = (slice, sampleRateOrUncommon) => {\n if (sampleRateOrUncommon === 'uncommon-u16') {\n return readU16Be(slice);\n }\n if (sampleRateOrUncommon === 'uncommon-u16-10') {\n return readU16Be(slice) * 10;\n }\n if (sampleRateOrUncommon === 'uncommon-u8') {\n return readU8(slice);\n }\n if (typeof sampleRateOrUncommon === 'number') {\n return sampleRateOrUncommon;\n }\n return null;\n};\n// https://www.rfc-editor.org/rfc/rfc9639.html#section-9.1.1\nexport const calculateCrc8 = (data) => {\n const polynomial = 0x07; // x^8 + x^2 + x^1 + x^0\n let crc = 0x00; // Initialize CRC to 0\n for (const byte of data) {\n crc ^= byte; // XOR byte into least significant byte of crc\n for (let i = 0; i < 8; i++) {\n // For each bit in the byte\n if ((crc & 0x80) !== 0) {\n // If the leftmost bit (MSB) is set\n crc = (crc << 1) ^ polynomial; // Shift left and XOR with polynomial\n }\n else {\n crc <<= 1; // Just shift left\n }\n crc &= 0xff; // Ensure CRC remains 8-bit\n }\n }\n return crc;\n};\n","/**\n * Video Engine for MediaBunny\n * Handles video frame rendering and synchronization\n */\nimport {\n ALL_FORMATS,\n BlobSource,\n CanvasSink,\n Input,\n ReadableStreamSource,\n UrlSource,\n} from 'mediabunny'\n\nexport default class VideoEngine {\n constructor({\n canvas,\n ctx,\n events,\n timeupdateInterval = 250,\n avSyncTolerance = 0.12,\n dropLateFrames = false,\n poster = '',\n preflightRange = false,\n }) {\n this.canvas = canvas\n this.ctx = ctx\n this.events = events\n this.timeupdateInterval = timeupdateInterval\n this.avSyncTolerance = avSyncTolerance\n this.dropLateFrames = dropLateFrames\n this.poster = poster\n this.preflightRange = preflightRange\n\n // MediaBunny instances\n this.input = null\n this.videoSink = null\n this.videoIterator = null\n\n // Frame rendering\n this.nextFrame = null\n this.rafId = 0\n this.asyncId = 0\n\n // Video properties\n this.width = 0\n this.height = 0\n this.duration = Number.NaN\n\n // Playback state\n this.audioClock = null\n this.lastTimeUpdate = 0\n this.stalled = false\n this.playbackRate = 1\n this.posterDrawn = false\n }\n\n normalizeSource(src) {\n if (typeof src === 'string') return new UrlSource(src)\n if (src instanceof Blob) return new BlobSource(src)\n if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) {\n return new ReadableStreamSource(src)\n }\n return src\n }\n\n async preflight(url) {\n if (!this.preflightRange || typeof url !== 'string') return true\n \n try {\n const res = await fetch(url, { method: 'HEAD' })\n const acceptRanges = res.headers.get('accept-ranges')\n if (!acceptRanges || acceptRanges === 'none') {\n this.events.emit('error', new Event('RangeNotSupported'))\n return false\n }\n return true\n } catch (e) {\n console.warn('Preflight check failed:', e)\n return true\n }\n }\n\n drawPoster() {\n if (!this.poster || this.posterDrawn) return\n \n const img = new Image()\n img.onload = () => {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n this.canvas.width = img.naturalWidth || this.canvas.width\n this.canvas.height = img.naturalHeight || this.canvas.height\n this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height)\n this.posterDrawn = true\n }\n img.src = this.poster\n }\n\n async stopIterator() {\n await this.videoIterator?.return()\n this.videoIterator = null\n }\n\n clear() {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n }\n\n async load(src, onMetadata) {\n const id = ++this.asyncId\n\n await this.stopIterator()\n this.clear()\n this.posterDrawn = false\n\n if (!(await this.preflight(src))) return\n\n const source = this.normalizeSource(src)\n if (!source) {\n this.drawPoster()\n return\n }\n\n this.input = new Input({\n source,\n formats: ALL_FORMATS,\n })\n\n this.duration = await this.input.computeDuration()\n if (id !== this.asyncId) return\n\n const videoTrack = await this.input.getPrimaryVideoTrack()\n if (!videoTrack) {\n this.handleNoVideoTrack()\n onMetadata?.()\n return\n }\n\n if (videoTrack.codec === null || !(await videoTrack.canDecode())) {\n this.handleNoVideoTrack()\n onMetadata?.()\n return\n }\n\n const transparent = await videoTrack.canBeTransparent()\n this.videoSink = new CanvasSink(videoTrack, {\n poolSize: 2,\n fit: 'contain',\n alpha: transparent,\n })\n\n this.width = videoTrack.displayWidth\n this.height = videoTrack.displayHeight\n\n this.canvas.width = this.width\n this.canvas.height = this.height\n\n onMetadata?.()\n\n await this.resetIterator(0)\n }\n\n handleNoVideoTrack() {\n this.videoSink = null\n this.width = 0\n this.height = 0\n this.canvas.width = 0\n this.canvas.height = 0\n this.clear()\n this.drawPoster()\n }\n\n async resetIterator(time) {\n await this.stopIterator()\n\n if (!this.videoSink) return\n\n this.videoIterator = this.videoSink.canvases(time)\n\n const first = (await this.videoIterator.next()).value ?? null\n const second = (await this.videoIterator.next()).value ?? null\n\n this.nextFrame = second\n\n if (first) {\n this.ctx.drawImage(first.canvas, 0, 0)\n this.events.emit('loadeddata')\n } else {\n this.drawPoster()\n }\n }\n\n async updateNextFrame(localId) {\n if (!this.videoIterator) return\n\n while (true) {\n const frame = (await this.videoIterator.next()).value ?? null\n if (!frame || localId !== this.asyncId) return\n\n const t = this.audioClock.currentTime\n const tolerance = this.dropLateFrames\n ? Math.max(0.06, this.avSyncTolerance / Math.max(1, this.playbackRate))\n : 0\n\n if (this.dropLateFrames && frame.timestamp < t - tolerance) {\n // Skip late frame\n continue\n }\n\n if (frame.timestamp <= t + tolerance) {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n this.ctx.drawImage(frame.canvas, 0, 0)\n \n if (!this.dropLateFrames && frame.timestamp > t) {\n this.nextFrame = null\n return\n }\n } else {\n this.nextFrame = frame\n return\n }\n }\n }\n\n render() {\n if (!this.audioClock) return\n\n const t = this.audioClock.currentTime\n const now = Date.now()\n\n // Emit timeupdate event\n if (now - this.lastTimeUpdate >= this.timeupdateInterval) {\n this.events.emit('timeupdate')\n this.lastTimeUpdate = now\n }\n\n // Check if reached end\n if (Number.isFinite(this.duration) && t >= this.duration) {\n this.stop()\n this.stalled = false\n this.events.emit('ended')\n this.events.emit('pause')\n this.events.emit('canplay')\n return\n }\n\n // Render next frame if ready\n if (this.nextFrame && this.nextFrame.timestamp <= t) {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height)\n this.ctx.drawImage(this.nextFrame.canvas, 0, 0)\n this.nextFrame = null\n this.updateNextFrame(this.asyncId)\n \n if (this.stalled) {\n this.events.emit('canplay')\n this.events.emit('playing')\n this.stalled = false\n }\n } else if (!this.nextFrame) {\n this.updateNextFrame(this.asyncId)\n \n if (!this.nextFrame && Number.isFinite(this.duration) && t < this.duration && !this.stalled) {\n this.stalled = true\n this.events.emit('waiting')\n }\n }\n\n this.rafId = requestAnimationFrame(() => this.render())\n }\n\n start(audioEngine) {\n this.audioClock = audioEngine\n this.asyncId++\n this.stalled = false\n this.updateNextFrame(this.asyncId)\n this.rafId = requestAnimationFrame(() => this.render())\n }\n\n stop() {\n cancelAnimationFrame(this.rafId)\n }\n\n async seek(time) {\n this.asyncId++\n await this.resetIterator(time)\n }\n\n setPlaybackRate(rate) {\n this.playbackRate = Math.max(0.1, Number(rate) || 1)\n }\n\n destroy() {\n this.asyncId++\n this.stop()\n this.stopIterator()\n this.posterDrawn = false\n this.input = null\n this.videoSink = null\n }\n}\n","/**\n * Event Target Implementation\n * Simple event system for video events\n */\nexport default class EventTarget {\n constructor() {\n this.listeners = new Map()\n }\n\n addEventListener(type, fn) {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, [])\n }\n this.listeners.get(type).push(fn)\n }\n\n removeEventListener(type, fn) {\n const list = this.listeners.get(type)\n if (!list) return\n \n const index = list.indexOf(fn)\n if (index >= 0) {\n list.splice(index, 1)\n }\n }\n\n emit(type, detail) {\n const evt = new Event(type)\n evt.detail = detail\n \n const list = this.listeners.get(type)\n if (list) {\n list.forEach(fn => fn(evt))\n }\n }\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"} \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/ARCHITECTURE.md b/packages/artplayer-proxy-mediabunny/ARCHITECTURE.md new file mode 100644 index 000000000..046d1f9d5 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/ARCHITECTURE.md @@ -0,0 +1,167 @@ +# Architecture Documentation + +## 文件结构 + +``` +src/ +├── index.js # 主入口,创建canvas代理 +├── VideoShim.js # HTMLVideoElement接口模拟层 +├── MediaBunnyEngine.js # 主引擎,协调音视频播放 +├── AudioEngine.js # 音频引擎,处理音频播放 +├── VideoEngine.js # 视频引擎,处理视频帧渲染 +└── EventTarget.js # 事件系统实现 +``` + +## 架构设计 + +### 层次结构 + +``` +ArtPlayer + ↓ +index.js (Canvas Proxy) + ↓ +VideoShim (HTMLVideoElement Interface) + ↓ +MediaBunnyEngine (Coordination Layer) + ├→ AudioEngine (Web Audio API) + └→ VideoEngine (Canvas Rendering) +``` + +### 核心组件 + +#### 1. index.js +- **职责**: 插件入口点,创建canvas元素并代理到VideoShim +- **功能**: + - 创建canvas和2D上下文 + - 实例化VideoShim + - 将VideoShim的属性和方法代理到canvas对象 + - 处理ArtPlayer的resize事件 + - 管理生命周期(destroy) + +#### 2. VideoShim.js +- **职责**: 模拟HTMLVideoElement接口 +- **功能**: + - 实现标准video元素的所有属性(currentTime, duration, paused等) + - 实现播放控制方法(play, pause, seek) + - 处理音量和播放速率 + - 转发事件到ArtPlayer + - 管理MediaBunnyEngine实例 + +#### 3. MediaBunnyEngine.js +- **职责**: 协调音频和视频引擎 +- **功能**: + - 管理加载流程(load timeout, metadata loading) + - 协调play/pause/seek操作 + - 同步readyState和networkState + - 错误处理 + - 管理播放状态(paused, ended, seeking) + +#### 4. AudioEngine.js +- **职责**: 音频播放和时钟源 +- **功能**: + - 使用MediaBunny加载音频轨道 + - Web Audio API播放音频 + - 提供准确的currentTime(作为主时钟) + - 音量控制和静音 + - 播放速率调整 + - 缓冲区监控(starvation detection) + +#### 5. VideoEngine.js +- **职责**: 视频帧渲染和同步 +- **功能**: + - 使用MediaBunny解码视频帧 + - 将帧渲染到canvas + - 与音频时钟同步 + - 处理late frames(可选丢帧) + - Poster图片显示 + - Preflight检查(range requests支持) + +#### 6. EventTarget.js +- **职责**: 简单的事件系统 +- **功能**: + - addEventListener + - removeEventListener + - emit事件 + +## 数据流 + +### 加载流程 +``` +MediaBunnyEngine.load() + ├→ AudioEngine.load() + │ ├→ 创建Input + │ ├→ 获取音频轨道 + │ ├→ 创建AudioBufferSink + │ └→ 触发metadata回调 + └→ VideoEngine.load() + ├→ Preflight检查(可选) + ├→ 创建Input + ├→ 获取视频轨道 + ├→ 创建CanvasSink + ├→ 初始化iterator + └→ 触发metadata回调 +``` + +### 播放流程 +``` +MediaBunnyEngine.play() + ├→ AudioEngine.play() + │ ├→ 恢复/创建AudioContext + │ └→ 启动音频buffer迭代器 + └→ VideoEngine.start(audioEngine) + ├→ 保存audio时钟引用 + └→ 启动渲染循环(requestAnimationFrame) +``` + +### 渲染循环 +``` +VideoEngine.render() + ├→ 获取当前音频时间 + ├→ 发送timeupdate事件 + ├→ 检查是否到达结束 + ├→ 如果nextFrame时间到了 + │ ├→ 清除canvas + │ ├→ 绘制frame + │ └→ 请求下一帧 + └→ requestAnimationFrame(render) +``` + +## 重构改进点 + +### 1. 代码组织 +- ✅ 扁平化目录结构(移除engine/shim/utils子目录) +- ✅ 使用ES6类代替工厂函数 +- ✅ 每个文件单一职责 + +### 2. 可读性 +- ✅ 添加详细的JSDoc注释 +- ✅ 有意义的变量和方法命名 +- ✅ 逻辑分组和代码组织 + +### 3. 可维护性 +- ✅ 清晰的依赖关系 +- ✅ 统一的错误处理 +- ✅ 一致的代码风格 + +### 4. 性能 +- ✅ 优化的帧同步算法 +- ✅ 改进的缓冲区监控 +- ✅ 减少不必要的函数创建 + +### 5. 功能 +- ✅ 移除未使用的工具函数(sleep.js) +- ✅ 简化事件系统 +- ✅ 统一的配置选项 + +## 使用的外部库 + +- **mediabunny**: WebCodecs封装库,提供Input/Source/Sink抽象 +- **ArtPlayer**: 视频播放器框架 + +## 浏览器API + +- **WebCodecs API**: 视频/音频解码 +- **Web Audio API**: 音频播放 +- **Canvas API**: 视频渲染 +- **requestAnimationFrame**: 渲染循环 diff --git a/packages/artplayer-proxy-mediabunny/README.md b/packages/artplayer-proxy-mediabunny/README.md index fcf1127fb..886be8ca1 100644 --- a/packages/artplayer-proxy-mediabunny/README.md +++ b/packages/artplayer-proxy-mediabunny/README.md @@ -1,11 +1,70 @@ # artplayer-proxy-mediabunny -mediabunny proxy for ArtPlayer +MediaBunny proxy for ArtPlayer - A high-performance video playback solution using WebCodecs and Canvas. + +## Features + +- 🚀 Hardware-accelerated video decoding via WebCodecs API +- 🎨 Canvas-based rendering for maximum flexibility +- 🎵 Web Audio API for audio playback +- 🔄 Precise audio-video synchronization +- 📦 Support for multiple media formats +- ⚡ Optimized for modern browsers + +## Installation + +```bash +npm install artplayer-proxy-mediabunny +``` + +## Usage + +```js +import Artplayer from 'artplayer' +import artplayerProxyMediabunny from 'artplayer-proxy-mediabunny' + +const art = new Artplayer({ + container: '.artplayer-app', + url: 'path/to/video.mp4', + customType: { + mediabunny: artplayerProxyMediabunny({ + // Options + loadTimeout: 12000, + timeupdateInterval: 250, + avSyncTolerance: 0.12, + dropLateFrames: false, + poster: 'path/to/poster.jpg', + }), + }, + type: 'mediabunny', +}) +``` + +## Options + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `loadTimeout` | `number` | `12000` | Timeout for loading media (ms) | +| `timeupdateInterval` | `number` | `250` | Interval for timeupdate events (ms) | +| `avSyncTolerance` | `number` | `0.12` | Audio-video sync tolerance (seconds) | +| `dropLateFrames` | `boolean` | `false` | Drop late video frames | +| `poster` | `string` | `''` | Poster image URL | +| `source` | `string\|Blob\|ReadableStream` | - | Media source | +| `preflightRange` | `boolean` | `false` | Check range support before loading | +| `volume` | `number` | `0.7` | Initial volume (0-1) | +| `muted` | `boolean` | `false` | Initial muted state | ## Demo [https://artplayer.org](https://artplayer.org/?libs=./uncompiled/artplayer-proxy-mediabunny/index.js&example=mediabunny) +## Browser Support + +Requires browsers with WebCodecs API support: +- Chrome 94+ +- Edge 94+ +- Opera 80+ + ## License MIT © Harvey Zack diff --git a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js deleted file mode 100644 index 6502ad8cd..000000000 --- a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.js +++ /dev/null @@ -1,8 +0,0 @@ - -/*! - * artplayer-proxy-mediabunny.js v1.0.0 - * Github: https://github.com/zhw2590582/ArtPlayer - * (c) 2017-2025 Harvey Zack - * Released under the MIT License. - */ -!function(e,r,a,i,s,n,o,l){var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},d="function"==typeof c[i]&&c[i],u=d.i||{},h=d.cache||{},m="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,a){if(!h[r]){if(!e[r]){if(s[r])return s[r];var n="function"==typeof c[i]&&c[i];if(!a&&n)return n(r,!0);if(d)return d(r,!0);if(m&&"string"==typeof r)return m(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}u.resolve=function(a){var i=e[r][1][a];return null!=i?i:a},u.cache={};var l=h[r]=new p.Module(r);e[r][0].call(l.exports,u,l,l.exports,c)}return h[r].exports;function u(e){var r=u.resolve(e);if(!1===r)return{};if(Array.isArray(r)){var a={__esModule:!0};return r.forEach(function(e){var r=e[0],i=e[1],s=e[2]||e[0],n=p(i);"*"===r?Object.keys(n).forEach(function(e){"default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(a,e)||Object.defineProperty(a,e,{enumerable:!0,get:function(){return n[e]}})}):"*"===s?Object.defineProperty(a,r,{enumerable:!0,value:n}):Object.defineProperty(a,r,{enumerable:!0,get:function(){return"default"===s?n.__esModule?n.default:n:n[s]}})}),a}return p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=m,this.exports={}},p.modules=e,p.cache=h,p.parent=d,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=u,p.register=function(r,a){e[r]=[function(e,r){r.exports=a},{}]},Object.defineProperty(p,"root",{get:function(){return c[i]}}),c[i]=p;for(var f=0;fl);var n=e("./proxy/canvasProxy.js"),o=s.interopDefault(n);function l(e={}){return r=>(0,o.default)(r,e)}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=l)},{"./proxy/canvasProxy.js":"ln3T4","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],ln3T4:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>l);var n=e("../shim/mediabunnyVideoShim.js"),o=s.interopDefault(n);function l(e,r){let{constructor:a}=e,{createElement:i}=a.utils,s=i("canvas"),n=s.getContext("2d"),l=(0,o.default)({art:e,canvas:s,ctx:n,option:r}),c={};for(let e in s)"function"==typeof s[e]&&(c[e]=s[e].bind(s));for(let e in l)e in s||Object.defineProperty(s,e,{get(){let r=l[e];return"function"==typeof r?r.bind(l):r},set(r){l[e]=r},configurable:!0,enumerable:!0});for(let e in c)s[e]=(...r)=>c[e](...r);function d(){e.template?.$player&&!e.option.autoSize&&Object.assign(s.style,{width:"100%",height:"100%",objectFit:"contain"})}return e.on("destroy",()=>{l.destroy()}),e.on("resize",d),e.on("video:loadedmetadata",d),s}},{"../shim/mediabunnyVideoShim.js":"aLQUP","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aLQUP:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>u);var n=e("../engine/mediabunnyEngine.js"),o=s.interopDefault(n),l=e("../utils/clamp.js"),c=s.interopDefault(l),d=e("./videoEvents.js");function u({art:e,canvas:r,ctx:a,option:i}){let s=(0,d.createVideoEventTarget)(),n=(0,o.default)({canvas:r,ctx:a,events:s,option:i}),l=null,u=i.volume??.7,h=!!i.muted,m=1;n.setVolume(u,h);let{events:p}=e.constructor.config;p.forEach(r=>{s.addEventListener(r,r=>{e.emit(`video:${r.type}`,r)})});let f={addEventListener:s.addEventListener,removeEventListener:s.removeEventListener,get src(){return l},set src(v){l=v,v&&n.load(v)},get currentTime(){return n.currentTime},set currentTime(t){n.seek(Number(t)||0)},get duration(){return n.duration},get buffered(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get played(){let e=n.duration,r=n.currentTime;if(!e||Number.isNaN(e)||r<=0)return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>r}},get paused(){return n.paused},get playing(){return!n.paused&&!n.ended},get ended(){return n.ended},get readyState(){return n.readyState},get networkState(){return n.networkState},get error(){return n.error},get seeking(){return n.seeking},get seekable(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get playbackRate(){return m},set playbackRate(v){let e=Number(v);if(Number.isNaN(e)||e<=0)return;m=e,n.setPlaybackRate(e),s.emit("ratechange")},get volume(){return u},set volume(v){u=(0,c.default)(v,0,1),h=!1,n.setVolume(u,h),s.emit("volumechange")},get muted(){return h},set muted(v){h=!!v,n.setVolume(u,h),s.emit("volumechange")},play:()=>n.play(),pause(){n.pause()},load(){l&&n.load(l)},destroy(){n.destroy()},get videoWidth(){return n.videoWidth},get videoHeight(){return n.videoHeight},get playsInline(){return!0},set playsInline(v){},get autoplay(){return i.autoplay||!1},set autoplay(v){},get loop(){return i.loop||!1},set loop(v){},get controls(){return!1},set controls(v){},get crossOrigin(){return i.crossOrigin||""},set crossOrigin(v){},get currentSrc(){return l},get poster(){return i.poster||""},set poster(v){i.poster=v},get preload(){return"auto"},set preload(v){},get defaultMuted(){return!1},set defaultMuted(v){},get defaultPlaybackRate(){return 1},set defaultPlaybackRate(v){},canPlayType:e=>"maybe",getBoundingClientRect:()=>r.getBoundingClientRect(),requestVideoFrameCallback:e=>requestAnimationFrame(r=>{e(r,{presentationTime:n.currentTime,expectedDisplayTime:r+16.6,width:n.videoWidth,height:n.videoHeight,mediaTime:n.currentTime,presentedFrames:0,processingDuration:0,captureTime:r,receiveTime:r,rtpTimestamp:0})}),cancelVideoFrameCallback(e){cancelAnimationFrame(e)},setAttribute(e,a){"src"===e?this.src=a:"autoplay"===e?this.autoplay=a:"loop"===e?this.loop=a:"muted"===e?this.muted=!0:r.setAttribute(e,a)}};return i.source?f.src=i.source:e.option?.url&&(f.src=e.option.url),f}},{"../engine/mediabunnyEngine.js":"hMkle","../utils/clamp.js":"i5ob4","./videoEvents.js":"5969H","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],hMkle:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>d);var n=e("./audioEngine.js"),o=s.interopDefault(n),l=e("./videoEngine.js"),c=s.interopDefault(l);function d({canvas:e,ctx:r,events:a,option:i={}}){let s=(0,o.default)(a),n=(0,c.default)({canvas:e,ctx:r,events:a,timeupdateInterval:i.timeupdateInterval??250,avSyncTolerance:i.avSyncTolerance??.12,dropLateFrames:i.dropLateFrames??!1,poster:i.poster??"",preflightRange:i.preflightRange??!1}),l=!0,d=!1,u=0,h=0,m=null,p=!1,f=0;async function g(e){let r=++f;b(),d=!1,m=null,h=2,u=0,setTimeout(()=>a.emit("waiting"),0),setTimeout(()=>a.emit("loadstart"),0);let o=Number.isFinite(i.loadTimeout)?i.loadTimeout:12e3,l=null,c=o>0?new Promise((e,r)=>{l=setTimeout(()=>r(Error("Load timeout")),o)}):null,p=(async()=>{try{let i=!1,o=!1,l=()=>{i&&o&&(u=1,a.emit("loadedmetadata"),a.emit("durationchange"))},c=n.load(e,()=>{r===f&&(i=!0,l())}),d=s.load(e,()=>{r===f&&(o=!0,l())});if(await Promise.all([c,d]),r!==f)return;u=4,h=1,a.emit("loadeddata"),a.emit("canplay"),a.emit("canplaythrough")}catch(e){if(r!==f)return;m={code:4,message:e.message},h=3,a.emit("error"),console.error(e)}finally{l&&clearTimeout(l)}})();if(c)try{await Promise.race([p,c])}catch(e){if(r!==f)return;f++,m={code:4,message:e.message},h=3,a.emit("error")}else await p}async function k(){l&&(d=!1,l=!1,await s.play(),n.start(s),a.emit("play"),a.emit("playing"))}function b(){l||(l=!0,s.pause(),n.stop(),a.emit("pause"))}async function T(e){let r=!l;d=!1,p=!0,a.emit("seeking"),a.emit("waiting"),b(),await s.seek(e),await n.seek(e),p=!1,a.emit("seeked"),r&&!d&&await k()}return a.addEventListener?.("ended",()=>{d=!0,l=!0}),{load:g,play:k,pause:b,seek:T,destroy:function(){b(),s.destroy(),n.destroy()},setVolume:s.setVolume,setPlaybackRate(e){s.setPlaybackRate(e),n.setPlaybackRate(e)},get currentTime(){return s.currentTime},get duration(){return s.duration||n.duration},get paused(){return l},get seeking(){return p},get ended(){return d},get readyState(){return u},get networkState(){return h},get error(){return m},get videoWidth(){return n.width},get videoHeight(){return n.height}}}},{"./audioEngine.js":"d0iOY","./videoEngine.js":"8o8Re","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],d0iOY:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o(e){let r=null,a=null,i=null,s=null,o=null,l=0,c=0,d=0,u=NaN,h=!0,m=.7,p=!1,f=1,g=0,k=new Set;function b(){return h?c:(i.currentTime-l)*f+c}function T(){if(!s)return;let e=p?0:m;s.gain.value=e*e}function y(e){if(i)return;let r=window.AudioContext||window.webkitAudioContext;try{i=new r({sampleRate:e})}catch{i=new r}(s=i.createGain()).connect(i.destination),T()}function S(){for(let e of k)e.stop();k.clear()}async function w(){await o?.return(),o=null}async function I(r){if(a)for(await w(),o=a.buffers(b());;){let a;if(r!==g||h)return;let n=o.next(),u=setInterval(()=>{r!==g||h?clearInterval(u):"running"===i.state&&i.currentTime>=d-.2&&(i.suspend(),e.emit("waiting"))},50);try{a=await n}catch(e){console.error(e);break}finally{clearInterval(u)}if(r!==g||h)return;if("suspended"===i.state&&(await i.resume(),e.emit("canplay"),e.emit("playing")),a.done)break;let{buffer:m,timestamp:p}=a.value,b=i.createBufferSource();b.buffer=m,b.connect(s),b.playbackRate.value=f;let T=l+(p-c)/f,y=T+m.duration/f;y>d&&(d=y),T>=i.currentTime?b.start(T):b.start(i.currentTime,(i.currentTime-T)*f),k.add(b),b.onended=()=>k.delete(b)}}function x(){h||(c=b(),h=!0,w(),S())}return{load:async function e(e,i){let s=++g;await w(),S(),h=!0,c=0,l=0;let o="string"==typeof e?new(0,n.UrlSource)(e):e instanceof Blob?new(0,n.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,n.ReadableStreamSource)(e):e;if(!o||(r=new(0,n.Input)({source:o,formats:n.ALL_FORMATS}),u=await r.computeDuration(),s!==g))return;let d=await r.getPrimaryAudioTrack();if(!d||null===d.codec||!await d.canDecode()){a=null,y(),i&&i();return}y(d.sampleRate),a=new(0,n.AudioBufferSink)(d),i&&i()},play:async function e(){h&&(i||y(),"suspended"===i.state&&await i.resume(),d=l=i.currentTime,h=!1,I(++g))},pause:x,seek:async function e(e){c=Math.max(0,e),d=l=i.currentTime,g++,h||I(g)},destroy:function(){g++,x(),i?.close(),i=null,r=null,a=null},setVolume(e,r){m=e,p=r,T()},setPlaybackRate(e){e!==f&&(h||(c=b(),l=i.currentTime),f=e,h||I(++g))},get currentTime(){return b()},get duration(){return u},get paused(){return h}}}},{mediabunny:[["ALL_FORMATS","eC3Vq"],["AudioBufferSink","h5xyX"],["BlobSource","d2urb"],["ReadableStreamSource","d2urb"],["UrlSource","d2urb"],["Input","cI9DB"]],"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],eC3Vq:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputFormat",()=>T),s.export(a,"IsobmffInputFormat",()=>y),s.export(a,"Mp4InputFormat",()=>S),s.export(a,"QuickTimeInputFormat",()=>w),s.export(a,"MatroskaInputFormat",()=>I),s.export(a,"WebMInputFormat",()=>x),s.export(a,"Mp3InputFormat",()=>E),s.export(a,"WaveInputFormat",()=>P),s.export(a,"OggInputFormat",()=>C),s.export(a,"FlacInputFormat",()=>B),s.export(a,"AdtsInputFormat",()=>_),s.export(a,"MP4",()=>A),s.export(a,"QTFF",()=>D),s.export(a,"MATROSKA",()=>M),s.export(a,"WEBM",()=>F),s.export(a,"MP3",()=>R),s.export(a,"WAVE",()=>U),s.export(a,"OGG",()=>L),s.export(a,"ADTS",()=>O),s.export(a,"FLAC",()=>N),s.export(a,"ALL_FORMATS",()=>j);var n=e("./isobmff/isobmff-demuxer.js"),o=e("./matroska/ebml.js"),l=e("./matroska/matroska-demuxer.js"),c=e("./mp3/mp3-demuxer.js"),d=e("../shared/mp3-misc.js"),u=e("./id3.js"),h=e("./mp3/mp3-reader.js"),m=e("./ogg/ogg-demuxer.js"),p=e("./wave/wave-demuxer.js"),f=e("./adts/adts-reader.js"),g=e("./adts/adts-demuxer.js"),k=e("./reader.js"),b=e("./flac/flac-demuxer.js");class T{}class y extends T{async _getMajorBrand(e){let r=e._reader.requestSlice(0,12);return(r instanceof Promise&&(r=await r),r)?(r.skip(4),"ftyp"!==(0,k.readAscii)(r,4))?null:(0,k.readAscii)(r,4):null}_createDemuxer(e){return new(0,n.IsobmffDemuxer)(e)}}class S extends y{async _canReadInput(e){let r=await this._getMajorBrand(e);return!!r&&"qt "!==r}get name(){return"MP4"}get mimeType(){return"video/mp4"}}class w extends y{async _canReadInput(e){return"qt "===await this._getMajorBrand(e)}get name(){return"QuickTime File Format"}get mimeType(){return"video/quicktime"}}class I extends T{async isSupportedEBMLOfDocType(e,r){let a=e._reader.requestSlice(0,o.MAX_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)return!1;let i=(0,o.readVarIntSize)(a);if(null===i||i<1||i>8||(0,o.readUnsignedInt)(a,i)!==o.EBMLId.EBML)return!1;let s=(0,o.readElementSize)(a);if(null===s)return!1;let n=e._reader.requestSlice(a.filePos,s);if(n instanceof Promise&&(n=await n),!n)return!1;let l=a.filePos;for(;n.filePos<=l+s-o.MIN_HEADER_SIZE;){let e=(0,o.readElementHeader)(n);if(!e)break;let{id:a,size:i}=e,s=n.filePos;if(null===i)return!1;switch(a){case o.EBMLId.EBMLVersion:case o.EBMLId.EBMLReadVersion:if(1!==(0,o.readUnsignedInt)(n,i))return!1;break;case o.EBMLId.DocType:if((0,o.readAsciiString)(n,i)!==r)return!1;break;case o.EBMLId.DocTypeVersion:if((0,o.readUnsignedInt)(n,i)>4)return!1}n.filePos=s+i}return!0}_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"matroska")}_createDemuxer(e){return new(0,l.MatroskaDemuxer)(e)}get name(){return"Matroska"}get mimeType(){return"video/x-matroska"}}class x extends I{_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"webm")}get name(){return"WebM"}get mimeType(){return"video/webm"}}class E extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,10);if(r instanceof Promise&&(r=await r),!r)return!1;let a=0,i=!1;for(;;){let r=e._reader.requestSlice(a,u.ID3_V2_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let s=(0,u.readId3V2Header)(r);if(!s)break;i=!0,a=r.filePos+s.size}let s=await (0,h.readNextFrameHeader)(e._reader,a,a+4096);if(!s)return!1;if(i)return!0;a=s.startPos+s.header.totalSize;let n=await (0,h.readNextFrameHeader)(e._reader,a,a+d.FRAME_HEADER_SIZE);if(!n)return!1;let o=s.header,l=n.header;return o.channel===l.channel&&o.sampleRate===l.sampleRate}_createDemuxer(e){return new(0,c.Mp3Demuxer)(e)}get name(){return"MP3"}get mimeType(){return"audio/mpeg"}}class P extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,12);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,k.readAscii)(r,4);return("RIFF"===a||"RIFX"===a||"RF64"===a)&&(r.skip(4),"WAVE"===(0,k.readAscii)(r,4))}_createDemuxer(e){return new(0,p.WaveDemuxer)(e)}get name(){return"WAVE"}get mimeType(){return"audio/wav"}}class C extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"OggS"===(0,k.readAscii)(r,4)}_createDemuxer(e){return new(0,m.OggDemuxer)(e)}get name(){return"Ogg"}get mimeType(){return"application/ogg"}}class B extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"fLaC"===(0,k.readAscii)(r,4)}get name(){return"FLAC"}get mimeType(){return"audio/flac"}_createDemuxer(e){return new(0,b.FlacDemuxer)(e)}}class _ extends T{async _canReadInput(e){let r=e._reader.requestSliceRange(0,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,f.readFrameHeader)(r);if(!a||((r=e._reader.requestSliceRange(a.frameLength,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE))instanceof Promise&&(r=await r),!r))return!1;let i=(0,f.readFrameHeader)(r);return!!i&&a.objectType===i.objectType&&a.samplingFrequencyIndex===i.samplingFrequencyIndex&&a.channelConfiguration===i.channelConfiguration}_createDemuxer(e){return new(0,g.AdtsDemuxer)(e)}get name(){return"ADTS"}get mimeType(){return"audio/aac"}}let A=new S,D=new w,M=new I,F=new x,R=new E,U=new P,L=new C,O=new _,N=new B,j=[A,D,M,F,U,L,N,R,O]},{"./isobmff/isobmff-demuxer.js":"c6bfa","./matroska/ebml.js":"B0jDs","./matroska/matroska-demuxer.js":"fOHz2","./mp3/mp3-demuxer.js":"i9O6t","../shared/mp3-misc.js":"25tyg","./id3.js":"69HAt","./mp3/mp3-reader.js":"8Pxtf","./ogg/ogg-demuxer.js":"5cgt7","./wave/wave-demuxer.js":"lUIAt","./adts/adts-reader.js":"5Z778","./adts/adts-demuxer.js":"2HibR","./reader.js":"3hF2Q","./flac/flac-demuxer.js":"h7VU7","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],c6bfa:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"IsobmffDemuxer",()=>g);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../misc.js"),u=e("../packet.js"),h=e("./isobmff-misc.js"),m=e("./isobmff-reader.js"),p=e("../reader.js"),f=e("../metadata.js");class g extends l.Demuxer{constructor(e){super(e),this.moovSlice=null,this.currentTrack=null,this.tracks=[],this.metadataPromise=null,this.movieTimescale=-1,this.movieDurationInTimescale=-1,this.isQuickTime=!1,this.metadataTags={},this.currentMetadataKeys=null,this.isFragmented=!1,this.fragmentTrackDefaults=[],this.currentFragment=null,this.lastReadFragment=null,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e=await Promise.all(this.tracks.map(e=>e.inputTrack.getCodecParameterString()));return(0,h.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(e=>e.info?.type==="video"),hasAudio:this.tracks.some(e=>e.info?.type==="audio"),codecStrings:e.filter(Boolean)})}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,m.MIN_BOX_HEADER_SIZE,m.MAX_BOX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=e,i=(0,m.readBoxHeader)(r);if(!i)break;if("ftyp"===i.name){let e=(0,p.readAscii)(r,4);this.isQuickTime="qt "===e}else if("moov"===i.name){let e=this.reader.requestSlice(r.filePos,i.contentSize);if(e instanceof Promise&&(e=await e),!e)break;for(let r of(this.moovSlice=e,this.readContiguousBoxes(this.moovSlice),this.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default)),this.tracks)){let e=r.editListPreviousSegmentDurations/this.movieTimescale;r.editListOffset-=Math.round(e*r.timescale)}break}e=a+i.totalSize}if(this.isFragmented&&null!==this.reader.fileSize){let e=this.reader.requestSlice(this.reader.fileSize-4,4);e instanceof Promise&&(e=await e),(0,d.assert)(e);let r=(0,p.readU32Be)(e),a=this.reader.fileSize-r;if(a>=0&&a<=this.reader.fileSize-m.MAX_BOX_HEADER_SIZE){let e=this.reader.requestSliceRange(a,m.MIN_BOX_HEADER_SIZE,m.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),e){let r=(0,m.readBoxHeader)(e);if(r&&"mfra"===r.name){let a=this.reader.requestSlice(e.filePos,r.contentSize);a instanceof Promise&&(a=await a),a&&this.readContiguousBoxes(a)}}}}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,d.assert)(this.moovSlice);let a=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(a),this.currentTrack=null,e.info?.type==="audio"&&e.info.codec&&n.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,d.assert)(e.info?.type==="audio");let a=(0,n.parsePcmCodec)(e.info.codec),i=[],s=[];for(let n=0;ne.startIndex),h=r.sampleTimingEntries[u],m=(0,d.binarySearchLessOrEqual)(r.sampleTimingEntries,c,e=>e.startIndex),p=r.sampleTimingEntries[m],f=h.startDecodeTimestamp+(l-h.startIndex)*h.delta,g=p.startDecodeTimestamp+(c-p.startIndex)*p.delta-f,k=(0,d.last)(i);k&&k.delta===g?k.count++:i.push({startIndex:o.startChunkIndex+n,startDecodeTimestamp:f,count:1,delta:g});let b=o.samplesPerChunk*a.sampleSize*e.info.numberOfChannels;s.push(b)}o.startSampleIndex=o.startChunkIndex,o.samplesPerChunk=1}r.sampleTimingEntries=i,r.sampleSizes=s}if(r.sampleCompositionTimeOffsets.length>0){for(let e of(r.presentationTimestamps=[],r.sampleTimingEntries))for(let a=0;ae.presentationTimestamp-r.presentationTimestamp),r.presentationTimestampIndexMap=Array(r.presentationTimestamps.length).fill(-1);for(let e=0;ee.moofOffset===s.moofOffset);if(i)x(r,i.timestamp);else{let e=(0,d.binarySearchLessOrEqual)(a,s.moofOffset-1,e=>e.moofOffset);-1!==e&&x(r,a[e].endTimestamp)}r.startTimestampIsFinal=!0}let i=(0,d.binarySearchLessOrEqual)(a,r.startTimestamp,e=>e.startTimestamp);(-1===i||a[i].moofOffset!==s.moofOffset)&&a.splice(i+1,0,{moofOffset:s.moofOffset,startTimestamp:r.startTimestamp,endTimestamp:r.endTimestamp})}return s}readContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-m.MIN_BOX_HEADER_SIZE&&this.traverseBox(e););}*iterateContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-m.MIN_BOX_HEADER_SIZE;){let r=e.filePos,a=(0,m.readBoxHeader)(e);if(!a)break;yield{boxInfo:a,slice:e},e.filePos=r+a.totalSize}}traverseBox(e){let r=e.filePos,a=(0,m.readBoxHeader)(e);if(!a)return!1;let i=e.filePos,s=r+a.totalSize;switch(a.name){case"mdia":case"minf":case"dinf":case"mfra":case"edts":case"wave":this.readContiguousBoxes(e.slice(i,a.contentSize));break;case"mvhd":{let r=(0,p.readU8)(e);e.skip(3),1===r?(e.skip(16),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU64Be)(e)):(e.skip(8),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU32Be)(e))}break;case"trak":{let r={id:-1,demuxer:this,inputTrack:null,disposition:{...f.DEFAULT_TRACK_DISPOSITION},info:null,timescale:-1,durationInMovieTimescale:-1,durationInMediaTimescale:-1,rotation:0,internalCodecId:null,name:null,languageCode:d.UNDETERMINED_LANGUAGE,sampleTableByteOffset:-1,sampleTable:null,fragmentLookupTable:[],currentFragmentState:null,fragmentPositionCache:[],editListPreviousSegmentDurations:0,editListOffset:0};this.currentTrack=r,this.readContiguousBoxes(e.slice(i,a.contentSize)),-1!==r.id&&-1!==r.timescale&&null!==r.info&&("video"===r.info.type&&-1!==r.info.width?(r.inputTrack=new(0,c.InputVideoTrack)(this.input,new b(r)),this.tracks.push(r)):"audio"===r.info.type&&-1!==r.info.numberOfChannels&&(r.inputTrack=new(0,c.InputAudioTrack)(this.input,new T(r)),this.tracks.push(r))),this.currentTrack=null}break;case"tkhd":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e);if(r.disposition.default=!!(1&i),0===a)e.skip(8),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU32Be)(e);else if(1===a)e.skip(16),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU64Be)(e);else throw Error(`Incorrect track header version ${a}.`);e.skip(16);let s=[(0,m.readFixed_16_16)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_2_30)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_2_30)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_2_30)(e)],n=(0,d.normalizeRotation)((0,d.roundToMultiple)(E(s),90));(0,d.assert)(0===n||90===n||180===n||270===n),r.rotation=n}break;case"elst":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e);e.skip(3);let i=!1,s=0,n=(0,p.readU32Be)(e);for(let o=0;o0){r.languageCode="";for(let e=0;e<3;e++)r.languageCode=String.fromCharCode(96+(31&i))+r.languageCode,i>>=5;(0,d.isIso639Dash2LanguageCode)(r.languageCode)||(r.languageCode=d.UNDETERMINED_LANGUAGE)}}break;case"hdlr":{let r=this.currentTrack;if(!r)break;e.skip(8);let a=(0,p.readAscii)(e,4);"vide"===a?r.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===a&&(r.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case"stbl":{let s=this.currentTrack;if(!s)break;s.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(i,a.contentSize))}break;case"stsd":{let r=this.currentTrack;if(!r||null===r.info||r.sampleTable)break;let a=(0,p.readU8)(e);e.skip(3);let i=(0,p.readU32Be)(e);for(let s=0;s0){if(1===l)e.skip(4),d=8*(0,p.readU32Be)(e),e.skip(8);else if(2===l){e.skip(4),u=(0,p.readF64Be)(e),c=(0,p.readU32Be)(e),e.skip(4),d=(0,p.readU32Be)(e);let a=(0,p.readU32Be)(e);if(e.skip(8),"lpcm"===o){let e=d+7>>3,i=!!(1&a),s=!!(2&a),n=4&a?-1:0;d>0&&d<=64&&(i?32===d&&(r.info.codec=s?"pcm-f32be":"pcm-f32"):n&1<>4,chromaSubsampling:s>>1&7,videoFullRangeFlag:1&s,colourPrimaries:n,transferCharacteristics:o,matrixCoefficients:l}}break;case"av1C":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="video"),e.skip(1);let a=(0,p.readU8)(e),i=a>>5,s=(0,p.readU8)(e),n=s>>6&1;r.info.av1CodecInfo={profile:i,level:31&a,tier:s>>7,bitDepth:2===i&&n?s>>5&1?12:10:n?10:8,monochrome:s>>4&1,chromaSubsamplingX:s>>3&1,chromaSubsamplingY:s>>2&1,chromaSamplePosition:3&s}}break;case"colr":{let r=this.currentTrack;if(!r||((0,d.assert)(r.info?.type==="video"),"nclx"!==(0,p.readAscii)(e,4)))break;let a=(0,p.readU16Be)(e),i=(0,p.readU16Be)(e),s=(0,p.readU16Be)(e),n=!!(128&(0,p.readU8)(e));r.info.colorSpace={primaries:d.COLOR_PRIMARIES_MAP_INVERSE[a],transfer:d.TRANSFER_CHARACTERISTICS_MAP_INVERSE[i],matrix:d.MATRIX_COEFFICIENTS_MAP_INVERSE[s],fullRange:n}}break;case"esds":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=(0,p.readU8)(e);(0,d.assert)(3===a),(0,m.readIsomVariableInteger)(e),e.skip(2);let i=(0,p.readU8)(e);if((128&i)!=0&&e.skip(2),(64&i)!=0){let r=(0,p.readU8)(e);e.skip(r)}(32&i)!=0&&e.skip(2);let s=(0,p.readU8)(e);(0,d.assert)(4===s);let o=(0,m.readIsomVariableInteger)(e),l=e.filePos,c=(0,p.readU8)(e);if(64===c||103===c?(r.info.codec="aac",r.info.aacCodecInfo={isMpeg2:103===c}):105===c||107===c?r.info.codec="mp3":221===c?r.info.codec="vorbis":console.warn(`Unsupported audio codec (objectTypeIndication ${c}) - discarding track.`),e.skip(12),o>e.filePos-l){let a=(0,p.readU8)(e);(0,d.assert)(5===a);let i=(0,m.readIsomVariableInteger)(e);if(r.info.codecDescription=(0,p.readBytes)(e,i),"aac"===r.info.codec){let e=(0,n.parseAacAudioSpecificConfig)(r.info.codecDescription);null!==e.numberOfChannels&&(r.info.numberOfChannels=e.numberOfChannels),null!==e.sampleRate&&(r.info.sampleRate=e.sampleRate)}}}break;case"enda":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),255&(0,p.readU16Be)(e)&&("pcm-s16be"===r.info.codec?r.info.codec="pcm-s16":"pcm-s24be"===r.info.codec?r.info.codec="pcm-s24":"pcm-s32be"===r.info.codec?r.info.codec="pcm-s32":"pcm-f32be"===r.info.codec?r.info.codec="pcm-f32":"pcm-f64be"===r.info.codec&&(r.info.codec="pcm-f64"))}break;case"pcmC":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=!!(1&(0,p.readU8)(e)),i=(0,p.readU8)(e);"pcm-s16be"===r.info.codec?a?16===i?r.info.codec="pcm-s16":24===i?r.info.codec="pcm-s24":32===i?r.info.codec="pcm-s32":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):16===i?r.info.codec="pcm-s16be":24===i?r.info.codec="pcm-s24be":32===i?r.info.codec="pcm-s32be":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):"pcm-f32be"===r.info.codec&&(a?32===i?r.info.codec="pcm-f32":64===i?r.info.codec="pcm-f64":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null):32===i?r.info.codec="pcm-f32be":64===i?r.info.codec="pcm-f64be":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null));break}case"dOps":{let r,a=this.currentTrack;if(!a)break;(0,d.assert)(a.info?.type==="audio"),e.skip(1);let i=(0,p.readU8)(e),s=(0,p.readU16Be)(e),n=(0,p.readU32Be)(e),o=(0,p.readI16Be)(e),l=(0,p.readU8)(e);r=0!==l?(0,p.readBytes)(e,2+i):new Uint8Array(0);let c=new Uint8Array(19+r.byteLength),u=new DataView(c.buffer);u.setUint32(0,0x4f707573,!1),u.setUint32(4,0x48656164,!1),u.setUint8(8,1),u.setUint8(9,i),u.setUint16(10,s,!0),u.setUint32(12,n,!0),u.setInt16(16,o,!0),u.setUint8(18,l),c.set(r,19),a.info.codecDescription=c,a.info.numberOfChannels=i}break;case"dfLa":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=e.filePos;for(;e.filePos>>12,s=(a>>9&7)+1;r.info.sampleRate=i,r.info.numberOfChannels=s,e.skip(20)}else e.skip(i);if(128&a)break}let i=e.filePos;e.filePos=a;let n=(0,p.readBytes)(e,i-a),l=new Uint8Array(4+n.byteLength);new DataView(l.buffer).setUint32(0,0x664c6143,!1),l.set(n,4),r.info.codecDescription=l}break;case"stts":{let r=this.currentTrack;if(!r||!r.sampleTable)break;e.skip(4);let a=(0,p.readU32Be)(e),i=0,s=0;for(let n=0;ne.id===a);if(!i)break;let s=(0,p.readU32Be)(e),n=[p.readU8,p.readU16Be,p.readU24Be,p.readU32Be],o=n[(48&s)>>4],l=n[(12&s)>>2],c=n[3&s],d=(0,p.readU32Be)(e);for(let a=0;ae.timestamp-r.timestamp);for(let e=0;ee.id===a);if(!i)break;let s=this.fragmentTrackDefaults.find(e=>e.trackId===a);this.currentTrack=i,i.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:s?.defaultSampleDescriptionIndex??null,defaultSampleDuration:s?.defaultSampleDuration??null,defaultSampleSize:s?.defaultSampleSize??null,defaultSampleFlags:s?.defaultSampleFlags??null,startTimestamp:null},1&r?i.currentFragmentState.baseDataOffset=(0,p.readU64Be)(e):131072&r&&(i.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),2&r&&(i.currentFragmentState.sampleDescriptionIndex=(0,p.readU32Be)(e)),8&r&&(i.currentFragmentState.defaultSampleDuration=(0,p.readU32Be)(e)),16&r&&(i.currentFragmentState.defaultSampleSize=(0,p.readU32Be)(e)),32&r&&(i.currentFragmentState.defaultSampleFlags=(0,p.readU32Be)(e)),65536&r&&(i.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.currentFragmentState);let a=(0,p.readU8)(e);e.skip(3);let i=0===a?(0,p.readU32Be)(e):(0,p.readU64Be)(e);r.currentFragmentState.startTimestamp=i}break;case"trun":{let r=this.currentTrack;if(!r)break;if((0,d.assert)(this.currentFragment),(0,d.assert)(r.currentFragmentState),this.currentFragment.trackData.has(r.id)){console.warn("Can't have two trun boxes for the same track in one fragment. Ignoring...");break}let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e),s=!!(256&i),n=!!(512&i),o=!!(1024&i),l=!!(2048&i),c=(0,p.readU32Be)(e),u=r.currentFragmentState.baseDataOffset;1&i&&(u+=(0,p.readI32Be)(e));let h=null;4&i&&(h=(0,p.readU32Be)(e));let m=u;if(0===c){this.currentFragment.implicitBaseDataOffset=m;break}let f=0,g={track:r,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(r.id,g);for(let i=0;i({presentationTimestamp:e.presentationTimestamp,sampleIndex:r})).sort((e,r)=>e.presentationTimestamp-r.presentationTimestamp);for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"trkn":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.trackNumber??=r),a>0&&(this.metadataTags.tracksTotal??=a)}break;case"disc":case"disk":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.discNumber??=r),a>0&&(this.metadataTags.discsTotal??=a)}}}}return e.filePos=s,!0}}class k{constructor(e){this.internalTrack=e,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.internalCodecId}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}getTimeResolution(){return this.internalTrack.timescale}getDisposition(){return this.internalTrack.disposition}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}async getFirstPacket(e){let r=await this.fetchPacketForSampleIndex(0,e);return r||!this.internalTrack.demuxer.isFragmented?r:this.performFragmentedLookup(null,e=>e.trackData.get(this.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1},-1/0,1/0,e)}mapTimestampIntoTimescale(e){return(0,d.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}async getPacket(e,r){let a=this.mapTimestampIntoTimescale(e),i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=y(i,a),n=await this.fetchPacketForSampleIndex(s,r);return P(i)&&this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.presentationTimestamp);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id);if(i.sampleIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.findLastIndex)(r.presentationTimestamps,e=>r.samples[e.sampleIndex].isKeyFrame&&e.presentationTimestamp<=a);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id).samples.findIndex((e,r)=>e.isKeyFrame&&r>i.sampleIndex);if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.samples.findIndex(e=>e.isKeyFrame);return(0,d.assert)(-1!==e),{sampleIndex:e,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)}async fetchPacketForSampleIndex(e,r){let a;if(-1===e)return null;let i=w(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e);if(!i)return null;if(r.metadataOnly)a=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(i.sampleOffset,i.sampleSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),a=(0,p.readBytes)(e,i.sampleSize)}let s=(i.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,n=i.duration/this.internalTrack.timescale,o=new(0,u.EncodedPacket)(a,i.isKeyFrame?"key":"delta",s,n,e,i.sampleSize);return this.packetToSampleIndex.set(o,e),o}async fetchPacketInFragment(e,r,a){let i;if(-1===r)return null;let s=e.trackData.get(this.internalTrack.id).samples[r];if((0,d.assert)(s),a.metadataOnly)i=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(s.byteOffset,s.byteSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),i=(0,p.readBytes)(e,s.byteSize)}let n=(s.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=s.duration/this.internalTrack.timescale,l=new(0,u.EncodedPacket)(i,s.isKeyFrame?"key":"delta",n,o,e.moofOffset+r,s.byteSize);return this.packetToFragmentLocation.set(l,{fragment:e,sampleIndex:r}),l}async performFragmentedLookup(e,r,a,i,s){let n,o=this.internalTrack.demuxer,l=null,c=null,u=-1;if(e){let{sampleIndex:a,correctSampleFound:i}=r(e);if(i)return this.fetchPacketInFragment(e,a,s);-1!==a&&(c=e,u=a)}let h=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,a,e=>e.timestamp),p=-1!==h?this.internalTrack.fragmentLookupTable[h]:null,f=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,a,e=>e.startTimestamp),g=-1!==f?this.internalTrack.fragmentPositionCache[f]:null,k=Math.max(p?.moofOffset??0,g?.moofOffset??0)||null;for(e?null===k||e.moofOffset>=k?(n=e.moofOffset+e.moofSize,l=e):n=k:n=k??0;;){if(l){let e=l.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,m.MIN_BOX_HEADER_SIZE,m.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,d=(0,m.readBoxHeader)(e);if(!d)break;if("moof"===d.name){let{sampleIndex:e,correctSampleFound:i}=r(l=await o.readFragment(a));if(i)return this.fetchPacketInFragment(l,e,s);-1!==e&&(c=l,u=e)}n=a+d.totalSize}if(p&&(!c||c.moofOffset{if("vp9"!==this.internalTrack.info.codec||this.internalTrack.info.vp9CodecInfo){if("av1"===this.internalTrack.info.codec&&!this.internalTrack.info.av1CodecInfo){let e=await this.getFirstPacket({});this.internalTrack.info.av1CodecInfo=e&&(0,o.extractAv1CodecInfoFromPacket)(e.data)}}else{let e=await this.getFirstPacket({});this.internalTrack.info.vp9CodecInfo=e&&(0,o.extractVp9CodecInfoFromPacket)(e.data)}return{codec:(0,n.extractVideoCodecString)(this.internalTrack.info),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class T extends k{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,n.extractAudioCodecString)(this.internalTrack.info),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}let y=(e,r)=>{if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);return -1===a?-1:e.presentationTimestamps[a].sampleIndex}{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startDecodeTimestamp);if(-1===a)return -1;let i=e.sampleTimingEntries[a];return i.startIndex+Math.min(Math.floor((r-i.startDecodeTimestamp)/i.delta),i.count-1)}},S=(e,r)=>{if(!e.keySampleIndices)return y(e,r);if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);if(-1===a)return -1;for(let r=a;r>=0;r--){let a=e.presentationTimestamps[r].sampleIndex;if(-1!==(0,d.binarySearchExact)(e.keySampleIndices,a,e=>e))return a}return -1}{let a=y(e,r),i=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,a,e=>e);return e.keySampleIndices[i]??-1}},w=(e,r)=>{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startIndex),i=e.sampleTimingEntries[a];if(!i||i.startIndex+i.count<=r)return null;let s=i.startDecodeTimestamp+(r-i.startIndex)*i.delta,n=(0,d.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,e=>e.startIndex),o=e.sampleCompositionTimeOffsets[n];o&&r-o.startIndexe.startSampleIndex),u=e.sampleToChunk[c];(0,d.assert)(u);let h=u.startChunkIndex+Math.floor((r-u.startSampleIndex)/u.samplesPerChunk),m=e.chunkOffsets[h],p=u.startSampleIndex+(h-u.startChunkIndex)*u.samplesPerChunk,f=0,g=m;if(1===e.sampleSizes.length)g+=l*(r-p),f+=l*u.samplesPerChunk;else for(let a=p;ae)}},I=(e,r)=>{if(!e.keySampleIndices)return r+1;let a=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,r,e=>e);return e.keySampleIndices[a+1]??-1},x=(e,r)=>{for(let a of(e.startTimestamp+=r,e.endTimestamp+=r,e.samples))a.presentationTimestamp+=r;for(let a of e.presentationTimestamps)a.presentationTimestamp+=r},E=e=>{let[r,,,a]=e,i=Math.hypot(r,a),s=-(180/Math.PI*Math.atan2(a/i,r/i));return Number.isFinite(s)?s:0},P=e=>0===e.sampleSizes.length},{"../codec.js":"8wd8o","../codec-data.js":"4Hepu","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../misc.js":"dpOkn","../packet.js":"i61Hy","./isobmff-misc.js":"8o5uh","./isobmff-reader.js":"8Phe1","../reader.js":"3hF2Q","../metadata.js":"fFgR1","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8wd8o":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"VIDEO_CODECS",()=>o),s.export(a,"PCM_AUDIO_CODECS",()=>l),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c),s.export(a,"AUDIO_CODECS",()=>d),s.export(a,"SUBTITLE_CODECS",()=>u),s.export(a,"VP9_LEVEL_TABLE",()=>p),s.export(a,"buildVideoCodecString",()=>b),s.export(a,"generateVp9CodecConfigurationFromCodecString",()=>T),s.export(a,"generateAv1CodecConfigurationFromCodecString",()=>y),s.export(a,"extractVideoCodecString",()=>S),s.export(a,"buildAudioCodecString",()=>w),s.export(a,"extractAudioCodecString",()=>I),s.export(a,"aacFrequencyTable",()=>x),s.export(a,"aacChannelMap",()=>E),s.export(a,"parseAacAudioSpecificConfig",()=>P),s.export(a,"buildAacAudioSpecificConfig",()=>C),s.export(a,"OPUS_SAMPLE_RATE",()=>B),s.export(a,"parsePcmCodec",()=>A),s.export(a,"inferCodecFromCodecString",()=>D),s.export(a,"getVideoEncoderConfigExtension",()=>M),s.export(a,"getAudioEncoderConfigExtension",()=>F),s.export(a,"validateVideoChunkMetadata",()=>j),s.export(a,"validateAudioChunkMetadata",()=>V),s.export(a,"validateSubtitleMetadata",()=>H);var n=e("./misc.js");let o=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],c=["aac","opus","mp3","vorbis","flac"],d=[...c,...l],u=["webvtt"],h=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],m=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],p=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],f=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],g=".01.01.01.01.00",k=".0.110.01.01.01.0",b=(e,r,a,i)=>{if("avc"===e){let e=Math.ceil(r/16)*Math.ceil(a/16),s=h.find(r=>e<=r.maxMacroblocks&&i<=r.maxBitrate)??(0,n.last)(h),o=s?s.level:0,l="64".padStart(2,"0"),c=o.toString(16).padStart(2,"0");return`avc1.${l}00${c}`}if("hevc"===e){let e=r*a,s=m.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(m);return`hev1.1.6.${s.tier}${s.level}.B0`}if("vp8"===e)return"vp8";if("vp9"===e){let e=r*a,s=p.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(p);return`vp09.00.${s.level.toString().padStart(2,"0")}.08`}if("av1"===e){let e=r*a,s=f.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(f),o=s.level.toString().padStart(2,"0");return`av01.0.${o}${s.tier}.08`}throw TypeError(`Unhandled codec '${e}'.`)},T=e=>{let r=e.split(".");return[1,1,Number(r[1]),2,1,Number(r[2]),3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},y=e=>{let r=e.split("."),a=Number(r[1]),i=r[2];return[129,(a<<5)+Number(i.slice(0,-1)),(("H"===i.slice(-1))<<7)+((8!==Number(r[3]))<<6)+0+((r[4]?Number(r[4]):0)<<4)+((r[5]?Number(r[5][0]):1)<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},S=e=>{let{codec:r,codecDescription:a,colorSpace:i,avcCodecInfo:s,hevcCodecInfo:o,vp9CodecInfo:l,av1CodecInfo:c}=e;if("avc"===r){if((0,n.assert)(null!==e.avcType),s){let r=new Uint8Array([s.avcProfileIndication,s.profileCompatibility,s.avcLevelIndication]);return`avc${e.avcType}.${(0,n.bytesToHexString)(r)}`}if(!a||a.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${e.avcType}.${(0,n.bytesToHexString)(a.subarray(1,4))}`}if("hevc"===r){let e,r,i,s,l,c;if(o)e=o.generalProfileSpace,r=o.generalProfileIdc,i=(0,n.reverseBitsU32)(o.generalProfileCompatibilityFlags),s=o.generalTierFlag,l=o.generalLevelIdc,c=[...o.generalConstraintIndicatorFlags];else{if(!a||a.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let o=(0,n.toDataView)(a),d=o.getUint8(1);e=d>>6&3,r=31&d,i=(0,n.reverseBitsU32)(o.getUint32(2)),s=d>>5&1,l=o.getUint8(12),c=[];for(let e=0;e<6;e++)c.push(o.getUint8(6+e))}let d="hev1.";for(d+=["","A","B","C"][e]+r,d+=".",d+=i.toString(16).toUpperCase(),d+=".",d+=0===s?"L":"H",d+=l;c.length>0&&0===c[c.length-1];)c.pop();return c.length>0&&(d+=".",d+=c.map(e=>e.toString(16).toUpperCase()).join(".")),d}if("vp8"===r)return"vp8";if("vp9"===r){if(!l){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`vp09.00.${a.toString().padStart(2,"0")}.08`}let r=l.profile.toString().padStart(2,"0"),a=l.level.toString().padStart(2,"0"),i=l.bitDepth.toString().padStart(2,"0"),s=l.chromaSubsampling.toString().padStart(2,"0"),o=l.colourPrimaries.toString().padStart(2,"0"),c=l.transferCharacteristics.toString().padStart(2,"0"),d=l.matrixCoefficients.toString().padStart(2,"0"),u=l.videoFullRangeFlag.toString().padStart(2,"0"),h=`vp09.${r}.${a}.${i}.${s}`;return(h+=`.${o}.${c}.${d}.${u}`).endsWith(g)&&(h=h.slice(0,-g.length)),h}if("av1"===r){if(!c){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`av01.0.${a.toString().padStart(2,"0")}M.08`}let r=c.profile,a=c.level.toString().padStart(2,"0"),s=c.tier?"H":"M",o=c.bitDepth.toString().padStart(2,"0"),l=c.monochrome?"1":"0",d=100*c.chromaSubsamplingX+10*c.chromaSubsamplingY+ +(c.chromaSubsamplingX&&c.chromaSubsamplingY?c.chromaSamplePosition:0),u=i?.primaries?n.COLOR_PRIMARIES_MAP[i.primaries]:1,h=i?.transfer?n.TRANSFER_CHARACTERISTICS_MAP[i.transfer]:1,m=i?.matrix?n.MATRIX_COEFFICIENTS_MAP[i.matrix]:1,f=+!!i?.fullRange,g=`av01.${r}.${a}${s}.${o}`;return g+=`.${l}.${d.toString().padStart(3,"0")}`,g+=`.${u.toString().padStart(2,"0")}`,g+=`.${h.toString().padStart(2,"0")}`,g+=`.${m.toString().padStart(2,"0")}`,(g+=`.${f}`).endsWith(k)&&(g=g.slice(0,-k.length)),g}throw TypeError(`Unhandled codec '${r}'.`)},w=(e,r,a)=>{if("aac"===e)return r>=2&&a<=24e3?"mp4a.40.29":a<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError(`Unhandled codec '${e}'.`)},I=e=>{let{codec:r,codecDescription:a,aacCodecInfo:i}=e;if("aac"===r){if(!i)throw TypeError("AAC codec info must be provided.");if(i.isMpeg2)return"mp4a.67";{let e=P(a);return`mp4a.40.${e.objectType}`}}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError(`Unhandled codec '${r}'.`)},x=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],E=[-1,1,2,3,4,5,6,8],P=e=>{if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");let r=new(0,n.Bitstream)(e),a=r.readBits(5);31===a&&(a=32+r.readBits(6));let i=r.readBits(4),s=null;15===i?s=r.readBits(24):i=1&&o<=7&&(l=E[o]),{objectType:a,frequencyIndex:i,sampleRate:s,channelConfiguration:o,numberOfChannels:l}},C=e=>{let r=x.indexOf(e.sampleRate),a=null;-1===r&&(r=15,a=e.sampleRate);let i=E.indexOf(e.numberOfChannels);if(-1===i)throw TypeError(`Unsupported number of channels: ${e.numberOfChannels}`);let s=13;e.objectType>=32&&(s+=6),15===r&&(s+=24);let o=new Uint8Array(Math.ceil(s/8)),l=new(0,n.Bitstream)(o);return e.objectType<32?l.writeBits(5,e.objectType):(l.writeBits(5,31),l.writeBits(6,e.objectType-32)),l.writeBits(4,r),15===r&&l.writeBits(24,a),l.writeBits(4,i),o},B=48e3,_=/^pcm-([usf])(\d+)+(be)?$/,A=e=>{let r;if((0,n.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};let a=_.exec(e);(0,n.assert)(a),r="u"===a[1]?"unsigned":"s"===a[1]?"signed":"float";let i=Number(a[2])/8;return{dataType:r,sampleSize:i,littleEndian:"be"!==a[3],silentValue:128*("pcm-u8"===e)}},D=e=>{if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(_.test(e))return e;return"webvtt"===e?"webvtt":null},M=e=>"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{},F=e=>"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{},R=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],U=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,O=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,N=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,j=e=>{if(!e)throw TypeError("Video chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!R.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){let{colorSpace:r}=e.decoderConfig;if("object"!=typeof r)throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let a=Object.keys(n.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!a.includes(r.primaries))throw TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${a.join(", ")}.`);let i=Object.keys(n.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!i.includes(r.transfer))throw TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(n.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!s.includes(r.matrix))throw TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!U.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!O.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},z=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],V=e=>{if(!e)throw TypeError("Audio chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!z.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${l.join(", ")}).`)},H=e=>{if(!e)throw TypeError("Subtitle metadata must be provided.");if("object"!=typeof e)throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!=typeof e.config)throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],dpOkn:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(e){if(!e)throw Error("Assertion failed.")}s.defineInteropFlag(a),s.export(a,"assert",()=>n),s.export(a,"normalizeRotation",()=>o),s.export(a,"last",()=>l),s.export(a,"isU32",()=>c),s.export(a,"Bitstream",()=>d),s.export(a,"readExpGolomb",()=>u),s.export(a,"readSignedExpGolomb",()=>h),s.export(a,"writeBits",()=>m),s.export(a,"toUint8Array",()=>p),s.export(a,"toDataView",()=>f),s.export(a,"textDecoder",()=>g),s.export(a,"textEncoder",()=>k),s.export(a,"isIso88591Compatible",()=>b),s.export(a,"COLOR_PRIMARIES_MAP",()=>y),s.export(a,"COLOR_PRIMARIES_MAP_INVERSE",()=>S),s.export(a,"TRANSFER_CHARACTERISTICS_MAP",()=>w),s.export(a,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",()=>I),s.export(a,"MATRIX_COEFFICIENTS_MAP",()=>x),s.export(a,"MATRIX_COEFFICIENTS_MAP_INVERSE",()=>E),s.export(a,"colorSpaceIsComplete",()=>P),s.export(a,"isAllowSharedBufferSource",()=>C),s.export(a,"AsyncMutex",()=>B),s.export(a,"bytesToHexString",()=>_),s.export(a,"reverseBitsU32",()=>A),s.export(a,"binarySearchExact",()=>D),s.export(a,"binarySearchLessOrEqual",()=>M),s.export(a,"insertSorted",()=>F),s.export(a,"promiseWithResolvers",()=>R),s.export(a,"removeItem",()=>U),s.export(a,"findLast",()=>L),s.export(a,"findLastIndex",()=>O),s.export(a,"toAsyncIterator",()=>N),s.export(a,"validateAnyIterable",()=>j),s.export(a,"assertNever",()=>z),s.export(a,"getUint24",()=>V),s.export(a,"getInt24",()=>H),s.export(a,"setUint24",()=>W),s.export(a,"setInt24",()=>q),s.export(a,"setInt64",()=>G),s.export(a,"mapAsyncGenerator",()=>K),s.export(a,"clamp",()=>X),s.export(a,"UNDETERMINED_LANGUAGE",()=>$),s.export(a,"roundIfAlmostInteger",()=>Q),s.export(a,"roundToMultiple",()=>Z),s.export(a,"ilog",()=>Y),s.export(a,"isIso639Dash2LanguageCode",()=>ee),s.export(a,"SECOND_TO_MICROSECOND_FACTOR",()=>et),s.export(a,"mergeRequestInit",()=>er),s.export(a,"retriedFetch",()=>ei),s.export(a,"computeRationalApproximation",()=>es),s.export(a,"CallSerializer",()=>en),s.export(a,"isWebKit",()=>el),s.export(a,"isFirefox",()=>ed),s.export(a,"isChromium",()=>eh),s.export(a,"getChromiumVersion",()=>ep),s.export(a,"coalesceIndex",()=>ef),s.export(a,"closedIntervalsOverlap",()=>eg),s.export(a,"keyValueIterator",()=>ek),s.export(a,"imageMimeTypeToExtension",()=>eb),s.export(a,"base64ToBytes",()=>eT),s.export(a,"bytesToBase64",()=>ey),s.export(a,"uint8ArraysAreEqual",()=>eS),s.export(a,"polyfillSymbolDispose",()=>ew),s.export(a,"isNumber",()=>eI);let o=e=>{let r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error(`Invalid rotation ${e}.`)},l=e=>e&&e[e.length-1],c=e=>e>=0&&e<0x100000000;class d{constructor(e){this.bytes=e,this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,a=7-(7&this.pos);return this.pos++,(r&1<>a}readBits(e){if(1===e)return this.readBit();let r=0;for(let a=0;a>a-e-1<{let r=0;for(;0===e.readBits(1)&&r<32;)r++;if(r>=32)throw Error("Invalid exponential-Golomb code.");return(1<{let r=u(e);return(1&r)==0?-(r>>1):r+1>>1},m=(e,r,a,i)=>{for(let s=r;s>a-s-1<e.constructor===Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e),f=e=>e.constructor===DataView?e:ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),g=new TextDecoder,k=new TextEncoder,b=e=>{for(let r=0;r255)return!1;return!0},T=e=>Object.fromEntries(Object.entries(e).map(([e,r])=>[r,e])),y={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},S=T(y),w={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},I=T(w),x={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},E=T(x),P=e=>!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange,C=e=>e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e);class B{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let e,r=new Promise(r=>{e=r}),a=this.currentPromise;return this.currentPromise=r,await a,e}}let _=e=>[...e].map(e=>e.toString(16).padStart(2,"0")).join(""),A=e=>(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0,D=(e,r,a)=>{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+s>>1,l=a(e[o]);l===r?(n=o,s=o-1):l{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+(s-i+1)/2|0;a(e[o])<=r?(n=o,i=o+1):s=o-1}return n},F=(e,r,a)=>{let i=M(e,a(r),a);e.splice(i+1,0,r)},R=()=>{let e,r;return{promise:new Promise((a,i)=>{e=a,r=i}),resolve:e,reject:r}},U=(e,r)=>{let a=e.indexOf(r);-1!==a&&e.splice(a,1)},L=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return e[a]},O=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return a;return -1},N=async function*(e){Symbol.iterator in e?yield*e[Symbol.iterator]():yield*e[Symbol.asyncIterator]()},j=e=>{if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},z=e=>{throw Error(`Unexpected value: ${e}`)},V=(e,r,a)=>{let i=e.getUint8(r),s=e.getUint8(r+1),n=e.getUint8(r+2);return a?i|s<<8|n<<16:i<<16|s<<8|n},H=(e,r,a)=>V(e,r,a)<<8>>8,W=(e,r,a,i)=>{a>>>=0,a&=0xffffff,i?(e.setUint8(r,255&a),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,a>>>16&255)):(e.setUint8(r,a>>>16&255),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,255&a))},q=(e,r,a,i)=>{(a=X(a,-8388608,8388607))<0&&(a=a+0x1000000&0xffffff),W(e,r,a,i)},G=(e,r,a,i)=>{i?(e.setUint32(r+0,a,!0),e.setInt32(r+4,Math.floor(a/0x100000000),!0)):(e.setInt32(r+0,Math.floor(a/0x100000000),!0),e.setUint32(r+4,a,!0))},K=(e,r)=>({async next(){let a=await e.next();return a.done?{value:void 0,done:!0}:{value:r(a.value),done:!1}},return:()=>e.return(),throw:r=>e.throw(r),[Symbol.asyncIterator](){return this}}),X=(e,r,a)=>Math.max(r,Math.min(a,e)),$="und",Q=e=>{let r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},Z=(e,r)=>Math.round(e/r)*r,Y=e=>{let r=0;for(;e;)r++,e>>=1;return r},J=/^[a-z]{3}$/,ee=e=>J.test(e),et=1e6*(1+Number.EPSILON),er=(e,r)=>{let a={...e,...r};if(e.headers||r.headers){let i=e.headers?ea(e.headers):{},s=r.headers?ea(r.headers):{},n={...i};Object.entries(s).forEach(([e,r])=>{let a=Object.keys(n).find(r=>r.toLowerCase()===e.toLowerCase());a&&delete n[a],n[e]=r}),a.headers=n}return a},ea=e=>{if(e instanceof Headers){let r={};return e.forEach((e,a)=>{r[a]=e}),r}if(Array.isArray(e)){let r={};return e.forEach(([e,a])=>{r[e]=a}),r}return e},ei=async(e,r,a,i,s)=>{let n=0;for(;;)try{return await e(r,a)}catch(a){if(s())throw a;let e=i(++n,a,r);if(null===e)throw a;if(console.error("Retrying failed fetch. Error:",a),!Number.isFinite(e)||e<0)throw TypeError("Retry delay must be a non-negative finite number.");if(e>0&&await new Promise(r=>setTimeout(r,1e3*e)),s())throw a}},es=(e,r)=>{let a=e<0?-1:1,i=0,s=1,n=1,o=0,l=e=Math.abs(e);for(;;){let e=Math.floor(l),a=e*n+i,c=e*o+s;if(c>r||(i=n,s=o,n=a,o=c,!isFinite(l=1/(l-e))))break}return{numerator:a*n,denominator:o}};class en{constructor(){this.currentPromise=Promise.resolve()}call(e){return this.currentPromise=this.currentPromise.then(e)}}let eo=null,el=()=>null!==eo?eo:eo=!!("undefined"!=typeof navigator&&(navigator.vendor?.match(/apple/i)||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))),ec=null,ed=()=>null!==ec?ec:ec="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),eu=null,eh=()=>null!==eu?eu:eu=!!("undefined"!=typeof navigator&&(navigator.vendor?.includes("Google Inc")||/Chrome/.test(navigator.userAgent))),em=null,ep=()=>{if(null!==em)return em;if("undefined"==typeof navigator)return null;let e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?em=Number(e[1]):null},ef=(e,r)=>-1!==e?e:r,eg=(e,r,a,i)=>e<=i&&a<=r,ek=function*(e){for(let r in e){let a=e[r];void 0!==a&&(yield{key:r,value:a})}},eb=e=>{switch(e.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},eT=e=>{let r=atob(e),a=new Uint8Array(r.length);for(let e=0;e{let r="";for(let a=0;a{if(e.length!==r.length)return!1;for(let a=0;a{Symbol.dispose??=Symbol("Symbol.dispose")},eI=e=>"number"==typeof e&&!Number.isNaN(e)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6ykb1":[function(e,r,a,i){a.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},a.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},a.exportAll=function(e,r){return Object.keys(e).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(r,a)||Object.defineProperty(r,a,{enumerable:!0,get:function(){return e[a]}})}),r},a.export=function(e,r,a){Object.defineProperty(e,r,{enumerable:!0,get:a})}},{}],"4Hepu":[function(e,r,a,i){var s,n,o,l,c,d,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(a),u.export(a,"AvcNalUnitType",()=>l),u.export(a,"HevcNalUnitType",()=>c),u.export(a,"findNalUnitsInAnnexB",()=>p),u.export(a,"transformAnnexBToLengthPrefixed",()=>k),u.export(a,"extractAvcNalUnits",()=>b),u.export(a,"extractAvcDecoderConfigurationRecord",()=>y),u.export(a,"serializeAvcDecoderConfigurationRecord",()=>S),u.export(a,"deserializeAvcDecoderConfigurationRecord",()=>w),u.export(a,"parseAvcSps",()=>I),u.export(a,"extractHevcNalUnits",()=>x),u.export(a,"extractNalUnitTypeForHevc",()=>E),u.export(a,"extractHevcDecoderConfigurationRecord",()=>P),u.export(a,"serializeHevcDecoderConfigurationRecord",()=>R),u.export(a,"extractVp9CodecInfoFromPacket",()=>U),u.export(a,"iterateAv1PacketObus",()=>L),u.export(a,"extractAv1CodecInfoFromPacket",()=>O),u.export(a,"parseOpusIdentificationHeader",()=>N),u.export(a,"parseOpusTocByte",()=>z),u.export(a,"parseModesFromVorbisSetupPacket",()=>V),u.export(a,"determineVideoPacketType",()=>H),u.export(a,"FlacBlockType",()=>d),u.export(a,"readVorbisComments",()=>W),u.export(a,"createVorbisComments",()=>q);var h=e("./codec.js"),m=e("./misc.js");(s=l||(l={}))[s.IDR=5]="IDR",s[s.SEI=6]="SEI",s[s.SPS=7]="SPS",s[s.PPS=8]="PPS",s[s.SPS_EXT=13]="SPS_EXT",(n=c||(c={}))[n.RASL_N=8]="RASL_N",n[n.RASL_R=9]="RASL_R",n[n.BLA_W_LP=16]="BLA_W_LP",n[n.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",n[n.VPS_NUT=32]="VPS_NUT",n[n.SPS_NUT=33]="SPS_NUT",n[n.PPS_NUT=34]="PPS_NUT",n[n.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",n[n.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT";let p=e=>{let r=[],a=0;for(;a0&&i>a){let s=e.subarray(a,i);s.length>0&&r.push(s)}a=i+s}if(a0&&r.push(i)}return r},f=(e,r)=>{let a=[],i=0,s=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;i+r<=e.length;){let n;1===r?n=s.getUint8(i):2===r?n=s.getUint16(i,!1):3===r?n=(0,m.getUint24)(s,i,!1):4===r?n=s.getUint32(i,!1):((0,m.assertNever)(r),(0,m.assert)(!1)),i+=r;let o=e.subarray(i,i+n);a.push(o),i+=n}return a},g=e=>{let r=[],a=e.length;for(let i=0;i{let r=p(e);if(0===r.length)return null;let a=0;for(let e of r)a+=4+e.byteLength;let i=new Uint8Array(a),s=new DataView(i.buffer),n=0;for(let e of r){let r=e.byteLength;s.setUint32(n,r,!1),n+=4,i.set(e,n),n+=e.byteLength}return i},b=(e,r)=>r.description?f(e,(3&(0,m.toUint8Array)(r.description)[4])+1):p(e),T=e=>31&e[0],y=e=>{try{let r=p(e),a=r.filter(e=>T(e)===l.SPS),i=r.filter(e=>T(e)===l.PPS),s=r.filter(e=>T(e)===l.SPS_EXT);if(0===a.length||0===i.length)return null;let n=a[0],o=I(n);(0,m.assert)(null!==o);let c=100===o.profileIdc||110===o.profileIdc||122===o.profileIdc||144===o.profileIdc;return{configurationVersion:1,avcProfileIndication:o.profileIdc,profileCompatibility:o.constraintFlags,avcLevelIndication:o.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:a,pictureParameterSets:i,chromaFormat:c?o.chromaFormatIdc:null,bitDepthLumaMinus8:c?o.bitDepthLumaMinus8:null,bitDepthChromaMinus8:c?o.bitDepthChromaMinus8:null,sequenceParameterSetExt:c?s:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},S=e=>{let r=[];for(let a of(r.push(e.configurationVersion),r.push(e.avcProfileIndication),r.push(e.profileCompatibility),r.push(e.avcLevelIndication),r.push(252|3&e.lengthSizeMinusOne),r.push(224|31&e.sequenceParameterSets.length),e.sequenceParameterSets)){let e=a.byteLength;r.push(e>>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i{try{let r=(0,m.toDataView)(e),a=0,i=r.getUint8(a++),s=r.getUint8(a++),n=r.getUint8(a++),o=r.getUint8(a++),l=3&r.getUint8(a++),c=31&r.getUint8(a++),d=[];for(let i=0;i{try{let r=new(0,m.Bitstream)(g(e));r.skipBits(1),r.skipBits(2);let a=r.readBits(5);if(7!==a)return null;let i=r.readAlignedByte(),s=r.readAlignedByte(),n=r.readAlignedByte();(0,m.readExpGolomb)(r);let o=null,l=null,c=null;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=(0,m.readExpGolomb)(r),3===o&&r.skipBits(1),l=(0,m.readExpGolomb)(r),c=(0,m.readExpGolomb)(r),r.skipBits(1),r.readBits(1))){for(let e=0;e<(3!==o?8:12);e++)if(r.readBits(1)){let a=e<6?16:64,i=8,s=8;for(let e=0;er.description?f(e,(3&(0,m.toUint8Array)(r.description)[21])+1):p(e),E=e=>e[0]>>1&63,P=e=>{try{let r=p(e),a=r.filter(e=>E(e)===c.VPS_NUT),i=r.filter(e=>E(e)===c.SPS_NUT),s=r.filter(e=>E(e)===c.PPS_NUT),n=r.filter(e=>E(e)===c.PREFIX_SEI_NUT||E(e)===c.SUFFIX_SEI_NUT);if(0===i.length||0===s.length)return null;let o=i[0],l=new(0,m.Bitstream)(g(o));l.skipBits(16),l.readBits(4);let d=l.readBits(3),u=l.readBits(1),{general_profile_space:h,general_tier_flag:f,general_profile_idc:k,general_profile_compatibility_flags:b,general_constraint_indicator_flags:T,general_level_idc:y}=C(l,d);(0,m.readExpGolomb)(l);let S=(0,m.readExpGolomb)(l);3===S&&l.skipBits(1),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),l.readBits(1)&&((0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l));let w=(0,m.readExpGolomb)(l),I=(0,m.readExpGolomb)(l);(0,m.readExpGolomb)(l);let x=l.readBits(1)?0:d;for(let e=x;e<=d;e++)(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l);(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),l.readBits(1)&&l.readBits(1)&&B(l),l.skipBits(1),l.skipBits(1),l.readBits(1)&&(l.skipBits(4),l.skipBits(4),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),l.skipBits(1));let P=(0,m.readExpGolomb)(l);if(_(l,P),l.readBits(1)){let e=(0,m.readExpGolomb)(l);for(let r=0;r0){let e=s[0],r=new(0,m.Bitstream)(g(e));r.skipBits(16),(0,m.readExpGolomb)(r),(0,m.readExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(3),r.skipBits(1),r.skipBits(1),(0,m.readExpGolomb)(r),(0,m.readExpGolomb)(r),(0,m.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.readBits(1)&&(0,m.readExpGolomb)(r),(0,m.readSignedExpGolomb)(r),(0,m.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);let a=r.readBits(1),i=r.readBits(1);M=a||i?a&&!i?2:!a&&i?3:0:0}let F=[...a.length?[{arrayCompleteness:1,nalUnitType:c.VPS_NUT,nalUnits:a}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:c.SPS_NUT,nalUnits:i}]:[],...s.length?[{arrayCompleteness:1,nalUnitType:c.PPS_NUT,nalUnits:s}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:E(n[0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:h,generalTierFlag:f,generalProfileIdc:k,generalProfileCompatibilityFlags:b,generalConstraintIndicatorFlags:T,generalLevelIdc:y,minSpatialSegmentationIdc:A,parallelismType:M,chromaFormatIdc:S,bitDepthLumaMinus8:w,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:d+1,temporalIdNested:u,lengthSizeMinusOne:3,arrays:F}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},C=(e,r)=>{let a=e.readBits(2),i=e.readBits(1),s=e.readBits(5),n=0;for(let r=0;r<32;r++)n=n<<1|e.readBits(1);let o=new Uint8Array(6);for(let r=0;r<6;r++)o[r]=e.readBits(8);let l=e.readBits(8),c=[],d=[];for(let a=0;a0)for(let a=r;a<8;a++)e.skipBits(2);for(let a=0;a{for(let r=0;r<4;r++)for(let a=0;a<(3===r?2:6);a++)if(e.readBits(1)){let a=Math.min(64,1<<4+(r<<1));r>1&&(0,m.readSignedExpGolomb)(e);for(let r=0;r{let a=[];for(let i=0;i{let s=0,n=0,o=0;if(0!==r&&(n=e.readBits(1)),n){o=r===a?r-((0,m.readExpGolomb)(e)+1):r-1,e.readBits(1),(0,m.readExpGolomb)(e);let n=i[o]??0;for(let r=0;r<=n;r++)e.readBits(1)||e.readBits(1);s=i[o]}else{let r=(0,m.readExpGolomb)(e),a=(0,m.readExpGolomb)(e);for(let a=0;a{if(e.readBits(1)&&255===e.readBits(8)&&(e.readBits(16),e.readBits(16)),e.readBits(1)&&e.readBits(1),e.readBits(1)&&(e.readBits(3),e.readBits(1),e.readBits(1)&&(e.readBits(8),e.readBits(8),e.readBits(8))),e.readBits(1)&&((0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e)),e.readBits(1),e.readBits(1),e.readBits(1),e.readBits(1)&&((0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e)),e.readBits(1)&&(e.readBits(32),e.readBits(32),e.readBits(1)&&(0,m.readExpGolomb)(e),e.readBits(1)&&M(e,!0,r)),e.readBits(1)){e.readBits(1),e.readBits(1),e.readBits(1);let r=(0,m.readExpGolomb)(e);return(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),r}return 0},M=(e,r,a)=>{let i=!1,s=!1,n=!1;r&&(i=1===e.readBits(1),s=1===e.readBits(1),(i||s)&&((n=1===e.readBits(1))&&(e.readBits(8),e.readBits(5),e.readBits(1),e.readBits(5)),e.readBits(4),e.readBits(4),n&&e.readBits(4),e.readBits(5),e.readBits(5),e.readBits(5)));for(let r=0;r<=a;r++){let r=1===e.readBits(1),a=!0;r||(a=1===e.readBits(1));let o=!1;a?(0,m.readExpGolomb)(e):o=1===e.readBits(1);let l=1;o||(l=(0,m.readExpGolomb)(e)+1),i&&F(e,l,n),s&&F(e,l,n)}},F=(e,r,a)=>{for(let i=0;i{let r=[];for(let a of(r.push(e.configurationVersion),r.push((3&e.generalProfileSpace)<<6|(1&e.generalTierFlag)<<5|31&e.generalProfileIdc),r.push(e.generalProfileCompatibilityFlags>>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push(...e.generalConstraintIndicatorFlags),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length),e.arrays))for(let e of(r.push((1&a.arrayCompleteness)<<7|63&a.nalUnitType),r.push(a.nalUnits.length>>8&255),r.push(255&a.nalUnits.length),a.nalUnits)){r.push(e.length>>8&255),r.push(255&e.length);for(let a=0;a{let r=new(0,m.Bitstream)(e);if(2!==r.readBits(2))return null;let a=r.readBits(1),i=(r.readBits(1)<<1)+a;if(3===i&&r.skipBits(1),1===r.readBits(1)||0!==r.readBits(1)||(r.skipBits(2),4817730!==r.readBits(24)))return null;let s=8;i>=2&&(s=r.readBits(1)?12:10);let n=r.readBits(3),o=0,l=0;if(7!==n)if(l=r.readBits(1),1===i||3===i){let e=r.readBits(1),a=r.readBits(1);o=e||a?e&&!a?2:1:3,r.skipBits(1)}else o=1;else o=3,l=1;let c=(r.readBits(16)+1)*(r.readBits(16)+1),d=(0,m.last)(h.VP9_LEVEL_TABLE).level;for(let e of h.VP9_LEVEL_TABLE)if(c<=e.maxPictureSize){d=e.level;break}return{profile:i,level:d,bitDepth:s,chromaSubsampling:o,videoFullRangeFlag:l,colourPrimaries:2===n?1:1===n?6:2,transferCharacteristics:2===n?1:1===n?6:2,matrixCoefficients:7===n?0:2===n?1:1===n?6:2}},L=function*(e){let r=new(0,m.Bitstream)(e),a=()=>{let e=0;for(let a=0;a<8;a++){let i=r.readAlignedByte();if(e|=(127&i)<<7*a,!(128&i))break;if(7===a&&128&i)return null}return e>=0x100000000-1?null:e};for(;r.getBitsLeft()>=8;){let i;r.skipBits(1);let s=r.readBits(4),n=r.readBits(1),o=r.readBits(1);if(r.skipBits(1),n&&r.skipBits(8),o){let e=a();if(null===e)return;i=e}else i=Math.floor(r.getBitsLeft()/8);(0,m.assert)(r.pos%8==0),yield{type:s,data:e.subarray(r.pos/8,r.pos/8+i)},r.skipBits(8*i)}},O=e=>{for(let{type:r,data:a}of L(e)){if(1!==r)continue;let e=new(0,m.Bitstream)(a),i=e.readBits(3);e.readBits(1);let s=e.readBits(1),n=0,o=0,l=0;if(s)n=e.readBits(5);else{if(e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.readBits(1)))return null;let r=e.readBits(1);r&&(l=e.readBits(5),e.skipBits(32),e.skipBits(5),e.skipBits(5));let a=e.readBits(5);for(let i=0;i<=a;i++){e.skipBits(12);let a=e.readBits(5);if(0===i&&(n=a),a>7){let r=e.readBits(1);0===i&&(o=r)}if(r&&e.readBits(1)){let r=l+1;e.skipBits(r),e.skipBits(r),e.skipBits(1)}e.readBits(1)&&e.skipBits(4)}}let c=e.readBits(4),d=e.readBits(4),u=c+1;e.skipBits(u);let h=d+1;e.skipBits(h);if((s?0:e.readBits(1))&&(e.skipBits(4),e.skipBits(3)),e.skipBits(1),e.skipBits(1),e.skipBits(1),!s){e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);let r=e.readBits(1);r&&(e.skipBits(1),e.skipBits(1));let a=e.readBits(1);(a?2:e.readBits(1))>0&&(e.readBits(1)||e.skipBits(1)),r&&e.skipBits(3)}e.skipBits(1),e.skipBits(1),e.skipBits(1);let p=e.readBits(1),f=8;2===i&&p?f=e.readBits(1)?12:10:i<=2&&(f=p?10:8);let g=0;1!==i&&(g=e.readBits(1));let k=1,b=1,T=0;return!g&&(0===i?(k=1,b=1):1===i?(k=0,b=0):12===f&&(k=e.readBits(1))&&(b=e.readBits(1)),k&&b&&(T=e.readBits(2))),{profile:i,level:n,tier:o,bitDepth:f,monochrome:g,chromaSubsamplingX:k,chromaSubsamplingY:b,chromaSamplePosition:T}}return null},N=e=>{let r=(0,m.toDataView)(e),a=r.getUint8(9),i=r.getUint16(10,!0),s=r.getUint32(12,!0),n=r.getInt16(16,!0),o=r.getUint8(18),l=null;return o&&(l=e.subarray(19,21+a)),{outputChannelCount:a,preSkip:i,inputSampleRate:s,outputGain:n,channelMappingFamily:o,channelMappingTable:l}},j=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],z=e=>({durationInSamples:j[e[0]>>3]}),V=e=>{if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==String.fromCharCode(...e.slice(1,7)))throw Error("Invalid packet signature in Setup header.");let r=e.length,a=new Uint8Array(r);for(let i=0;i97;)if(1===i.readBits(1)){s=i.pos;break}if(0===s)throw Error("Invalid Setup header: framing bit not found.");let n=0,o=!1,l=0;for(;i.getBitsLeft()>=97;){let e=i.pos,r=i.readBits(8),a=i.readBits(16),s=i.readBits(16);if(r>63||0!==a||0!==s){i.pos=e;break}if(i.skipBits(1),++n>64)break;i.clone().readBits(6)+1===n&&(o=!0,l=n)}if(!o)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error(`Unsupported mode count: ${l}.`);let c=l;i.pos=0,i.skipBits(s);let d=Array(c).fill(0);for(let e=c-1;e>=0;e--)i.skipBits(40),d[e]=i.readBits(1);return{modeBlockflags:d}},H=(e,r,a)=>{switch(e){case"avc":{let e=b(a,r),i=e.some(e=>T(e)===l.IDR);if(!i&&(!(0,m.isChromium)()||(0,m.getChromiumVersion)()>=144))for(let r of e){if(T(r)!==l.SEI)continue;let e=g(r),a=1;do{let r=0;for(;;){let i=e[a++];if(void 0===i||(r+=i,i<255))break}let s=0;for(;;){let r=e[a++];if(void 0===r||(s+=r,r<255))break}if(6===r){let r=new(0,m.Bitstream)(e);r.pos=8*a;let s=(0,m.readExpGolomb)(r),n=r.readBits(1);if(0===s&&1===n){i=!0;break}}a+=s}while(a{let r=E(e);return c.BLA_W_LP<=r&&r<=c.RSV_IRAP_VCL23})?"key":"delta";case"vp8":return 0==(1&a[0])?"key":"delta";case"vp9":{let e=new(0,m.Bitstream)(a);if(2!==e.readBits(2))return null;let r=e.readBits(1);if(3===(e.readBits(1)<<1)+r&&e.skipBits(1),e.readBits(1))return null;return 0===e.readBits(1)?"key":"delta"}case"av1":{let e=!1;for(let{type:r,data:i}of L(a))if(1===r){let r=new(0,m.Bitstream)(i);r.skipBits(4),e=!!r.readBits(1)}else if(3===r||6===r||7===r){if(e)return"key";let r=new(0,m.Bitstream)(i);if(r.readBits(1))return null;return 0===r.readBits(2)?"key":"delta"}return null}default:(0,m.assertNever)(e),(0,m.assert)(!1)}};(o=d||(d={}))[o.STREAMINFO=0]="STREAMINFO",o[o.VORBIS_COMMENT=4]="VORBIS_COMMENT",o[o.PICTURE=6]="PICTURE";let W=(e,r)=>{let a=(0,m.toDataView)(e),i=0,s=a.getUint32(i,!0);i+=4;let n=m.textDecoder.decode(e.subarray(i,i+s));i+=s,s>0&&(r.raw??={},r.raw.vendor??=n);let o=a.getUint32(i,!0);i+=4;for(let s=0;s0&&(r.trackNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.tracksTotal??=i)}break;case"TRACKTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.tracksTotal??=e)}break;case"DISCNUMBER":{let e=c.split("/"),a=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(a)&&a>0&&(r.discNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.discsTotal??=i)}break;case"DISCTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.discsTotal??=e)}break;case"DATE":{let e=new Date(c);Number.isNaN(e.getTime())||(r.date??=e)}break;case"GENRE":r.genre??=c;break;case"METADATA_BLOCK_PICTURE":{let e=(0,m.base64ToBytes)(c),a=(0,m.toDataView)(e),i=a.getUint32(0,!1),s=a.getUint32(4,!1),n=String.fromCharCode(...e.subarray(8,8+s)),o=a.getUint32(8+s,!1),l=m.textDecoder.decode(e.subarray(12+s,12+s+o)),d=a.getUint32(s+o+28),u=e.subarray(s+o+32,s+o+32+d);r.images??=[],r.images.push({data:u,mimeType:n,kind:3===i?"coverFront":4===i?"coverBack":"unknown",name:void 0,description:l||void 0})}}}},q=(e,r,a)=>{let i=[e],s=m.textEncoder.encode("Mediabunny"),n=new Uint8Array(4+s.length),o=new DataView(n.buffer);o.setUint32(0,s.length,!0),n.set(s,4),i.push(n);let l=new Set,c=(e,r)=>{let a=`${e}=${r}`,s=m.textEncoder.encode(a);(o=new DataView((n=new Uint8Array(4+s.length)).buffer)).setUint32(0,s.length,!0),n.set(s,4),i.push(n),l.add(e)};for(let{key:e,value:i}of(0,m.keyValueIterator)(r))switch(e){case"title":c("TITLE",i);break;case"description":c("DESCRIPTION",i);break;case"artist":c("ARTIST",i);break;case"album":c("ALBUM",i);break;case"albumArtist":c("ALBUMARTIST",i);break;case"genre":c("GENRE",i);break;case"date":{let e=r.raw?.DATE??r.raw?.date;c("DATE",e&&"string"==typeof e?e:i.toISOString().slice(0,10))}break;case"comment":c("COMMENT",i);break;case"lyrics":c("LYRICS",i);break;case"trackNumber":c("TRACKNUMBER",i.toString());break;case"tracksTotal":c("TRACKTOTAL",i.toString());break;case"discNumber":c("DISCNUMBER",i.toString());break;case"discsTotal":c("DISCTOTAL",i.toString());break;case"images":if(!a)break;for(let e of i){let r="coverFront"===e.kind?3:4*("coverBack"===e.kind),a=new Uint8Array(e.mimeType.length);for(let r=0;re+r.length,0)),h=0;for(let e of i)u.set(e,h),h+=e.length;return u}},{"./codec.js":"8wd8o","./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"6cHW1":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Demuxer",()=>n);class n{constructor(e){this.input=e}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8ofmg":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputTrack",()=>u),s.export(a,"InputVideoTrack",()=>h),s.export(a,"InputAudioTrack",()=>m);var n=e("./codec-data.js"),o=e("./custom-coder.js"),l=e("./media-sink.js"),c=e("./misc.js"),d=e("./packet.js");class u{constructor(e,r){this.input=e,this._backing=r}isVideoTrack(){return this instanceof h}isAudioTrack(){return this instanceof m}get id(){return this._backing.getId()}get internalCodecId(){return this._backing.getInternalCodecId()}get languageCode(){return this._backing.getLanguageCode()}get name(){return this._backing.getName()}get timeResolution(){return this._backing.getTimeResolution()}get disposition(){return this._backing.getDisposition()}getFirstTimestamp(){return this._backing.getFirstTimestamp()}computeDuration(){return this._backing.computeDuration()}async computePacketStats(e=1/0){let r=new(0,l.EncodedPacketSink)(this),a=1/0,i=-1/0,s=0,n=0;for await(let o of r.packets(void 0,void 0,{metadataOnly:!0})){if(s>=e&&o.timestamp>=i)break;a=Math.min(a,o.timestamp),i=Math.max(i,o.timestamp+o.duration),s++,n+=o.byteLength}return{packetCount:s,averagePacketRate:s?Number((s/(i-a)).toPrecision(16)):0,averageBitrate:s?Number((8*n/(i-a)).toPrecision(16)):0}}}class h extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"video"}get codec(){return this._backing.getCodec()}get codedWidth(){return this._backing.getCodedWidth()}get codedHeight(){return this._backing.getCodedHeight()}get rotation(){return this._backing.getRotation()}get displayWidth(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}get displayHeight(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getColorSpace(){return this._backing.getColorSpace()}async hasHighDynamicRange(){let e=await this._backing.getColorSpace();return"bt2020"===e.primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix}canBeTransparent(){return this._backing.canBeTransparent()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customVideoDecoders.some(a=>a.supports(r,e)))return!0;if("undefined"==typeof VideoDecoder)return!1;let a=await VideoDecoder.isConfigSupported(e);return!0===a.supported}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return null;let r=await this.getDecoderConfig();return(0,c.assert)(r),(0,n.determineVideoPacketType)(this.codec,r,e.data)}}class m extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"audio"}get codec(){return this._backing.getCodec()}get numberOfChannels(){return this._backing.getNumberOfChannels()}get sampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customAudioDecoders.some(a=>a.supports(r,e))||e.codec.startsWith("pcm-"))return!0;{if("undefined"==typeof AudioDecoder)return!1;let r=await AudioDecoder.isConfigSupported(e);return!0===r.supported}}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?null:"key"}}},{"./codec-data.js":"4Hepu","./custom-coder.js":"3RBiS","./media-sink.js":"h5xyX","./misc.js":"dpOkn","./packet.js":"i61Hy","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3RBiS":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"CustomVideoDecoder",()=>n),s.export(a,"CustomAudioDecoder",()=>o),s.export(a,"CustomVideoEncoder",()=>l),s.export(a,"CustomAudioEncoder",()=>c),s.export(a,"customVideoDecoders",()=>d),s.export(a,"customAudioDecoders",()=>u),s.export(a,"customVideoEncoders",()=>h),s.export(a,"customAudioEncoders",()=>m),s.export(a,"registerDecoder",()=>p),s.export(a,"registerEncoder",()=>f);class n{static supports(e,r){return!1}}class o{static supports(e,r){return!1}}class l{static supports(e,r){return!1}}class c{static supports(e,r){return!1}}let d=[],u=[],h=[],m=[],p=e=>{if(e.prototype instanceof n){if(d.includes(e))return void console.warn("Video decoder already registered.");d.push(e)}else if(e.prototype instanceof o){if(u.includes(e))return void console.warn("Audio decoder already registered.");u.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},f=e=>{if(e.prototype instanceof l){if(h.includes(e))return void console.warn("Video encoder already registered.");h.push(e)}else if(e.prototype instanceof c){if(m.includes(e))return void console.warn("Audio encoder already registered.");m.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],h5xyX:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"EncodedPacketSink",()=>b),s.export(a,"BaseMediaSampleSink",()=>y),s.export(a,"VideoSampleSink",()=>x),s.export(a,"CanvasSink",()=>E),s.export(a,"AudioSampleSink",()=>B),s.export(a,"AudioBufferSink",()=>_);var n=e("./codec.js"),o=e("./codec-data.js"),l=e("./custom-coder.js"),c=e("./input.js"),d=e("./input-track.js"),u=e("./misc.js"),h=e("./packet.js"),m=e("./pcm.js"),p=e("./sample.js");let f=e=>{if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},g=e=>{if(!(0,u.isNumber)(e))throw TypeError("timestamp must be a number.")},k=(e,r,a)=>a.verifyKeyPackets?r.then(async r=>{if(!r||"delta"===r.type)return r;let a=await e.determinePacketType(r);return a&&(r.type=a),r}):r;class b{constructor(e){if(!(e instanceof d.InputTrack))throw TypeError("track must be an InputTrack.");this._track=e}getFirstPacket(e={}){if(f(e),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getFirstPacket(e),e)}getPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getPacket(e,r),r)}getNextPacket(e,r={}){if(!(e instanceof h.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getNextPacket(e,r),r)}async getKeyPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getKeyPacket(e,r);let a=await this._track._backing.getKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getKeyPacket(a.timestamp-1/this._track.timeResolution,r):a}async getNextKeyPacket(e,r={}){if(!(e instanceof h.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getNextKeyPacket(e,r);let a=await this._track._backing.getNextKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getNextKeyPacket(a,r):a}packets(e,r,a={}){if(void 0!==e&&!(e instanceof h.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!a?.metadataOnly)throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof h.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(f(a),this._track.input._disposed)throw new(0,c.InputDisposedError);let i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,m=!1,p=null,g=[],k=()=>Math.max(2,g.length);(async()=>{let c=e??await this.getFirstPacket(a);for(;c&&!m&&!this._track.input._disposed&&!(r&&c.sequenceNumber>=r?.sequenceNumber);){if(i.length>k()){({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;continue}i.push(c),n(),({promise:s,resolve:n}=(0,u.promiseWithResolvers)()),c=await this.getNextPacket(c,a)}d=!0,n()})().catch(e=>{p||(p=e,n())});let b=this._track;return{async next(){for(;;)if(b.input._disposed)throw new(0,c.InputDisposedError);else if(m)return{value:void 0,done:!0};else if(p)throw p;else if(i.length>0){let e=i.shift(),r=performance.now();for(g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(m=!0,l(),n(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}class T{constructor(e,r){this.onSample=e,this.onError=r}}class y{mediaSamplesInRange(e=0,r=1/0){g(e),g(r);let a=[],i=!1,s=null,{promise:n,resolve:o}=(0,u.promiseWithResolvers)(),{promise:l,resolve:d}=(0,u.promiseWithResolvers)(),h=!1,m=!1,p=!1,f=null;(async()=>{let c,g=Error(),k=await this._createDecoder(l=>{(d(),l.timestamp>=r&&(m=!0),m)?l.close():(s&&(l.timestamp>e?(a.push(s),i=!0):s.close()),l.timestamp>=e&&(a.push(l),i=!0),s=i?null:l,a.length>0&&(o(),{promise:n,resolve:o}=(0,u.promiseWithResolvers)()))},e=>{f||(e.stack=g.stack,f=e,o())}),b=this._createPacketSink(),T=await b.getKeyPacket(e,{verifyKeyPackets:!0})??await b.getFirstPacket(),y=T;if(r<1/0){let e=await b.getPacket(r),a=e?"key"===e.type&&e.timestamp===r?e:await b.getNextKeyPacket(e,{verifyKeyPackets:!0}):null;a&&(c=a)}let w=b.packets(T??void 0,c);for(await w.next();y&&!m&&!this._track.input._disposed;){let e=S(a.length);if(a.length+k.getDecodeQueueSize()>e){({promise:l,resolve:d}=(0,u.promiseWithResolvers)()),await l;continue}k.decode(y);let r=await w.next();if(r.done)break;y=r.value}await w.return(),p||this._track.input._disposed||await k.flush(),k.close(),!i&&s&&a.push(s),h=!0,o()})().catch(e=>{f||(f=e,o())});let k=this._track,b=()=>{for(let e of(s?.close(),a))e.close()};return{async next(){for(;;)if(k.input._disposed)throw b(),new(0,c.InputDisposedError);else if(p)return{value:void 0,done:!0};else if(f)throw b(),f;else if(a.length>0){let e=a.shift();return d(),{value:e,done:!1}}else{if(h)return{value:void 0,done:!0};await n}},return:async()=>(p=!0,m=!0,d(),o(),b(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}mediaSamplesAtTimestamps(e){(0,u.validateAnyIterable)(e);let r=(0,u.toAsyncIterator)(e),a=[],i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,h=!1,m=null,p=e=>{i.push(e),n(),{promise:s,resolve:n}=(0,u.promiseWithResolvers)()};(async()=>{let e=Error(),s=await this._createDecoder(e=>{if(l(),h)return void e.close();let r=0;for(;a.length>0&&e.timestamp-a[0]>-1e-10;)r++,a.shift();if(r>0)for(let a=0;a{m||(r.stack=e.stack,m=r,n())}),c=this._createPacketSink(),f=null,k=null,b=-1,T=async()=>{(0,u.assert)(k);let e=k;for(s.decode(e);e.sequenceNumberr&&!h;)({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;if(h)break;let a=await c.getNextPacket(e);(0,u.assert)(a),s.decode(a),e=a}b=-1},y=async()=>{await s.flush();for(let e=0;e{m||(m=e,n())});let f=this._track,k=()=>{for(let e of i)e?.close()};return{async next(){for(;;)if(f.input._disposed)throw k(),new(0,c.InputDisposedError);else if(h)return{value:void 0,done:!0};else if(m)throw k(),m;else if(i.length>0){let e=i.shift();return(0,u.assert)(void 0!==e),l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(h=!0,l(),n(),k(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}let S=e=>0===e?40:8;class w extends T{constructor(e,r,a,i,s,n){super(e,r),this.codec=a,this.decoderConfig=i,this.rotation=s,this.timeResolution=n,this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.inputTimestamps=[],this.sampleQueue=[],this.currentPacketIndex=0,this.raslSkipped=!1,this.alphaDecoder=null,this.alphaHadKeyframe=!1,this.colorQueue=[],this.alphaQueue=[],this.merger=null,this.mergerCreationFailed=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue=[],this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1;const c=l.customVideoDecoders.find(e=>e.supports(a,i));if(c)this.customDecoder=new c,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");this.finalizeAndEmitSample(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init());else{const e=e=>{if(this.alphaQueue.length>0){let r=this.alphaQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(e,r)}else this.colorQueue.push(e)};if("avc"===a&&this.decoderConfig.description&&(0,u.isChromium)()){const e=(0,o.deserializeAvcDecoderConfigurationRecord)((0,u.toUint8Array)(this.decoderConfig.description));if(e&&e.sequenceParameterSets.length>0){const r=(0,o.parseAvcSps)(e.sequenceParameterSets[0]);r&&0===r.frameMbsOnlyFlag&&(this.decoderConfig={...this.decoderConfig,hardwareAcceleration:"prefer-software"})}}this.decoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:r}),this.decoder.configure(this.decoderConfig)}}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,this.alphaDecoder?.decodeQueueSize??0))}decode(e){if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),(0,u.isWebKit)()||(0,u.insertSorted)(this.inputTimestamps,e.timestamp,e=>e),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}decodeAlphaData(e){if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new I}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){let e=e=>{if(this.alphaDecoderQueueSize--,this.colorQueue.length>0){let r=this.colorQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(r,e)}else this.alphaQueue.push(e);for(this.decodedAlphaChunkCount++;this.nullAlphaFrameQueue.length>0&&this.nullAlphaFrameQueue[0]===this.decodedAlphaChunkCount;)if(this.nullAlphaFrameQueue.shift(),this.colorQueue.length>0){let e=this.colorQueue.shift();(0,u.assert)(void 0!==e),this.mergeAlpha(e,null)}else this.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}let r=(0,o.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===r),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(r??e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}pushNullAlphaFrame(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}hasHevcRaslPicture(e){return(0,o.extractHevcNalUnits)(e,this.decoderConfig).some(e=>{let r=(0,o.extractNalUnitTypeForHevc)(e);return r===o.HevcNalUnitType.RASL_N||r===o.HevcNalUnitType.RASL_R})}sampleHandler(e){if((0,u.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,u.last)(this.sampleQueue).timestamp){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}(0,u.insertSorted)(this.sampleQueue,e,e=>e.timestamp)}else{let r=this.inputTimestamps.shift();(0,u.assert)(void 0!==r),e.setTimestamp(r),this.finalizeAndEmitSample(e)}}finalizeAndEmitSample(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}mergeAlpha(e,r){if(!r){let r=new(0,p.VideoSample)(e);this.sampleHandler(r);return}(0,u.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();let a=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:e.duration??void 0}),i=new(0,p.VideoSample)(a);this.sampleHandler(i)}async flush(){if(this.customDecoder?await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),await Promise.all([this.decoder.flush(),this.alphaDecoder?.flush()]),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1),(0,u.isWebKit)()){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}this.currentPacketIndex=0,this.raslSkipped=!1}close(){for(let e of(this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close(),this.alphaDecoder?.close(),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.merger?.close()),this.sampleQueue))e.close();this.sampleQueue.length=0}}class I{constructor(){"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");const e=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!e)throw Error("Couldn't acquire WebGL 2 context.");this.gl=e,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}createProgram(){let e=this.createShader(this.gl.VERTEX_SHADER,`#version 300 es in vec2 a_position; in vec2 a_texCoord; out vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; } `),r=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es precision highp float; uniform sampler2D u_colorTexture; uniform sampler2D u_alphaTexture; in vec2 v_texCoord; out vec4 fragColor; void main() { vec3 color = texture(u_colorTexture, v_texCoord).rgb; float alpha = texture(u_alphaTexture, v_texCoord).r; fragColor = vec4(color, alpha); } `),a=this.gl.createProgram();return this.gl.attachShader(a,e),this.gl.attachShader(a,r),this.gl.linkProgram(a),a}createShader(e,r){let a=this.gl.createShader(e);return this.gl.shaderSource(a,r),this.gl.compileShader(a),a}createVAO(){let e=this.gl.createVertexArray();this.gl.bindVertexArray(e);let r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),a=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);let i=this.gl.getAttribLocation(this.program,"a_position"),s=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),e}createTexture(){let e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}update(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}close(){this.gl.getExtension("WEBGL_lose_context")?.loseContext(),this.gl=null}}class x extends y{constructor(e){if(!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=this._track.rotation,s=await this._track.getDecoderConfig(),n=this._track.timeResolution;return(0,u.assert)(a&&s),new w(e,r,a,s,i,n)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class E{constructor(e,r={}){if(this._nextCanvasIndex=0,!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(r&&"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.alpha&&"boolean"!=typeof r.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==r.width&&(!Number.isInteger(r.width)||r.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==r.height&&(!Number.isInteger(r.height)||r.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==r.fit&&!["fill","contain","cover"].includes(r.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==r.width&&void 0!==r.height&&void 0===r.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==r.crop&&(0,p.validateCropRectangle)(r.crop,"options."),void 0!==r.poolSize&&("number"!=typeof r.poolSize||!Number.isInteger(r.poolSize)||r.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");const a=r.rotation??e.rotation,[i,s]=a%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],n=r.crop;n&&(0,p.clampCropRectangle)(n,i,s);let[o,l]=n?[n.width,n.height]:[i,s];const c=o/l;void 0!==r.width&&void 0===r.height?l=Math.round((o=r.width)/c):void 0===r.width&&void 0!==r.height?o=Math.round((l=r.height)*c):void 0!==r.width&&void 0!==r.height&&(o=r.width,l=r.height),this._videoTrack=e,this._alpha=r.alpha??!1,this._width=o,this._height=l,this._rotation=a,this._crop=n,this._fit=r.fit??"fill",this._videoSampleSink=new x(e),this._canvasPool=Array.from({length:r.poolSize??0},()=>null)}_videoSampleToWrappedCanvas(e){let r=this._canvasPool[this._nextCanvasIndex],a=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),a=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);let i=r.getContext("2d",{alpha:this._alpha||(0,u.isFirefox)()});(0,u.assert)(i),i.resetTransform(),a||(!this._alpha&&(0,u.isFirefox)()?(i.fillStyle="black",i.fillRect(0,0,this._width,this._height)):i.clearRect(0,0,this._width,this._height)),e.drawWithFit(i,{fit:this._fit,rotation:this._rotation,crop:this._crop});let s={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),s}async getCanvas(e){g(e);let r=await this._videoSampleSink.getSample(e);return r&&this._videoSampleToWrappedCanvas(r)}canvases(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samples(e,r),e=>this._videoSampleToWrappedCanvas(e))}canvasesAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),e=>e&&this._videoSampleToWrappedCanvas(e))}}class P extends T{constructor(e,r,a,i){super(e,r),this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.currentTimestamp=null;const s=r=>{(null===this.currentTimestamp||Math.abs(r.timestamp-this.currentTimestamp)>=r.duration)&&(this.currentTimestamp=r.timestamp);let a=this.currentTimestamp;if(this.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();let s=i.sampleRate;r.setTimestamp(Math.round(a*s)/s),e(r)},n=l.customAudioDecoders.find(e=>e.supports(a,i));n?(this.customDecoder=new n,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");s(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init())):(this.decoder=new AudioDecoder({output:e=>{try{s(new(0,p.AudioSample)(e))}catch(e){this.onError(e)}},error:r}),this.decoder.configure(i))}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),this.decoder.decodeQueueSize)}decode(e){this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}flush(){return this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),this.decoder.flush())}close(){this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close())}}class C extends T{constructor(e,r,a){super(e,r),this.decoderConfig=a,this.currentTimestamp=null,(0,u.assert)(n.PCM_AUDIO_CODECS.includes(a.codec)),this.codec=a.codec;const{dataType:i,sampleSize:s,littleEndian:o}=(0,n.parsePcmCodec)(this.codec);switch(this.inputSampleSize=s,s){case 1:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint8(r)-128:"signed"===i?this.readInputValue=(e,r)=>e.getInt8(r):"ulaw"===i?this.readInputValue=(e,r)=>(0,m.fromUlaw)(e.getUint8(r)):"alaw"===i?this.readInputValue=(e,r)=>(0,m.fromAlaw)(e.getUint8(r)):(0,u.assert)(!1);break;case 2:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint16(r,o)-32768:"signed"===i?this.readInputValue=(e,r)=>e.getInt16(r,o):(0,u.assert)(!1);break;case 3:"unsigned"===i?this.readInputValue=(e,r)=>(0,u.getUint24)(e,r,o)-8388608:"signed"===i?this.readInputValue=(e,r)=>(0,u.getInt24)(e,r,o):(0,u.assert)(!1);break;case 4:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint32(r,o)-0x80000000:"signed"===i?this.readInputValue=(e,r)=>e.getInt32(r,o):"float"===i?this.readInputValue=(e,r)=>e.getFloat32(r,o):(0,u.assert)(!1);break;case 8:"float"===i?this.readInputValue=(e,r)=>e.getFloat64(r,o):(0,u.assert)(!1);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}switch(s){case 1:"ulaw"===i||"alaw"===i?(this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0)):(this.outputSampleSize=1,this.outputFormat="u8",this.writeOutputValue=(e,r,a)=>e.setUint8(r,a+128));break;case 2:this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0);break;case 3:this.outputSampleSize=4,this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a<<8,!0);break;case 4:this.outputSampleSize=4,"float"===i?(this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0)):(this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a,!0));break;case 8:this.outputSampleSize=4,this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}}getDecodeQueueSize(){return 0}decode(e){let r=(0,u.toDataView)(e.data),a=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,i=new ArrayBuffer(a*this.decoderConfig.numberOfChannels*this.outputSampleSize),s=new DataView(i);for(let e=0;e=n)&&(this.currentTimestamp=e.timestamp);let o=this.currentTimestamp;this.currentTimestamp+=n;let l=new(0,p.AudioSample)({format:this.outputFormat,data:i,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:a,timestamp:o});this.onSample(l)}async flush(){}close(){}}class B extends y{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=await this._track.getDecoderConfig();return((0,u.assert)(a&&i),n.PCM_AUDIO_CODECS.includes(i.codec))?new C(e,r,i):new P(e,r,a,i)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class _{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new B(e)}_audioSampleToWrappedArrayBuffer(e){let r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}async getBuffer(e){g(e);let r=await this._audioSampleSink.getSample(e);return r&&this._audioSampleToWrappedArrayBuffer(r)}buffers(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samples(e,r),e=>this._audioSampleToWrappedArrayBuffer(e))}buffersAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),e=>e&&this._audioSampleToWrappedArrayBuffer(e))}}},{"./codec.js":"8wd8o","./codec-data.js":"4Hepu","./custom-coder.js":"3RBiS","./input.js":"cI9DB","./input-track.js":"8ofmg","./misc.js":"dpOkn","./packet.js":"i61Hy","./pcm.js":"bPgId","./sample.js":"9Wy36","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],cI9DB:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Input",()=>d),s.export(a,"InputDisposedError",()=>u);var n=e("./input-format.js"),o=e("./misc.js"),l=e("./reader.js"),c=e("./source.js");(0,o.polyfillSymbolDispose)();class d{get disposed(){return this._disposed}constructor(e){if(this._demuxerPromise=null,this._format=null,this._disposed=!1,!e||"object"!=typeof e)throw TypeError("options must be an object.");if(!Array.isArray(e.formats)||e.formats.some(e=>!(e instanceof n.InputFormat)))throw TypeError("options.formats must be an array of InputFormat.");if(!(e.source instanceof c.Source))throw TypeError("options.source must be a Source.");if(e.source._disposed)throw Error("options.source must not be disposed.");this._formats=e.formats,this._source=e.source,this._reader=new(0,l.Reader)(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{for(let e of(this._reader.fileSize=await this._source.getSizeOrNull(),this._formats))if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw Error("Input has an unsupported or unrecognizable format.")})()}get source(){return this._source}async getFormat(){return await this._getDemuxer(),(0,o.assert)(this._format),this._format}async computeDuration(){return(await this._getDemuxer()).computeDuration()}async getTracks(){return(await this._getDemuxer()).getTracks()}async getVideoTracks(){return(await this.getTracks()).filter(e=>e.isVideoTrack())}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}async getMetadataTags(){return(await this._getDemuxer()).getMetadataTags()}dispose(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}[Symbol.dispose](){this.dispose()}}class u extends Error{constructor(e="Input has been disposed."){super(e),this.name="InputDisposedError"}}},{"./input-format.js":"eC3Vq","./misc.js":"dpOkn","./reader.js":"3hF2Q","./source.js":"d2urb","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"3hF2Q":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Reader",()=>l),s.export(a,"FileSlice",()=>c),s.export(a,"readBytes",()=>u),s.export(a,"readU8",()=>h),s.export(a,"readU16",()=>m),s.export(a,"readU16Be",()=>p),s.export(a,"readU24Be",()=>f),s.export(a,"readI16Be",()=>g),s.export(a,"readU32",()=>k),s.export(a,"readU32Be",()=>b),s.export(a,"readU32Le",()=>T),s.export(a,"readI32Be",()=>y),s.export(a,"readI32Le",()=>S),s.export(a,"readU64",()=>w),s.export(a,"readU64Be",()=>I),s.export(a,"readI64Be",()=>x),s.export(a,"readI64Le",()=>E),s.export(a,"readF32Be",()=>P),s.export(a,"readF64Be",()=>C),s.export(a,"readAscii",()=>B);var n=e("./input.js"),o=e("./misc.js");class l{constructor(e){this.source=e}requestSlice(e,r){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;let a=e+r,i=this.source._read(e,a);return i instanceof Promise?i.then(r=>r?new c(r.bytes,r.view,r.offset,e,a):null):i?new c(i.bytes,i.view,i.offset,e,a):null}requestSliceRange(e,r,a){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,o.clamp)(this.fileSize-e,r,a));{let i=this.requestSlice(e,a),s=i=>{if(i)return i;let s=i=>((0,o.assert)(null!==i),this.requestSlice(e,(0,o.clamp)(i-e,r,a))),n=this.source._retrieveSize();return n instanceof Promise?n.then(s):s(n)};return i instanceof Promise?i.then(s):s(i)}}}class c{constructor(e,r,a,i,s){this.bytes=e,this.view=r,this.offset=a,this.start=i,this.end=s,this.bufferPos=i-a}static tempFromBytes(e){return new c(e,(0,o.toDataView)(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(e){this.bufferPos=e-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(e){this.bufferPos+=e}slice(e,r=this.end-e){if(ethis.end)throw RangeError("Slicing outside of original slice.");return new c(this.bytes,this.view,this.offset,e,e+r)}}let d=(e,r)=>{if(e.filePose.end)throw RangeError(`Tried reading [${e.filePos}, ${e.filePos+r}), but slice is [${e.start}, ${e.end}). This is likely an internal error, please report it alongside the file that caused it.`)},u=(e,r)=>{d(e,r);let a=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,a},h=e=>(d(e,1),e.view.getUint8(e.bufferPos++)),m=(e,r)=>{d(e,2);let a=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,a},p=e=>{d(e,2);let r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},f=e=>{d(e,3);let r=(0,o.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},g=e=>{d(e,2);let r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},k=(e,r)=>{d(e,4);let a=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,a},b=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},T=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},y=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},S=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},w=(e,r)=>{let a,i;return r?(a=k(e,!0),i=k(e,!0)):(i=k(e,!1),a=k(e,!1)),0x100000000*i+a},I=e=>0x100000000*b(e)+b(e),x=e=>0x100000000*y(e)+b(e),E=e=>{let r=T(e);return 0x100000000*S(e)+r},P=e=>{d(e,4);let r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},C=e=>{d(e,8);let r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},B=(e,r)=>{d(e,r);let a="";for(let i=0;id),s.export(a,"BufferSource",()=>u),s.export(a,"BlobSource",()=>h),s.export(a,"UrlSource",()=>p),s.export(a,"FilePathSource",()=>f),s.export(a,"StreamSource",()=>g),s.export(a,"ReadableStreamSource",()=>k);var n=e("./misc.js"),o=e("./node.js"),l=e("./input.js");let c=void 0!==o?o:void 0;class d{constructor(){this._disposed=!1,this._sizePromise=null,this.onread=null}async getSizeOrNull(){if(this._disposed)throw new(0,l.InputDisposedError);return this._sizePromise??=Promise.resolve(this._retrieveSize())}async getSize(){if(this._disposed)throw new(0,l.InputDisposedError);let e=await this.getSizeOrNull();if(null===e)throw Error("Cannot determine the size of an unsized source.");return e}}class u extends d{constructor(e){if(!(e instanceof ArrayBuffer)&&!("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)&&!ArrayBuffer.isView(e))throw TypeError("buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.");super(),this._onreadCalled=!1,this._bytes=(0,n.toUint8Array)(e),this._view=(0,n.toDataView)(e)}_retrieveSize(){return this._bytes.byteLength}_read(){return this._onreadCalled||(this.onread?.(0,this._bytes.byteLength),this._onreadCalled=!0),{bytes:this._bytes,view:this._view,offset:0}}_dispose(){}}class h extends d{constructor(e,r={}){if(!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._readers=new WeakMap,this._blob=e,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??8388608,maxWorkerCount:4,runWorker:this._runWorker.bind(this),prefetchProfile:b.fileSystem})}_retrieveSize(){let e=this._blob.size;return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){let r=this._readers.get(e);for(void 0===r&&(r=("stream"in this._blob)&&!(0,n.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r));e.currentPos{if(r instanceof Error&&(r.message.includes("Failed to fetch")||r.message.includes("Load failed")||r.message.includes("NetworkError when attempting to fetch resource"))){let e=null;try{"undefined"!=typeof window&&void 0!==window.location&&(e=new URL(a instanceof Request?a.url:a,window.location.href).origin)}catch{}if(("undefined"==typeof navigator||"boolean"!=typeof navigator.onLine||navigator.onLine)&&null!==e&&e!==window.location.origin)return console.warn("Request will not be retried because a CORS error was suspected due to different origins. You can modify this behavior by providing your own function for the 'getRetryDelay' option."),null}return Math.min(2**(e-2),16)};class p extends d{constructor(e,r={}){if("string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.requestInit&&(!r.requestInit||"object"!=typeof r.requestInit))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==r.getRetryDelay&&"function"!=typeof r.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==r.fetchFn&&"function"!=typeof r.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");super(),this._existingResponses=new WeakMap,this._url=e,this._options=r,this._getRetryDelay=r.getRetryDelay??m,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??0x4000000,maxWorkerCount:2,runWorker:this._runWorker.bind(this),prefetchProfile:b.network})}async _retrieveSize(){let e,r,a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:"bytes=0-"},signal:a.signal}),this._getRetryDelay,()=>this._disposed);if(!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(206===i.status)r=this._getTotalLengthFromRangeResponse(i),e=this._orchestrator.createWorker(0,Math.min(r,524288));else{let a=i.headers.get("Content-Length");if(a)r=Number(a),e=this._orchestrator.createWorker(0,r),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error(`HTTP response (status ${i.status}) must surface Content-Length header.`)}return this._orchestrator.fileSize=r,this._existingResponses.set(e,{response:i,abortController:a}),this._orchestrator.runWorker(e),r}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;;){let r=this._existingResponses.get(e);this._existingResponses.delete(e);let a=r?.abortController,i=r?.response;if(a||(a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:`bytes=${e.currentPos}-`},signal:a.signal}),this._getRetryDelay,()=>this._disposed)),(0,n.assert)(i),!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(e.currentPos>0&&206!==i.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!i.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");let s=i.body.getReader();for(;;){let r;if(e.currentPos>=e.targetPos||e.aborted){a.abort(),e.running=!1;return}try{r=await s.read()}catch(r){if(this._disposed)throw r;let e=this._getRetryDelay(1,r,this._url);if(null!==e){console.error("Error while reading response stream. Attempting to resume.",r),await new Promise(r=>setTimeout(r,1e3*e));break}throw r}if(e.aborted)break;let{done:i,value:n}=r;if(i){if(e.currentPos>=e.targetPos){this._orchestrator.forgetWorker(e),e.running=!1;return}break}this.onread?.(e.currentPos,e.currentPos+n.length),this._orchestrator.supplyWorkerData(e,n)}if(e.aborted)break}e.running=!1}_getTotalLengthFromRangeResponse(e){let r=e.headers.get("Content-Range");if(r){let e=/\/(\d+)/.exec(r);if(e)return Number(e[1])}let a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}_dispose(){this._orchestrator.dispose()}}class f extends d{constructor(e,r={}){if("string"!=typeof e)throw TypeError("filePath must be a string.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._fileHandle=null,this._streamSource=new g({getSize:async()=>(this._fileHandle=await c.fs.open(e,"r"),(await this._fileHandle.stat()).size),read:async(e,r)=>{(0,n.assert)(this._fileHandle);let a=new Uint8Array(r-e);return await this._fileHandle.read(a,0,r-e,e),a},maxCacheSize:r.maxCacheSize,prefetchProfile:"fileSystem"})}_read(e,r){return this._streamSource._read(e,r)}_retrieveSize(){return this._streamSource._retrieveSize()}_dispose(){this._streamSource._dispose(),this._fileHandle?.close(),this._fileHandle=null}}class g extends d{constructor(e){if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,n.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");super(),this._options=e,this._orchestrator=new T({maxCacheSize:e.maxCacheSize??8388608,maxWorkerCount:2,prefetchProfile:b[e.prefetchProfile??"none"],runWorker:this._runWorker.bind(this)})}_retrieveSize(){let e=this._options.getSize();if(e instanceof Promise)return e.then(e=>{if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e});if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;e.currentPosthis._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);let a=(0,n.binarySearchLessOrEqual)(this._cache,e,e=>e.start),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};let s=e,o=new Uint8Array(r-e);if(-1!==a)for(let i=a;i=r)break;let n=Math.max(e,a.start);n>s&&this._throwDueToCacheMiss();let l=Math.min(r,a.end);ns&&this._throwDueToCacheMiss();let{promise:l,resolve:c,reject:d}=(0,n.promiseWithResolvers)();return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:c,reject:d}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(e=>{if(this._pulling=!1,this._pendingSlices.length>0)this._pendingSlices.forEach(r=>r.reject(e)),this._pendingSlices.length=0;else throw e})),l}_throwDueToCacheMiss(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}async _pull(){for(this._reader??=this._stream.getReader();this._currentIndex0;){let e=this._cache[0];if(this._maxRequestedIndex-e.end<=this._maxCacheSize)break;this._cache.shift()}this._currentIndex+=r.byteLength}this._pulling=!1}_dispose(){this._pendingSlices.length=0,this._cache.length=0}}let b={none:(e,r)=>({start:e,end:r}),fileSystem:(e,r)=>({start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}),network:(e,r,a)=>{for(let i of(e=Math.max(0,65536*Math.floor((e-65536)/65536)),a)){let a=Math.max((i.startPos+i.targetPos)/2,i.targetPos-8388608);if((0,n.closedIntervalsOverlap)(e,r,a,i.targetPos)){let e=i.targetPos-i.startPos,a=8388608*Math.ceil((e+1)/8388608),s=Math.min(2**Math.ceil(Math.log2(e+1)),a);r=Math.max(r,i.startPos+s)}}return r=Math.max(r,e+524288),{start:e,end:r}}};class T{constructor(e){this.options=e,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}read(e,r){(0,n.assert)(null!==this.fileSize);let a=this.options.prefetchProfile(e,r,this.workers),i=Math.max(a.start,0),s=Math.min(a.end,this.fileSize);(0,n.assert)(i<=e&&r<=s);let o=null,l=(0,n.binarySearchLessOrEqual)(this.cache,e,e=>e.start),c=-1!==l?this.cache[l]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,o={bytes:c.bytes,view:c.view,offset:c.start});let d=(0,n.binarySearchLessOrEqual)(this.cache,i,e=>e.start),u=o?null:new Uint8Array(r-e),h=0,m=i,p=[];if(-1!==d){for(let a=d;a=s)break;if(o.end<=i)continue;let l=Math.max(i,o.start),c=Math.min(s,o.end);if((0,n.assert)(l<=c),m=u.length&&(o={bytes:u,view:(0,n.toDataView)(u),offset:e}),0===p.length)return(0,n.assert)(o),o;let{promise:f,resolve:g,reject:k}=(0,n.promiseWithResolvers)(),b=[];for(let a of p){let i=Math.max(e,a.start),s=Math.min(r,a.end);i===a.start&&s===a.end?b.push(a):i({bytes:r,view:(0,n.toDataView)(r),offset:e}))),o}createWorker(e,r){let a={startPos:e,currentPos:e,targetPos:r,running:!1,aborted:this.disposed,pendingSlices:[],age:this.nextAge++};for(this.workers.push(a);this.workers.length>this.options.maxWorkerCount;){let e=0,r=this.workers[0];for(let a=1;a0)break;r.aborted=!0,this.workers.splice(e,1)}return a}runWorker(e){(0,n.assert)(!e.running),(0,n.assert)(e.currentPos{if(e.running=!1,e.pendingSlices.length>0)e.pendingSlices.forEach(e=>e.reject(r)),e.pendingSlices.length=0;else throw r})}supplyWorkerData(e,r){(0,n.assert)(!e.aborted);let a=e.currentPos,i=a+r.length;this.insertIntoCache({start:a,end:i,bytes:r,view:(0,n.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(let s=0;sr.start&&(r.start=i),r.end<=r.start&&(n.holes.splice(e,1),e--)}0===n.holes.length&&(n.resolve(n.bytes),e.pendingSlices.splice(s,1),s--)}for(let r=0;re.start)+1;if(r>0){let a=this.cache[r-1];if(a.end>=e.end)return;if(a.end>e.start){let i=new Uint8Array(e.end-a.start);i.set(a.bytes,0),i.set(e.bytes,e.start-a.start),this.currentCacheSize+=e.end-a.end,a.bytes=i,a.view=(0,n.toDataView)(i),a.end=e.end,r--,e=a}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(let a=r+1;a=r.end){this.cache.splice(a,1),this.currentCacheSize-=r.bytes.length,a--;continue}let i=new Uint8Array(r.end-e.start);i.set(e.bytes,0),i.set(r.bytes,r.start-e.start),this.currentCacheSize-=e.end-r.start,e.bytes=i,e.view=(0,n.toDataView)(i),e.end=r.end,this.cache.splice(a,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){let e=0,r=this.cache[0];for(let a=1;ao),s.export(a,"EncodedPacket",()=>l);var n=e("./misc.js");let o=new Uint8Array(0);class l{constructor(e,r,a,i,s=-1,n,l){if(this.data=e,this.type=r,this.timestamp=a,this.duration=i,this.sequenceNumber=s,e===o&&void 0===n)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===n&&(n=e.byteLength),!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==r&&"delta"!==r)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(n)||n<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==l&&("object"!=typeof l||!l))throw TypeError("sideData, when provided, must be an object.");if(l?.alpha!==void 0&&!(l.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(l?.alphaByteLength!==void 0&&(!Number.isInteger(l.alphaByteLength)||l.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=n,this.sideData=l??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===o}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(e=this.type){if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,r){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");let a=new Uint8Array(e.byteLength);return e.copyTo(a),new l(a,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,r)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw TypeError("options, when provided, must be an object.");if(e?.timestamp!==void 0&&!Number.isFinite(e.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if(e?.duration!==void 0&&!Number.isFinite(e.duration))throw TypeError("options.duration, when provided, must be a number.");return new l(this.data,this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,this.sequenceNumber,this.byteLength)}}},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],bPgId:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"toUlaw",()=>n),s.export(a,"fromUlaw",()=>o),s.export(a,"toAlaw",()=>l),s.export(a,"fromAlaw",()=>c);let n=e=>{let r=e,a=4096,i=0,s=12,n=0;for(r<0&&(r=-r,i=128),(r+=33)>8191&&(r=8191);(r&a)!==a&&s>=5;)a>>=1,s--;return n=r>>s-4&15,255&~(i|s-5<<4|n)},o=e=>{let r=0,a=0,i=~e;128&i&&(i&=-129,r=-1);let s=(1<<(a=((240&i)>>4)+5)|(15&i)<{let r=2048,a=0,i=11,s=0,n=e;for(n<0&&(n=-n,a=128),n>4095&&(n=4095);(n&r)!==r&&i>=5;)r>>=1,i--;return s=n>>(4===i?1:i-4)&15,(a|i-4<<4|s)^85},c=e=>{let r=0,a=0,i=85^e;128&i&&(i&=-129,r=-1);let s=0;return s=4!=(a=((240&i)>>4)+4)?1<d),s.export(a,"clampCropRectangle",()=>h),s.export(a,"validateCropRectangle",()=>m),s.export(a,"AudioSample",()=>f);var n=e("./misc.js");(0,n.polyfillSymbolDispose)();let o=-1/0,l=-1/0,c=null;"undefined"!=typeof FinalizationRegistry&&(c=new FinalizationRegistry(e=>{let r=Date.now();"video"===e.type?(r-o>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),o=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-l>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),l=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));class d{get displayWidth(){return this.rotation%180==0?this.codedWidth:this.codedHeight}get displayHeight(){return this.rotation%180==0?this.codedHeight:this.codedWidth}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,r){if(this._closed=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(!("format"in r)||"string"!=typeof r.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(r.codedWidth)||r.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(r.codedHeight)||r.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,n.toUint8Array)(e).slice(),this.format=r.format,this.codedWidth=r.codedWidth,this.codedHeight=r.codedHeight,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace(r.colorSpace)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(r?.rotation!==void 0&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(r?.timestamp!==void 0&&!Number.isFinite(r?.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if(r?.duration!==void 0&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=e,this.format=e.format,this.codedWidth=e.displayWidth,this.codedHeight=e.displayHeight,this.rotation=r?.rotation??0,this.timestamp=r?.timestamp??e.timestamp/1e6,this.duration=r?.duration??(e.duration??0)/1e6,this.colorSpace=e.colorSpace}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new d(new VideoFrame(e,{timestamp:Math.trunc(r.timestamp*n.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((r.duration??0)*n.SECOND_TO_MICROSECOND_FACTOR)||void 0}),r);let a=0,i=0;if("naturalWidth"in e?(a=e.naturalWidth,i=e.naturalHeight):"videoWidth"in e?(a=e.videoWidth,i=e.videoHeight):"width"in e&&(a=Number(e.width),i=Number(e.height)),!a||!i)throw TypeError("Could not determine dimensions.");const s=new OffscreenCanvas(a,i),o=s.getContext("2d",{alpha:(0,n.isFirefox)(),willReadFrequently:!0});(0,n.assert)(o),o.drawImage(e,0,0),this._data=s,this.format="RGBX",this.codedWidth=a,this.codedHeight=i,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");c?.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new d(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new d(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new d(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}close(){this._closed||(c?.unregister(this),u(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}async copyTo(e){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),u(this._data))await this._data.copyTo(e);else if(this._data instanceof Uint8Array)(0,n.toUint8Array)(e).set(this._data);else{let r=this._data.getContext("2d");(0,n.assert)(r);let a=r.getImageData(0,0,this.codedWidth,this.codedHeight);(0,n.toUint8Array)(e).set(a.data)}}toVideoFrame(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(e,r,a,i,s,n,o,l,c){let d=0,u=0,h=this.displayWidth,m=this.displayHeight,p=0,f=0,g=this.displayWidth,k=this.displayHeight;if(void 0!==n?(d=r,u=a,h=i,m=s,p=n,f=o,void 0!==l?(g=l,k=c):(g=h,k=m)):(p=r,f=a,void 0!==i&&(g=i,k=s)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(u))throw TypeError("sy must be a number.");if(!Number.isFinite(h)||h<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(m)||m<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(f))throw TypeError("dy must be a number.");if(!Number.isFinite(g)||g<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");({sx:d,sy:u,sWidth:h,sHeight:m}=this._rotateSourceRegion(d,u,h,m,this.rotation));let b=this.toCanvasImageSource();e.save();let T=p+g/2,y=f+k/2;e.translate(T,y),e.rotate(this.rotation*Math.PI/180);let S=this.rotation%180==0?1:g/k;e.scale(1/S,S),e.drawImage(b,d,u,h,m,-g/2,-k/2,g,k),e.restore()}drawWithFit(e,r){let a,i,s,n;if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&m(r.crop,"options.");let o=e.canvas.width,l=e.canvas.height,c=r.rotation??this.rotation,[d,u]=c%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth];r.crop&&h(r.crop,d,u);let{sx:p,sy:f,sWidth:g,sHeight:k}=this._rotateSourceRegion(r.crop?.left??0,r.crop?.top??0,r.crop?.width??d,r.crop?.height??u,c);if("fill"===r.fit)a=0,i=0,s=o,n=l;else{let[e,c]=r.crop?[r.crop.width,r.crop.height]:[d,u],h="contain"===r.fit?Math.min(o/e,l/c):Math.max(o/e,l/c);s=e*h,n=c*h,a=(o-s)/2,i=(l-n)/2}e.save();let b=c%180==0?1:s/n;e.translate(o/2,l/2),e.rotate(c*Math.PI/180),e.scale(1/b,b),e.translate(-o/2,-l/2),e.drawImage(this.toCanvasImageSource(),p,f,g,k,a,i,s,n),e.restore()}_rotateSourceRegion(e,r,a,i,s){return 90===s?[e,r,a,i]=[r,this.codedHeight-e-a,i,a]:180===s?[e,r]=[this.codedWidth-e-a,this.codedHeight-r-i]:270===s&&([e,r,a,i]=[this.codedWidth-r-i,e,i,a]),{sx:e,sy:r,sWidth:a,sHeight:i}}toCanvasImageSource(){if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;{let e=this.toVideoFrame();return queueMicrotask(()=>e.close()),e}}setRotation(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}setTimestamp(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}setDuration(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}[Symbol.dispose](){this.close()}}let u=e=>"undefined"!=typeof VideoFrame&&e instanceof VideoFrame,h=(e,r,a)=>{e.left=Math.min(e.left,r),e.top=Math.min(e.top,a),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,a-e.top),(0,n.assert)(e.width>=0),(0,n.assert)(e.height>=0)},m=(e,r)=>{if(!e||"object"!=typeof e)throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},p=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]);class f{get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}constructor(e){if(this._closed=!1,y(e)){if(null===e.format)throw TypeError("AudioData with null format is not supported.");this._data=e,this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=e.numberOfFrames,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp/1e6,this.duration=e.numberOfFrames/e.sampleRate}else{let r;if(!e||"object"!=typeof e)throw TypeError("Invalid AudioDataInit: must be an object.");if(!p.has(e.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(e.sampleRate)||e.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(e.numberOfChannels)||0===e.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(e?.timestamp))throw TypeError("init.timestamp must be a number.");const a=e.data.byteLength/(g(e.format)*e.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=a,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp,this.duration=a/e.sampleRate,e.data instanceof ArrayBuffer)r=new Uint8Array(e.data);else if(ArrayBuffer.isView(e.data))r=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");const i=this.numberOfFrames*this.numberOfChannels*g(this.format);if(r.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");let i=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-a;if(i>this.numberOfFrames-a)throw RangeError("frameCount out of range");let s=g(r),n=k(r);if(n&&e.planeIndex>=this.numberOfChannels||!n&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(n?i:i*this.numberOfChannels)*s}copyTo(e,r){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!p.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");let{planeIndex:a,format:i,frameCount:s,frameOffset:o}=r,l=i??this.format;if(!l)throw Error("Destination format not determined");let c=this.numberOfFrames,d=this.numberOfChannels,u=o??0;if(u>=c)throw RangeError("frameOffset out of range");let h=void 0!==s?s:c-u;if(h>c-u)throw RangeError("frameCount out of range");let m=g(l),f=k(l);if(f&&a>=d||!f&&0!==a)throw RangeError("planeIndex out of range");let S=f?h:h*d;if(e.byteLength0;){let s=Math.min(n,l),c=new Float32Array(a*s);for(let r=0;r0;){let s=Math.min(n,l),d=new Float32Array(a*s);for(let r=0;r{switch(e){case"u8":case"u8-planar":return 1;case"s16":case"s16-planar":return 2;case"s32":case"s32-planar":case"f32":case"f32-planar":return 4;default:throw Error("Unknown AudioSampleFormat")}},k=e=>{switch(e){case"u8-planar":case"s16-planar":case"s32-planar":case"f32-planar":return!0;default:return!1}},b=e=>{switch(e){case"u8":case"u8-planar":return(e,r)=>(e.getUint8(r)-128)/128;case"s16":case"s16-planar":return(e,r)=>e.getInt16(r,!0)/32768;case"s32":case"s32-planar":return(e,r)=>e.getInt32(r,!0)/0x80000000;case"f32":case"f32-planar":return(e,r)=>e.getFloat32(r,!0)}},T=e=>{switch(e){case"u8":case"u8-planar":return(e,r,a)=>e.setUint8(r,(0,n.clamp)((a+1)*127.5,0,255));case"s16":case"s16-planar":return(e,r,a)=>e.setInt16(r,(0,n.clamp)(Math.round(32767*a),-32768,32767),!0);case"s32":case"s32-planar":return(e,r,a)=>e.setInt32(r,(0,n.clamp)(Math.round(0x7fffffff*a),-0x80000000,0x7fffffff),!0);case"f32":case"f32-planar":return(e,r,a)=>e.setFloat32(r,a,!0)}},y=e=>"undefined"!=typeof AudioData&&e instanceof AudioData},{"./misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8o5uh":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildIsobmffMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8Phe1":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_BOX_HEADER_SIZE",()=>c),s.export(a,"MAX_BOX_HEADER_SIZE",()=>d),s.export(a,"readBoxHeader",()=>u),s.export(a,"readFixed_16_16",()=>h),s.export(a,"readFixed_2_30",()=>m),s.export(a,"readIsomVariableInteger",()=>p),s.export(a,"readMetadataStringShort",()=>f),s.export(a,"readDataBox",()=>g);var n=e("../metadata.js"),o=e("../misc.js"),l=e("../reader.js");let c=8,d=16,u=e=>{let r=(0,l.readU32Be)(e),a=(0,l.readAscii)(e,4),i=8;1===r&&(r=(0,l.readU64Be)(e),i=16);let s=r-i;return s<0?null:{name:a,totalSize:r,headerSize:i,contentSize:s}},h=e=>(0,l.readI32Be)(e)/65536,m=e=>(0,l.readI32Be)(e)/0x40000000,p=e=>{let r=0;for(let a=0;a<4;a++){r<<=7;let a=(0,l.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},f=e=>{let r=(0,l.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,l.readBytes)(e,r))},g=e=>{let r=u(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;let a=(0,l.readU32Be)(e);e.skip(4);let i=(0,l.readBytes)(e,r.contentSize-8);switch(a){case 1:return o.textDecoder.decode(i);case 2:return new TextDecoder("utf-16be").decode(i);case 13:return new(0,n.RichImageData)(i,"image/jpeg");case 14:return new(0,n.RichImageData)(i,"image/png");case 27:return new(0,n.RichImageData)(i,"image/bmp");default:return i}}},{"../metadata.js":"fFgR1","../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],fFgR1:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"RichImageData",()=>n),s.export(a,"AttachedFile",()=>o),s.export(a,"validateMetadataTags",()=>l),s.export(a,"metadataTagsAreEmpty",()=>c),s.export(a,"DEFAULT_TRACK_DISPOSITION",()=>d),s.export(a,"validateTrackDisposition",()=>u);class n{constructor(e,r){if(this.data=e,this.mimeType=r,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof r)throw TypeError("mimeType must be a string.")}}class o{constructor(e,r,a,i){if(this.data=e,this.mimeType=r,this.name=a,this.description=i,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==r&&"string"!=typeof r)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")}}let l=e=>{if(!e||"object"!=typeof e)throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");for(let r of e.images){if(!r||"object"!=typeof r)throw TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof r.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!=typeof e.raw)throw TypeError("tags.raw, when provided, must be an object.");for(let r of Object.values(e.raw))if(null!==r&&"string"!=typeof r&&!(r instanceof Uint8Array)&&!(r instanceof n)&&!(r instanceof o))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}},c=e=>void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length),d={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},u=e=>{if(!e||"object"!=typeof e)throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],B0jDs:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"EBMLFloat32",()=>d),o.export(a,"EBMLFloat64",()=>u),o.export(a,"EBMLSignedInt",()=>h),o.export(a,"EBMLUnicodeString",()=>m),o.export(a,"EBMLId",()=>n),o.export(a,"LEVEL_0_EBML_IDS",()=>p),o.export(a,"LEVEL_1_EBML_IDS",()=>f),o.export(a,"LEVEL_0_AND_1_EBML_IDS",()=>g),o.export(a,"measureUnsignedInt",()=>k),o.export(a,"measureUnsignedBigInt",()=>b),o.export(a,"measureSignedInt",()=>T),o.export(a,"measureVarInt",()=>y),o.export(a,"EBMLWriter",()=>S),o.export(a,"MAX_VAR_INT_SIZE",()=>w),o.export(a,"MIN_HEADER_SIZE",()=>I),o.export(a,"MAX_HEADER_SIZE",()=>x),o.export(a,"readVarIntSize",()=>E),o.export(a,"readVarInt",()=>P),o.export(a,"readUnsignedInt",()=>C),o.export(a,"readUnsignedBigInt",()=>B),o.export(a,"readSignedInt",()=>_),o.export(a,"readElementId",()=>A),o.export(a,"readElementSize",()=>D),o.export(a,"readElementHeader",()=>M),o.export(a,"readAsciiString",()=>F),o.export(a,"readUnicodeString",()=>R),o.export(a,"readFloat",()=>U),o.export(a,"searchForNextElementId",()=>L),o.export(a,"resync",()=>O),o.export(a,"CODEC_STRING_MAP",()=>N),o.export(a,"assertDefinedSize",()=>j);var l=e("../misc.js"),c=e("../reader.js");class d{constructor(e){this.value=e}}class u{constructor(e){this.value=e}}class h{constructor(e){this.value=e}}class m{constructor(e){this.value=e}}(s=n||(n={}))[s.EBML=0x1a45dfa3]="EBML",s[s.EBMLVersion=17030]="EBMLVersion",s[s.EBMLReadVersion=17143]="EBMLReadVersion",s[s.EBMLMaxIDLength=17138]="EBMLMaxIDLength",s[s.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",s[s.DocType=17026]="DocType",s[s.DocTypeVersion=17031]="DocTypeVersion",s[s.DocTypeReadVersion=17029]="DocTypeReadVersion",s[s.Void=236]="Void",s[s.Segment=0x18538067]="Segment",s[s.SeekHead=0x114d9b74]="SeekHead",s[s.Seek=19899]="Seek",s[s.SeekID=21419]="SeekID",s[s.SeekPosition=21420]="SeekPosition",s[s.Duration=17545]="Duration",s[s.Info=0x1549a966]="Info",s[s.TimestampScale=2807729]="TimestampScale",s[s.MuxingApp=19840]="MuxingApp",s[s.WritingApp=22337]="WritingApp",s[s.Tracks=0x1654ae6b]="Tracks",s[s.TrackEntry=174]="TrackEntry",s[s.TrackNumber=215]="TrackNumber",s[s.TrackUID=29637]="TrackUID",s[s.TrackType=131]="TrackType",s[s.FlagEnabled=185]="FlagEnabled",s[s.FlagDefault=136]="FlagDefault",s[s.FlagForced=21930]="FlagForced",s[s.FlagOriginal=21934]="FlagOriginal",s[s.FlagHearingImpaired=21931]="FlagHearingImpaired",s[s.FlagVisualImpaired=21932]="FlagVisualImpaired",s[s.FlagCommentary=21935]="FlagCommentary",s[s.FlagLacing=156]="FlagLacing",s[s.Name=21358]="Name",s[s.Language=2274716]="Language",s[s.LanguageBCP47=2274717]="LanguageBCP47",s[s.CodecID=134]="CodecID",s[s.CodecPrivate=25506]="CodecPrivate",s[s.CodecDelay=22186]="CodecDelay",s[s.SeekPreRoll=22203]="SeekPreRoll",s[s.DefaultDuration=2352003]="DefaultDuration",s[s.Video=224]="Video",s[s.PixelWidth=176]="PixelWidth",s[s.PixelHeight=186]="PixelHeight",s[s.AlphaMode=21440]="AlphaMode",s[s.Audio=225]="Audio",s[s.SamplingFrequency=181]="SamplingFrequency",s[s.Channels=159]="Channels",s[s.BitDepth=25188]="BitDepth",s[s.SimpleBlock=163]="SimpleBlock",s[s.BlockGroup=160]="BlockGroup",s[s.Block=161]="Block",s[s.BlockAdditions=30113]="BlockAdditions",s[s.BlockMore=166]="BlockMore",s[s.BlockAdditional=165]="BlockAdditional",s[s.BlockAddID=238]="BlockAddID",s[s.BlockDuration=155]="BlockDuration",s[s.ReferenceBlock=251]="ReferenceBlock",s[s.Cluster=0x1f43b675]="Cluster",s[s.Timestamp=231]="Timestamp",s[s.Cues=0x1c53bb6b]="Cues",s[s.CuePoint=187]="CuePoint",s[s.CueTime=179]="CueTime",s[s.CueTrackPositions=183]="CueTrackPositions",s[s.CueTrack=247]="CueTrack",s[s.CueClusterPosition=241]="CueClusterPosition",s[s.Colour=21936]="Colour",s[s.MatrixCoefficients=21937]="MatrixCoefficients",s[s.TransferCharacteristics=21946]="TransferCharacteristics",s[s.Primaries=21947]="Primaries",s[s.Range=21945]="Range",s[s.Projection=30320]="Projection",s[s.ProjectionType=30321]="ProjectionType",s[s.ProjectionPoseRoll=30325]="ProjectionPoseRoll",s[s.Attachments=0x1941a469]="Attachments",s[s.AttachedFile=24999]="AttachedFile",s[s.FileDescription=18046]="FileDescription",s[s.FileName=18030]="FileName",s[s.FileMediaType=18016]="FileMediaType",s[s.FileData=18012]="FileData",s[s.FileUID=18094]="FileUID",s[s.Chapters=0x1043a770]="Chapters",s[s.Tags=0x1254c367]="Tags",s[s.Tag=29555]="Tag",s[s.Targets=25536]="Targets",s[s.TargetTypeValue=26826]="TargetTypeValue",s[s.TargetType=25546]="TargetType",s[s.TagTrackUID=25541]="TagTrackUID",s[s.TagEditionUID=25545]="TagEditionUID",s[s.TagChapterUID=25540]="TagChapterUID",s[s.TagAttachmentUID=25542]="TagAttachmentUID",s[s.SimpleTag=26568]="SimpleTag",s[s.TagName=17827]="TagName",s[s.TagLanguage=17530]="TagLanguage",s[s.TagString=17543]="TagString",s[s.TagBinary=17541]="TagBinary",s[s.ContentEncodings=28032]="ContentEncodings",s[s.ContentEncoding=25152]="ContentEncoding",s[s.ContentEncodingOrder=20529]="ContentEncodingOrder",s[s.ContentEncodingScope=20530]="ContentEncodingScope",s[s.ContentCompression=20532]="ContentCompression",s[s.ContentCompAlgo=16980]="ContentCompAlgo",s[s.ContentCompSettings=16981]="ContentCompSettings",s[s.ContentEncryption=20533]="ContentEncryption";let p=[n.EBML,n.Segment],f=[n.SeekHead,n.Info,n.Cluster,n.Tracks,n.Cues,n.Attachments,n.Chapters,n.Tags],g=[...p,...f],k=e=>{if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},b=e=>{if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},T=e=>{if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},y=e=>{if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x800000000-1)return 5;else if(e<0x40000000000-1)return 6;else throw Error("EBML varint size not supported "+e)};class S{constructor(e){this.writer=e,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}writeFloat32(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}writeUnsignedInt(e,r=k(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/0x10000000000|0);case 5:this.helperView.setUint8(a++,e/0x100000000|0);case 4:this.helperView.setUint8(a++,e>>24);case 3:this.helperView.setUint8(a++,e>>16);case 2:this.helperView.setUint8(a++,e>>8);case 1:this.helperView.setUint8(a++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,a))}writeUnsignedBigInt(e,r=b(e)){let a=0;for(let i=r-1;i>=0;i--)this.helperView.setUint8(a++,Number(e>>BigInt(8*i)&255n));this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=T(e)){e<0&&(e+=2**(8*r)),this.writeUnsignedInt(e,r)}writeVarInt(e,r=y(e)){let a=0;switch(r){case 1:this.helperView.setUint8(a++,128|e);break;case 2:this.helperView.setUint8(a++,64|e>>8),this.helperView.setUint8(a++,e);break;case 3:this.helperView.setUint8(a++,32|e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 4:this.helperView.setUint8(a++,16|e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 5:this.helperView.setUint8(a++,8|e/0x100000000&7),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 6:this.helperView.setUint8(a++,4|e/0x10000000000&3),this.helperView.setUint8(a++,e/0x100000000|0),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,a))}writeAsciiString(e){this.writer.write(new Uint8Array(e.split("").map(e=>e.charCodeAt(0))))}writeEBML(e){if(null!==e)if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let r of e)this.writeEBML(r);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let r=this.writer.getPos(),a=-1===e.size?1:e.size??4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let i=this.writer.getPos();if(this.dataOffsets.set(e,i),this.writeEBML(e.data),-1!==e.size){let e=this.writer.getPos()-i,s=this.writer.getPos();this.writer.seek(r),this.writeVarInt(e,a),this.writer.seek(s)}}else if("number"==typeof e.data){let r=e.size??k(e.data);this.writeVarInt(r),this.writeUnsignedInt(e.data,r)}else if("bigint"==typeof e.data){let r=e.size??b(e.data);this.writeVarInt(r),this.writeUnsignedBigInt(e.data,r)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof d)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof u)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof h){let r=e.size??T(e.data.value);this.writeVarInt(r),this.writeSignedInt(e.data.value,r)}else if(e.data instanceof m){let r=l.textEncoder.encode(e.data.value);this.writeVarInt(r.length),this.writer.write(r)}else(0,l.assertNever)(e.data)}}let w=8,I=2,x=16,E=e=>{let r=(0,c.readU8)(e);if(e.skip(-1),0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;return a},P=e=>{let r=(0,c.readU8)(e);if(0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;let s=r&i-1;for(let r=1;r{if(r<1||r>8)throw Error("Bad unsigned int size "+r);let a=0;for(let i=0;i{if(r<1)throw Error("Bad unsigned int size "+r);let a=0n;for(let i=0;i{let a=C(e,r);return a&1<<8*r-1&&(a-=2**(8*r)),a},A=e=>{let r=E(e);return null===r?null:C(e,r)},D=e=>{let r=(0,c.readU8)(e);return 255===r?r=null:(e.skip(-1),0x100000000000000===(r=P(e))&&(r=null)),r},M=e=>{let r=A(e);return null===r?null:{id:r,size:D(e)}},F=(e,r)=>{let a=(0,c.readBytes)(e,r),i=0;for(;i{let a=(0,c.readBytes)(e,r),i=0;for(;i{if(0===r)return 0;if(4!==r&&8!==r)throw Error("Bad float size "+r);return 4===r?(0,c.readF32Be)(e):(0,c.readF64Be)(e)},L=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;null===i||nn?i:n,found:!1}},O=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;nI);var h=e("../codec-data.js"),m=e("../codec.js"),p=e("../demuxer.js"),f=e("../input-track.js"),g=e("../metadata.js"),k=e("../misc.js"),b=e("../packet.js"),T=e("./ebml.js"),y=e("./matroska-misc.js"),S=e("../reader.js");(s=l||(l={}))[s.None=0]="None",s[s.Xiph=1]="Xiph",s[s.FixedSize=2]="FixedSize",s[s.Ebml=3]="Ebml",(n=c||(c={}))[n.Block=1]="Block",n[n.Private=2]="Private",n[n.Next=4]="Next",(o=d||(d={}))[o.Zlib=0]="Zlib",o[o.Bzlib=1]="Bzlib",o[o.lzo1x=2]="lzo1x",o[o.HeaderStripping=3]="HeaderStripping";let w=[{id:T.EBMLId.SeekHead,flag:"seekHeadSeen"},{id:T.EBMLId.Info,flag:"infoSeen"},{id:T.EBMLId.Tracks,flag:"tracksSeen"},{id:T.EBMLId.Cues,flag:"cuesSeen"}];class I extends p.Demuxer{constructor(e){super(e),this.readMetadataPromise=null,this.segments=[],this.currentSegment=null,this.currentTrack=null,this.currentCluster=null,this.currentBlock=null,this.currentBlockAdditional=null,this.currentCueTime=null,this.currentDecodingInstruction=null,this.currentTagTargetIsMovie=!0,this.currentSimpleTagName=null,this.currentAttachedFile=null,this.isWebM=!1,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.segments.flatMap(e=>e.tracks.map(e=>e.inputTrack))}async getMimeType(){await this.readMetadata();let e=await this.getTracks(),r=await Promise.all(e.map(e=>e.getCodecParameterString()));return(0,y.buildMatroskaMimeType)({isWebM:this.isWebM,hasVideo:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="video")),hasAudio:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="audio")),codecStrings:r.filter(Boolean)})}async getMetadataTags(){for(let e of(await this.readMetadata(),this.segments))e.metadataTagsCollected||(null!==this.reader.fileSize&&await this.loadSegmentMetadata(e),e.metadataTagsCollected=!0);let e={};for(let r of this.segments)e={...e,...r.metadataTags};return e}readMetadata(){return this.readMetadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,T.readElementHeader)(r);if(!a)break;let i=a.id,s=a.size,n=r.filePos;if(i===T.EBMLId.EBML){(0,T.assertDefinedSize)(s);let e=this.reader.requestSlice(n,s);if(e instanceof Promise&&(e=await e),!e)break;this.readContiguousElements(e)}else if(i===T.EBMLId.Segment){if(await this.readSegment(n,s),null===s||null===this.reader.fileSize)break}else if(i===T.EBMLId.Cluster){if(null===this.reader.fileSize)break;null===s&&(s=(await (0,T.searchForNextElementId)(this.reader,n,T.LEVEL_0_AND_1_EBML_IDS,this.reader.fileSize)).pos-n);let e=(0,k.last)(this.segments);e&&(e.elementEndPos=n+s)}(0,T.assertDefinedSize)(s),e=n+s}})()}async readSegment(e,r){this.currentSegment={seekHeadSeen:!1,infoSeen:!1,tracksSeen:!1,cuesSeen:!1,tagsSeen:!1,attachmentsSeen:!1,timestampScale:-1,timestampFactor:-1,duration:-1,seekEntries:[],tracks:[],cuePoints:[],dataStartPos:e,elementEndPos:null===r?null:e+r,clusterSeekStartPos:e,lastReadCluster:null,metadataTags:{},metadataTagsCollected:!1},this.segments.push(this.currentSegment);let a=e;for(;null===this.currentSegment.elementEndPos||ae.id===s);if(-1!==l){let e=w[l].flag;this.currentSegment[e]=!0,(0,T.assertDefinedSize)(n);let r=this.reader.requestSlice(o,n);r instanceof Promise&&(r=await r),r&&this.readContiguousElements(r)}else if(s===T.EBMLId.Tags||s===T.EBMLId.Attachments){s===T.EBMLId.Tags?this.currentSegment.tagsSeen=!0:this.currentSegment.attachmentsSeen=!0,(0,T.assertDefinedSize)(n);let e=this.reader.requestSlice(o,n);e instanceof Promise&&(e=await e),e&&this.readContiguousElements(e)}else if(s===T.EBMLId.Cluster){this.currentSegment.clusterSeekStartPos=r;break}if(null===n)break;a=o+n}if(this.currentSegment.seekEntries.sort((e,r)=>e.segmentPosition-r.segmentPosition),null!==this.reader.fileSize)for(let r of this.currentSegment.seekEntries){let a=w.find(e=>e.id===r.id);if(!a||this.currentSegment[a.flag])continue;let i=this.reader.requestSliceRange(e+r.segmentPosition,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(i instanceof Promise&&(i=await i),!i)continue;let s=(0,T.readElementHeader)(i);if(!s)continue;let{id:n,size:o}=s;if(n!==a.id)continue;(0,T.assertDefinedSize)(o),this.currentSegment[a.flag]=!0;let l=this.reader.requestSlice(i.filePos,o);l instanceof Promise&&(l=await l),l&&this.readContiguousElements(l)}-1===this.currentSegment.timestampScale&&(this.currentSegment.timestampScale=1e6,this.currentSegment.timestampFactor=1e3),this.currentSegment.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default));let i=new Map(this.currentSegment.tracks.map(e=>[e.id,e]));for(let e of this.currentSegment.cuePoints){let r=i.get(e.trackId);r&&r.cuePoints.push(e)}for(let e of this.currentSegment.tracks){e.cuePoints.sort((e,r)=>e.time-r.time);for(let r=0;rn&&(n=e.cuePoints.length,s=e);for(let e of this.currentSegment.tracks)0===e.cuePoints.length&&(e.cuePoints=s.cuePoints);this.currentSegment=null}async readCluster(e,r){if(r.lastReadCluster?.elementStartPos===e)return r.lastReadCluster;let a=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);a instanceof Promise&&(a=await a),(0,k.assert)(a);let i=(0,T.readElementHeader)(a);(0,k.assert)(i);let s=i.id;(0,k.assert)(s===T.EBMLId.Cluster);let n=i.size,o=a.filePos;null===n&&(n=(await (0,T.searchForNextElementId)(this.reader,o,T.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)).pos-o);let c=this.reader.requestSlice(o,n);c instanceof Promise&&(c=await c);let d={segment:r,elementStartPos:e,elementEndPos:o+n,dataStartPos:o,timestamp:-1,trackData:new Map};for(let[,r]of(this.currentCluster=d,c&&(d.elementEndPos=this.readContiguousElements(c,T.LEVEL_0_AND_1_EBML_IDS)),d.trackData)){let a=r.track;(0,k.assert)(r.blocks.length>0);let i=!1;for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp);for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp));let s=r.blocks[r.presentationTimestamps[0].blockIndex],n=r.blocks[(0,k.last)(r.presentationTimestamps).blockIndex];r.startTimestamp=s.timestamp,r.endTimestamp=n.timestamp+n.duration;let o=(0,k.binarySearchLessOrEqual)(a.clusterPositionCache,r.startTimestamp,e=>e.startTimestamp);(-1===o||a.clusterPositionCache[o].elementStartPos!==e)&&a.clusterPositionCache.splice(o+1,0,{elementStartPos:d.elementStartPos,startTimestamp:r.startTimestamp})}return r.lastReadCluster=d,d}getTrackDataInCluster(e,r){let a=e.trackData.get(r);if(!a){let i=e.segment.tracks.find(e=>e.id===r);if(!i)return null;a={track:i,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,a)}return a}expandLacedBlocks(e,r){for(let a=0;ae.data?.type!=="decompress"||e.scope!==c.Block||e.data.algorithm!==d.HeaderStripping)&&(console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`),this.currentTrack=null),this.currentTrack&&-1!==this.currentTrack.id&&this.currentTrack.codecId&&this.currentTrack.info){let e=this.currentTrack.codecId.indexOf("/"),r=-1===e?this.currentTrack.codecId:this.currentTrack.codecId.slice(0,e);if("video"===this.currentTrack.info.type&&-1!==this.currentTrack.info.width&&-1!==this.currentTrack.info.height){this.currentTrack.codecId===T.CODEC_STRING_MAP.avc?(this.currentTrack.info.codec="avc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.hevc?(this.currentTrack.info.codec="hevc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.vp8?this.currentTrack.info.codec="vp8":r===T.CODEC_STRING_MAP.vp9?this.currentTrack.info.codec="vp9":r===T.CODEC_STRING_MAP.av1&&(this.currentTrack.info.codec="av1");let e=this.currentTrack,a=new(0,f.InputVideoTrack)(this.input,new E(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}else if("audio"===this.currentTrack.info.type&&-1!==this.currentTrack.info.numberOfChannels&&-1!==this.currentTrack.info.sampleRate){r===T.CODEC_STRING_MAP.aac?(this.currentTrack.info.codec="aac",this.currentTrack.info.aacCodecInfo={isMpeg2:this.currentTrack.codecId.includes("MPEG2")},this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.mp3?this.currentTrack.info.codec="mp3":r===T.CODEC_STRING_MAP.opus?(this.currentTrack.info.codec="opus",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate,this.currentTrack.info.sampleRate=m.OPUS_SAMPLE_RATE):r===T.CODEC_STRING_MAP.vorbis?(this.currentTrack.info.codec="vorbis",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.flac?(this.currentTrack.info.codec="flac",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):"A_PCM/INT/LIT"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32"):"A_PCM/INT/BIG"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16be":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24be":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32be"):"A_PCM/FLOAT/IEEE"===this.currentTrack.codecId&&(32===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-f32":64===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-f64"));let e=this.currentTrack,a=new(0,f.InputAudioTrack)(this.input,new P(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}}this.currentTrack=null;break;case T.EBMLId.TrackNumber:if(!this.currentTrack)break;this.currentTrack.id=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TrackType:{if(!this.currentTrack)break;let r=(0,T.readUnsignedInt)(e,s);1===r?this.currentTrack.info={type:"video",width:-1,height:-1,rotation:0,codec:null,codecDescription:null,colorSpace:null,alphaMode:!1}:2===r&&(this.currentTrack.info={type:"audio",numberOfChannels:-1,sampleRate:-1,bitDepth:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case T.EBMLId.FlagEnabled:if(!this.currentTrack)break;(0,T.readUnsignedInt)(e,s)||(this.currentSegment.tracks.pop(),this.currentTrack=null);break;case T.EBMLId.FlagDefault:if(!this.currentTrack)break;this.currentTrack.disposition.default=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagForced:if(!this.currentTrack)break;this.currentTrack.disposition.forced=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagOriginal:if(!this.currentTrack)break;this.currentTrack.disposition.original=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagHearingImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.hearingImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagVisualImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.visuallyImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagCommentary:if(!this.currentTrack)break;this.currentTrack.disposition.commentary=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CodecID:if(!this.currentTrack)break;this.currentTrack.codecId=(0,T.readAsciiString)(e,s);break;case T.EBMLId.CodecPrivate:if(!this.currentTrack)break;this.currentTrack.codecPrivate=(0,S.readBytes)(e,s);break;case T.EBMLId.DefaultDuration:if(!this.currentTrack)break;this.currentTrack.defaultDuration=this.currentTrack.segment.timestampFactor*(0,T.readUnsignedInt)(e,s)/1e9;break;case T.EBMLId.Name:if(!this.currentTrack)break;this.currentTrack.name=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.Language:if(!this.currentTrack||this.currentTrack.languageCode!==k.UNDETERMINED_LANGUAGE)break;this.currentTrack.languageCode=(0,T.readAsciiString)(e,s),(0,k.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)||(this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE);break;case T.EBMLId.LanguageBCP47:{if(!this.currentTrack)break;let r=(0,T.readAsciiString)(e,s).split("-")[0];r?this.currentTrack.languageCode=r:this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE}break;case T.EBMLId.Video:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.PixelWidth:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.width=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.PixelHeight:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.height=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.AlphaMode:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.alphaMode=1===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.Colour:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.colorSpace={},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.MatrixCoefficients:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.MATRIX_COEFFICIENTS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.matrix=a}break;case T.EBMLId.Range:if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;this.currentTrack.info.colorSpace.fullRange=2===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TransferCharacteristics:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.TRANSFER_CHARACTERISTICS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.transfer=a}break;case T.EBMLId.Primaries:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.COLOR_PRIMARIES_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.primaries=a}break;case T.EBMLId.Projection:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ProjectionPoseRoll:{if(this.currentTrack?.info?.type!=="video")break;let r=(0,T.readFloat)(e,s);try{this.currentTrack.info.rotation=(0,k.normalizeRotation)(-r)}catch{}}break;case T.EBMLId.Audio:if(this.currentTrack?.info?.type!=="audio")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.SamplingFrequency:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.sampleRate=(0,T.readFloat)(e,s);break;case T.EBMLId.Channels:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.numberOfChannels=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BitDepth:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.bitDepth=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CuePoint:if(!this.currentSegment)break;this.readContiguousElements(e.slice(n,s)),this.currentCueTime=null;break;case T.EBMLId.CueTime:this.currentCueTime=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CueTrackPositions:{if(null===this.currentCueTime)break;(0,k.assert)(this.currentSegment);let r={time:this.currentCueTime,trackId:-1,clusterPosition:-1};this.currentSegment.cuePoints.push(r),this.readContiguousElements(e.slice(n,s)),(-1===r.trackId||-1===r.clusterPosition)&&this.currentSegment.cuePoints.pop()}break;case T.EBMLId.CueTrack:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;r.trackId=(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.CueClusterPosition:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;(0,k.assert)(this.currentSegment),r.clusterPosition=this.currentSegment.dataStartPos+(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.Timestamp:if(!this.currentCluster)break;this.currentCluster.timestamp=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.SimpleBlock:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,S.readI16Be)(e),o=(0,S.readU8)(e),l=!!(128&o);a.track.info?.type==="audio"&&a.track.info.codec&&(l=!0);let c=(0,S.readBytes)(e,s-(e.filePos-n)),d=a.track.decodingInstructions.length>0;a.blocks.push({timestamp:i,duration:0,isKeyFrame:l,data:c,lacing:o>>1&3,decoded:!d,mainAdditional:null})}break;case T.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(n,s)),this.currentBlock=null;break;case T.EBMLId.Block:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,S.readI16Be)(e),o=(0,S.readU8)(e),l=(0,S.readBytes)(e,s-(e.filePos-n)),c=a.track.decodingInstructions.length>0;this.currentBlock={timestamp:i,duration:0,isKeyFrame:!0,data:l,lacing:o>>1&3,decoded:!c,mainAdditional:null},a.blocks.push(this.currentBlock)}break;case T.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(n,s)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case T.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,S.readBytes)(e,s);break;case T.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case T.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.Targets:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TargetTypeValue:50!==(0,T.readUnsignedInt)(e,s)&&(this.currentTagTargetIsMovie=!1);break;case T.EBMLId.TagTrackUID:case T.EBMLId.TagEditionUID:case T.EBMLId.TagChapterUID:case T.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case T.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TagName:this.currentSimpleTagName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.TagString:{if(!this.currentSimpleTagName)break;let r=(0,T.readUnicodeString)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.TagBinary:{if(!this.currentSimpleTagName)break;let r=(0,S.readBytes)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.AttachedFile:{if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(n,s));let r=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(r.raw??={},r.raw[this.currentAttachedFile.fileUid.toString()]=new(0,g.AttachedFile)(this.currentAttachedFile.fileData,this.currentAttachedFile.fileMediaType??void 0,this.currentAttachedFile.fileName??void 0,this.currentAttachedFile.fileDescription??void 0)),this.currentAttachedFile.fileMediaType?.startsWith("image/")&&this.currentAttachedFile.fileData){let e=this.currentAttachedFile.fileName,a="unknown";if(e){let r=e.toLowerCase();r.startsWith("cover.")?a="coverFront":r.startsWith("back.")&&(a="coverBack")}r.images??=[],r.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:a,name:this.currentAttachedFile.fileName??void 0,description:this.currentAttachedFile.fileDescription??void 0})}this.currentAttachedFile=null}break;case T.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,T.readUnsignedBigInt)(e,s);break;case T.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,T.readAsciiString)(e,s);break;case T.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,S.readBytes)(e,s);break;case T.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(n,s)),this.currentTrack.decodingInstructions.sort((e,r)=>r.order-e.order);break;case T.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:c.Block,data:null},this.readContiguousElements(e.slice(n,s)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case T.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:d.Zlib,settings:null},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ContentCompAlgo:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompSettings:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,S.readBytes)(e,s);break;case T.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=n+s,!0}decodeBlockData(e,r){(0,k.assert)(e.decodingInstructions.length>0);let a=r;for(let r of e.decodingInstructions)if((0,k.assert)(r.data),"decompress"===r.data.type&&r.data.algorithm===d.HeaderStripping&&r.data.settings&&r.data.settings.length>0){let e=r.data.settings,i=new Uint8Array(e.length+a.length);i.set(e,0),i.set(a,e.length),a=i}return a}processTagValue(e,r){if(!this.currentSegment?.metadataTags)return;let a=this.currentSegment.metadataTags;if(a.raw??={},a.raw[e]??=r,"string"==typeof r)switch(e.toLowerCase()){case"title":a.title??=r;break;case"description":a.description??=r;break;case"artist":a.artist??=r;break;case"album":a.album??=r;break;case"album_artist":a.albumArtist??=r;break;case"genre":a.genre??=r;break;case"comment":a.comment??=r;break;case"lyrics":a.lyrics??=r;break;case"date":{let e=new Date(r);Number.isNaN(e.getTime())||(a.date??=e)}break;case"track_number":case"part_number":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.trackNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.tracksTotal??=s)}break;case"disc_number":case"disc":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.discNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.discsTotal??=s)}}}}class x{constructor(e){this.internalTrack=e,this.packetToClusterLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.codecId}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}getTimeResolution(){return this.internalTrack.segment.timestampFactor}getDisposition(){return this.internalTrack.disposition}async getFirstPacket(e){return this.performClusterLookup(null,e=>e.trackData.get(this.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1},-1/0,1/0,e)}intoTimescale(e){return(0,k.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}async getPacket(e,r){let a=this.intoTimescale(e);return this.performClusterLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.timestamp);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id);if(a.blockIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.findLastIndex)(r.presentationTimestamps,e=>r.blocks[e.blockIndex].isKeyFrame&&e.timestamp<=a);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id).blocks.findIndex((e,r)=>e.isKeyFrame&&r>a.blockIndex);if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.blocks.findIndex(e=>e.isKeyFrame);return(0,k.assert)(-1!==e),{blockIndex:e,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)}async fetchPacketInCluster(e,r,a){if(-1===r)return null;let i=e.trackData.get(this.internalTrack.id).blocks[r];(0,k.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0);let s=a.metadataOnly?b.PLACEHOLDER_DATA:i.data,n=i.timestamp/this.internalTrack.segment.timestampFactor,o=i.duration/this.internalTrack.segment.timestampFactor,l={};i.mainAdditional&&this.internalTrack.info?.type==="video"&&this.internalTrack.info.alphaMode&&(l.alpha=a.metadataOnly?b.PLACEHOLDER_DATA:i.mainAdditional,l.alphaByteLength=i.mainAdditional.byteLength);let c=new(0,b.EncodedPacket)(s,i.isKeyFrame?"key":"delta",n,o,e.dataStartPos+r,i.data.byteLength,l);return this.packetToClusterLocation.set(c,{cluster:e,blockIndex:r}),c}async performClusterLookup(e,r,a,i,s){let n,{demuxer:o,segment:l}=this.internalTrack,c=null,d=null,u=-1;if(e){let{blockIndex:a,correctBlockFound:i}=r(e);if(i)return this.fetchPacketInCluster(e,a,s);-1!==a&&(d=e,u=a)}let h=(0,k.binarySearchLessOrEqual)(this.internalTrack.cuePoints,a,e=>e.time),m=-1!==h?this.internalTrack.cuePoints[h]:null,p=(0,k.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,a,e=>e.startTimestamp),f=-1!==p?this.internalTrack.clusterPositionCache[p]:null,g=Math.max(m?.clusterPosition??0,f?.elementStartPos??0)||null;for(e?null===g||e.elementStartPos>=g?(n=e.elementEndPos,c=e):n=g:n=g??l.clusterSeekStartPos;null===l.elementEndPos||n<=l.elementEndPos-T.MIN_HEADER_SIZE;){if(c){let e=c.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,h=(0,T.readElementHeader)(e);if(!h||!T.LEVEL_1_EBML_IDS.includes(h.id)&&h.id!==T.EBMLId.Void){let e=await (0,T.resync)(o.reader,a,T.LEVEL_1_EBML_IDS,Math.min(l.elementEndPos??1/0,a+0xa00000));if(e){n=e;continue}break}let m=h.id,p=h.size,f=e.filePos;if(m===T.EBMLId.Cluster){p=(c=await o.readCluster(a,l)).elementEndPos-f;let{blockIndex:e,correctBlockFound:i}=r(c);if(i)return this.fetchPacketInCluster(c,e,s);-1!==e&&(d=c,u=e)}null===p&&((0,k.assert)(m!==T.EBMLId.Cluster),p=(await (0,T.searchForNextElementId)(o.reader,f,T.LEVEL_0_AND_1_EBML_IDS,l.elementEndPos)).pos-f);let g=f+p;if(null===l.elementEndPos){let e=o.reader.requestSliceRange(g,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;if((0,T.readElementId)(e)===T.EBMLId.Segment){l.elementEndPos=g;break}}n=g}if(m&&(!d||d.elementStartPos{let e=null;return"vp9"!==this.internalTrack.info.codec&&"av1"!==this.internalTrack.info.codec&&("avc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)&&("hevc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)||(e=await this.getFirstPacket({})),{codec:(0,m.extractVideoCodecString)({width:this.internalTrack.info.width,height:this.internalTrack.info.height,codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,colorSpace:this.internalTrack.info.colorSpace,avcType:1,avcCodecInfo:"avc"===this.internalTrack.info.codec&&e?(0,h.extractAvcDecoderConfigurationRecord)(e.data):null,hevcCodecInfo:"hevc"===this.internalTrack.info.codec&&e?(0,h.extractHevcDecoderConfigurationRecord)(e.data):null,vp9CodecInfo:"vp9"===this.internalTrack.info.codec&&e?(0,h.extractVp9CodecInfoFromPacket)(e.data):null,av1CodecInfo:"av1"===this.internalTrack.info.codec&&e?(0,h.extractAv1CodecInfoFromPacket)(e.data):null}),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class P extends x{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,m.extractAudioCodecString)({codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,aacCodecInfo:this.internalTrack.info.aacCodecInfo}),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}},{"../codec-data.js":"4Hepu","../codec.js":"8wd8o","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../metadata.js":"fFgR1","../misc.js":"dpOkn","../packet.js":"i61Hy","./ebml.js":"B0jDs","./matroska-misc.js":"axlni","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],axlni:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildMatroskaMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings.filter(Boolean))];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i9O6t:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Mp3Demuxer",()=>f);var n=e("../demuxer.js"),o=e("../input-track.js"),l=e("../metadata.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../../shared/mp3-misc.js"),h=e("../id3.js"),m=e("./mp3-reader.js"),p=e("../reader.js");class f extends n.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.metadataTags=null,this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");this.tracks=[new(0,o.InputAudioTrack)(this.input,new g(this))]})()}async advanceReader(){if(0===this.lastLoadedPos)for(;;){let e=this.reader.requestSlice(this.lastLoadedPos,h.ID3_V2_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,h.readId3V2Header)(e);if(!r)break;this.lastLoadedPos=e.filePos+r.size}let e=await (0,m.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize);if(!e){this.lastSampleLoaded=!0;return}let r=e.header;this.lastLoadedPos=e.startPos+r.totalSize-1;let a=(0,u.getXingOffset)(r.mpegVersionId,r.channel),i=this.reader.requestSlice(e.startPos+a,4);if(i instanceof Promise&&(i=await i),i){let e=(0,p.readU32Be)(i);if(e===u.XING||e===u.INFO)return}this.firstFrameHeader||(this.firstFrameHeader=r),r.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${r.sampleRate} Hz. Might be a bug, so please report this file.`);let s=r.audioSamplesInFrame/this.firstFrameHeader.sampleRate,n={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:s,dataStart:e.startPos,dataSize:r.totalSize};this.loadedSamples.push(n),this.nextTimestampInSamples+=r.audioSamplesInFrame}async getMimeType(){return"audio/mpeg"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){let e=await this.readingMutex.acquire();try{if(await this.readMetadata(),this.metadataTags)return this.metadataTags;this.metadataTags={};let e=0,r=!1;for(;;){let a=this.reader.requestSlice(e,h.ID3_V2_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)break;let i=(0,h.readId3V2Header)(a);if(!i)break;r=!0;let s=this.reader.requestSlice(a.filePos,i.size);if(s instanceof Promise&&(s=await s),!s)break;(0,h.parseId3V2Tag)(s,i,this.metadataTags),e=a.filePos+i.size}if(!r&&null!==this.reader.fileSize&&this.reader.fileSize>=h.ID3_V1_TAG_SIZE){let e=this.reader.requestSlice(this.reader.fileSize-h.ID3_V1_TAG_SIZE,h.ID3_V1_TAG_SIZE);e instanceof Promise&&(e=await e),(0,c.assert)(e);let r=(0,p.readAscii)(e,3);"TAG"===r&&(0,h.parseId3V1Tag)(e,this.metadataTags)}return this.metadataTags}finally{e()}}}class g{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"mp3"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}getSampleRate(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}getDisposition(){return{...l.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){return(0,c.assert)(this.demuxer.firstFrameHeader),{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,p.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1n),s.export(a,"SAMPLING_RATES",()=>o),s.export(a,"KILOBIT_RATES",()=>l),s.export(a,"XING",()=>c),s.export(a,"INFO",()=>d),s.export(a,"computeMp3FrameSize",()=>u),s.export(a,"getXingOffset",()=>h),s.export(a,"readFrameHeader",()=>m),s.export(a,"encodeSynchsafe",()=>p),s.export(a,"decodeSynchsafe",()=>f);let n=4,o=[44100,48e3,32e3],l=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1,-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1,-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,32,48,56,64,80,96,112,128,144,160,176,192,224,256,-1],c=0x58696e67,d=0x496e666f,u=(e,r,a,i,s)=>0===r?0:1===r?Math.floor(144*a/(i<3===e?3===r?21:36:3===r?13:21,m=(e,r)=>{let a,i=e>>>24,s=e>>>16&255,n=e>>>8&255,c=255&e;if(255!==i&&255!==s&&255!==n&&255!==c)return{header:null,bytesAdvanced:4};if(255!==i||(224&s)!=224)return{header:null,bytesAdvanced:1};let d=0,h=0;16&s?d=8&s?0:1:(d=1,h=1);let m=s>>3&3,p=s>>1&3,f=(n>>2&3)%3,g=l[64*d+16*p+(n>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};let k=1e3*g,b=o[f]>>d+h,T=u(d,p,k,b,n>>1&1);return null!==r&&r>6&3,modeExtension:c>>4&3,copyright:c>>3&1,original:c>>2&1,emphasis:3&c,audioSamplesInFrame:a},bytesAdvanced:1})},p=e=>{let r=127,a=0,i=e;for(;(0x7fffffff^r)!=0;)a=(i&~r)<<1|i&r,r=(r+1<<8)-1,i=a;return a},f=e=>{let r=0x7f000000,a=0;for(;0!==r;)a>>=1,a|=e&r,r>>=8;return a}},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"69HAt":[function(e,r,a,i){var s,n,o,l,c=e("@parcel/transformer-js/src/esmodule-helpers.js");c.defineInteropFlag(a),c.export(a,"Id3V2HeaderFlags",()=>o),c.export(a,"Id3V2TextEncoding",()=>l),c.export(a,"ID3_V1_TAG_SIZE",()=>m),c.export(a,"ID3_V2_HEADER_SIZE",()=>p),c.export(a,"ID3_V1_GENRES",()=>f),c.export(a,"parseId3V1Tag",()=>g),c.export(a,"readId3V1String",()=>k),c.export(a,"readId3V2Header",()=>b),c.export(a,"parseId3V2Tag",()=>T),c.export(a,"Id3V2Reader",()=>y),c.export(a,"Id3V2Writer",()=>S);var d=e("../shared/mp3-misc.js"),u=e("./misc.js"),h=e("./reader.js");(s=o||(o={}))[s.Unsynchronisation=128]="Unsynchronisation",s[s.ExtendedHeader=64]="ExtendedHeader",s[s.ExperimentalIndicator=32]="ExperimentalIndicator",s[s.Footer=16]="Footer",(n=l||(l={}))[n.ISO_8859_1=0]="ISO_8859_1",n[n.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",n[n.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",n[n.UTF_8=3]="UTF_8";let m=128,p=10,f=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],g=(e,r)=>{let a,i=e.filePos;r.raw??={},r.raw.TAG??=(0,h.readBytes)(e,m-3),e.filePos=i;let s=k(e,30);s&&(r.title??=s);let n=k(e,30);n&&(r.artist??=n);let o=k(e,30);o&&(r.album??=o);let l=Number.parseInt(k(e,4),10);Number.isInteger(l)&&l>0&&(r.date??=new Date(l,0,1));let c=(0,h.readBytes)(e,30);if(0===c[28]&&0!==c[29]){let i=c[29];i>0&&(r.trackNumber??=i),e.skip(-30),a=k(e,28),e.skip(2)}else e.skip(-30),a=k(e,30);a&&(r.comment??=a);let d=(0,h.readU8)(e);d{let a=(0,h.readBytes)(e,r),i=(0,u.coalesceIndex)(a.indexOf(0),a.length),s=a.subarray(0,i),n="";for(let e=0;e{let r=e.filePos,a=(0,h.readAscii)(e,3),i=(0,h.readU8)(e),s=(0,h.readU8)(e),n=(0,h.readU8)(e),o=(0,h.readU32Be)(e);return"ID3"!==a||255===i||255===s||(0x80808080&o)!=0?(e.filePos=r,null):{majorVersion:i,revision:s,flags:n,size:(0,d.decodeSynchsafe)(o)}},T=(e,r,a)=>{if(![2,3,4].includes(r.majorVersion))return void console.warn(`Unsupported ID3v2 major version: ${r.majorVersion}`);let i=(0,h.readBytes)(e,r.size),s=new y(r,i);if(r.flags&o.Footer&&s.removeFooter(),r.flags&o.Unsynchronisation&&3===r.majorVersion&&s.ununsynchronizeAll(),r.flags&o.ExtendedHeader){let e=s.readU32();3===r.majorVersion?s.pos+=e:s.pos+=e-4}for(;s.pos<=s.bytes.length-s.frameHeaderSize();){let e=s.readId3V2Frame();if(!e)break;let i=s.pos,n=s.pos+e.size,l=!1,c=!1,d=!1;if(3===r.majorVersion?(l=!!(64&e.flags),c=!!(128&e.flags)):4===r.majorVersion&&(l=!!(4&e.flags),c=!!(8&e.flags),d=!!(2&e.flags)||!!(r.flags&o.Unsynchronisation)),l){console.warn(`Skipping encrypted ID3v2 frame ${e.id}`),s.pos=n;continue}if(c){console.warn(`Skipping compressed ID3v2 frame ${e.id}`),s.pos=n;continue}switch(d&&s.ununsynchronizeRegion(s.pos,n),a.raw??={},"T"===e.id[0]?a.raw[e.id]??=s.readId3V2EncodingAndText(n):a.raw[e.id]??=s.readBytes(e.size),s.pos=i,e.id){case"TIT2":case"TT2":a.title??=s.readId3V2EncodingAndText(n);break;case"TIT3":case"TT3":a.description??=s.readId3V2EncodingAndText(n);break;case"TPE1":case"TP1":a.artist??=s.readId3V2EncodingAndText(n);break;case"TALB":case"TAL":a.album??=s.readId3V2EncodingAndText(n);break;case"TPE2":case"TP2":a.albumArtist??=s.readId3V2EncodingAndText(n);break;case"TRCK":case"TRK":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.trackNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.tracksTotal??=i)}break;case"TPOS":case"TPA":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.discNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.discsTotal??=i)}break;case"TCON":case"TCO":{let e=s.readId3V2EncodingAndText(n),r=/^\((\d+)\)/.exec(e);if(r){let e=Number.parseInt(r[1]);if(void 0!==f[e]){a.genre??=f[e];break}}if(r=/^\d+$/.exec(e)){let e=Number.parseInt(r[0]);if(void 0!==f[e]){a.genre??=f[e];break}}a.genre??=e}break;case"TDRC":case"TDAT":{let e=new Date(s.readId3V2EncodingAndText(n));Number.isNaN(e.getTime())||(a.date??=e)}break;case"TYER":case"TYE":{let e=Number.parseInt(s.readId3V2EncodingAndText(n),10);Number.isInteger(e)&&(a.date??=new Date(e,0,1))}break;case"USLT":case"ULT":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.lyrics??=s.readId3V2Text(e,n)}break;case"COMM":case"COM":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.comment??=s.readId3V2Text(e,n)}break;case"APIC":case"PIC":{let e,i=s.readId3V2TextEncoding();if(2===r.majorVersion){let r=s.readAscii(3);e="PNG"===r?"image/png":"JPG"===r?"image/jpeg":"image/*"}else e=s.readId3V2Text(i,n);let o=s.readU8(),l=s.readId3V2Text(i,n).trimEnd(),c=n-s.pos;if(c>=0){let r=s.readBytes(c);a.images||(a.images=[]),a.images.push({data:r,mimeType:e,kind:3===o?"coverFront":4===o?"coverBack":"unknown",description:l})}}break;default:s.pos+=e.size}s.pos=n}};class y{constructor(e,r){this.header=e,this.bytes=r,this.pos=0,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength)}frameHeaderSize(){return 2===this.header.majorVersion?6:10}ununsynchronizeAll(){let e=[];for(let r=0;r{let r=this.pos+e;if(r>this.bytes.length)return!1;if(r<=this.bytes.length-this.frameHeaderSize()){this.pos+=e;let r=this.readAscii(4);if("\0\0\0\0"!==r&&!/[0-9A-Z]{4}/.test(r))return!1}return!0};if(!n(a)){let e=4===this.header.majorVersion?r:(0,d.decodeSynchsafe)(r);n(e)&&(a=e)}return this.pos=s,{id:e,size:a,flags:i}}}readId3V2TextEncoding(){let e=this.readU8();if(e>3)throw Error(`Unsupported text encoding: ${e}`);return e}readId3V2Text(e,r){let a=this.pos,i=this.readBytes(r-this.pos);switch(e){case l.ISO_8859_1:{let e="";for(let r=0;r0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}if(254===i[0]&&255===i[1]){let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}case l.UTF_16_BE_NO_BOM:{let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(0,r))}case l.UTF_8:{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}}}readId3V2EncodingAndText(e){if(this.pos>=e)return"";let r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}class S{constructor(e){this.helper=new Uint8Array(8),this.helperView=(0,u.toDataView)(this.helper),this.writer=e}writeId3V2Tag(e){let r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);let a=this.writer.getPos(),i=new Set;for(let{key:r,value:a}of(0,u.keyValueIterator)(e))switch(r){case"title":this.writeId3V2TextFrame("TIT2",a),i.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",a),i.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",a),i.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",a),i.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",a),i.add("TPE2");break;case"trackNumber":{let r=void 0!==e.tracksTotal?`${a}/${e.tracksTotal}`:a.toString();this.writeId3V2TextFrame("TRCK",r),i.add("TRCK")}break;case"discNumber":{let r=void 0!==e.discsTotal?`${a}/${e.discsTotal}`:a.toString();this.writeId3V2TextFrame("TPOS",r),i.add("TPOS")}break;case"genre":this.writeId3V2TextFrame("TCON",a),i.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",a.toISOString().slice(0,10)),i.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(a),i.add("USLT");break;case"comment":this.writeId3V2CommentFrame(a),i.add("COMM");break;case"images":{let e={coverFront:3,coverBack:4,unknown:0};for(let r of a){let a=e[r.kind]??0,i=r.description??"";this.writeId3V2ApicFrame(r.mimeType,a,i,r.data)}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,u.assertNever)(r)}if(e.raw)for(let r in e.raw){let a,s=e.raw[r];if(!(null==s||4!==r.length||i.has(r))){if("string"==typeof s){let e=u.textEncoder.encode(s);(a=new Uint8Array(e.byteLength+2))[0]=l.UTF_8,a.set(e,1)}else{if(!(s instanceof Uint8Array))continue;a=s}this.writeAscii(r),this.writeSynchsafeU32(a.byteLength),this.writeU16(0),this.writer.write(a)}}let s=this.writer.getPos(),n=s-a;return this.writer.seek(r+6),this.writeSynchsafeU32(n),this.writer.seek(s),n+10}writeU8(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}writeU16(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeAscii(e){for(let r=0;rl);var n=e("../../shared/mp3-misc.js"),o=e("../reader.js");let l=async(e,r,a)=>{let i=r;for(;null===a||ig);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),h=e("../packet.js"),m=e("../reader.js"),p=e("./ogg-misc.js"),f=e("./ogg-reader.js");class g extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.bitstreams=[],this.tracks=[],this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,f.readPageHeader)(r);if(!a||!(2&a.headerType))break;this.bitstreams.push({serialNumber:a.serialNumber,bosPage:a,description:null,numberOfChannels:-1,sampleRate:-1,codecInfo:{codec:null,vorbisInfo:null,opusInfo:null},lastMetadataPacket:null}),e=a.headerStartPos+a.totalSize}for(let e of this.bitstreams){let r=await this.readPacket(e.bosPage,0);r&&(r.data.byteLength>=7&&1===r.data[0]&&118===r.data[1]&&111===r.data[2]&&114===r.data[3]&&98===r.data[4]&&105===r.data[5]&&115===r.data[6]?await this.readVorbisMetadata(r,e):r.data.byteLength>=8&&79===r.data[0]&&112===r.data[1]&&117===r.data[2]&&115===r.data[3]&&72===r.data[4]&&101===r.data[5]&&97===r.data[6]&&100===r.data[7]&&await this.readOpusMetadata(r,e),null!==e.codecInfo.codec&&this.tracks.push(new(0,c.InputAudioTrack)(this.input,new k(e,this))))}})()}async readVorbisMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i||!(a=await this.findNextPacketStart(i)))return;let s=await this.readPacket(a.startPage,a.startSegmentIndex);if(!s||3!==i.data[0]||5!==s.data[0])return;let n=[],l=e=>{for(;n.push(Math.min(255,e)),!(e<255);)e-=255};l(e.data.length),l(i.data.length);let c=new Uint8Array(1+n.length+e.data.length+i.data.length+s.data.length);c[0]=2,c.set(n,1),c.set(e.data,1+n.length),c.set(i.data,1+n.length+e.data.length),c.set(s.data,1+n.length+e.data.length+i.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=s;let d=(0,u.toDataView)(e.data);r.numberOfChannels=d.getUint8(11),r.sampleRate=d.getUint32(12,!0);let h=d.getUint8(28);r.codecInfo.vorbisInfo={blocksizes:[1<<(15&h),1<<(h>>4)],modeBlockflags:(0,o.parseModesFromVorbisSetupPacket)(s.data).modeBlockflags},(0,o.readVorbisComments)(i.data.subarray(7),this.metadataTags)}async readOpusMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i)return;r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=i;let s=(0,o.parseOpusIdentificationHeader)(e.data);r.numberOfChannels=s.outputChannelCount,r.sampleRate=n.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:s.preSkip},(0,o.readVorbisComments)(i.data.subarray(8),this.metadataTags)}async readPacket(e,r){(0,u.assert)(re+r.length,0)),c=0;for(let e=0;ee.getCodecParameterString()));return(0,p.buildOggMimeType)({codecStrings:e.filter(Boolean)})}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class k{constructor(e,r){this.bitstream=e,this.demuxer=r,this.encodedPacketToMetadata=new WeakMap,this.sequentialScanCache=[],this.sequentialScanMutex=new(0,u.AsyncMutex),this.internalSampleRate="opus"===e.codecInfo.codec?n.OPUS_SAMPLE_RATE:e.sampleRate}getId(){return this.bitstream.serialNumber}getNumberOfChannels(){return this.bitstream.numberOfChannels}getSampleRate(){return this.bitstream.sampleRate}getTimeResolution(){return this.bitstream.sampleRate}getCodec(){return this.bitstream.codecInfo.codec}getInternalCodecId(){return null}async getDecoderConfig(){return(0,u.assert)(this.bitstream.codecInfo.codec),{codec:this.bitstream.codecInfo.codec,numberOfChannels:this.bitstream.numberOfChannels,sampleRate:this.bitstream.sampleRate,description:this.bitstream.description??void 0}}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}granulePositionToTimestampInSamples(e){return"opus"===this.bitstream.codecInfo.codec?((0,u.assert)(this.bitstream.codecInfo.opusInfo),e-this.bitstream.codecInfo.opusInfo.preSkip):e}createEncodedPacketFromOggPacket(e,r,a){if(!e)return null;let{durationInSamples:i,vorbisBlockSize:s}=(0,p.extractSampleMetadata)(e.data,this.bitstream.codecInfo,r.vorbisLastBlocksize),n=new(0,h.EncodedPacket)(a.metadataOnly?h.PLACEHOLDER_DATA:e.data,"key",Math.max(0,r.timestampInSamples)/this.internalSampleRate,i/this.internalSampleRate,e.endPage.headerStartPos+e.endSegmentIndex,e.data.byteLength);return this.encodedPacketToMetadata.set(n,{packet:e,timestampInSamples:r.timestampInSamples,durationInSamples:i,vorbisLastBlockSize:r.vorbisLastBlocksize,vorbisBlockSize:s}),n}async getFirstPacket(e){(0,u.assert)(this.bitstream.lastMetadataPacket);let r=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!r)return null;let a=0;"opus"===this.bitstream.codecInfo.codec&&((0,u.assert)(this.bitstream.codecInfo.opusInfo),a-=this.bitstream.codecInfo.opusInfo.preSkip);let i=await this.demuxer.readPacket(r.startPage,r.startSegmentIndex);return this.createEncodedPacketFromOggPacket(i,{timestampInSamples:a,vorbisLastBlocksize:null},e)}async getNextPacket(e,r){let a=this.encodedPacketToMetadata.get(e);if(!a)throw Error("Packet was not created from this track.");let i=await this.demuxer.findNextPacketStart(a.packet);if(!i)return null;let s=a.timestampInSamples+a.durationInSamples,n=await this.demuxer.readPacket(i.startPage,i.startSegmentIndex);return this.createEncodedPacketFromOggPacket(n,{timestampInSamples:s,vorbisLastBlocksize:a.vorbisBlockSize},r)}async getPacket(e,r){let a,i;if(null===this.demuxer.reader.fileSize)return this.getPacketSequential(e,r);let s=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);if(0===s)return this.getFirstPacket(r);if(s<0)return null;(0,u.assert)(this.bitstream.lastMetadataPacket);let n=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!n)return null;let o=n.startPage,l=this.demuxer.reader.fileSize,c=[o];e:for(;o.headerStartPos+o.totalSizes?l=d.headerStartPos:(o=d,c.push(d));continue e}}let d=n.startPage;for(let e of c){if(e.granulePosition===o.granulePosition)break;(!d||e.headerStartPos>d.headerStartPos)&&(d=e)}let g=d,k=[g];for(;g.serialNumber!==this.bitstream.serialNumber||g.granulePosition!==o.granulePosition;){let e=g.headerStartPos+g.totalSize,r=this.demuxer.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);r instanceof Promise&&(r=await r),(0,u.assert)(r);let a=(0,f.readPageHeader)(r);(0,u.assert)(a),(g=a).serialNumber===this.bitstream.serialNumber&&k.push(g)}(0,u.assert)(-1!==g.granulePosition);let y=null,S=g,w=0;if(g.headerStartPos===n.startPage.headerStartPos)a=this.granulePositionToTimestampInSamples(0),i=!0,y=0;else{a=0,i=!1;for(let e=g.lacingValues.length-1;e>=0;e--)if(g.lacingValues[e]<255){y=e+1;break}if(null===y)throw Error("Invalid page with granule position: no packets end on this page.");w=y-1;let e={data:h.PLACEHOLDER_DATA,endPage:S,endSegmentIndex:w};if(await this.demuxer.findNextPacketStart(e)){let e=T(k,g,y);(0,u.assert)(e);let r=b(k,e.page,e.segmentIndex);r&&(g=r.page,y=r.segmentIndex)}else for(;;){let e=T(k,g,y);if(!e)break;let r=b(k,e.page,e.segmentIndex);if(!r)break;if(g=r.page,y=r.segmentIndex,e.page.headerStartPos!==S.headerStartPos){S=e.page,w=e.segmentIndex;break}}}let I=null,x=null;for(;null!==g;){(0,u.assert)(null!==y);let e=await this.demuxer.readPacket(g,y);if(!e)break;if(!(g.headerStartPos===n.startPage.headerStartPos&&ys||Math.max(o.timestampInSamples,0)===s))break}let o=await this.demuxer.findNextPacketStart(e);if(!o)break;g=o.startPage,y=o.startSegmentIndex}return I}async getPacketSequential(e,r){let a=await this.sequentialScanMutex.acquire();try{let a,i=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);e=i/this.internalSampleRate;let s=(0,u.binarySearchLessOrEqual)(this.sequentialScanCache,i,e=>e.timestampInSamples);if(-1!==s){let e=this.sequentialScanCache[s];a=this.createEncodedPacketFromOggPacket(e.packet,{timestampInSamples:e.timestampInSamples,vorbisLastBlocksize:e.vorbisLastBlockSize},r)}else a=await this.getFirstPacket(r);let n=0;for(;a&&a.timestampe)break;if(a=i,n++,100===n){n=0;let e=this.encodedPacketToMetadata.get(a);(0,u.assert)(e),this.sequentialScanCache.length>0&&(0,u.assert)((0,u.last)(this.sequentialScanCache).timestampInSamples<=e.timestampInSamples),this.sequentialScanCache.push(e)}}return a}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}let b=(e,r,a)=>{let i=r,s=a;e:for(;;){for(s--;s>=0;s--)if(i.lacingValues[s]<255){s++;break e}if((0,u.assert)(-1===s),!(1&i.headerType)){s=0;break}let r=(0,u.findLast)(e,e=>e.headerStartPos{if(a>0)return{page:r,segmentIndex:a-1};let i=(0,u.findLast)(e,e=>e.headerStartPosl),s.export(a,"computeOggPageCrc",()=>d),s.export(a,"extractSampleMetadata",()=>u),s.export(a,"buildOggMimeType",()=>h);var n=e("../codec-data.js"),o=e("../misc.js");let l=0x5367674f,c=new Uint32Array(256);for(let e=0;e<256;e++){let r=e<<24;for(let e=0;e<8;e++)r=0x80000000&r?r<<1^0x4c11db7:r<<1;c[e]=r>>>0}let d=e=>{let r=(0,o.toDataView)(e),a=r.getUint32(22,!0);r.setUint32(22,0,!0);let i=0;for(let r=0;r>>24^e[r]])>>>0;return r.setUint32(22,a,!0),i},u=(e,r,a)=>{let i=0,s=null;if(e.length>0)if("vorbis"===r.codec){(0,o.assert)(r.vorbisInfo);let n=r.vorbisInfo.modeBlockflags.length,l=(1<<(0,o.ilog)(n-1))-1<<1,c=(e[0]&l)>>1;if(c>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");let d=a,u=r.vorbisInfo.modeBlockflags[c];if(s=r.vorbisInfo.blocksizes[u],1===u){let a=e[0]&(1|l)+1?1:0;d=r.vorbisInfo.blocksizes[a]}i=null!==d?d+s>>2:0}else"opus"===r.codec&&(i=(0,n.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:i,vorbisBlockSize:s}},h=e=>{let r="audio/ogg";if(e.codecStrings){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"../codec-data.js":"4Hepu","../misc.js":"dpOkn","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],i9qmX:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_PAGE_HEADER_SIZE",()=>l),s.export(a,"MAX_PAGE_HEADER_SIZE",()=>c),s.export(a,"MAX_PAGE_SIZE",()=>d),s.export(a,"readPageHeader",()=>u),s.export(a,"findNextPageHeader",()=>h);var n=e("../reader.js"),o=e("./ogg-misc.js");let l=27,c=282,d=65307,u=e=>{let r=e.filePos;if((0,n.readU32Le)(e)!==o.OGGS)return null;e.skip(1);let a=(0,n.readU8)(e),i=(0,n.readI64Le)(e),s=(0,n.readU32Le)(e),l=(0,n.readU32Le)(e),c=(0,n.readU32Le)(e),d=(0,n.readU8)(e),u=new Uint8Array(d);for(let r=0;re+r,0);return{headerStartPos:r,totalSize:h+m,dataStartPos:r+h,dataSize:m,headerType:a,granulePosition:i,serialNumber:s,sequenceNumber:l,checksum:c,lacingValues:u}},h=(e,r)=>{for(;e.filePos>>8&255,s=r>>>16&255,l=r>>>24&255;if(79===a||79===i||79===s||79===l){if(e.skip(-4),r===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"3hF2Q","./ogg-misc.js":"7ByLQ","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],lUIAt:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"WaveFormat",()=>n),o.export(a,"WaveDemuxer",()=>f);var l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),h=e("../packet.js"),m=e("../reader.js"),p=e("../id3.js");(s=n||(n={}))[s.PCM=1]="PCM",s[s.IEEE_FLOAT=3]="IEEE_FLOAT",s[s.ALAW=6]="ALAW",s[s.MULAW=7]="MULAW",s[s.EXTENSIBLE=65534]="EXTENSIBLE";class f extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.dataStart=-1,this.dataSize=-1,this.audioInfo=null,this.tracks=[],this.lastKnownPacketIndex=0,this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=this.reader.requestSlice(0,12);e instanceof Promise&&(e=await e),(0,u.assert)(e);let r=(0,m.readAscii)(e,4),a="RIFX"!==r,i="RF64"===r,s=(0,m.readU32)(e,a),n=i?this.reader.fileSize:Math.min(s+8,this.reader.fileSize??1/0);if("WAVE"!==(0,m.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");let o=0,l=null,d=e.filePos;for(;null===n||d=18&&357!==o)&&Math.min(r-18,(0,m.readU16)(s,a))>=22&&o===n.EXTENSIBLE){s.skip(6);let e=(0,m.readBytes)(s,16);o=e[0]|e[1]<<8}(o===n.MULAW||o===n.ALAW)&&(i=8),this.audioInfo={format:o,numberOfChannels:l,sampleRate:c,sampleSizeInBytes:Math.ceil(i/8),blockSizeInBytes:d}}async parseListChunk(e,r,a){let i=this.reader.requestSlice(e,r);if(i instanceof Promise&&(i=await i),!i)return;let s=(0,m.readAscii)(i,4);if("INFO"!==s&&"INF0"!==s)return;let n=i.filePos;for(;n<=e+r-8;){i.filePos=n;let e=(0,m.readAscii)(i,4),r=(0,m.readU32)(i,a),s=(0,m.readBytes)(i,r),o=0;for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"ICRD":case"IDIT":{let e=new Date(l);Number.isNaN(e.getTime())||(this.metadataTags.date??=e)}break;case"YEAR":{let e=Number.parseInt(l,10);Number.isInteger(e)&&e>0&&(this.metadataTags.date??=new Date(e,0,1))}break;case"IGNR":case"GENR":this.metadataTags.genre??=l;break;case"ICMT":case"CMNT":case"COMM":this.metadataTags.comment??=l}n+=8+r+(1&r)}}async parseId3Chunk(e,r){let a=this.reader.requestSlice(e,r);if(a instanceof Promise&&(a=await a),!a)return;let i=(0,p.readId3V2Header)(a);if(i){let r=a.slice(e+10,i.size);(0,p.parseId3V2Tag)(r,i,this.metadataTags)}}getCodec(){if((0,u.assert)(this.audioInfo),this.audioInfo.format===n.MULAW)return"ulaw";if(this.audioInfo.format===n.ALAW)return"alaw";if(this.audioInfo.format===n.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===n.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}async getMimeType(){return"audio/wav"}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,u.assert)(e),e.computeDuration()}async getTracks(){return await this.readMetadata(),this.tracks}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class g{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return this.demuxer.getCodec()}getInternalCodecId(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}async getDecoderConfig(){let e=this.demuxer.getCodec();return e?((0,u.assert)(this.demuxer.audioInfo),{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}):null}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getNumberOfChannels(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}getSampleRate(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getTimeResolution(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getPacketAtIndex(e,r){let a;(0,u.assert)(this.demuxer.audioInfo);let i=2048*e*this.demuxer.audioInfo.blockSizeInBytes;if(i>=this.demuxer.dataSize)return null;let s=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-i);if(null===this.demuxer.reader.fileSize){let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);if(e instanceof Promise&&(e=await e),!e)return null}if(r.metadataOnly)a=h.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);e instanceof Promise&&(e=await e),(0,u.assert)(e),a=(0,m.readBytes)(e,s)}let n=2048*e/this.demuxer.audioInfo.sampleRate,o=s/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate;return this.demuxer.lastKnownPacketIndex=Math.max(e,n),new(0,h.EncodedPacket)(a,"key",n,o,e,s)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),i=await this.getPacketAtIndex(a,r);if(i)return i;if(0===a)return null;(0,u.assert)(null===this.demuxer.reader.fileSize);let s=await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r);for(;s;){let e=await this.getNextPacket(s,r);if(!e)break;s=e}return s}getNextPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(a+1,r)}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}},{"../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../metadata.js":"fFgR1","../misc.js":"dpOkn","../packet.js":"i61Hy","../reader.js":"3hF2Q","../id3.js":"69HAt","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5Z778":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_FRAME_HEADER_SIZE",()=>l),s.export(a,"MAX_FRAME_HEADER_SIZE",()=>c),s.export(a,"readFrameHeader",()=>d);var n=e("../misc.js"),o=e("../reader.js");let l=7,c=9,d=e=>{let r=e.filePos,a=(0,o.readBytes)(e,9),i=new(0,n.Bitstream)(a);if(4095!==i.readBits(12)||(i.skipBits(1),0!==i.readBits(2)))return null;let s=i.readBits(1),l=i.readBits(2)+1,c=i.readBits(4);if(15===c)return null;i.skipBits(1);let d=i.readBits(3);if(0===d)throw Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let u=i.readBits(13);i.skipBits(11);let h=i.readBits(2)+1;if(1!==h)throw Error("ADTS frames with more than one AAC frame are not supported.");let m=null;return 1===s?e.filePos-=2:m=i.readBits(16),{objectType:l,samplingFrequencyIndex:c,channelConfiguration:d,frameLength:u,numberOfAacFrames:h,crcCheck:m,startPos:r}}},{"../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"2HibR":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"AdtsDemuxer",()=>p);var n=e("../codec.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),h=e("../metadata.js"),m=e("./adts-reader.js");class p extends o.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();(0,c.assert)(this.firstFrameHeader),this.tracks=[new(0,l.InputAudioTrack)(this.input,new f(this))]})()}async advanceReader(){let e=this.reader.requestSliceRange(this.lastLoadedPos,m.MIN_FRAME_HEADER_SIZE,m.MAX_FRAME_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,m.readFrameHeader)(e);if(!r||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize){this.lastSampleLoaded=!0;return}this.firstFrameHeader||(this.firstFrameHeader=r);let a=n.aacFrequencyTable[r.samplingFrequencyIndex];(0,c.assert)(void 0!==a);let i=r.crcCheck?m.MAX_FRAME_HEADER_SIZE:m.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/a,duration:1024/a,dataStart:r.startPos+i,dataSize:r.frameLength-i};this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength}async getMimeType(){return"audio/aac"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){return{}}}class f{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return this.getSampleRate()/1024}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"aac"}getInternalCodecId(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}getNumberOfChannels(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,c.assert)(void 0!==e),e}getSampleRate(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,c.assert)(void 0!==e),e}getDisposition(){return{...h.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=new Uint8Array(3),r=new(0,c.Bitstream)(e),{objectType:a,samplingFrequencyIndex:i,channelConfiguration:s}=this.demuxer.firstFrameHeader;return a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),{codec:`mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1p);var n=e("../codec-data.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),h=e("../metadata.js"),m=e("./flac-misc.js");class p extends o.Demuxer{constructor(e){super(e),this.loadedSamples=[],this.metadataPromise=null,this.track=null,this.metadataTags={},this.audioInfo=null,this.lastLoadedPos=null,this.blockingBit=null,this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.reader=e._reader}async computeDuration(){return await this.readMetadata(),(0,c.assert)(this.track),this.track.computeDuration()}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}async getTracks(){return await this.readMetadata(),(0,c.assert)(this.track),[this.track]}async getMimeType(){return"audio/flac"}async readMetadata(){let e=4;return this.metadataPromise??=(async()=>{for(;null===this.reader.fileSize||ei.end-6)return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:i.end-e,isLastFrame:!0};if(255===(0,u.readU8)(i)){let r=i.filePos;if((0,u.readU8)(i)!==(1===this.blockingBit?249:248)){i.filePos=r;continue}i.skip(-2);let a=i.filePos-e,n=this.readFlacFrameHeader({slice:i,isFirstPacket:!1});if(!n){i.filePos=r;continue}if(0===this.blockingBit){if(n.num-s.num!=1){i.filePos=r;continue}}else if(n.num-s.num!==s.blockSize){i.filePos=r;continue}return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:a,isLastFrame:!1}}}}readFlacFrameHeader({slice:e,isFirstPacket:r}){let a=e.filePos,i=(0,u.readBytes)(e,4),s=new(0,c.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,c.assert)(r);let e=s.readBits(1);this.blockingBit=e}else if(1===this.blockingBit){if((0,c.assert)(!r),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,c.assert)(!r),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");let n=(0,m.getBlockSizeOrUncommon)(s.readBits(4));if(!n)return null;(0,c.assert)(this.audioInfo);let o=(0,m.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!o||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;let l=(0,m.readCodedNumber)(e),d=(0,m.readBlockSize)(e,n),h=(0,m.readSampleRate)(e,o);if(null===h||h!==this.audioInfo.sampleRate)return null;let p=e.filePos-a,f=(0,u.readU8)(e);return(e.skip(-p),e.skip(-1),f!==(0,m.calculateCrc8)((0,u.readBytes)(e,p)))?null:{num:l,blockSize:d,sampleRate:h}}async advanceReader(){await this.readMetadata(),(0,c.assert)(null!==this.lastLoadedPos),(0,c.assert)(this.audioInfo);let e=this.lastLoadedPos,r=await this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length});if(!r){this.lastSampleLoaded=!0;return}let a=this.loadedSamples[this.loadedSamples.length-1],i={blockOffset:a?a.blockOffset+a.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size};if(this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(i),r.isLastFrame){this.lastSampleLoaded=!0;return}}}class f{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return"flac"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getSampleRate(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getTimeResolution(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getDisposition(){return{...h.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getDecoderConfig(){return(0,c.assert)(this.demuxer.audioInfo),{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}}async getPacket(e,r){if((0,c.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.blockOffset/this.demuxer.audioInfo.sampleRate);if(-1===a){await this.demuxer.advanceReader();continue}let i=this.demuxer.loadedSamples[a],s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;if(s+n<=e){if(this.demuxer.lastSampleLoaded)return this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r);await this.demuxer.advanceReader();continue}return this.getPacketAtIndex(a,r)}}finally{a()}}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=e.sequenceNumber+1;if(this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return null;for(;a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(a,r)}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}async getPacketAtIndex(e,r){let a,i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.byteOffset,i.byteSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.byteSize)}(0,c.assert)(this.demuxer.audioInfo);let s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;return new(0,d.EncodedPacket)(a,"key",s,n,e,i.byteSize)}async getFirstPacket(e){for(;0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(0,e)}}},{"../codec-data.js":"4Hepu","../demuxer.js":"6cHW1","../input-track.js":"8ofmg","../misc.js":"dpOkn","../packet.js":"i61Hy","../reader.js":"3hF2Q","../metadata.js":"fFgR1","./flac-misc.js":"aXiDm","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],aXiDm:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"getBlockSizeOrUncommon",()=>l),s.export(a,"getSampleRateOrUncommon",()=>c),s.export(a,"readCodedNumber",()=>d),s.export(a,"readBlockSize",()=>u),s.export(a,"readSampleRate",()=>h),s.export(a,"calculateCrc8",()=>m);var n=e("../misc.js"),o=e("../reader.js");let l=e=>{if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*2**e;if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return 2**e;else return null},c=(e,r)=>{switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},d=e=>{let r=0,a=new(0,n.Bitstream)((0,o.readBytes)(e,1));for(;1===a.readBits(1);)r++;if(0===r)return a.readBits(7);let i=[],s=r-1,l=new(0,n.Bitstream)((0,o.readBytes)(e,s)),c=8-r-1;for(let e=0;ee|r<"uncommon-u16"===r?(0,o.readU16Be)(e)+1:"uncommon-u8"===r?(0,o.readU8)(e)+1:"number"==typeof r?r:void((0,n.assertNever)(r),(0,n.assert)(!1)),h=(e,r)=>"uncommon-u16"===r?(0,o.readU16Be)(e):"uncommon-u16-10"===r?10*(0,o.readU16Be)(e):"uncommon-u8"===r?(0,o.readU8)(e):"number"==typeof r?r:null,m=e=>{let r=0;for(let a of e){r^=a;for(let e=0;e<8;e++)(128&r)!=0?r=r<<1^7:r<<=1,r&=255}return r}},{"../misc.js":"dpOkn","../reader.js":"3hF2Q","@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"8o8Re":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o({canvas:e,ctx:r,events:a,timeupdateInterval:i=250,avSyncTolerance:s=.12,dropLateFrames:o=!1,poster:l="",preflightRange:c=!1}){let d=null,u=null,h=null,m=null,p=0,f=0,g=0,k=0,b=NaN,T=null,y=0,S=!1,w=1,I=!1;async function x(e){if(!c||"string"!=typeof e)return!0;try{let r=(await fetch(e,{method:"HEAD"})).headers.get("accept-ranges");if(!r||"none"===r)return a.emit("error",new Event("RangeNotSupported")),!1;return!0}catch(e){return console.warn("preflight failed",e),!0}}function E(){if(!l||I)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,e.width,e.height),e.width=a.naturalWidth||e.width,e.height=a.naturalHeight||e.height,r.drawImage(a,0,0,e.width,e.height),I=!0},a.src=l}async function P(){await h?.return(),h=null}function C(){r.clearRect(0,0,e.width,e.height)}async function B(e){if(await P(),!u)return;h=u.canvases(e);let i=(await h.next()).value??null;m=(await h.next()).value??null,i?(r.drawImage(i.canvas,0,0),a.emit("loadeddata")):E()}async function _(a){if(h)for(;;){let i=(await h.next()).value??null;if(!i||a!==f)return;let n=T.currentTime;if(o){let a=Math.max(.06,s/Math.max(1,w));if(i.timestamp=i&&(a.emit("timeupdate"),y=n),Number.isFinite(b)&&s>=b){D(),a.emit("ended");return}m&&m.timestamp<=s?(r.clearRect(0,0,e.width,e.height),r.drawImage(m.canvas,0,0),m=null,_(f),S&&(a.emit("canplay"),a.emit("playing"),S=!1)):!m&&(_(f),!m&&Number.isFinite(b)&&sn)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}],"5969H":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(){let e=new Map;return{addEventListener:function(r,a){e.has(r)||e.set(r,[]),e.get(r).push(a)},removeEventListener:function(r,a){let i=e.get(r);if(!i)return;let s=i.indexOf(a);s>=0&&i.splice(s,1)},emit:function(r,a){let i=new Event(r);i.detail=a;let s=e.get(r);s&&s.forEach(e=>e(i))}}}s.defineInteropFlag(a),s.export(a,"createVideoEventTarget",()=>n)},{"@parcel/transformer-js/src/esmodule-helpers.js":"6ykb1"}]},["1qMFK"],"1qMFK","parcelRequire4dc0",{}); \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js deleted file mode 100644 index 5d76a8cd1..000000000 --- a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.legacy.js +++ /dev/null @@ -1,8 +0,0 @@ - -/*! - * artplayer-proxy-mediabunny.js v1.0.0 - * Github: https://github.com/zhw2590582/ArtPlayer - * (c) 2017-2025 Harvey Zack - * Released under the MIT License. - */ -!function(e,r,n,a,i,s,o,c){var u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},l="function"==typeof u[a]&&u[a],d=l.i||{},f=l.cache||{},h="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function m(r,n){if(!f[r]){if(!e[r]){if(i[r])return i[r];var s="function"==typeof u[a]&&u[a];if(!n&&s)return s(r,!0);if(l)return l(r,!0);if(h&&"string"==typeof r)return h(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}d.resolve=function(n){var a=e[r][1][n];return null!=a?a:n},d.cache={};var c=f[r]=new m.Module(r);e[r][0].call(c.exports,d,c,c.exports,u)}return f[r].exports;function d(e){var r=d.resolve(e);if(!1===r)return{};if(Array.isArray(r)){var n={__esModule:!0};return r.forEach(function(e){var r=e[0],a=e[1],i=e[2]||e[0],s=m(a);"*"===r?Object.keys(s).forEach(function(e){"default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:function(){return s[e]}})}):"*"===i?Object.defineProperty(n,r,{enumerable:!0,value:s}):Object.defineProperty(n,r,{enumerable:!0,get:function(){return"default"===i?s.__esModule?s.default:s:s[i]}})}),n}return m(r)}}m.isParcelRequire=!0,m.Module=function(e){this.id=e,this.bundle=m,this.require=h,this.exports={}},m.modules=e,m.cache=f,m.parent=l,m.distDir=void 0,m.publicUrl=void 0,m.devServer=void 0,m.i=d,m.register=function(r,n){e[r]=[function(e,r){r.exports=n},{}]},Object.defineProperty(m,"root",{get:function(){return u[a]}}),u[a]=m;for(var p=0;p0&&void 0!==arguments[0]?arguments[0]:{};return function(r){return(0,o.default)(r,e)}}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=c)},{"./proxy/canvasProxy.js":"hTxiw","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hTxiw:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"default",function(){return u});var s=e("@swc/helpers/cjs/_to_consumable_array.cjs"),o=e("../shim/mediabunnyVideoShim.js"),c=i.interopDefault(o);function u(e,r){var n,a=function(e){e in o||Object.defineProperty(o,e,{get:function(){var r=l[e];return"function"==typeof r?r.bind(l):r},set:function(r){l[e]=r},configurable:!0,enumerable:!0})},i=function(e){o[e]=function(){for(var r=arguments.length,a=Array(r),i=0;ie.length)&&(r=e.length);for(var n=0,a=Array(r);n0?new Promise(function(e,r){a=setTimeout(function(){return r(Error("Load timeout"))},n)}):null,c=(0,s._)(function(){var n,i,s,c;return(0,o._)(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,3,4]),n=!1,i=!1,s=function(){n&&i&&(w=1,m.emit("loadedmetadata"),m.emit("durationchange"))},[4,Promise.all([k.load(e,function(){r===I&&(n=!0,s())}),b.load(e,function(){r===I&&(i=!0,s())})])];case 1:if(o.sent(),r!==I)return[2];return w=4,S=1,m.emit("loadeddata"),m.emit("canplay"),m.emit("canplaythrough"),[3,4];case 2:if(c=o.sent(),r!==I)return[2];return T={code:4,message:c.message},S=3,m.emit("error"),console.error(c),[3,4];case 3:return a&&clearTimeout(a),[7];case 4:return[2]}})})(),!i)return[3,5];l.label=1;case 1:return l.trys.push([1,3,,4]),[4,Promise.race([c,i])];case 2:return l.sent(),[3,4];case 3:if(u=l.sent(),r!==I)return[2];return I++,T={code:4,message:u.message},S=3,m.emit("error"),[3,4];case 4:return[3,7];case 5:return[4,c];case 6:l.sent(),l.label=7;case 7:return[2]}})})()},play:E,pause:j,seek:function(e){return(0,s._)(function(){var r;return(0,o._)(this,function(n){switch(n.label){case 0:return r=!_,y=!1,x=!0,m.emit("seeking"),m.emit("waiting"),j(),[4,b.seek(e)];case 1:return n.sent(),[4,k.seek(e)];case 2:if(n.sent(),x=!1,m.emit("seeked"),!(r&&!y))return[3,4];return[4,E()];case 3:n.sent(),n.label=4;case 4:return[2]}})})()},destroy:function(){j(),b.destroy(),k.destroy()},setVolume:b.setVolume,setPlaybackRate:function(e){b.setPlaybackRate(e),k.setPlaybackRate(e)},get currentTime(){return b.currentTime},get duration(){return b.duration||k.duration},get paused(){return _},get seeking(){return x},get ended(){return y},get readyState(){return w},get networkState(){return S},get error(){return T},get videoWidth(){return k.width},get videoHeight(){return k.height}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./audioEngine.js":"avNjw","./videoEngine.js":"iWP57","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cZn0e:[function(e,r,n,a){"use strict";function i(e,r,n,a,i,s,o){try{var c=e[s](o),u=c.value}catch(e){n(e);return}c.done?r(u):Promise.resolve(u).then(a,i)}n._=function(e){return function(){var r=this,n=arguments;return new Promise(function(a,s){var o=e.apply(r,n);function c(e){i(o,a,s,c,u,"next",e)}function u(e){i(o,a,s,c,u,"throw",e)}c(void 0)})}}},{}],eltGh:[function(e,r,n,a){"use strict";n._=e("eb260df52bffddd").__generator},{eb260df52bffddd:"6yrAu"}],"6yrAu":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"__extends",function(){return c}),i.export(n,"__assign",function(){return u}),i.export(n,"__rest",function(){return l}),i.export(n,"__decorate",function(){return d}),i.export(n,"__param",function(){return f}),i.export(n,"__esDecorate",function(){return h}),i.export(n,"__runInitializers",function(){return m}),i.export(n,"__propKey",function(){return p}),i.export(n,"__setFunctionName",function(){return g}),i.export(n,"__metadata",function(){return b}),i.export(n,"__awaiter",function(){return k}),i.export(n,"__generator",function(){return _}),i.export(n,"__createBinding",function(){return y}),i.export(n,"__exportStar",function(){return w}),i.export(n,"__values",function(){return S}),i.export(n,"__read",function(){return T}),i.export(n,"__spread",function(){return x}),i.export(n,"__spreadArrays",function(){return I}),i.export(n,"__spreadArray",function(){return E}),i.export(n,"__await",function(){return j}),i.export(n,"__asyncGenerator",function(){return P}),i.export(n,"__asyncDelegator",function(){return C}),i.export(n,"__asyncValues",function(){return A}),i.export(n,"__makeTemplateObject",function(){return B}),i.export(n,"__importStar",function(){return F}),i.export(n,"__importDefault",function(){return R}),i.export(n,"__classPrivateFieldGet",function(){return U}),i.export(n,"__classPrivateFieldSet",function(){return O}),i.export(n,"__classPrivateFieldIn",function(){return L}),i.export(n,"__addDisposableResource",function(){return N}),i.export(n,"__disposeResources",function(){return V}),i.export(n,"__rewriteRelativeImportExtension",function(){return H});var s=e("@swc/helpers/cjs/_type_of.cjs"),o=function(e,r){return(o=Object.setPrototypeOf||({__proto__:[]})instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])})(e,r)};function c(e,r){if("function"!=typeof r&&null!==r)throw TypeError("Class extends value "+String(r)+" is not a constructor or null");function n(){this.constructor=e}o(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}var u=function(){return(u=Object.assign||function(e){for(var r,n=1,a=arguments.length;nr.indexOf(a)&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var i=0,a=Object.getOwnPropertySymbols(e);ir.indexOf(a[i])&&Object.prototype.propertyIsEnumerable.call(e,a[i])&&(n[a[i]]=e[a[i]]);return n}function d(e,r,n,a){var i,o=arguments.length,c=o<3?r:null===a?a=Object.getOwnPropertyDescriptor(r,n):a;if(("undefined"==typeof Reflect?"undefined":(0,s._)(Reflect))==="object"&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,r,n,a);else for(var u=e.length-1;u>=0;u--)(i=e[u])&&(c=(o<3?i(c):o>3?i(r,n,c):i(r,n))||c);return o>3&&c&&Object.defineProperty(r,n,c),c}function f(e,r){return function(n,a){r(n,a,e)}}function h(e,r,n,a,i,o){function c(e){if(void 0!==e&&"function"!=typeof e)throw TypeError("Function expected");return e}for(var u,l=a.kind,d="getter"===l?"get":"setter"===l?"set":"value",f=!r&&e?a.static?e:e.prototype:null,h=r||(f?Object.getOwnPropertyDescriptor(f,a.name):{}),m=!1,p=n.length-1;p>=0;p--){var g={};for(var b in a)g[b]="access"===b?{}:a[b];for(var b in a.access)g.access[b]=a.access[b];g.addInitializer=function(e){if(m)throw TypeError("Cannot add initializers after decoration has completed");o.push(c(e||null))};var k=(0,n[p])("accessor"===l?{get:h.get,set:h.set}:h[d],g);if("accessor"===l){if(void 0===k)continue;if(null===k||(void 0===k?"undefined":(0,s._)(k))!=="object")throw TypeError("Object expected");(u=c(k.get))&&(h.get=u),(u=c(k.set))&&(h.set=u),(u=c(k.init))&&i.unshift(u)}else(u=c(k))&&("field"===l?i.unshift(u):h[d]=u)}f&&Object.defineProperty(f,a.name,h),m=!0}function m(e,r,n){for(var a=arguments.length>2,i=0;i0&&i[i.length-1])&&(6===l[0]||2===l[0])){s=0;continue}if(3===l[0]&&(!i||l[1]>i[0]&&l[1]=e.length&&(e=void 0),{value:e&&e[a++],done:!e}}};throw TypeError(r?"Object is not iterable.":"Symbol.iterator is not defined.")}function T(e,r){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var a,i,s=n.call(e),o=[];try{for(;(void 0===r||r-- >0)&&!(a=s.next()).done;)o.push(a.value)}catch(e){i={error:e}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(i)throw i.error}}return o}function x(){for(var e=[],r=0;r1||c(e,r)})},r&&(a[e]=r(a[e])))}function c(e,r){try{var n;(n=i[e](r)).value instanceof j?Promise.resolve(n.value.v).then(u,l):d(s[0][2],n)}catch(e){d(s[0][3],e)}}function u(e){c("next",e)}function l(e){c("throw",e)}function d(e,r){e(r),s.shift(),s.length&&c(s[0][0],s[0][1])}}function C(e){var r,n;return r={},a("next"),a("throw",function(e){throw e}),a("return"),r[Symbol.iterator]=function(){return this},r;function a(a,i){r[a]=e[a]?function(r){return(n=!n)?{value:j(e[a](r)),done:!1}:i?i(r):r}:i}}function A(e){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var r,n=e[Symbol.asyncIterator];return n?n.call(e):(e=S(e),r={},a("next"),a("throw"),a("return"),r[Symbol.asyncIterator]=function(){return this},r);function a(n){r[n]=e[n]&&function(r){return new Promise(function(a,i){var s,o,c;s=a,o=i,c=(r=e[n](r)).done,Promise.resolve(r.value).then(function(e){s({value:e,done:c})},o)})}}}function B(e,r){return Object.defineProperty?Object.defineProperty(e,"raw",{value:r}):e.raw=r,e}var M=Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r},D=function(e){return(D=Object.getOwnPropertyNames||function(e){var r=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[r.length]=n);return r})(e)};function F(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var n=D(e),a=0;a=m-.2&&(a.suspend(),e.emit("waiting"))},50),o=void 0,c.label=1;case 1:return c.trys.push([1,3,4,5]),[4,n];case 2:return o=c.sent(),[3,5];case 3:return console.error(c.sent()),[2,"break"];case 4:return clearInterval(s),[7];case 5:if(r!==y||g)return[2,{v:void 0}];if("suspended"!==a.state)return[3,7];return[4,a.resume()];case 6:c.sent(),e.emit("canplay"),e.emit("playing"),c.label=7;case 7:if(o.done)return[2,"break"];return l=(u=o.value).buffer,p=u.timestamp,(b=a.createBufferSource()).buffer=l,b.connect(i),b.playbackRate.value=_,(S=(k=f+(p-h)/_)+l.duration/_)>m&&(m=S),k>=a.currentTime?b.start(k):b.start(a.currentTime,(a.currentTime-k)*_),w.add(b),b.onended=function(){return w.delete(b)},[2]}})},!n)return[2];return[4,E()];case 1:p.sent(),d=n.buffers(S()),p.label=2;case 2:return[5,(0,u._)(s())];case 3:if(l=p.sent(),"object"===(0,o._)(l))return[2,l.v];if("break"===l)return[3,4];return[3,2];case 4:return[2]}})})()}function P(){g||(h=S(),g=!0,E(),I())}return{load:function(e,a){return(0,s._)(function(){var i,s,o,u;return(0,c._)(this,function(c){switch(c.label){case 0:return i=++y,[4,E()];case 1:if(c.sent(),I(),g=!0,h=0,f=0,!(s="string"==typeof e?new(0,l.UrlSource)(e):e instanceof Blob?new(0,l.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,l.ReadableStreamSource)(e):e))return[2];return[4,(r=new(0,l.Input)({source:s,formats:l.ALL_FORMATS})).computeDuration()];case 2:if(p=c.sent(),i!==y)return[2];return[4,r.getPrimaryAudioTrack()];case 3:if(!(o=c.sent()))return n=null,x(),a&&a(),[2];if(u=null===o.codec)return[3,5];return[4,o.canDecode()];case 4:u=!c.sent(),c.label=5;case 5:if(u)return n=null,x(),a&&a(),[2];return x(o.sampleRate),n=new(0,l.AudioBufferSink)(o),a&&a(),[2]}})})()},play:function(){return(0,s._)(function(){return(0,c._)(this,function(e){switch(e.label){case 0:if(!g)return[2];if(a||x(),"suspended"!==a.state)return[3,2];return[4,a.resume()];case 1:e.sent(),e.label=2;case 2:return m=f=a.currentTime,g=!1,j(++y),[2]}})})()},pause:P,seek:function(e){return(0,s._)(function(){return(0,c._)(this,function(r){return h=Math.max(0,e),m=f=a.currentTime,y++,g||j(y),[2]})})()},destroy:function(){y++,P(),null==a||a.close(),a=null,r=null,n=null},setVolume:function(e,r){b=e,k=r,T()},setPlaybackRate:function(e){e!==_&&(g||(h=S(),f=a.currentTime),_=e,g||j(++y))},get currentTime(){return S()},get duration(){return p},get paused(){return g}}}},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","@swc/helpers/cjs/_ts_values.cjs":"94P5Q",mediabunny:[["ALL_FORMATS","1jhAI"],["AudioBufferSink","k0V9R"],["BlobSource","7vKle"],["ReadableStreamSource","7vKle"],["UrlSource","7vKle"],["Input","3sapy"]],"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"94P5Q":[function(e,r,n,a){"use strict";n._=e("2ed00358a4809745").__values},{"2ed00358a4809745":"6yrAu"}],"1jhAI":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"InputFormat",function(){return I}),i.export(n,"IsobmffInputFormat",function(){return E}),i.export(n,"Mp4InputFormat",function(){return j}),i.export(n,"QuickTimeInputFormat",function(){return P}),i.export(n,"MatroskaInputFormat",function(){return C}),i.export(n,"WebMInputFormat",function(){return A}),i.export(n,"Mp3InputFormat",function(){return B}),i.export(n,"WaveInputFormat",function(){return M}),i.export(n,"OggInputFormat",function(){return D}),i.export(n,"FlacInputFormat",function(){return F}),i.export(n,"AdtsInputFormat",function(){return R}),i.export(n,"MP4",function(){return U}),i.export(n,"QTFF",function(){return O}),i.export(n,"MATROSKA",function(){return L}),i.export(n,"WEBM",function(){return N}),i.export(n,"MP3",function(){return z}),i.export(n,"WAVE",function(){return V}),i.export(n,"OGG",function(){return H}),i.export(n,"ADTS",function(){return G}),i.export(n,"FLAC",function(){return q}),i.export(n,"ALL_FORMATS",function(){return W});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_ts_generator.cjs"),f=e("./isobmff/isobmff-demuxer.js"),h=e("./matroska/ebml.js"),m=e("./matroska/matroska-demuxer.js"),p=e("./mp3/mp3-demuxer.js"),g=e("../shared/mp3-misc.js"),b=e("./id3.js"),k=e("./mp3/mp3-reader.js"),_=e("./ogg/ogg-demuxer.js"),y=e("./wave/wave-demuxer.js"),w=e("./adts/adts-reader.js"),S=e("./adts/adts-demuxer.js"),T=e("./reader.js"),x=e("./flac/flac-demuxer.js"),I=function e(){"use strict";(0,c._)(this,e)},E=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_getMajorBrand",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r||(r.skip(4),"ftyp"!==(0,T.readAscii)(r,4)))return[2,null];return[2,(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,f.IsobmffDemuxer)(e)}}]),r}(I),j=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:return[4,this._getMajorBrand(e)];case 1:return[2,!!(r=n.sent())&&"qt "!==r]}})}).call(this)}},{key:"name",get:function(){return"MP4"}},{key:"mimeType",get:function(){return"video/mp4"}}]),r}(E),P=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){return(0,d._)(this,function(r){switch(r.label){case 0:return[4,this._getMajorBrand(e)];case 1:return[2,"qt "===r.sent()]}})}).call(this)}},{key:"name",get:function(){return"QuickTime File Format"}},{key:"mimeType",get:function(){return"video/quicktime"}}]),r}(E),C=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"isSupportedEBMLOfDocType",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l,f;return(0,d._)(this,function(d){switch(d.label){case 0:if(!((n=e._reader.requestSlice(0,h.MAX_HEADER_SIZE))instanceof Promise))return[3,2];return[4,n];case 1:n=d.sent(),d.label=2;case 2:if(!n||null===(a=(0,h.readVarIntSize)(n))||a<1||a>8||(0,h.readUnsignedInt)(n,a)!==h.EBMLId.EBML||null===(i=(0,h.readElementSize)(n)))return[2,!1];if(!((s=e._reader.requestSlice(n.filePos,i))instanceof Promise))return[3,4];return[4,s];case 3:s=d.sent(),d.label=4;case 4:if(!s)return[2,!1];for(o=n.filePos;s.filePos<=o+i-h.MIN_HEADER_SIZE&&(c=(0,h.readElementHeader)(s));){if(u=c.id,l=c.size,f=s.filePos,null===l)return[2,!1];switch(u){case h.EBMLId.EBMLVersion:case h.EBMLId.EBMLReadVersion:if(1!==(0,h.readUnsignedInt)(s,l))return[2,!1];break;case h.EBMLId.DocType:if((0,h.readAsciiString)(s,l)!==r)return[2,!1];break;case h.EBMLId.DocTypeVersion:if((0,h.readUnsignedInt)(s,l)>4)return[2,!1]}s.filePos=f+l}return[2,!0]}})})()}},{key:"_canReadInput",value:function(e){return this.isSupportedEBMLOfDocType(e,"matroska")}},{key:"_createDemuxer",value:function(e){return new(0,m.MatroskaDemuxer)(e)}},{key:"name",get:function(){return"Matroska"}},{key:"mimeType",get:function(){return"video/x-matroska"}}]),r}(I),A=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return this.isSupportedEBMLOfDocType(e,"webm")}},{key:"name",get:function(){return"WebM"}},{key:"mimeType",get:function(){return"video/webm"}}]),r}(C),B=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l;return(0,d._)(this,function(d){switch(d.label){case 0:if(!((r=e._reader.requestSlice(0,10))instanceof Promise))return[3,2];return[4,r];case 1:r=d.sent(),d.label=2;case 2:if(!r)return[2,!1];n=0,a=!1,d.label=3;case 3:if(!((i=e._reader.requestSlice(n,b.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,5];return[4,i];case 4:i=d.sent(),d.label=5;case 5:if(!i||!(s=(0,b.readId3V2Header)(i)))return[3,6];return a=!0,n=i.filePos+s.size,[3,3];case 6:return[4,(0,k.readNextFrameHeader)(e._reader,n,n+4096)];case 7:if(!(o=d.sent()))return[2,!1];if(a)return[2,!0];return n=o.startPos+o.header.totalSize,[4,(0,k.readNextFrameHeader)(e._reader,n,n+g.FRAME_HEADER_SIZE)];case 8:if(!(c=d.sent())||(u=o.header,l=c.header,u.channel!==l.channel||u.sampleRate!==l.sampleRate))return[2,!1];return[2,!0]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,p.Mp3Demuxer)(e)}},{key:"name",get:function(){return"MP3"}},{key:"mimeType",get:function(){return"audio/mpeg"}}]),r}(I),M=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n;return(0,d._)(this,function(a){switch(a.label){case 0:if(!((r=e._reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,r];case 1:r=a.sent(),a.label=2;case 2:if(!r||"RIFF"!==(n=(0,T.readAscii)(r,4))&&"RIFX"!==n&&"RF64"!==n)return[2,!1];return r.skip(4),[2,"WAVE"===(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,y.WaveDemuxer)(e)}},{key:"name",get:function(){return"WAVE"}},{key:"mimeType",get:function(){return"audio/wav"}}]),r}(I),D=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,4))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r)return[2,!1];return[2,"OggS"===(0,T.readAscii)(r,4)]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,_.OggDemuxer)(e)}},{key:"name",get:function(){return"Ogg"}},{key:"mimeType",get:function(){return"application/ogg"}}]),r}(I),F=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r;return(0,d._)(this,function(n){switch(n.label){case 0:if(!((r=e._reader.requestSlice(0,4))instanceof Promise))return[3,2];return[4,r];case 1:r=n.sent(),n.label=2;case 2:if(!r)return[2,!1];return[2,"fLaC"===(0,T.readAscii)(r,4)]}})})()}},{key:"name",get:function(){return"FLAC"}},{key:"mimeType",get:function(){return"audio/flac"}},{key:"_createDemuxer",value:function(e){return new(0,x.FlacDemuxer)(e)}}]),r}(I),R=function(e){"use strict";function r(){return(0,c._)(this,r),(0,o._)(this,r,arguments)}return(0,l._)(r,e),(0,u._)(r,[{key:"_canReadInput",value:function(e){return(0,s._)(function(){var r,n,a;return(0,d._)(this,function(i){switch(i.label){case 0:if(!((r=e._reader.requestSliceRange(0,w.MIN_FRAME_HEADER_SIZE,w.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,2];return[4,r];case 1:r=i.sent(),i.label=2;case 2:if(!r||!(n=(0,w.readFrameHeader)(r)))return[2,!1];if(!((r=e._reader.requestSliceRange(n.frameLength,w.MIN_FRAME_HEADER_SIZE,w.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,4];return[4,r];case 3:r=i.sent(),i.label=4;case 4:if(!r||!(a=(0,w.readFrameHeader)(r)))return[2,!1];return[2,n.objectType===a.objectType&&n.samplingFrequencyIndex===a.samplingFrequencyIndex&&n.channelConfiguration===a.channelConfiguration]}})})()}},{key:"_createDemuxer",value:function(e){return new(0,S.AdtsDemuxer)(e)}},{key:"name",get:function(){return"ADTS"}},{key:"mimeType",get:function(){return"audio/aac"}}]),r}(I),U=new j,O=new P,L=new C,N=new A,z=new B,V=new M,H=new D,G=new R,q=new F,W=[U,O,L,N,V,H,q,z,G]},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./isobmff/isobmff-demuxer.js":"1Dw1A","./matroska/ebml.js":"fq2QE","./matroska/matroska-demuxer.js":"kY1ME","./mp3/mp3-demuxer.js":"ifShX","../shared/mp3-misc.js":"gcure","./id3.js":"42Y2c","./mp3/mp3-reader.js":"gFWvE","./ogg/ogg-demuxer.js":"hRJRs","./wave/wave-demuxer.js":"cokSU","./adts/adts-reader.js":"5AUBv","./adts/adts-demuxer.js":"3t0bF","./reader.js":"8KRfO","./flac/flac-demuxer.js":"e0w8C","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],clpdF:[function(e,r,n,a){"use strict";var i=e("feddc910f69a01a6"),s=e("b644f6b72647b399"),o=e("ba991daace2b8ed9");n._=function(e,r,n){return r=i._(r),o._(e,s._()?Reflect.construct(r,n||[],i._(e).constructor):r.apply(e,n))}},{feddc910f69a01a6:"NOGHw",b644f6b72647b399:"83nDe",ba991daace2b8ed9:"hd12h"}],NOGHw:[function(e,r,n,a){"use strict";function i(e){return n._=i=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},i(e)}n._=i},{}],"83nDe":[function(e,r,n,a){"use strict";function i(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(n._=i=function(){return!!e})()}n._=i},{}],hd12h:[function(e,r,n,a){"use strict";var i=e("f7151fe13994d2aa"),s=e("f18e81760bb14899");n._=function(e,r){return r&&("object"===s._(r)||"function"==typeof r)?r:i._(e)}},{f7151fe13994d2aa:"1tlYe",f18e81760bb14899:"iXhRw"}],"1tlYe":[function(e,r,n,a){"use strict";n._=function(e){if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}},{}],"4Uf9M":[function(e,r,n,a){"use strict";n._=function(e,r){if(!(e instanceof r))throw TypeError("Cannot call a class as a function")}},{}],igUuK:[function(e,r,n,a){"use strict";function i(e,r){for(var n=0;n=0&&b<=this.reader.fileSize-S.MAX_BOX_HEADER_SIZE))return[3,15];if(!((k=this.reader.requestSliceRange(b,S.MIN_BOX_HEADER_SIZE,S.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,12];return[4,k];case 11:k=m.sent(),m.label=12;case 12:if(!k||!((y=(0,S.readBoxHeader)(k))&&"mfra"===y.name))return[3,15];if(!((w=this.reader.requestSlice(k.filePos,y.contentSize))instanceof Promise))return[3,14];return[4,w];case 13:w=m.sent(),m.label=14;case 14:w&&this.readContiguousBoxes(w),m.label=15;case 15:return[2]}})}).call(this)}},{key:"getSampleTableForTrack",value:function(e){if(e.sampleTable)return e.sampleTable;var r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,_.assert)(this.moovSlice);var n=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(n),this.currentTrack=null,(null==(a=e.info)?void 0:a.type)==="audio"&&e.info.codec&&p.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,_.assert)((null==(i=e.info)?void 0:i.type)==="audio");for(var a,i,s=(0,p.parsePcmCodec)(e.info.codec),o=[],c=[],u=0;u0){r.presentationTimestamps=[];var E=!0,j=!1,P=void 0;try{for(var C,A=r.sampleTimingEntries[Symbol.iterator]();!(E=(C=A.next()).done);E=!0)for(var B=C.value,M=0;M0){M.languageCode="";for(var O=0;O<3;O++)M.languageCode=String.fromCharCode(96+(31&U))+M.languageCode,U>>=5;(0,_.isIso639Dash2LanguageCode)(M.languageCode)||(M.languageCode=_.UNDETERMINED_LANGUAGE)}break;case"hdlr":var L=this.currentTrack;if(!L)break;e.skip(8);var N=(0,T.readAscii)(e,4);"vide"===N?L.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===N&&(L.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null});break;case"stbl":var z=this.currentTrack;if(!z)break;z.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(a,n.contentSize));break;case"stsd":var V=this.currentTrack;if(!V||null===V.info||V.sampleTable)break;var H=(0,T.readU8)(e);e.skip(3);for(var G=(0,T.readU32Be)(e),q=0;q0){if(1===Z)e.skip(4),Y=8*(0,T.readU32Be)(e),e.skip(8);else if(2===Z){e.skip(4),J=(0,T.readF64Be)(e),Q=(0,T.readU32Be)(e),e.skip(4),Y=(0,T.readU32Be)(e);var $=(0,T.readU32Be)(e);if(e.skip(8),"lpcm"===X){var ee=Y+7>>3,et=!!(1&$),er=!!(2&$),en=4&$?-1:0;Y>0&&Y<=64&&(et?32===Y&&(V.info.codec=er?"pcm-f32be":"pcm-f32"):en&1<>4,chromaSubsampling:el>>1&7,videoFullRangeFlag:1&el,colourPrimaries:ed,transferCharacteristics:ef,matrixCoefficients:eh};break;case"av1C":var em,ep=this.currentTrack;if(!ep)break;(0,_.assert)((null==(em=ep.info)?void 0:em.type)==="video"),e.skip(1);var eg=(0,T.readU8)(e),ev=eg>>5,eb=(0,T.readU8)(e),ek=eb>>6&1;ep.info.av1CodecInfo={profile:ev,level:31&eg,tier:eb>>7,bitDepth:2===ev&&ek?eb>>5&1?12:10:ek?10:8,monochrome:eb>>4&1,chromaSubsamplingX:eb>>3&1,chromaSubsamplingY:eb>>2&1,chromaSamplePosition:3&eb};break;case"colr":var e_,ey=this.currentTrack;if(!ey||((0,_.assert)((null==(e_=ey.info)?void 0:e_.type)==="video"),"nclx"!==(0,T.readAscii)(e,4)))break;var ew=(0,T.readU16Be)(e),eS=(0,T.readU16Be)(e),eT=(0,T.readU16Be)(e),ex=!!(128&(0,T.readU8)(e));ey.info.colorSpace={primaries:_.COLOR_PRIMARIES_MAP_INVERSE[ew],transfer:_.TRANSFER_CHARACTERISTICS_MAP_INVERSE[eS],matrix:_.MATRIX_COEFFICIENTS_MAP_INVERSE[eT],fullRange:ex};break;case"esds":var eI,eE=this.currentTrack;if(!eE)break;(0,_.assert)((null==(eI=eE.info)?void 0:eI.type)==="audio"),e.skip(4);var ej=(0,T.readU8)(e);(0,_.assert)(3===ej),(0,S.readIsomVariableInteger)(e),e.skip(2);var eP=(0,T.readU8)(e);if((128&eP)!=0&&e.skip(2),(64&eP)!=0){var eC=(0,T.readU8)(e);e.skip(eC)}(32&eP)!=0&&e.skip(2);var eA=(0,T.readU8)(e);(0,_.assert)(4===eA);var eB=(0,S.readIsomVariableInteger)(e),eM=e.filePos,eD=(0,T.readU8)(e);if(64===eD||103===eD?(eE.info.codec="aac",eE.info.aacCodecInfo={isMpeg2:103===eD}):105===eD||107===eD?eE.info.codec="mp3":221===eD?eE.info.codec="vorbis":console.warn("Unsupported audio codec (objectTypeIndication ".concat(eD,") - discarding track.")),e.skip(12),eB>e.filePos-eM){var eF=(0,T.readU8)(e);(0,_.assert)(5===eF);var eR=(0,S.readIsomVariableInteger)(e);if(eE.info.codecDescription=(0,T.readBytes)(e,eR),"aac"===eE.info.codec){var eU=(0,p.parseAacAudioSpecificConfig)(eE.info.codecDescription);null!==eU.numberOfChannels&&(eE.info.numberOfChannels=eU.numberOfChannels),null!==eU.sampleRate&&(eE.info.sampleRate=eU.sampleRate)}}break;case"enda":var eO,eL=this.currentTrack;if(!eL)break;(0,_.assert)((null==(eO=eL.info)?void 0:eO.type)==="audio"),255&(0,T.readU16Be)(e)&&("pcm-s16be"===eL.info.codec?eL.info.codec="pcm-s16":"pcm-s24be"===eL.info.codec?eL.info.codec="pcm-s24":"pcm-s32be"===eL.info.codec?eL.info.codec="pcm-s32":"pcm-f32be"===eL.info.codec?eL.info.codec="pcm-f32":"pcm-f64be"===eL.info.codec&&(eL.info.codec="pcm-f64"));break;case"pcmC":var eN,ez=this.currentTrack;if(!ez)break;(0,_.assert)((null==(eN=ez.info)?void 0:eN.type)==="audio"),e.skip(4);var eV=!!(1&(0,T.readU8)(e)),eH=(0,T.readU8)(e);"pcm-s16be"===ez.info.codec?eV?16===eH?ez.info.codec="pcm-s16":24===eH?ez.info.codec="pcm-s24":32===eH?ez.info.codec="pcm-s32":(console.warn("Invalid ipcm sample size ".concat(eH,".")),ez.info.codec=null):16===eH?ez.info.codec="pcm-s16be":24===eH?ez.info.codec="pcm-s24be":32===eH?ez.info.codec="pcm-s32be":(console.warn("Invalid ipcm sample size ".concat(eH,".")),ez.info.codec=null):"pcm-f32be"===ez.info.codec&&(eV?32===eH?ez.info.codec="pcm-f32":64===eH?ez.info.codec="pcm-f64":(console.warn("Invalid fpcm sample size ".concat(eH,".")),ez.info.codec=null):32===eH?ez.info.codec="pcm-f32be":64===eH?ez.info.codec="pcm-f64be":(console.warn("Invalid fpcm sample size ".concat(eH,".")),ez.info.codec=null));break;case"dOps":var eG,eq,eW=this.currentTrack;if(!eW)break;(0,_.assert)((null==(eG=eW.info)?void 0:eG.type)==="audio"),e.skip(1);var eK=(0,T.readU8)(e),eX=(0,T.readU16Be)(e),eZ=(0,T.readU32Be)(e),eQ=(0,T.readI16Be)(e),eY=(0,T.readU8)(e);eq=0!==eY?(0,T.readBytes)(e,2+eK):new Uint8Array(0);var eJ=new Uint8Array(19+eq.byteLength),e$=new DataView(eJ.buffer);e$.setUint32(0,0x4f707573,!1),e$.setUint32(4,0x48656164,!1),e$.setUint8(8,1),e$.setUint8(9,eK),e$.setUint16(10,eX,!0),e$.setUint32(12,eZ,!0),e$.setInt16(16,eQ,!0),e$.setUint8(18,eY),eJ.set(eq,19),eW.info.codecDescription=eJ,eW.info.numberOfChannels=eK;break;case"dfLa":var e0,e1=this.currentTrack;if(!e1)break;(0,_.assert)((null==(e0=e1.info)?void 0:e0.type)==="audio"),e.skip(4);for(var e2=e.filePos;e.filePos>>12,e5=(e8>>9&7)+1;e1.info.sampleRate=e6,e1.info.numberOfChannels=e5,e.skip(20)}else e.skip(e4);if(128&e3)break}var e7=e.filePos;e.filePos=e2;var e9=(0,T.readBytes)(e,e7-e2),te=new Uint8Array(4+e9.byteLength);new DataView(te.buffer).setUint32(0,0x664c6143,!1),te.set(e9,4),e1.info.codecDescription=te;break;case"stts":var tt=this.currentTrack;if(!tt||!tt.sampleTable)break;e.skip(4);for(var tr=(0,T.readU32Be)(e),tn=0,ta=0,ti=0;ti>4],t8=t3[(12&t2)>>2],t6=t3[3&t2],t5=(0,T.readU32Be)(e),t7=0;t70&&(null!=(nD=this.metadataTags).trackNumber||(nD.trackNumber=nU)),nO&&Number.isInteger(nO)&&nO>0&&(null!=(nF=this.metadataTags).tracksTotal||(nF.tracksTotal=nO))}break;case"trkn":if(nb instanceof Uint8Array&&nb.length>=6){var nL,nN,nz=(0,_.toDataView)(nb),nV=nz.getUint16(2,!1),nH=nz.getUint16(4,!1);nV>0&&(null!=(nL=this.metadataTags).trackNumber||(nL.trackNumber=nV)),nH>0&&(null!=(nN=this.metadataTags).tracksTotal||(nN.tracksTotal=nH))}break;case"disc":case"disk":if(nb instanceof Uint8Array&&nb.length>=6){var nG,nq,nW=(0,_.toDataView)(nb),nK=nW.getUint16(2,!1),nX=nW.getUint16(4,!1);nK>0&&(null!=(nG=this.metadataTags).discNumber||(nG.discNumber=nK)),nX>0&&(null!=(nq=this.metadataTags).discsTotal||(nq.discsTotal=nX))}}}}catch(e){nu=!0,nl=e}finally{try{nc||null==nf.return||nf.return()}finally{if(nu)throw nl}}}return e.filePos=i,!0}}]),r}(b.Demuxer),E=function(){"use strict";function e(r){(0,c._)(this,e),this.internalTrack=r,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}return(0,u._)(e,[{key:"getId",value:function(){return this.internalTrack.id}},{key:"getCodec",value:function(){throw Error("Not implemented on base class.")}},{key:"getInternalCodecId",value:function(){return this.internalTrack.internalCodecId}},{key:"getName",value:function(){return this.internalTrack.name}},{key:"getLanguageCode",value:function(){return this.internalTrack.languageCode}},{key:"getTimeResolution",value:function(){return this.internalTrack.timescale}},{key:"getDisposition",value:function(){return this.internalTrack.disposition}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,m._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){var e,r;return(0,m._)(this,function(n){switch(n.label){case 0:return[4,this.getFirstPacket({metadataOnly:!0})];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.timestamp)?r:0]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return(0,s._)(function(){var r,n;return(0,m._)(this,function(a){switch(a.label){case 0:return r=this,[4,this.fetchPacketForSampleIndex(0,e)];case 1:if((n=a.sent())||!this.internalTrack.demuxer.isFragmented)return[2,n];return[2,this.performFragmentedLookup(null,function(e){return e.trackData.get(r.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,e)]}})}).call(this)}},{key:"mapTimestampIntoTimescale",value:function(e){return(0,_.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o;return(0,m._)(this,function(c){switch(c.label){case 0:return n=this,a=this.mapTimestampIntoTimescale(e),s=C(i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a),[4,this.fetchPacketForSampleIndex(s,r)];case 1:if(o=c.sent(),!R(i)||!this.internalTrack.demuxer.isFragmented)return[2,o];return[2,this.performFragmentedLookup(null,function(e){var r=e.trackData.get(n.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};var i=(0,_.binarySearchLessOrEqual)(r.presentationTimestamps,a,function(e){return e.presentationTimestamp});return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&as.sampleIndex});if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{var a=e.trackData.get(n.internalTrack.id);if(a&&null!==a.firstKeyFrameTimestamp){var i=a.samples.findIndex(function(e){return e.isKeyFrame});return(0,_.assert)(-1!==i),{sampleIndex:i,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)]})}).call(this)}},{key:"fetchPacketForSampleIndex",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c;return(0,m._)(this,function(u){switch(u.label){case 0:if(-1===e||!(n=B(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e)))return[2,null];if(!r.metadataOnly)return[3,1];return a=y.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.internalTrack.demuxer.reader.requestSlice(n.sampleOffset,n.sampleSize))instanceof Promise))return[3,3];return[4,i];case 2:i=u.sent(),u.label=3;case 3:(0,_.assert)(i),a=(0,T.readBytes)(i,n.sampleSize),u.label=4;case 4:return s=(n.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=n.duration/this.internalTrack.timescale,c=new(0,y.EncodedPacket)(a,n.isKeyFrame?"key":"delta",s,o,e,n.sampleSize),this.packetToSampleIndex.set(c,e),[2,c]}})}).call(this)}},{key:"fetchPacketInFragment",value:function(e,r,n){return(0,s._)(function(){var a,i,s,o,c,u;return(0,m._)(this,function(l){switch(l.label){case 0:if(-1===r)return[2,null];if(a=e.trackData.get(this.internalTrack.id).samples[r],(0,_.assert)(a),!n.metadataOnly)return[3,1];return i=y.PLACEHOLDER_DATA,[3,4];case 1:if(!((s=this.internalTrack.demuxer.reader.requestSlice(a.byteOffset,a.byteSize))instanceof Promise))return[3,3];return[4,s];case 2:s=l.sent(),l.label=3;case 3:(0,_.assert)(s),i=(0,T.readBytes)(s,a.byteSize),l.label=4;case 4:return o=(a.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,c=a.duration/this.internalTrack.timescale,u=new(0,y.EncodedPacket)(i,a.isKeyFrame?"key":"delta",o,c,e.moofOffset+r,a.byteSize),this.packetToFragmentLocation.set(u,{fragment:e,sampleIndex:r}),[2,u]}})}).call(this)}},{key:"performFragmentedLookup",value:function(e,r,n,a,i){return(0,s._)(function(){var s,o,c,u,l,d,f,h,p,g,b,k,y,w,T,x,I,E,j,P,C,A,B;return(0,m._)(this,function(m){switch(m.label){case 0:if(s=this.internalTrack.demuxer,o=null,c=null,u=-1,e){if(d=(l=r(e)).sampleIndex,l.correctSampleFound)return[2,this.fetchPacketInFragment(e,d,i)];-1!==d&&(c=e,u=d)}h=-1!==(f=(0,_.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,n,function(e){return e.timestamp}))?this.internalTrack.fragmentLookupTable[f]:null,g=-1!==(p=(0,_.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,n,function(e){return e.startTimestamp}))?this.internalTrack.fragmentPositionCache[p]:null,y=Math.max(null!=(b=null==h?void 0:h.moofOffset)?b:0,null!=(k=null==g?void 0:g.moofOffset)?k:0)||null,e?null===y||e.moofOffset>=y?(w=e.moofOffset+e.moofSize,o=e):w=y:w=null!=y?y:0,m.label=1;case 1:if(o&&(T=o.trackData.get(this.internalTrack.id))&&T.startTimestamp>a)return[3,6];if(!((x=s.reader.requestSliceRange(w,S.MIN_BOX_HEADER_SIZE,S.MAX_BOX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,x];case 2:x=m.sent(),m.label=3;case 3:if(!x||(I=w,!(E=(0,S.readBoxHeader)(x))))return[3,6];if("moof"!==E.name)return[3,5];return[4,s.readFragment(I)];case 4:if(P=(j=r(o=m.sent())).sampleIndex,j.correctSampleFound)return[2,this.fetchPacketInFragment(o,P,i)];-1!==P&&(c=o,u=P),m.label=5;case 5:return w=I+E.totalSize,[3,1];case 6:if(h&&(!c||c.moofOffset=0;a--){var i=e.presentationTimestamps[a].sampleIndex;if(-1!==(0,_.binarySearchExact)(e.keySampleIndices,i,function(e){return e}))return i}return -1}var s,o=C(e,r),c=(0,_.binarySearchLessOrEqual)(e.keySampleIndices,o,function(e){return e});return null!=(s=e.keySampleIndices[c])?s:-1},B=function(e,r){var n=(0,_.binarySearchLessOrEqual)(e.sampleTimingEntries,r,function(e){return e.startIndex}),a=e.sampleTimingEntries[n];if(!a||a.startIndex+a.count<=r)return null;var i=a.startDecodeTimestamp+(r-a.startIndex)*a.delta,s=(0,_.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,function(e){return e.startIndex}),o=e.sampleCompositionTimeOffsets[s];o&&r-o.startIndex>6&3,h=31&S,m=(0,c.reverseBitsU32)(w.getUint32(2)),p=S>>5&1,b=w.getUint8(12),y=[];for(var T=0;T<6;T++)y.push(w.getUint8(6+T))}var x="hev1.";for(x+=["","A","B","C"][f]+h,x+=".",x+=m.toString(16).toUpperCase(),x+=".",x+=0===p?"L":"H",x+=b;y.length>0&&0===y[y.length-1];)y.pop();return y.length>0&&(x+=".",x+=y.map(function(e){return e.toString(16).toUpperCase()}).join(".")),x}if("vp8"===r)return"vp8";if("vp9"===r){if(!u){var I=e.width*e.height,E=(0,c.last)(g).level,j=!0,P=!1,C=void 0;try{for(var A,B=g[Symbol.iterator]();!(j=(A=B.next()).done);j=!0){var M=A.value;if(I<=M.maxPictureSize){E=M.level;break}}}catch(e){P=!0,C=e}finally{try{j||null==B.return||B.return()}finally{if(P)throw C}}return"vp09.00.".concat(E.toString().padStart(2,"0"),".08")}var D=u.profile.toString().padStart(2,"0"),F=u.level.toString().padStart(2,"0"),R=u.bitDepth.toString().padStart(2,"0"),U=u.chromaSubsampling.toString().padStart(2,"0"),O=u.colourPrimaries.toString().padStart(2,"0"),L=u.transferCharacteristics.toString().padStart(2,"0"),N=u.matrixCoefficients.toString().padStart(2,"0"),z=u.videoFullRangeFlag.toString().padStart(2,"0"),V="vp09.".concat(D,".").concat(F,".").concat(R,".").concat(U);return(V+=".".concat(O,".").concat(L,".").concat(N,".").concat(z)).endsWith(k)&&(V=V.slice(0,-k.length)),V}if("av1"===r){if(!l){var H=e.width*e.height,G=(0,c.last)(g).level,q=!0,W=!1,K=void 0;try{for(var X,Z=g[Symbol.iterator]();!(q=(X=Z.next()).done);q=!0){var Q=X.value;if(H<=Q.maxPictureSize){G=Q.level;break}}}catch(e){W=!0,K=e}finally{try{q||null==Z.return||Z.return()}finally{if(W)throw K}}return"av01.0.".concat(G.toString().padStart(2,"0"),"M.08")}var Y=l.profile,J=l.level.toString().padStart(2,"0"),$=l.tier?"H":"M",ee=l.bitDepth.toString().padStart(2,"0"),et=l.monochrome?"1":"0",er=100*l.chromaSubsamplingX+10*l.chromaSubsamplingY+ +(l.chromaSubsamplingX&&l.chromaSubsamplingY?l.chromaSamplePosition:0),en=(null==a?void 0:a.primaries)?c.COLOR_PRIMARIES_MAP[a.primaries]:1,ea=(null==a?void 0:a.transfer)?c.TRANSFER_CHARACTERISTICS_MAP[a.transfer]:1,ei=(null==a?void 0:a.matrix)?c.MATRIX_COEFFICIENTS_MAP[a.matrix]:1,es=+(null!=a&&!!a.fullRange),eo="av01.".concat(Y,".").concat(J).concat($,".").concat(ee);return eo+=".".concat(et,".").concat(er.toString().padStart(3,"0")),eo+=".".concat(en.toString().padStart(2,"0")),eo+=".".concat(ea.toString().padStart(2,"0")),eo+=".".concat(ei.toString().padStart(2,"0")),(eo+=".".concat(es)).endsWith(_)&&(eo=eo.slice(0,-_.length)),eo}throw TypeError("Unhandled codec '".concat(r,"'."))},x=function(e,r,n){if("aac"===e)return r>=2&&n<=24e3?"mp4a.40.29":n<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError("Unhandled codec '".concat(e,"'."))},I=function(e){var r=e.codec,n=e.codecDescription,a=e.aacCodecInfo;if("aac"===r){if(!a)throw TypeError("AAC codec info must be provided.");if(a.isMpeg2)return"mp4a.67";var i=P(n);return"mp4a.40.".concat(i.objectType)}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError("Unhandled codec '".concat(r,"'."))},E=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],j=[-1,1,2,3,4,5,6,8],P=function(e){if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");var r=new(0,c.Bitstream)(e),n=r.readBits(5);31===n&&(n=32+r.readBits(6));var a=r.readBits(4),i=null;15===a?i=r.readBits(24):a=1&&s<=7&&(o=j[s]),{objectType:n,frequencyIndex:a,sampleRate:i,channelConfiguration:s,numberOfChannels:o}},C=function(e){var r=E.indexOf(e.sampleRate),n=null;-1===r&&(r=15,n=e.sampleRate);var a=j.indexOf(e.numberOfChannels);if(-1===a)throw TypeError("Unsupported number of channels: ".concat(e.numberOfChannels));var i=13;e.objectType>=32&&(i+=6),15===r&&(i+=24);var s=new Uint8Array(Math.ceil(i/8)),o=new(0,c.Bitstream)(s);return e.objectType<32?o.writeBits(5,e.objectType):(o.writeBits(5,31),o.writeBits(6,e.objectType-32)),o.writeBits(4,r),15===r&&o.writeBits(24,n),o.writeBits(4,a),s},A=48e3,B=/^pcm-([usf])(\d+)+(be)?$/,M=function(e){if((0,c.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};var r=B.exec(e);return(0,c.assert)(r),{dataType:"u"===r[1]?"unsigned":"s"===r[1]?"signed":"float",sampleSize:Number(r[2])/8,littleEndian:"be"!==r[3],silentValue:128*("pcm-u8"===e)}},D=function(e){if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(B.test(e))return e;return"webvtt"===e?"webvtt":null},F=function(e){return"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{}},R=function(e){return"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{}},U=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],O=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,N=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,z=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,V=function(e){if(!e)throw TypeError("Video chunk metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!==(0,o._)(e.decoderConfig))throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!U.some(function(r){return e.decoderConfig.codec.startsWith(r)}))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,c.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){var r=e.decoderConfig.colorSpace;if((void 0===r?"undefined":(0,o._)(r))!=="object")throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");var n=Object.keys(c.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!n.includes(r.primaries))throw TypeError("Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of"+" ".concat(n.join(", "),"."));var a=Object.keys(c.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!a.includes(r.transfer))throw TypeError("Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of"+" ".concat(a.join(", "),"."));var i=Object.keys(c.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!i.includes(r.matrix))throw TypeError("Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of"+" ".concat(i.join(", "),"."));if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!O.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!z.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},H=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],G=function(e){if(!e)throw TypeError("Audio chunk metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!==(0,o._)(e.decoderConfig))throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!H.some(function(r){return e.decoderConfig.codec.startsWith(r)}))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,c.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM"+" codecs (".concat(l.join(", "),")."))},q=function(e){if(!e)throw TypeError("Subtitle metadata must be provided.");if((void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!==(0,o._)(e.config))throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@swc/helpers/cjs/_type_of.cjs":"iXhRw","./misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j7iGm:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"assert",function(){return _}),i.export(n,"normalizeRotation",function(){return y}),i.export(n,"last",function(){return w}),i.export(n,"isU32",function(){return S}),i.export(n,"Bitstream",function(){return T}),i.export(n,"readExpGolomb",function(){return x}),i.export(n,"readSignedExpGolomb",function(){return I}),i.export(n,"writeBits",function(){return E}),i.export(n,"toUint8Array",function(){return j}),i.export(n,"toDataView",function(){return P}),i.export(n,"textDecoder",function(){return C}),i.export(n,"textEncoder",function(){return A}),i.export(n,"isIso88591Compatible",function(){return B}),i.export(n,"COLOR_PRIMARIES_MAP",function(){return D}),i.export(n,"COLOR_PRIMARIES_MAP_INVERSE",function(){return F}),i.export(n,"TRANSFER_CHARACTERISTICS_MAP",function(){return R}),i.export(n,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",function(){return U}),i.export(n,"MATRIX_COEFFICIENTS_MAP",function(){return O}),i.export(n,"MATRIX_COEFFICIENTS_MAP_INVERSE",function(){return L}),i.export(n,"colorSpaceIsComplete",function(){return N}),i.export(n,"isAllowSharedBufferSource",function(){return z}),i.export(n,"AsyncMutex",function(){return V}),i.export(n,"bytesToHexString",function(){return H}),i.export(n,"reverseBitsU32",function(){return G}),i.export(n,"binarySearchExact",function(){return q}),i.export(n,"binarySearchLessOrEqual",function(){return W}),i.export(n,"insertSorted",function(){return K}),i.export(n,"promiseWithResolvers",function(){return X}),i.export(n,"removeItem",function(){return Z}),i.export(n,"findLast",function(){return Q}),i.export(n,"findLastIndex",function(){return Y}),i.export(n,"toAsyncIterator",function(){return J}),i.export(n,"validateAnyIterable",function(){return $}),i.export(n,"assertNever",function(){return ee}),i.export(n,"getUint24",function(){return et}),i.export(n,"getInt24",function(){return er}),i.export(n,"setUint24",function(){return en}),i.export(n,"setInt24",function(){return ea}),i.export(n,"setInt64",function(){return ei}),i.export(n,"mapAsyncGenerator",function(){return es}),i.export(n,"clamp",function(){return eo}),i.export(n,"UNDETERMINED_LANGUAGE",function(){return ec}),i.export(n,"roundIfAlmostInteger",function(){return eu}),i.export(n,"roundToMultiple",function(){return el}),i.export(n,"ilog",function(){return ed}),i.export(n,"isIso639Dash2LanguageCode",function(){return eh}),i.export(n,"SECOND_TO_MICROSECOND_FACTOR",function(){return em}),i.export(n,"mergeRequestInit",function(){return ep}),i.export(n,"retriedFetch",function(){return ev}),i.export(n,"computeRationalApproximation",function(){return eb}),i.export(n,"CallSerializer",function(){return ek}),i.export(n,"isWebKit",function(){return ey}),i.export(n,"isFirefox",function(){return eS}),i.export(n,"isChromium",function(){return ex}),i.export(n,"getChromiumVersion",function(){return eE}),i.export(n,"coalesceIndex",function(){return ej}),i.export(n,"closedIntervalsOverlap",function(){return eP}),i.export(n,"keyValueIterator",function(){return eC}),i.export(n,"imageMimeTypeToExtension",function(){return eA}),i.export(n,"base64ToBytes",function(){return eB}),i.export(n,"bytesToBase64",function(){return eM}),i.export(n,"uint8ArraysAreEqual",function(){return eD}),i.export(n,"polyfillSymbolDispose",function(){return eF}),i.export(n,"isNumber",function(){return eR});var s=e("@swc/helpers/cjs/_async_generator_delegate.cjs"),o=e("@swc/helpers/cjs/_async_iterator.cjs"),c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_define_property.cjs"),f=e("@swc/helpers/cjs/_object_spread.cjs"),h=e("@swc/helpers/cjs/_sliced_to_array.cjs"),m=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_type_of.cjs"),g=e("@swc/helpers/cjs/_wrap_async_generator.cjs"),b=e("@swc/helpers/cjs/_ts_generator.cjs"),k=e("@swc/helpers/cjs/_ts_values.cjs");function _(e){if(!e)throw Error("Assertion failed.")}var y=function(e){var r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error("Invalid rotation ".concat(e,"."))},w=function(e){return e&&e[e.length-1]},S=function(e){return e>=0&&e<0x100000000},T=function(){"use strict";function e(r){(0,u._)(this,e),this.bytes=r,this.pos=0}return(0,l._)(e,[{key:"seekToByte",value:function(e){this.pos=8*e}},{key:"readBit",value:function(){var e,r=Math.floor(this.pos/8),n=null!=(e=this.bytes[r])?e:0,a=7-(7&this.pos);return this.pos++,(n&1<>a}},{key:"readBits",value:function(e){if(1===e)return this.readBit();for(var r=0,n=0;n>n-a-1<=32)throw Error("Invalid exponential-Golomb code.");return(1<>1):r+1>>1},E=function(e,r,n,a){for(var i=r;i>n-i-1<255)return!1;return!0},M=function(e){return Object.fromEntries(Object.entries(e).map(function(e){var r=(0,h._)(e,2),n=r[0];return[r[1],n]}))},D={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},F=M(D),R={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},U=M(R),O={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},L=M(O),N=function(e){return!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange},z=function(e){return e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)},V=function(){"use strict";function e(){(0,u._)(this,e),this.currentPromise=Promise.resolve()}return(0,l._)(e,[{key:"acquire",value:function(){return(0,c._)(function(){var e,r,n;return(0,b._)(this,function(a){switch(a.label){case 0:return r=new Promise(function(r){e=r}),n=this.currentPromise,this.currentPromise=r,[4,n];case 1:return a.sent(),[2,e]}})}).call(this)}}]),e}(),H=function(e){return(0,m._)(e).map(function(e){return e.toString(16).padStart(2,"0")}).join("")},G=function(e){return(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0},q=function(e,r,n){for(var a=0,i=e.length-1,s=-1;a<=i;){var o=a+i>>1,c=n(e[o]);c===r?(s=o,i=o-1):c=0;n--)if(r(e[n]))return e[n]},Y=function(e,r){for(var n=e.length-1;n>=0;n--)if(r(e[n]))return n;return -1},J=function(e){return(0,g._)(function(){return(0,b._)(this,function(r){switch(r.label){case 0:if(!(Symbol.iterator in e))return[3,2];return[5,(0,k._)((0,s._)((0,o._)(e[Symbol.iterator]())))];case 1:return r.sent(),[3,4];case 2:return[5,(0,k._)((0,s._)((0,o._)(e[Symbol.asyncIterator]())))];case 3:r.sent(),r.label=4;case 4:return[2]}})})()},$=function(e){if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},ee=function(e){throw Error("Unexpected value: ".concat(e))},et=function(e,r,n){var a=e.getUint8(r),i=e.getUint8(r+1),s=e.getUint8(r+2);return n?a|i<<8|s<<16:a<<16|i<<8|s},er=function(e,r,n){return et(e,r,n)<<8>>8},en=function(e,r,n,a){n>>>=0,n&=0xffffff,a?(e.setUint8(r,255&n),e.setUint8(r+1,n>>>8&255),e.setUint8(r+2,n>>>16&255)):(e.setUint8(r,n>>>16&255),e.setUint8(r+1,n>>>8&255),e.setUint8(r+2,255&n))},ea=function(e,r,n,a){(n=eo(n,-8388608,8388607))<0&&(n=n+0x1000000&0xffffff),en(e,r,n,a)},ei=function(e,r,n,a){a?(e.setUint32(r+0,n,!0),e.setInt32(r+4,Math.floor(n/0x100000000),!0)):(e.setInt32(r+0,Math.floor(n/0x100000000),!0),e.setUint32(r+4,n,!0))},es=function(e,r){return(0,d._)({next:function(){return(0,c._)(function(){var n;return(0,b._)(this,function(a){switch(a.label){case 0:return[4,e.next()];case 1:if((n=a.sent()).done)return[2,{value:void 0,done:!0}];return[2,{value:r(n.value),done:!1}]}})})()},return:function(){return e.return()},throw:function(r){return e.throw(r)}},Symbol.asyncIterator,function(){return this})},eo=function(e,r,n){return Math.max(r,Math.min(n,e))},ec="und",eu=function(e){var r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},el=function(e,r){return Math.round(e/r)*r},ed=function(e){for(var r=0;e;)r++,e>>=1;return r},ef=/^[a-z]{3}$/,eh=function(e){return ef.test(e)},em=1e6*(1+Number.EPSILON),ep=function(e,r){var n=(0,f._)({},e,r);if(e.headers||r.headers){var a=e.headers?eg(e.headers):{},i=r.headers?eg(r.headers):{},s=(0,f._)({},a);Object.entries(i).forEach(function(e){var r=(0,h._)(e,2),n=r[0],a=r[1],i=Object.keys(s).find(function(e){return e.toLowerCase()===n.toLowerCase()});i&&delete s[i],s[n]=a}),n.headers=s}return n},eg=function(e){if(e instanceof Headers){var r={};return e.forEach(function(e,n){r[n]=e}),r}if(Array.isArray(e)){var n={};return e.forEach(function(e){var r=(0,h._)(e,2),a=r[0],i=r[1];n[a]=i}),n}return e},ev=function(e,r,n,a,i){return(0,c._)(function(){var s,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:s=function(){var s,c,u;return(0,b._)(this,function(l){switch(l.label){case 0:return l.trys.push([0,2,,5]),s={},[4,e(r,n)];case 1:return[2,(s.v=l.sent(),s)];case 2:if(c=l.sent(),i()||null===(u=a(++o,c,r)))throw c;if(console.error("Retrying failed fetch. Error:",c),!Number.isFinite(u)||u<0)throw TypeError("Retry delay must be a non-negative finite number.");if(!(u>0))return[3,4];return[4,new Promise(function(e){return setTimeout(e,1e3*u)})];case 3:l.sent(),l.label=4;case 4:if(i())throw c;return[3,5];case 5:return[2]}})},o=0,u.label=1;case 1:return[5,(0,k._)(s())];case 2:if(c=u.sent(),"object"===(0,p._)(c))return[2,c.v];return[3,1];case 3:return[2]}})})()},eb=function(e,r){for(var n=e<0?-1:1,a=0,i=1,s=1,o=0,c=e=Math.abs(e);;){var u=Math.floor(c),l=u*s+a,d=u*o+i;if(d>r||(a=s,i=o,s=l,o=d,!isFinite(c=1/(c-u))))break}return{numerator:n*s,denominator:o}},ek=function(){"use strict";function e(){(0,u._)(this,e),this.currentPromise=Promise.resolve()}return(0,l._)(e,[{key:"call",value:function(e){return this.currentPromise=this.currentPromise.then(e)}}]),e}(),e_=null,ey=function(){var e;return null!==e_?e_:e_=!!("undefined"!=typeof navigator&&((null==(e=navigator.vendor)?void 0:e.match(/apple/i))||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent)))},ew=null,eS=function(){var e;return null!==ew?ew:ew="undefined"!=typeof navigator&&(null==(e=navigator.userAgent)?void 0:e.includes("Firefox"))},eT=null,ex=function(){var e;return null!==eT?eT:eT=!!("undefined"!=typeof navigator&&((null==(e=navigator.vendor)?void 0:e.includes("Google Inc"))||/Chrome/.test(navigator.userAgent)))},eI=null,eE=function(){if(null!==eI)return eI;if("undefined"==typeof navigator)return null;var e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?eI=Number(e[1]):null},ej=function(e,r){return -1!==e?e:r},eP=function(e,r,n,a){return e<=a&&n<=r},eC=function(e){var r,n,a,i,s;return(0,b._)(this,function(o){switch(o.label){case 0:for(n in r=[],e)r.push(n);a=0,o.label=1;case 1:if(!(a0&&a>n){var o=e.subarray(n,a);o.length>0&&r.push(o)}n=a+i}if(n0&&r.push(c)}return r},b=function(e,r){for(var n=[],a=0,i=new DataView(e.buffer,e.byteOffset,e.byteLength);a+r<=e.length;){var s=void 0;1===r?s=i.getUint8(a):2===r?s=i.getUint16(a,!1):3===r?s=(0,p.getUint24)(i,a,!1):4===r?s=i.getUint32(a,!1):((0,p.assertNever)(r),(0,p.assert)(!1)),a+=r;var o=e.subarray(a,a+s);n.push(o),a+=s}return n},k=function(e){for(var r=[],n=e.length,a=0;a>8),r.push(255&u);for(var l=0;l>8),r.push(255&k);for(var _=0;_>8),r.push(255&E);for(var j=0;j>1&63},P=function(e){try{var r=g(e),n=r.filter(function(e){return j(e)===u.VPS_NUT}),a=r.filter(function(e){return j(e)===u.SPS_NUT}),i=r.filter(function(e){return j(e)===u.PPS_NUT}),s=r.filter(function(e){return j(e)===u.PREFIX_SEI_NUT||j(e)===u.SUFFIX_SEI_NUT});if(0===a.length||0===i.length)return null;var o=a[0],c=new(0,p.Bitstream)(k(o));c.skipBits(16),c.readBits(4);var l=c.readBits(3),d=c.readBits(1),h=C(c,l),m=h.general_profile_space,b=h.general_tier_flag,_=h.general_profile_idc,y=h.general_profile_compatibility_flags,w=h.general_constraint_indicator_flags,S=h.general_level_idc;(0,p.readExpGolomb)(c);var T=(0,p.readExpGolomb)(c);3===T&&c.skipBits(1),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),c.readBits(1)&&((0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c));var x=(0,p.readExpGolomb)(c),I=(0,p.readExpGolomb)(c);(0,p.readExpGolomb)(c);for(var E=c.readBits(1)?0:l,P=E;P<=l;P++)(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c);(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),c.readBits(1)&&c.readBits(1)&&A(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&(c.skipBits(4),c.skipBits(4),(0,p.readExpGolomb)(c),(0,p.readExpGolomb)(c),c.skipBits(1));var M=(0,p.readExpGolomb)(c);if(B(c,M),c.readBits(1))for(var F=(0,p.readExpGolomb)(c),R=0;R0){var L=i[0],N=new(0,p.Bitstream)(k(L));N.skipBits(16),(0,p.readExpGolomb)(N),(0,p.readExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.skipBits(3),N.skipBits(1),N.skipBits(1),(0,p.readExpGolomb)(N),(0,p.readExpGolomb)(N),(0,p.readSignedExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.readBits(1)&&(0,p.readExpGolomb)(N),(0,p.readSignedExpGolomb)(N),(0,p.readSignedExpGolomb)(N),N.skipBits(1),N.skipBits(1),N.skipBits(1),N.skipBits(1);var z=N.readBits(1),V=N.readBits(1);O=z||V?z&&!V?2:!z&&V?3:0:0}var H=(0,f._)(n.length?[{arrayCompleteness:1,nalUnitType:u.VPS_NUT,nalUnits:n}]:[]).concat((0,f._)(a.length?[{arrayCompleteness:1,nalUnitType:u.SPS_NUT,nalUnits:a}]:[]),(0,f._)(i.length?[{arrayCompleteness:1,nalUnitType:u.PPS_NUT,nalUnits:i}]:[]),(0,f._)(s.length?[{arrayCompleteness:1,nalUnitType:j(s[0]),nalUnits:s}]:[]));return{configurationVersion:1,generalProfileSpace:m,generalTierFlag:b,generalProfileIdc:_,generalProfileCompatibilityFlags:y,generalConstraintIndicatorFlags:w,generalLevelIdc:S,minSpatialSegmentationIdc:U,parallelismType:O,chromaFormatIdc:T,bitDepthLumaMinus8:x,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:l+1,temporalIdNested:d,lengthSizeMinusOne:3,arrays:H}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},C=function(e,r){for(var n=e.readBits(2),a=e.readBits(1),i=e.readBits(5),s=0,o=0;o<32;o++)s=s<<1|e.readBits(1);for(var c=new Uint8Array(6),u=0;u<6;u++)c[u]=e.readBits(8);for(var l=e.readBits(8),d=[],f=[],h=0;h0)for(var m=r;m<8;m++)e.skipBits(2);for(var p=0;p1&&(0,p.readSignedExpGolomb)(e);for(var i=0;i>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push.apply(r,(0,f._)(e.generalConstraintIndicatorFlags)),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length);var n=!0,a=!1,i=void 0;try{for(var s,o=e.arrays[Symbol.iterator]();!(n=(s=o.next()).done);n=!0){var c=s.value;r.push((1&c.arrayCompleteness)<<7|63&c.nalUnitType),r.push(c.nalUnits.length>>8&255),r.push(255&c.nalUnits.length);var u=!0,l=!1,d=void 0;try{for(var h,m=c.nalUnits[Symbol.iterator]();!(u=(h=m.next()).done);u=!0){var p=h.value;r.push(p.length>>8&255),r.push(255&p.length);for(var g=0;g=2&&(i=r.readBits(1)?12:10);var s=r.readBits(3),o=0,c=0;if(7!==s)if(c=r.readBits(1),1===a||3===a){var u=r.readBits(1),l=r.readBits(1);o=u||l?u&&!l?2:1:3,r.skipBits(1)}else o=1;else o=3,c=1;var d=(r.readBits(16)+1)*(r.readBits(16)+1),f=(0,p.last)(m.VP9_LEVEL_TABLE).level,h=!0,g=!1,b=void 0;try{for(var k,_=m.VP9_LEVEL_TABLE[Symbol.iterator]();!(h=(k=_.next()).done);h=!0){var y=k.value;if(d<=y.maxPictureSize){f=y.level;break}}}catch(e){g=!0,b=e}finally{try{h||null==_.return||_.return()}finally{if(g)throw b}}return{profile:a,level:f,bitDepth:i,chromaSubsampling:o,videoFullRangeFlag:c,colourPrimaries:2===s?1:1===s?6:2,transferCharacteristics:2===s?1:1===s?6:2,matrixCoefficients:7===s?0:2===s?1:1===s?6:2}},L=function(e){var r,n,a,i,s,o,c;return(0,h._)(this,function(u){switch(u.label){case 0:r=new(0,p.Bitstream)(e),n=function(){for(var e=0,n=0;n<8;n++){var a=r.readAlignedByte();if(e|=(127&a)<<7*n,!(128&a))break;if(7===n&&128&a)return null}return e>=0xffffffff?null:e},u.label=1;case 1:if(!(r.getBitsLeft()>=8))return[3,3];if(r.skipBits(1),a=r.readBits(4),i=r.readBits(1),s=r.readBits(1),r.skipBits(1),i&&r.skipBits(8),o=void 0,s){if(null===(c=n()))return[2];o=c}else o=Math.floor(r.getBitsLeft()/8);return(0,p.assert)(r.pos%8==0),[4,{type:a,data:e.subarray(r.pos/8,r.pos/8+o)}];case 2:return u.sent(),r.skipBits(8*o),[3,1];case 3:return[2]}})},N=function(e){var r=!0,n=!1,a=void 0;try{for(var i,s=L(e)[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value,c=o.type,u=o.data;if(1===c){var l=new(0,p.Bitstream)(u),d=l.readBits(3);l.readBits(1);var f=l.readBits(1),h=0,m=0,g=0;if(f)h=l.readBits(5);else{if(l.readBits(1)&&(l.skipBits(32),l.skipBits(32),l.readBits(1)))return null;var b=l.readBits(1);b&&(g=l.readBits(5),l.skipBits(32),l.skipBits(5),l.skipBits(5));for(var k=l.readBits(5),_=0;_<=k;_++){l.skipBits(12);var y=l.readBits(5);if(0===_&&(h=y),y>7){var w=l.readBits(1);0===_&&(m=w)}if(b&&l.readBits(1)){var S=g+1;l.skipBits(S),l.skipBits(S),l.skipBits(1)}l.readBits(1)&&l.skipBits(4)}}var T=l.readBits(4),x=l.readBits(4),I=T+1;l.skipBits(I);var E=x+1;l.skipBits(E);if((f?0:l.readBits(1))&&(l.skipBits(4),l.skipBits(3)),l.skipBits(1),l.skipBits(1),l.skipBits(1),!f){l.skipBits(1),l.skipBits(1),l.skipBits(1),l.skipBits(1);var j=l.readBits(1);j&&(l.skipBits(1),l.skipBits(1));var P=l.readBits(1);(P?2:l.readBits(1))>0&&(l.readBits(1)||l.skipBits(1)),j&&l.skipBits(3)}l.skipBits(1),l.skipBits(1),l.skipBits(1);var C=l.readBits(1),A=8;2===d&&C?A=l.readBits(1)?12:10:d<=2&&(A=C?10:8);var B=0;1!==d&&(B=l.readBits(1));var M=1,D=1,F=0;return!B&&(0===d?(M=1,D=1):1===d?(M=0,D=0):12===A&&(M=l.readBits(1))&&(D=l.readBits(1)),M&&D&&(F=l.readBits(2))),{profile:d,level:h,tier:m,bitDepth:A,monochrome:B,chromaSubsamplingX:M,chromaSubsamplingY:D,chromaSamplePosition:F}}}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}return null},z=function(e){var r=(0,p.toDataView)(e),n=r.getUint8(9),a=r.getUint16(10,!0),i=r.getUint32(12,!0),s=r.getInt16(16,!0),o=r.getUint8(18),c=null;return o&&(c=e.subarray(19,21+n)),{outputChannelCount:n,preSkip:a,inputSampleRate:i,outputGain:s,channelMappingFamily:o,channelMappingTable:c}},V=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],H=function(e){return{durationInSamples:V[e[0]>>3]}},G=function(e){if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==(r=String).fromCharCode.apply(r,(0,f._)(e.slice(1,7))))throw Error("Invalid packet signature in Setup header.");for(var r,n=e.length,a=new Uint8Array(n),i=0;i97;)if(1===s.readBits(1)){o=s.pos;break}if(0===o)throw Error("Invalid Setup header: framing bit not found.");for(var c=0,u=!1,l=0;s.getBitsLeft()>=97;){var d=s.pos,h=s.readBits(8),m=s.readBits(16),g=s.readBits(16);if(h>63||0!==m||0!==g){s.pos=d;break}if(s.skipBits(1),++c>64)break;s.clone().readBits(6)+1===c&&(u=!0,l=c)}if(!u)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error("Unsupported mode count: ".concat(l,"."));var b=l;s.pos=0,s.skipBits(o);for(var k=Array(b).fill(0),_=b-1;_>=0;_--)s.skipBits(40),k[_]=s.readBits(1);return{modeBlockflags:k}},q=function(e,r,n){switch(e){case"avc":var a=y(n,r),i=a.some(function(e){return w(e)===c.IDR}),s=!0,o=!1,l=void 0;if(!i&&(!(0,p.isChromium)()||(0,p.getChromiumVersion)()>=144))try{for(var d,f=a[Symbol.iterator]();!(s=(d=f.next()).done);s=!0){var h=d.value;if(w(h)===c.SEI){var m=k(h),g=1;do{for(var b=0;;){var _=m[g++];if(void 0===_||(b+=_,_<255))break}for(var S=0;;){var T=m[g++];if(void 0===T||(S+=T,T<255))break}if(6===b){var x=new(0,p.Bitstream)(m);x.pos=8*g;var I=(0,p.readExpGolomb)(x),P=x.readBits(1);if(0===I&&1===P){i=!0;break}}g+=S}while(g0&&(null!=r.raw||(r.raw={}),null!=(g=r.raw)[b="vendor"]||(g[b]=s));var o=n.getUint32(a,!0);a+=4;for(var c=0;c0&&(null!=r.trackNumber||(r.trackNumber=y)),w&&Number.isInteger(w)&&w>0&&(null!=r.tracksTotal||(r.tracksTotal=w));break;case"TRACKTOTAL":var S=Number.parseInt(m,10);Number.isInteger(S)&&S>0&&(null!=r.tracksTotal||(r.tracksTotal=S));break;case"DISCNUMBER":var T=m.split("/"),x=Number.parseInt(T[0],10),I=T[1]&&Number.parseInt(T[1],10);Number.isInteger(x)&&x>0&&(null!=r.discNumber||(r.discNumber=x)),I&&Number.isInteger(I)&&I>0&&(null!=r.discsTotal||(r.discsTotal=I));break;case"DISCTOTAL":var E=Number.parseInt(m,10);Number.isInteger(E)&&E>0&&(null!=r.discsTotal||(r.discsTotal=E));break;case"DATE":var j=new Date(m);Number.isNaN(j.getTime())||null!=r.date||(r.date=j);break;case"GENRE":null!=r.genre||(r.genre=m);break;case"METADATA_BLOCK_PICTURE":var P,C=(0,p.base64ToBytes)(m),A=(0,p.toDataView)(C),B=A.getUint32(0,!1),M=A.getUint32(4,!1),D=(P=String).fromCharCode.apply(P,(0,f._)(C.subarray(8,8+M))),F=A.getUint32(8+M,!1),R=p.textDecoder.decode(C.subarray(12+M,12+M+F)),U=A.getUint32(M+F+28),O=C.subarray(M+F+32,M+F+32+U);null!=r.images||(r.images=[]),r.images.push({data:O,mimeType:D,kind:3===B?"coverFront":4===B?"coverBack":"unknown",name:void 0,description:R||void 0})}}}},K=function(e,r,n){var a=[e],i=p.textEncoder.encode("Mediabunny"),s=new Uint8Array(4+i.length),o=new DataView(s.buffer);o.setUint32(0,i.length,!0),s.set(i,4),a.push(s);var c=new Set,u=function(e,r){var n="".concat(e,"=").concat(r),i=p.textEncoder.encode(n);(o=new DataView((s=new Uint8Array(4+i.length)).buffer)).setUint32(0,i.length,!0),s.set(i,4),a.push(s),c.add(e)},l=!0,d=!1,f=void 0;try{for(var h,m=(0,p.keyValueIterator)(r)[Symbol.iterator]();!(l=(h=m.next()).done);l=!0){var g=h.value,b=g.key,k=g.value;switch(b){case"title":u("TITLE",k);break;case"description":u("DESCRIPTION",k);break;case"artist":u("ARTIST",k);break;case"album":u("ALBUM",k);break;case"albumArtist":u("ALBUMARTIST",k);break;case"genre":u("GENRE",k);break;case"date":var _,y,w,S=null!=(w=null==(_=r.raw)?void 0:_.DATE)?w:null==(y=r.raw)?void 0:y.date;u("DATE",S&&"string"==typeof S?S:k.toISOString().slice(0,10));break;case"comment":u("COMMENT",k);break;case"lyrics":u("LYRICS",k);break;case"trackNumber":u("TRACKNUMBER",k.toString());break;case"tracksTotal":u("TRACKTOTAL",k.toString());break;case"discNumber":u("DISCNUMBER",k.toString());break;case"discsTotal":u("DISCTOTAL",k.toString());break;case"images":if(!n)break;var T=!0,x=!1,I=void 0;try{for(var E,j=k[Symbol.iterator]();!(T=(E=j.next()).done);T=!0){for(var P,C=E.value,A="coverFront"===C.kind?3:4*("coverBack"===C.kind),B=new Uint8Array(C.mimeType.length),M=0;M0&&void 0!==b[0]?b[0]:1/0,r=new(0,p.EncodedPacketSink)(this),n=1/0,a=-1/0,i=0,o=0,c=!1,u=!1,f.label=1;case 1:f.trys.push([1,6,7,12]),d=(0,s._)(r.packets(void 0,void 0,{metadataOnly:!0})),f.label=2;case 2:return[4,d.next()];case 3:if(!(c=!(h=f.sent()).done)||(m=h.value,i>=e&&m.timestamp>=a))return[3,5];n=Math.min(n,m.timestamp),a=Math.max(a,m.timestamp+m.duration),i++,o+=m.byteLength,f.label=4;case 4:return c=!1,[3,2];case 5:return[3,12];case 6:return g=f.sent(),u=!0,l=g,[3,12];case 7:if(f.trys.push([7,,10,11]),!(c&&null!=d.return))return[3,9];return[4,d.return()];case 8:f.sent(),f.label=9;case 9:return[3,11];case 10:if(u)throw l;return[7];case 11:return[7];case 12:return[2,{packetCount:i,averagePacketRate:i?Number((i/(a-n)).toPrecision(16)):0,averageBitrate:i?Number((8*o/(a-n)).toPrecision(16)):0}]}})}).apply(this,arguments)}}]),e}(),_=function(e){"use strict";function r(e,n){var a;return(0,u._)(this,r),(a=(0,c._)(this,r,[e,n]))._backing=n,a}return(0,d._)(r,e),(0,l._)(r,[{key:"type",get:function(){return"video"}},{key:"codec",get:function(){return this._backing.getCodec()}},{key:"codedWidth",get:function(){return this._backing.getCodedWidth()}},{key:"codedHeight",get:function(){return this._backing.getCodedHeight()}},{key:"rotation",get:function(){return this._backing.getRotation()}},{key:"displayWidth",get:function(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}},{key:"displayHeight",get:function(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}},{key:"getColorSpace",value:function(){return this._backing.getColorSpace()}},{key:"hasHighDynamicRange",value:function(){return(0,o._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this._backing.getColorSpace()];case 1:return[2,"bt2020"===(e=r.sent()).primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix]}})}).call(this)}},{key:"canBeTransparent",value:function(){return this._backing.canBeTransparent()}},{key:"getDecoderConfig",value:function(){return this._backing.getDecoderConfig()}},{key:"getCodecParameterString",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return[4,this._backing.getDecoderConfig()];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.codec)?r:null]}})}).call(this)}},{key:"canDecode",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,,4]),[4,this._backing.getDecoderConfig()];case 1:if(!(e=n.sent()))return[2,!1];if(r=this._backing.getCodec(),(0,g.assert)(null!==r),m.customVideoDecoders.some(function(n){return n.supports(r,e)}))return[2,!0];if("undefined"==typeof VideoDecoder)return[2,!1];return[4,VideoDecoder.isConfigSupported(e)];case 2:return[2,!0===n.sent().supported];case 3:return console.error("Error during decodability check:",n.sent()),[2,!1];case 4:return[2]}})}).call(this)}},{key:"determinePacketType",value:function(e){return(0,o._)(function(){var r;return(0,f._)(this,function(n){switch(n.label){case 0:if(!(e instanceof b.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return[2,null];return[4,this.getDecoderConfig()];case 1:return r=n.sent(),(0,g.assert)(r),[2,(0,h.determineVideoPacketType)(this.codec,r,e.data)]}})}).call(this)}}]),r}(k),y=function(e){"use strict";function r(e,n){var a;return(0,u._)(this,r),(a=(0,c._)(this,r,[e,n]))._backing=n,a}return(0,d._)(r,e),(0,l._)(r,[{key:"type",get:function(){return"audio"}},{key:"codec",get:function(){return this._backing.getCodec()}},{key:"numberOfChannels",get:function(){return this._backing.getNumberOfChannels()}},{key:"sampleRate",get:function(){return this._backing.getSampleRate()}},{key:"getDecoderConfig",value:function(){return this._backing.getDecoderConfig()}},{key:"getCodecParameterString",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return[4,this._backing.getDecoderConfig()];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.codec)?r:null]}})}).call(this)}},{key:"canDecode",value:function(){return(0,o._)(function(){var e,r;return(0,f._)(this,function(n){switch(n.label){case 0:return n.trys.push([0,5,,6]),[4,this._backing.getDecoderConfig()];case 1:if(!(e=n.sent()))return[2,!1];if(r=this._backing.getCodec(),(0,g.assert)(null!==r),m.customAudioDecoders.some(function(n){return n.supports(r,e)}))return[2,!0];if(!e.codec.startsWith("pcm-"))return[3,2];return[2,!0];case 2:if("undefined"==typeof AudioDecoder)return[2,!1];return[4,AudioDecoder.isConfigSupported(e)];case 3:return[2,!0===n.sent().supported];case 4:return[3,6];case 5:return console.error("Error during decodability check:",n.sent()),[2,!1];case 6:return[2]}})}).call(this)}},{key:"determinePacketType",value:function(e){return(0,o._)(function(){return(0,f._)(this,function(r){if(!(e instanceof b.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?[2,null]:[2,"key"]})}).call(this)}}]),r}(k)},{"@swc/helpers/cjs/_async_iterator.cjs":"f3IhJ","@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./codec-data.js":"kWTYV","./custom-coder.js":"hAl48","./media-sink.js":"k0V9R","./misc.js":"j7iGm","./packet.js":"QfqGG","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],hAl48:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"CustomVideoDecoder",function(){return c}),i.export(n,"CustomAudioDecoder",function(){return u}),i.export(n,"CustomVideoEncoder",function(){return l}),i.export(n,"CustomAudioEncoder",function(){return d}),i.export(n,"customVideoDecoders",function(){return f}),i.export(n,"customAudioDecoders",function(){return h}),i.export(n,"customVideoEncoders",function(){return m}),i.export(n,"customAudioEncoders",function(){return p}),i.export(n,"registerDecoder",function(){return g}),i.export(n,"registerEncoder",function(){return b});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),u=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),l=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),d=function(){"use strict";function e(){(0,s._)(this,e)}return(0,o._)(e,null,[{key:"supports",value:function(e,r){return!1}}]),e}(),f=[],h=[],m=[],p=[],g=function(e){if(e.prototype instanceof c){if(f.includes(e))return void console.warn("Video decoder already registered.");f.push(e)}else if(e.prototype instanceof u){if(h.includes(e))return void console.warn("Audio decoder already registered.");h.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},b=function(e){if(e.prototype instanceof l){if(m.includes(e))return void console.warn("Video encoder already registered.");m.push(e)}else if(e.prototype instanceof d){if(p.includes(e))return void console.warn("Audio encoder already registered.");p.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],k0V9R:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"EncodedPacketSink",function(){return A}),i.export(n,"BaseMediaSampleSink",function(){return M}),i.export(n,"VideoSampleSink",function(){return U}),i.export(n,"CanvasSink",function(){return O}),i.export(n,"AudioSampleSink",function(){return z}),i.export(n,"AudioBufferSink",function(){return V});var s=e("@swc/helpers/cjs/_async_iterator.cjs"),o=e("@swc/helpers/cjs/_async_to_generator.cjs"),c=e("@swc/helpers/cjs/_call_super.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_define_property.cjs"),f=e("@swc/helpers/cjs/_inherits.cjs"),h=e("@swc/helpers/cjs/_object_spread.cjs"),m=e("@swc/helpers/cjs/_object_spread_props.cjs"),p=e("@swc/helpers/cjs/_sliced_to_array.cjs"),g=e("@swc/helpers/cjs/_type_of.cjs"),b=e("@swc/helpers/cjs/_ts_generator.cjs"),k=e("./codec.js"),_=e("./codec-data.js"),y=e("./custom-coder.js"),w=e("./input.js"),S=e("./input-track.js"),T=e("./misc.js"),x=e("./packet.js"),I=e("./pcm.js"),E=e("./sample.js"),j=function(e){if(!e||(void 0===e?"undefined":(0,g._)(e))!=="object")throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},P=function(e){if(!(0,T.isNumber)(e))throw TypeError("timestamp must be a number.")},C=function(e,r,n){return n.verifyKeyPackets?r.then(function(r){return(0,o._)(function(){var n;return(0,b._)(this,function(a){switch(a.label){case 0:if(!r||"delta"===r.type)return[2,r];return[4,e.determinePacketType(r)];case 1:return(n=a.sent())&&(r.type=n),[2,r]}})})()}):r},A=function(){"use strict";function e(r){if((0,u._)(this,e),!(r instanceof S.InputTrack))throw TypeError("track must be an InputTrack.");this._track=r}return(0,l._)(e,[{key:"getFirstPacket",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(j(e),this._track.input._disposed)throw new(0,w.InputDisposedError);return C(this._track,this._track._backing.getFirstPacket(e),e)}},{key:"getPacket",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(P(e),j(r),this._track.input._disposed)throw new(0,w.InputDisposedError);return C(this._track,this._track._backing.getPacket(e,r),r)}},{key:"getNextPacket",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(e instanceof x.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(j(r),this._track.input._disposed)throw new(0,w.InputDisposedError);return C(this._track,this._track._backing.getNextPacket(e,r),r)}},{key:"getKeyPacket",value:function(e){return(0,o._)(function(e){var r,n,a=arguments;return(0,b._)(this,function(i){switch(i.label){case 0:if(r=a.length>1&&void 0!==a[1]?a[1]:{},P(e),j(r),this._track.input._disposed)throw new(0,w.InputDisposedError);if(!r.verifyKeyPackets)return[2,this._track._backing.getKeyPacket(e,r)];return[4,this._track._backing.getKeyPacket(e,r)];case 1:if(!(n=i.sent()))return[2,n];return(0,T.assert)("key"===n.type),[4,this._track.determinePacketType(n)];case 2:if("delta"===i.sent())return[2,this.getKeyPacket(n.timestamp-1/this._track.timeResolution,r)];return[2,n]}})}).apply(this,arguments)}},{key:"getNextKeyPacket",value:function(e){return(0,o._)(function(e){var r,n,a=arguments;return(0,b._)(this,function(i){switch(i.label){case 0:if(r=a.length>1&&void 0!==a[1]?a[1]:{},!(e instanceof x.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(j(r),this._track.input._disposed)throw new(0,w.InputDisposedError);if(!r.verifyKeyPackets)return[2,this._track._backing.getNextKeyPacket(e,r)];return[4,this._track._backing.getNextKeyPacket(e,r)];case 1:if(!(n=i.sent()))return[2,n];return(0,T.assert)("key"===n.type),[4,this._track.determinePacketType(n)];case 2:if("delta"===i.sent())return[2,this.getNextKeyPacket(n,r)];return[2,n]}})}).apply(this,arguments)}},{key:"packets",value:function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(void 0!==e&&!(e instanceof x.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!(null==n?void 0:n.metadataOnly))throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof x.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(j(n),this._track.input._disposed)throw new(0,w.InputDisposedError);var a=[],i=(0,T.promiseWithResolvers)(),s=i.promise,c=i.resolve,u=(0,T.promiseWithResolvers)(),l=u.promise,f=u.resolve,h=!1,m=!1,p=null,g=[];(0,o._)(function(){var i,o,u,d;return(0,b._)(this,function(p){switch(p.label){case 0:if(null==e)return[3,1];return o=e,[3,3];case 1:return[4,this.getFirstPacket(n)];case 2:o=p.sent(),p.label=3;case 3:i=o,p.label=4;case 4:if(!(i&&!m&&!this._track.input._disposed)||r&&i.sequenceNumber>=(null==r?void 0:r.sequenceNumber))return[3,8];if(!(a.length>Math.max(2,g.length)))return[3,6];return l=(u=(0,T.promiseWithResolvers)()).promise,f=u.resolve,[4,l];case 5:return p.sent(),[3,4];case 6:return a.push(i),c(),s=(d=(0,T.promiseWithResolvers)()).promise,c=d.resolve,[4,this.getNextPacket(i,n)];case 7:return i=p.sent(),[3,4];case 8:return h=!0,c(),[2]}})}).call(this).catch(function(e){p||(p=e,c())});var k=this._track;return(0,d._)({next:function(){return(0,o._)(function(){var e,r;return(0,b._)(this,function(n){switch(n.label){case 0:if(!k.input._disposed)return[3,1];throw new(0,w.InputDisposedError);case 1:if(!m)return[3,2];return[2,{value:void 0,done:!0}];case 2:if(!p)return[3,3];throw p;case 3:if(!(a.length>0))return[3,4];for(e=a.shift(),r=performance.now(),g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return f(),[2,{value:e,done:!1}];case 4:if(!h)return[3,5];return[2,{value:void 0,done:!0}];case 5:return[4,s];case 6:n.sent(),n.label=7;case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return m=!0,f(),c(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}}]),e}(),B=function e(r,n){"use strict";(0,u._)(this,e),this.onSample=r,this.onError=n},M=function(){"use strict";function e(){(0,u._)(this,e)}return(0,l._)(e,[{key:"mediaSamplesInRange",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;P(e),P(r);var n=[],a=!1,i=null,s=(0,T.promiseWithResolvers)(),c=s.promise,u=s.resolve,l=(0,T.promiseWithResolvers)(),f=l.promise,h=l.resolve,m=!1,p=!1,g=!1,k=null;(0,o._)(function(){var s,o,l,d,_,y,w,S,x,I,E,j,P,C,A,B;return(0,b._)(this,function(b){switch(b.label){case 0:return s=Error(),[4,this._createDecoder(function(s){if(h(),s.timestamp>=r&&(p=!0),p)return void s.close();if(i&&(s.timestamp>e?(n.push(i),a=!0):i.close()),s.timestamp>=e&&(n.push(s),a=!0),i=a?null:s,n.length>0){var o;u(),c=(o=(0,T.promiseWithResolvers)()).promise,u=o.resolve}},function(e){k||(e.stack=s.stack,k=e,u())})];case 1:return o=b.sent(),[4,(l=this._createPacketSink()).getKeyPacket(e,{verifyKeyPackets:!0})];case 2:if(null==(d=b.sent()))return[3,3];return y=d,[3,5];case 3:return[4,l.getFirstPacket()];case 4:y=b.sent(),b.label=5;case 5:if(w=_=y,S=void 0,!(r<1/0))return[3,12];return[4,l.getPacket(r)];case 6:if(x=b.sent())return[3,7];return E=null,[3,11];case 7:if("key"!==x.type||x.timestamp!==r)return[3,8];return j=x,[3,10];case 8:return[4,l.getNextKeyPacket(x,{verifyKeyPackets:!0})];case 9:j=b.sent(),b.label=10;case 10:E=j,b.label=11;case 11:(I=E)&&(S=I),b.label=12;case 12:return[4,(P=l.packets(null!=_?_:void 0,S)).next()];case 13:b.sent(),b.label=14;case 14:if(!(w&&!p&&!this._track.input._disposed))return[3,18];if(C=D(n.length),!(n.length+o.getDecodeQueueSize()>C))return[3,16];return f=(A=(0,T.promiseWithResolvers)()).promise,h=A.resolve,[4,f];case 15:return b.sent(),[3,14];case 16:return o.decode(w),[4,P.next()];case 17:if((B=b.sent()).done)return[3,18];return w=B.value,[3,14];case 18:return[4,P.return()];case 19:if(b.sent(),!(!g&&!this._track.input._disposed))return[3,21];return[4,o.flush()];case 20:b.sent(),b.label=21;case 21:return o.close(),!a&&i&&n.push(i),m=!0,u(),[2]}})}).call(this).catch(function(e){k||(k=e,u())});var _=this._track,y=function(){null==i||i.close();var e=!0,r=!1,a=void 0;try{for(var s,o=n[Symbol.iterator]();!(e=(s=o.next()).done);e=!0)s.value.close()}catch(e){r=!0,a=e}finally{try{e||null==o.return||o.return()}finally{if(r)throw a}}};return(0,d._)({next:function(){return(0,o._)(function(){var e;return(0,b._)(this,function(r){switch(r.label){case 0:if(!_.input._disposed)return[3,1];throw y(),new(0,w.InputDisposedError);case 1:if(!g)return[3,2];return[2,{value:void 0,done:!0}];case 2:if(!k)return[3,3];throw y(),k;case 3:if(!(n.length>0))return[3,4];return e=n.shift(),h(),[2,{value:e,done:!1}];case 4:if(m)return[3,6];return[4,c];case 5:return r.sent(),[3,7];case 6:return[2,{value:void 0,done:!0}];case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return g=!0,p=!0,h(),u(),y(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}},{key:"mediaSamplesAtTimestamps",value:function(e){(0,T.validateAnyIterable)(e);var r=(0,T.toAsyncIterator)(e),n=[],a=[],i=(0,T.promiseWithResolvers)(),c=i.promise,u=i.resolve,l=(0,T.promiseWithResolvers)(),f=l.promise,h=l.resolve,m=!1,p=!1,g=null,k=function(e){var r;a.push(e),u(),c=(r=(0,T.promiseWithResolvers)()).promise,u=r.resolve};(0,o._)(function(){var e,i,c,l,d,_,y,w,S,x,I,E,j,C,A,B,M,F;return(0,b._)(this,function(R){switch(R.label){case 0:return e=Error(),[4,this._createDecoder(function(e){if(h(),p)return void e.close();for(var r=0;n.length>0&&e.timestamp-n[0]>-1e-10;)r++,n.shift();if(r>0)for(var a=0;ar&&!p))return[3,4];return f=(n=(0,T.promiseWithResolvers)()).promise,h=n.resolve,[4,f];case 3:return o.sent(),[3,2];case 4:if(p)return[3,6];return[4,c.getNextPacket(e)];case 5:return s=o.sent(),(0,T.assert)(s),i.decode(s),e=s,[3,1];case 6:return _=-1,[2]}})})()},w=function(){return(0,o._)(function(){var e;return(0,b._)(this,function(r){switch(r.label){case 0:return[4,i.flush()];case 1:for(r.sent(),e=0;e0))return[3,4];return e=a.shift(),(0,T.assert)(void 0!==e),h(),[2,{value:e,done:!1}];case 4:if(m)return[3,6];return[4,c];case 5:return r.sent(),[3,7];case 6:return[2,{value:void 0,done:!0}];case 7:return[3,0];case 8:return[2]}})})()},return:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return p=!0,h(),u(),y(),[2,{value:void 0,done:!0}]})})()},throw:function(e){return(0,o._)(function(){return(0,b._)(this,function(r){throw e})})()}},Symbol.asyncIterator,function(){return this})}}]),e}(),D=function(e){return 0===e?40:8},F=function(e){"use strict";function r(e,n,a,i,s,o){(0,u._)(this,r),(l=(0,c._)(this,r,[e,n])).codec=a,l.decoderConfig=i,l.rotation=s,l.timeResolution=o,l.decoder=null,l.customDecoder=null,l.customDecoderCallSerializer=new(0,T.CallSerializer),l.customDecoderQueueSize=0,l.inputTimestamps=[],l.sampleQueue=[],l.currentPacketIndex=0,l.raslSkipped=!1,l.alphaDecoder=null,l.alphaHadKeyframe=!1,l.colorQueue=[],l.alphaQueue=[],l.merger=null,l.mergerCreationFailed=!1,l.decodedAlphaChunkCount=0,l.alphaDecoderQueueSize=0,l.nullAlphaFrameQueue=[],l.currentAlphaPacketIndex=0,l.alphaRaslSkipped=!1;var l,d=y.customVideoDecoders.find(function(e){return e.supports(a,i)});if(d)l.customDecoder=new d,l.customDecoder.codec=a,l.customDecoder.config=i,l.customDecoder.onSample=function(e){if(!(e instanceof E.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");l.finalizeAndEmitSample(e)},l.customDecoderCallSerializer.call(function(){return l.customDecoder.init()});else{var f=function(e){if(l.alphaQueue.length>0){var r=l.alphaQueue.shift();(0,T.assert)(void 0!==r),l.mergeAlpha(e,r)}else l.colorQueue.push(e)};if("avc"===a&&l.decoderConfig.description&&(0,T.isChromium)()){var p=(0,_.deserializeAvcDecoderConfigurationRecord)((0,T.toUint8Array)(l.decoderConfig.description));if(p&&p.sequenceParameterSets.length>0){var g=(0,_.parseAvcSps)(p.sequenceParameterSets[0]);g&&0===g.frameMbsOnlyFlag&&(l.decoderConfig=(0,m._)((0,h._)({},l.decoderConfig),{hardwareAcceleration:"prefer-software"}))}}l.decoder=new VideoDecoder({output:function(e){try{f(e)}catch(e){l.onError(e)}},error:n}),l.decoder.configure(l.decoderConfig)}return l}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){var e,r;return this.customDecoder?this.customDecoderQueueSize:((0,T.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,null!=(r=null==(e=this.alphaDecoder)?void 0:e.decodeQueueSize)?r:0))}},{key:"decode",value:function(e){var r=this;if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(function(){return r.customDecoder.decode(e)}).then(function(){return r.customDecoderQueueSize--})):((0,T.assert)(this.decoder),(0,T.isWebKit)()||(0,T.insertSorted)(this.inputTimestamps,e.timestamp,function(e){return e}),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}},{key:"decodeAlphaData",value:function(e){var r=this;if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new R}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){var n=function(e){if(r.alphaDecoderQueueSize--,r.colorQueue.length>0){var n=r.colorQueue.shift();(0,T.assert)(void 0!==n),r.mergeAlpha(n,e)}else r.alphaQueue.push(e);for(r.decodedAlphaChunkCount++;r.nullAlphaFrameQueue.length>0&&r.nullAlphaFrameQueue[0]===r.decodedAlphaChunkCount;)if(r.nullAlphaFrameQueue.shift(),r.colorQueue.length>0){var a=r.colorQueue.shift();(0,T.assert)(void 0!==a),r.mergeAlpha(a,null)}else r.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:function(e){try{n(e)}catch(e){r.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}var a=(0,_.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===a),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(null!=a?a:e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}},{key:"pushNullAlphaFrame",value:function(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}},{key:"hasHevcRaslPicture",value:function(e){return(0,_.extractHevcNalUnits)(e,this.decoderConfig).some(function(e){var r=(0,_.extractNalUnitTypeForHevc)(e);return r===_.HevcNalUnitType.RASL_N||r===_.HevcNalUnitType.RASL_R})}},{key:"sampleHandler",value:function(e){if((0,T.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,T.last)(this.sampleQueue).timestamp){var r=!0,n=!1,a=void 0;try{for(var i,s=this.sampleQueue[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value;this.finalizeAndEmitSample(o)}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}this.sampleQueue.length=0}(0,T.insertSorted)(this.sampleQueue,e,function(e){return e.timestamp})}else{var c=this.inputTimestamps.shift();(0,T.assert)(void 0!==c),e.setTimestamp(c),this.finalizeAndEmitSample(e)}}},{key:"finalizeAndEmitSample",value:function(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}},{key:"mergeAlpha",value:function(e,r){if(!r){var n,a=new(0,E.VideoSample)(e);this.sampleHandler(a);return}(0,T.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();var i=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:null!=(n=e.duration)?n:void 0}),s=new(0,E.VideoSample)(i);this.sampleHandler(s)}},{key:"flush",value:function(){return(0,o._)(function(){var e,r,n,a,i,s,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:if(e=this,!this.customDecoder)return[3,2];return[4,this.customDecoderCallSerializer.call(function(){return e.customDecoder.flush()})];case 1:return u.sent(),[3,4];case 2:return(0,T.assert)(this.decoder),[4,Promise.all([this.decoder.flush(),null==(r=this.alphaDecoder)?void 0:r.flush()])];case 3:u.sent(),this.colorQueue.forEach(function(e){return e.close()}),this.colorQueue.length=0,this.alphaQueue.forEach(function(e){return null==e?void 0:e.close()}),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1,u.label=4;case 4:if((0,T.isWebKit)()){n=!0,a=!1,i=void 0;try{for(s=this.sampleQueue[Symbol.iterator]();!(n=(o=s.next()).done);n=!0)c=o.value,this.finalizeAndEmitSample(c)}catch(e){a=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(a)throw i}}this.sampleQueue.length=0}return this.currentPacketIndex=0,this.raslSkipped=!1,[2]}})}).call(this)}},{key:"close",value:function(){var e=this;this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.close()}):((0,T.assert)(this.decoder),this.decoder.close(),null==(i=this.alphaDecoder)||i.close(),this.colorQueue.forEach(function(e){return e.close()}),this.colorQueue.length=0,this.alphaQueue.forEach(function(e){return null==e?void 0:e.close()}),this.alphaQueue.length=0,null==(s=this.merger)||s.close());var r=!0,n=!1,a=void 0;try{for(var i,s,o,c=this.sampleQueue[Symbol.iterator]();!(r=(o=c.next()).done);r=!0)o.value.close()}catch(e){n=!0,a=e}finally{try{r||null==c.return||c.return()}finally{if(n)throw a}}this.sampleQueue.length=0}}]),r}(B),R=function(){"use strict";function e(){(0,u._)(this,e),"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");var r=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!r)throw Error("Couldn't acquire WebGL 2 context.");this.gl=r,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}return(0,l._)(e,[{key:"createProgram",value:function(){var e=this.createShader(this.gl.VERTEX_SHADER,"#version 300 es\n in vec2 a_position;\n in vec2 a_texCoord;\n out vec2 v_texCoord;\n \n void main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_texCoord = a_texCoord;\n }\n "),r=this.createShader(this.gl.FRAGMENT_SHADER,"#version 300 es\n precision highp float;\n \n uniform sampler2D u_colorTexture;\n uniform sampler2D u_alphaTexture;\n in vec2 v_texCoord;\n out vec4 fragColor;\n \n void main() {\n vec3 color = texture(u_colorTexture, v_texCoord).rgb;\n float alpha = texture(u_alphaTexture, v_texCoord).r;\n fragColor = vec4(color, alpha);\n }\n "),n=this.gl.createProgram();return this.gl.attachShader(n,e),this.gl.attachShader(n,r),this.gl.linkProgram(n),n}},{key:"createShader",value:function(e,r){var n=this.gl.createShader(e);return this.gl.shaderSource(n,r),this.gl.compileShader(n),n}},{key:"createVAO",value:function(){var e=this.gl.createVertexArray();this.gl.bindVertexArray(e);var r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),n=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,n),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);var a=this.gl.getAttribLocation(this.program,"a_position"),i=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(a),this.gl.vertexAttribPointer(a,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,8),e}},{key:"createTexture",value:function(){var e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}},{key:"update",value:function(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}},{key:"close",value:function(){var e;null==(e=this.gl.getExtension("WEBGL_lose_context"))||e.loseContext(),this.gl=null}}]),e}(),U=function(e){"use strict";function r(e){var n;if((0,u._)(this,r),!(e instanceof S.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");return(n=(0,c._)(this,r))._track=e,n}return(0,f._)(r,e),(0,l._)(r,[{key:"_createDecoder",value:function(e,r){return(0,o._)(function(){var n,a,i,s;return(0,b._)(this,function(o){switch(o.label){case 0:return[4,this._track.canDecode()];case 1:if(!o.sent())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");return n=this._track.codec,a=this._track.rotation,[4,this._track.getDecoderConfig()];case 2:return i=o.sent(),s=this._track.timeResolution,(0,T.assert)(n&&i),[2,new F(e,r,n,i,a,s)]}})}).call(this)}},{key:"_createPacketSink",value:function(){return new A(this._track)}},{key:"getSample",value:function(e){return(0,o._)(function(){var r,n,a,i,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:P(e),r=!1,n=!1,u.label=1;case 1:u.trys.push([1,6,7,12]),i=(0,s._)(this.mediaSamplesAtTimestamps([e])),u.label=2;case 2:return[4,i.next()];case 3:if(!(r=!(o=u.sent()).done))return[3,5];return[2,o.value];case 4:return r=!1,[3,2];case 5:return[3,12];case 6:return c=u.sent(),n=!0,a=c,[3,12];case 7:if(u.trys.push([7,,10,11]),!(r&&null!=i.return))return[3,9];return[4,i.return()];case 8:u.sent(),u.label=9;case 9:return[3,11];case 10:if(n)throw a;return[7];case 11:return[7];case 12:throw Error("Internal error: Iterator returned nothing.")}})}).call(this)}},{key:"samples",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return this.mediaSamplesInRange(e,r)}},{key:"samplesAtTimestamps",value:function(e){return this.mediaSamplesAtTimestamps(e)}}]),r}(M),O=function(){"use strict";function e(r){var n,a,i,s,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((0,u._)(this,e),this._nextCanvasIndex=0,!(r instanceof S.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(o&&(void 0===o?"undefined":(0,g._)(o))!=="object")throw TypeError("options must be an object.");if(void 0!==o.alpha&&"boolean"!=typeof o.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==o.width&&(!Number.isInteger(o.width)||o.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==o.height&&(!Number.isInteger(o.height)||o.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==o.fit&&!["fill","contain","cover"].includes(o.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==o.width&&void 0!==o.height&&void 0===o.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==o.rotation&&![0,90,180,270].includes(o.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==o.crop&&(0,E.validateCropRectangle)(o.crop,"options."),void 0!==o.poolSize&&("number"!=typeof o.poolSize||!Number.isInteger(o.poolSize)||o.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");var c=null!=(n=o.rotation)?n:r.rotation,l=(0,p._)(c%180==0?[r.codedWidth,r.codedHeight]:[r.codedHeight,r.codedWidth],2),d=l[0],f=l[1],h=o.crop;h&&(0,E.clampCropRectangle)(h,d,f);var m=(0,p._)(h?[h.width,h.height]:[d,f],2),b=m[0],k=m[1],_=b/k;void 0!==o.width&&void 0===o.height?k=Math.round((b=o.width)/_):void 0===o.width&&void 0!==o.height?b=Math.round((k=o.height)*_):void 0!==o.width&&void 0!==o.height&&(b=o.width,k=o.height),this._videoTrack=r,this._alpha=null!=(a=o.alpha)&&a,this._width=b,this._height=k,this._rotation=c,this._crop=h,this._fit=null!=(i=o.fit)?i:"fill",this._videoSampleSink=new U(r),this._canvasPool=Array.from({length:null!=(s=o.poolSize)?s:0},function(){return null})}return(0,l._)(e,[{key:"_videoSampleToWrappedCanvas",value:function(e){var r=this._canvasPool[this._nextCanvasIndex],n=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),n=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);var a=r.getContext("2d",{alpha:this._alpha||(0,T.isFirefox)()});(0,T.assert)(a),a.resetTransform(),n||(!this._alpha&&(0,T.isFirefox)()?(a.fillStyle="black",a.fillRect(0,0,this._width,this._height)):a.clearRect(0,0,this._width,this._height)),e.drawWithFit(a,{fit:this._fit,rotation:this._rotation,crop:this._crop});var i={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),i}},{key:"getCanvas",value:function(e){return(0,o._)(function(){var r;return(0,b._)(this,function(n){switch(n.label){case 0:return P(e),[4,this._videoSampleSink.getSample(e)];case 1:return[2,(r=n.sent())&&this._videoSampleToWrappedCanvas(r)]}})}).call(this)}},{key:"canvases",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return(0,T.mapAsyncGenerator)(this._videoSampleSink.samples(r,n),function(r){return e._videoSampleToWrappedCanvas(r)})}},{key:"canvasesAtTimestamps",value:function(e){var r=this;return(0,T.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),function(e){return e&&r._videoSampleToWrappedCanvas(e)})}}]),e}(),L=function(e){"use strict";function r(e,n,a,i){(0,u._)(this,r),(s=(0,c._)(this,r,[e,n])).decoder=null,s.customDecoder=null,s.customDecoderCallSerializer=new(0,T.CallSerializer),s.customDecoderQueueSize=0,s.currentTimestamp=null;var s,o=function(r){(null===s.currentTimestamp||Math.abs(r.timestamp-s.currentTimestamp)>=r.duration)&&(s.currentTimestamp=r.timestamp);var n=s.currentTimestamp;if(s.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();var a=i.sampleRate;r.setTimestamp(Math.round(n*a)/a),e(r)},l=y.customAudioDecoders.find(function(e){return e.supports(a,i)});return l?(s.customDecoder=new l,s.customDecoder.codec=a,s.customDecoder.config=i,s.customDecoder.onSample=function(e){if(!(e instanceof E.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");o(e)},s.customDecoderCallSerializer.call(function(){return s.customDecoder.init()})):(s.decoder=new AudioDecoder({output:function(e){try{o(new(0,E.AudioSample)(e))}catch(e){s.onError(e)}},error:n}),s.decoder.configure(i)),s}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){return this.customDecoder?this.customDecoderQueueSize:((0,T.assert)(this.decoder),this.decoder.decodeQueueSize)}},{key:"decode",value:function(e){var r=this;this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(function(){return r.customDecoder.decode(e)}).then(function(){return r.customDecoderQueueSize--})):((0,T.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}},{key:"flush",value:function(){var e=this;return this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.flush()}):((0,T.assert)(this.decoder),this.decoder.flush())}},{key:"close",value:function(){var e=this;this.customDecoder?this.customDecoderCallSerializer.call(function(){return e.customDecoder.close()}):((0,T.assert)(this.decoder),this.decoder.close())}}]),r}(B),N=function(e){"use strict";function r(e,n,a){(0,u._)(this,r),(i=(0,c._)(this,r,[e,n])).decoderConfig=a,i.currentTimestamp=null,(0,T.assert)(k.PCM_AUDIO_CODECS.includes(a.codec)),i.codec=a.codec;var i,s=(0,k.parsePcmCodec)(i.codec),o=s.dataType,l=s.sampleSize,d=s.littleEndian;switch(i.inputSampleSize=l,l){case 1:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint8(r)-128}:"signed"===o?i.readInputValue=function(e,r){return e.getInt8(r)}:"ulaw"===o?i.readInputValue=function(e,r){return(0,I.fromUlaw)(e.getUint8(r))}:"alaw"===o?i.readInputValue=function(e,r){return(0,I.fromAlaw)(e.getUint8(r))}:(0,T.assert)(!1);break;case 2:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint16(r,d)-32768}:"signed"===o?i.readInputValue=function(e,r){return e.getInt16(r,d)}:(0,T.assert)(!1);break;case 3:"unsigned"===o?i.readInputValue=function(e,r){return(0,T.getUint24)(e,r,d)-8388608}:"signed"===o?i.readInputValue=function(e,r){return(0,T.getInt24)(e,r,d)}:(0,T.assert)(!1);break;case 4:"unsigned"===o?i.readInputValue=function(e,r){return e.getUint32(r,d)-0x80000000}:"signed"===o?i.readInputValue=function(e,r){return e.getInt32(r,d)}:"float"===o?i.readInputValue=function(e,r){return e.getFloat32(r,d)}:(0,T.assert)(!1);break;case 8:"float"===o?i.readInputValue=function(e,r){return e.getFloat64(r,d)}:(0,T.assert)(!1);break;default:(0,T.assertNever)(l),(0,T.assert)(!1)}switch(l){case 1:"ulaw"===o||"alaw"===o?(i.outputSampleSize=2,i.outputFormat="s16",i.writeOutputValue=function(e,r,n){return e.setInt16(r,n,!0)}):(i.outputSampleSize=1,i.outputFormat="u8",i.writeOutputValue=function(e,r,n){return e.setUint8(r,n+128)});break;case 2:i.outputSampleSize=2,i.outputFormat="s16",i.writeOutputValue=function(e,r,n){return e.setInt16(r,n,!0)};break;case 3:i.outputSampleSize=4,i.outputFormat="s32",i.writeOutputValue=function(e,r,n){return e.setInt32(r,n<<8,!0)};break;case 4:i.outputSampleSize=4,"float"===o?(i.outputFormat="f32",i.writeOutputValue=function(e,r,n){return e.setFloat32(r,n,!0)}):(i.outputFormat="s32",i.writeOutputValue=function(e,r,n){return e.setInt32(r,n,!0)});break;case 8:i.outputSampleSize=4,i.outputFormat="f32",i.writeOutputValue=function(e,r,n){return e.setFloat32(r,n,!0)};break;default:(0,T.assertNever)(l),(0,T.assert)(!1)}return i}return(0,f._)(r,e),(0,l._)(r,[{key:"getDecodeQueueSize",value:function(){return 0}},{key:"decode",value:function(e){for(var r=(0,T.toDataView)(e.data),n=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,a=new ArrayBuffer(n*this.decoderConfig.numberOfChannels*this.outputSampleSize),i=new DataView(a),s=0;s=l)&&(this.currentTimestamp=e.timestamp);var d=this.currentTimestamp;this.currentTimestamp+=l;var f=new(0,E.AudioSample)({format:this.outputFormat,data:a,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:n,timestamp:d});this.onSample(f)}},{key:"flush",value:function(){return(0,o._)(function(){return(0,b._)(this,function(e){return[2]})})()}},{key:"close",value:function(){}}]),r}(B),z=function(e){"use strict";function r(e){var n;if((0,u._)(this,r),!(e instanceof S.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");return(n=(0,c._)(this,r))._track=e,n}return(0,f._)(r,e),(0,l._)(r,[{key:"_createDecoder",value:function(e,r){return(0,o._)(function(){var n,a;return(0,b._)(this,function(i){switch(i.label){case 0:return[4,this._track.canDecode()];case 1:if(!i.sent())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");return n=this._track.codec,[4,this._track.getDecoderConfig()];case 2:if(a=i.sent(),(0,T.assert)(n&&a),k.PCM_AUDIO_CODECS.includes(a.codec))return[2,new N(e,r,a)];return[2,new L(e,r,n,a)]}})}).call(this)}},{key:"_createPacketSink",value:function(){return new A(this._track)}},{key:"getSample",value:function(e){return(0,o._)(function(){var r,n,a,i,o,c;return(0,b._)(this,function(u){switch(u.label){case 0:P(e),r=!1,n=!1,u.label=1;case 1:u.trys.push([1,6,7,12]),i=(0,s._)(this.mediaSamplesAtTimestamps([e])),u.label=2;case 2:return[4,i.next()];case 3:if(!(r=!(o=u.sent()).done))return[3,5];return[2,o.value];case 4:return r=!1,[3,2];case 5:return[3,12];case 6:return c=u.sent(),n=!0,a=c,[3,12];case 7:if(u.trys.push([7,,10,11]),!(r&&null!=i.return))return[3,9];return[4,i.return()];case 8:u.sent(),u.label=9;case 9:return[3,11];case 10:if(n)throw a;return[7];case 11:return[7];case 12:throw Error("Internal error: Iterator returned nothing.")}})}).call(this)}},{key:"samples",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return this.mediaSamplesInRange(e,r)}},{key:"samplesAtTimestamps",value:function(e){return this.mediaSamplesAtTimestamps(e)}}]),r}(M),V=function(){"use strict";function e(r){if((0,u._)(this,e),!(r instanceof S.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new z(r)}return(0,l._)(e,[{key:"_audioSampleToWrappedArrayBuffer",value:function(e){var r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}},{key:"getBuffer",value:function(e){return(0,o._)(function(){var r;return(0,b._)(this,function(n){switch(n.label){case 0:return P(e),[4,this._audioSampleSink.getSample(e)];case 1:return[2,(r=n.sent())&&this._audioSampleToWrappedArrayBuffer(r)]}})}).call(this)}},{key:"buffers",value:function(){var e=this,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return(0,T.mapAsyncGenerator)(this._audioSampleSink.samples(r,n),function(r){return e._audioSampleToWrappedArrayBuffer(r)})}},{key:"buffersAtTimestamps",value:function(e){var r=this;return(0,T.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),function(e){return e&&r._audioSampleToWrappedArrayBuffer(e)})}}]),e}()},{"@swc/helpers/cjs/_async_iterator.cjs":"f3IhJ","@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_define_property.cjs":"ltU3W","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_object_spread_props.cjs":"3G1wX","@swc/helpers/cjs/_sliced_to_array.cjs":"gIQTH","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./codec.js":"fXWqW","./codec-data.js":"kWTYV","./custom-coder.js":"hAl48","./input.js":"3sapy","./input-track.js":"b22CJ","./misc.js":"j7iGm","./packet.js":"QfqGG","./pcm.js":"501Zr","./sample.js":"1oMH7","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3G1wX":[function(e,r,n,a){"use strict";n._=function(e,r){return r=null!=r?r:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):(function(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n.push.apply(n,a)}return n})(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))}),e}},{}],"3sapy":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Input",function(){return k}),i.export(n,"InputDisposedError",function(){return _});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_type_of.cjs"),f=e("@swc/helpers/cjs/_wrap_native_super.cjs"),h=e("@swc/helpers/cjs/_ts_generator.cjs"),m=e("./input-format.js"),p=e("./misc.js"),g=e("./reader.js"),b=e("./source.js");(0,p.polyfillSymbolDispose)();var k=function(){"use strict";function e(r){if((0,c._)(this,e),this._demuxerPromise=null,this._format=null,this._disposed=!1,!r||(void 0===r?"undefined":(0,d._)(r))!=="object")throw TypeError("options must be an object.");if(!Array.isArray(r.formats)||r.formats.some(function(e){return!(e instanceof m.InputFormat)}))throw TypeError("options.formats must be an array of InputFormat.");if(!(r.source instanceof b.Source))throw TypeError("options.source must be a Source.");if(r.source._disposed)throw Error("options.source must not be disposed.");this._formats=r.formats,this._source=r.source,this._reader=new(0,g.Reader)(r.source)}return(0,u._)(e,[{key:"disposed",get:function(){return this._disposed}},{key:"_getDemuxer",value:function(){var e;return null!=(e=this._demuxerPromise)?e:this._demuxerPromise=(0,s._)(function(){var e,r,n,a,i,s,o,c;return(0,h._)(this,function(u){switch(u.label){case 0:return e=this._reader,[4,this._source.getSizeOrNull()];case 1:e.fileSize=u.sent(),r=!0,n=!1,a=void 0,u.label=2;case 2:u.trys.push([2,7,8,9]),i=this._formats[Symbol.iterator](),u.label=3;case 3:if(r=(s=i.next()).done)return[3,6];return[4,(o=s.value)._canReadInput(this)];case 4:if(u.sent())return this._format=o,[2,o._createDemuxer(this)];u.label=5;case 5:return r=!0,[3,3];case 6:return[3,9];case 7:return c=u.sent(),n=!0,a=c,[3,9];case 8:try{r||null==i.return||i.return()}finally{if(n)throw a}return[7];case 9:throw Error("Input has an unsupported or unrecognizable format.")}})}).call(this)}},{key:"source",get:function(){return this._source}},{key:"getFormat",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this._getDemuxer()];case 1:return e.sent(),(0,p.assert)(this._format),[2,this._format]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this._getDemuxer()];case 1:return[2,e.sent().computeDuration()]}})}).call(this)}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this._getDemuxer()];case 1:return[2,e.sent().getTracks()]}})}).call(this)}},{key:"getVideoTracks",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this.getTracks()];case 1:return[2,e.sent().filter(function(e){return e.isVideoTrack()})]}})}).call(this)}},{key:"getAudioTracks",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this.getTracks()];case 1:return[2,e.sent().filter(function(e){return e.isAudioTrack()})]}})}).call(this)}},{key:"getPrimaryVideoTrack",value:function(){return(0,s._)(function(){var e;return(0,h._)(this,function(r){switch(r.label){case 0:return[4,this.getTracks()];case 1:return[2,null!=(e=r.sent().find(function(e){return e.isVideoTrack()}))?e:null]}})}).call(this)}},{key:"getPrimaryAudioTrack",value:function(){return(0,s._)(function(){var e;return(0,h._)(this,function(r){switch(r.label){case 0:return[4,this.getTracks()];case 1:return[2,null!=(e=r.sent().find(function(e){return e.isAudioTrack()}))?e:null]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this._getDemuxer()];case 1:return[2,e.sent().getMimeType()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){return(0,h._)(this,function(e){switch(e.label){case 0:return[4,this._getDemuxer()];case 1:return[2,e.sent().getMetadataTags()]}})}).call(this)}},{key:"dispose",value:function(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}},{key:Symbol.dispose,value:function(){this.dispose()}}]),e}(),_=function(e){"use strict";function r(){var e,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Input has been disposed.";return(0,c._)(this,r),(e=(0,o._)(this,r,[n])).name="InputDisposedError",e}return(0,l._)(r,e),r}((0,f._)(Error))},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@swc/helpers/cjs/_wrap_native_super.cjs":"j8pRR","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","./input-format.js":"1jhAI","./misc.js":"j7iGm","./reader.js":"8KRfO","./source.js":"7vKle","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],j8pRR:[function(e,r,n,a){"use strict";var i=e("c8857d56f4968279"),s=e("2ed7bdf1701f2d07"),o=e("5c5ad8846076b9cd"),c=e("2db6fa09e8a5be4c");function u(e){var r="function"==typeof Map?new Map:void 0;return n._=u=function(e){if(null===e||!o._(e))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(e))return r.get(e);r.set(e,n)}function n(){return i._(e,arguments,s._(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c._(n,e)},u(e)}n._=u},{c8857d56f4968279:"bC52X","2ed7bdf1701f2d07":"NOGHw","5c5ad8846076b9cd":"1mpbk","2db6fa09e8a5be4c":"7ubVA"}],bC52X:[function(e,r,n,a){"use strict";var i=e("62fc231ae2e75266"),s=e("3f98bf9d4f706151");function o(e,r,a){return i._()?n._=o=Reflect.construct:n._=o=function(e,r,n){var a=[null];a.push.apply(a,r);var i=new(Function.bind.apply(e,a));return n&&s._(i,n.prototype),i},o.apply(null,arguments)}n._=o},{"62fc231ae2e75266":"83nDe","3f98bf9d4f706151":"7ubVA"}],"1mpbk":[function(e,r,n,a){"use strict";n._=function(e){return -1!==Function.toString.call(e).indexOf("[native code]")}},{}],"8KRfO":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Reader",function(){return l}),i.export(n,"FileSlice",function(){return d}),i.export(n,"readBytes",function(){return h}),i.export(n,"readU8",function(){return m}),i.export(n,"readU16",function(){return p}),i.export(n,"readU16Be",function(){return g}),i.export(n,"readU24Be",function(){return b}),i.export(n,"readI16Be",function(){return k}),i.export(n,"readU32",function(){return _}),i.export(n,"readU32Be",function(){return y}),i.export(n,"readU32Le",function(){return w}),i.export(n,"readI32Be",function(){return S}),i.export(n,"readI32Le",function(){return T}),i.export(n,"readU64",function(){return x}),i.export(n,"readU64Be",function(){return I}),i.export(n,"readI64Be",function(){return E}),i.export(n,"readI64Le",function(){return j}),i.export(n,"readF32Be",function(){return P}),i.export(n,"readF64Be",function(){return C}),i.export(n,"readAscii",function(){return A});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_create_class.cjs"),c=e("./input.js"),u=e("./misc.js"),l=function(){"use strict";function e(r){(0,s._)(this,e),this.source=r}return(0,o._)(e,[{key:"requestSlice",value:function(e,r){if(this.source._disposed)throw new(0,c.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;var n=e+r,a=this.source._read(e,n);return a instanceof Promise?a.then(function(r){return r?new d(r.bytes,r.view,r.offset,e,n):null}):a?new d(a.bytes,a.view,a.offset,e,n):null}},{key:"requestSliceRange",value:function(e,r,n){var a=this;if(this.source._disposed)throw new(0,c.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,u.clamp)(this.fileSize-e,r,n));var i=this.requestSlice(e,n),s=function(i){if(i)return i;var s=function(i){return(0,u.assert)(null!==i),a.requestSlice(e,(0,u.clamp)(i-e,r,n))},o=a.source._retrieveSize();return o instanceof Promise?o.then(s):s(o)};return i instanceof Promise?i.then(s):s(i)}}]),e}(),d=function(){"use strict";function e(r,n,a,i,o){(0,s._)(this,e),this.bytes=r,this.view=n,this.offset=a,this.start=i,this.end=o,this.bufferPos=i-a}return(0,o._)(e,[{key:"length",get:function(){return this.end-this.start}},{key:"filePos",get:function(){return this.offset+this.bufferPos},set:function(e){this.bufferPos=e-this.offset}},{key:"remainingLength",get:function(){return Math.max(this.end-this.filePos,0)}},{key:"skip",value:function(e){this.bufferPos+=e}},{key:"slice",value:function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.end-r;if(rthis.end)throw RangeError("Slicing outside of original slice.");return new e(this.bytes,this.view,this.offset,r,r+n)}}],[{key:"tempFromBytes",value:function(r){return new e(r,(0,u.toDataView)(r),0,0,r.length)}}]),e}(),f=function(e,r){if(e.filePose.end)throw RangeError("Tried reading [".concat(e.filePos,", ").concat(e.filePos+r,"), but slice is")+" [".concat(e.start,", ").concat(e.end,"). This is likely an internal error, please report it alongside the file")+" that caused it.")},h=function(e,r){f(e,r);var n=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,n},m=function(e){return f(e,1),e.view.getUint8(e.bufferPos++)},p=function(e,r){f(e,2);var n=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,n},g=function(e){f(e,2);var r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},b=function(e){f(e,3);var r=(0,u.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},k=function(e){f(e,2);var r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},_=function(e,r){f(e,4);var n=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,n},y=function(e){f(e,4);var r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},w=function(e){f(e,4);var r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},S=function(e){f(e,4);var r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},T=function(e){f(e,4);var r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},x=function(e,r){var n,a;return r?(n=_(e,!0),a=_(e,!0)):(a=_(e,!1),n=_(e,!1)),0x100000000*a+n},I=function(e){return 0x100000000*y(e)+y(e)},E=function(e){return 0x100000000*S(e)+y(e)},j=function(e){var r=w(e);return 0x100000000*T(e)+r},P=function(e){f(e,4);var r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},C=function(e){f(e,8);var r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},A=function(e,r){f(e,r);for(var n="",a=0;a1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!i||(void 0===i?"undefined":(0,d._)(i))!=="object")throw TypeError("options must be an object.");if(void 0!==i.maxCacheSize&&(!(0,m.isNumber)(i.maxCacheSize)||i.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._readers=new WeakMap,n._blob=e,n._orchestrator=new j({maxCacheSize:null!=(a=i.maxCacheSize)?a:8388608,maxWorkerCount:4,runWorker:n._runWorker.bind(n),prefetchProfile:E.fileSystem}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){var e=this._blob.size;return this._orchestrator.fileSize=e,e}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l;return(0,f._)(this,function(d){switch(d.label){case 0:void 0===(r=this._readers.get(e))&&(r="stream"in this._blob&&!(0,m.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r)),d.label=1;case 1:if(!(e.currentPos1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),"string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!s||(void 0===s?"undefined":(0,d._)(s))!=="object")throw TypeError("options must be an object.");if(void 0!==s.requestInit&&(!s.requestInit||"object"!==(0,d._)(s.requestInit)))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==s.getRetryDelay&&"function"!=typeof s.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==s.maxCacheSize&&(!(0,m.isNumber)(s.maxCacheSize)||s.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==s.fetchFn&&"function"!=typeof s.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");return(n=(0,o._)(this,r))._existingResponses=new WeakMap,n._url=e,n._options=s,n._getRetryDelay=null!=(a=s.getRetryDelay)?a:w,n._orchestrator=new j({maxCacheSize:null!=(i=s.maxCacheSize)?i:0x4000000,maxWorkerCount:2,runWorker:n._runWorker.bind(n),prefetchProfile:E.network}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c;return(0,f._)(this,function(u){switch(u.label){case 0:return e=this,r=new AbortController,[4,(0,m.retriedFetch)(null!=(n=this._options.fetchFn)?n:fetch,this._url,(0,m.mergeRequestInit)(null!=(a=this._options.requestInit)?a:{},{headers:{Range:"bytes=0-"},signal:r.signal}),this._getRetryDelay,function(){return e._disposed})];case 1:if(!(i=u.sent()).ok)throw Error("Error fetching ".concat(String(this._url),": ").concat(i.status," ").concat(i.statusText));if(206===i.status)o=this._getTotalLengthFromRangeResponse(i),s=this._orchestrator.createWorker(0,Math.min(o,524288));else if(c=i.headers.get("Content-Length"))o=Number(c),s=this._orchestrator.createWorker(0,o),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error("HTTP response (status ".concat(i.status,") must surface Content-Length header."));return this._orchestrator.fileSize=o,this._existingResponses.set(s,{response:i,abortController:r}),this._orchestrator.runWorker(s),[2,o]}})}).call(this)}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l,p;return(0,f._)(this,function(g){switch(g.label){case 0:r=this,g.label=1;case 1:if(a=function(){var r,a,i,o,c,u,d;return(0,f._)(this,function(f){switch(f.label){case 0:if(e.currentPos>=e.targetPos||e.aborted)return s.abort(),e.running=!1,[2,{v:void 0}];i=void 0,f.label=1;case 1:return f.trys.push([1,3,,7]),[4,l.read()];case 2:return i=f.sent(),[3,7];case 3:if(o=f.sent(),n._disposed)throw o;if(null===(c=n._getRetryDelay(1,o,n._url)))return[3,5];return console.error("Error while reading response stream. Attempting to resume.",o),[4,new Promise(function(e){return setTimeout(e,1e3*c)})];case 4:return f.sent(),[2,"break"];case 5:throw o;case 6:return[3,7];case 7:if(e.aborted)return[2,"break"];if(u=i.done,d=i.value,u){if(e.currentPos>=e.targetPos)return n._orchestrator.forgetWorker(e),e.running=!1,[2,{v:void 0}];return[2,"break"]}return null==(r=(a=n).onread)||r.call(a,e.currentPos,e.currentPos+d.length),n._orchestrator.supplyWorkerData(e,d),[2]}})},i=this._existingResponses.get(e),this._existingResponses.delete(e),s=null==i?void 0:i.abortController,o=null==i?void 0:i.response,s)return[3,3];return s=new AbortController,[4,(0,m.retriedFetch)(null!=(c=this._options.fetchFn)?c:fetch,this._url,(0,m.mergeRequestInit)(null!=(u=this._options.requestInit)?u:{},{headers:{Range:"bytes=".concat(e.currentPos,"-")},signal:s.signal}),this._getRetryDelay,function(){return r._disposed})];case 2:o=g.sent(),g.label=3;case 3:if((0,m.assert)(o),!o.ok)throw Error("Error fetching ".concat(String(this._url),": ").concat(o.status," ").concat(o.statusText));if(e.currentPos>0&&206!==o.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!o.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");l=o.body.getReader(),g.label=4;case 4:return n=this,[5,(0,h._)(a())];case 5:if(p=g.sent(),"object"===(0,d._)(p))return[2,p.v];if("break"===p)return[3,6];return[3,4];case 6:if(e.aborted)return[3,7];return[3,1];case 7:return e.running=!1,[2]}})}).call(this)}},{key:"_getTotalLengthFromRangeResponse",value:function(e){var r=e.headers.get("Content-Range");if(r){var n=/\/(\d+)/.exec(r);if(n)return Number(n[1])}var a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}},{key:"_dispose",value:function(){this._orchestrator.dispose()}}]),r}(k),T=function(e){"use strict";function r(e){var n,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),"string"!=typeof e)throw TypeError("filePath must be a string.");if(!a||(void 0===a?"undefined":(0,d._)(a))!=="object")throw TypeError("options must be an object.");if(void 0!==a.maxCacheSize&&(!(0,m.isNumber)(a.maxCacheSize)||a.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._fileHandle=null,n._streamSource=new x({getSize:function(){return(0,s._)(function(){return(0,f._)(this,function(r){switch(r.label){case 0:return[4,b.fs.open(e,"r")];case 1:return n._fileHandle=r.sent(),[4,n._fileHandle.stat()];case 2:return[2,r.sent().size]}})})()},read:function(e,r){return(0,s._)(function(){var a;return(0,f._)(this,function(i){switch(i.label){case 0:return(0,m.assert)(n._fileHandle),a=new Uint8Array(r-e),[4,n._fileHandle.read(a,0,r-e,e)];case 1:return i.sent(),[2,a]}})})()},maxCacheSize:a.maxCacheSize,prefetchProfile:"fileSystem"}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_read",value:function(e,r){return this._streamSource._read(e,r)}},{key:"_retrieveSize",value:function(){return this._streamSource._retrieveSize()}},{key:"_dispose",value:function(){var e;this._streamSource._dispose(),null==(e=this._fileHandle)||e.close(),this._fileHandle=null}}]),r}(k),x=function(e){"use strict";function r(e){var n,a,i;if((0,c._)(this,r),!e||(void 0===e?"undefined":(0,d._)(e))!=="object")throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,m.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");return(n=(0,o._)(this,r))._options=e,n._orchestrator=new j({maxCacheSize:null!=(a=e.maxCacheSize)?a:8388608,maxWorkerCount:2,prefetchProfile:E[null!=(i=e.prefetchProfile)?i:"none"],runWorker:n._runWorker.bind(n)}),n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){var e=this,r=this._options.getSize();if(r instanceof Promise)return r.then(function(r){if(!Number.isInteger(r)||r<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return e._orchestrator.fileSize=r,r});if(!Number.isInteger(r)||r<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=r,r}},{key:"_read",value:function(e,r){return this._orchestrator.read(e,r)}},{key:"_runWorker",value:function(e){return(0,s._)(function(){var r,n,a,i,s,o,c,u,l,d,h,p;return(0,f._)(this,function(f){switch(f.label){case 0:if(!(e.currentPos1&&void 0!==arguments[1]?arguments[1]:{};if((0,c._)(this,r),!(e instanceof ReadableStream))throw TypeError("stream must be a ReadableStream.");if(!i||(void 0===i?"undefined":(0,d._)(i))!=="object")throw TypeError("options must be an object.");if(void 0!==i.maxCacheSize&&(!(0,m.isNumber)(i.maxCacheSize)||i.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");return(n=(0,o._)(this,r))._reader=null,n._cache=[],n._pendingSlices=[],n._currentIndex=0,n._targetIndex=0,n._maxRequestedIndex=0,n._endIndex=null,n._pulling=!1,n._stream=e,n._maxCacheSize=null!=(a=i.maxCacheSize)?a:0x1000000,n}return(0,l._)(r,e),(0,u._)(r,[{key:"_retrieveSize",value:function(){return this._endIndex}},{key:"_read",value:function(e,r){var n=this;if(null!==this._endIndex&&r>this._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);var a=(0,m.binarySearchLessOrEqual)(this._cache,e,function(e){return e.start}),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};var s=e,o=new Uint8Array(r-e);if(-1!==a)for(var c=a;c=r)break;var l=Math.max(e,u.start);l>s&&this._throwDueToCacheMiss();var d=Math.min(r,u.end);ls&&this._throwDueToCacheMiss();var f=(0,m.promiseWithResolvers)(),h=f.promise,p=f.resolve,g=f.reject;return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:p,reject:g}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(function(e){if(n._pulling=!1,n._pendingSlices.length>0)n._pendingSlices.forEach(function(r){return r.reject(e)}),n._pendingSlices.length=0;else throw e})),h}},{key:"_throwDueToCacheMiss",value:function(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}},{key:"_pull",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c,u,l,d,h,p,g,b;return(0,f._)(this,function(f){switch(f.label){case 0:null!=this._reader||(this._reader=this._stream.getReader()),f.label=1;case 1:if(!(this._currentIndex0&&(b=this._cache[0],!(this._maxRequestedIndex-b.end<=this._maxCacheSize));)this._cache.shift();return this._currentIndex+=n.byteLength,[3,1];case 3:return this._pulling=!1,[2]}})}).call(this)}},{key:"_dispose",value:function(){this._pendingSlices.length=0,this._cache.length=0}}]),r}(k),E={none:function(e,r){return{start:e,end:r}},fileSystem:function(e,r){return{start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}},network:function(e,r,n){e=Math.max(0,65536*Math.floor((e-65536)/65536));var a=!0,i=!1,s=void 0;try{for(var o,c=n[Symbol.iterator]();!(a=(o=c.next()).done);a=!0){var u=o.value,l=Math.max((u.startPos+u.targetPos)/2,u.targetPos-8388608);if((0,m.closedIntervalsOverlap)(e,r,l,u.targetPos)){var d=u.targetPos-u.startPos,f=8388608*Math.ceil((d+1)/8388608),h=Math.pow(2,Math.ceil(Math.log2(d+1))),p=Math.min(h,f);r=Math.max(r,u.startPos+p)}}}catch(e){i=!0,s=e}finally{try{a||null==c.return||c.return()}finally{if(i)throw s}}return r=Math.max(r,e+524288),{start:e,end:r}}},j=function(){"use strict";function e(r){(0,c._)(this,e),this.options=r,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}return(0,u._)(e,[{key:"read",value:function(e,r){(0,m.assert)(null!==this.fileSize);var n=this.options.prefetchProfile(e,r,this.workers),a=Math.max(n.start,0),i=Math.min(n.end,this.fileSize);(0,m.assert)(a<=e&&r<=i);var s=null,o=(0,m.binarySearchLessOrEqual)(this.cache,e,function(e){return e.start}),c=-1!==o?this.cache[o]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,s={bytes:c.bytes,view:c.view,offset:c.start});var u=(0,m.binarySearchLessOrEqual)(this.cache,a,function(e){return e.start}),l=s?null:new Uint8Array(r-e),d=0,f=a,h=[];if(-1!==u){for(var p=u;p=i)break;if(!(g.end<=a)){var b=Math.max(a,g.start),k=Math.min(i,g.end);if((0,m.assert)(b<=k),f=l.length&&(s={bytes:l,view:(0,m.toDataView)(l),offset:e}),0===h.length)return(0,m.assert)(s),s;var S=(0,m.promiseWithResolvers)(),T=S.promise,x=S.resolve,I=S.reject,E=[],j=!0,P=!1,C=void 0;try{for(var A,B=h[Symbol.iterator]();!(j=(A=B.next()).done);j=!0){var M=A.value,D=Math.max(e,M.start),F=Math.min(r,M.end);D===M.start&&F===M.end?E.push(M):Dthis.options.maxWorkerCount;){for(var a=0,i=this.workers[0],s=1;s0)break;i.aborted=!0,this.workers.splice(a,1)}return n}},{key:"runWorker",value:function(e){(0,m.assert)(!e.running),(0,m.assert)(e.currentPos0)e.pendingSlices.forEach(function(e){return e.reject(r)}),e.pendingSlices.length=0;else throw r})}},{key:"supplyWorkerData",value:function(e,r){(0,m.assert)(!e.aborted);var n=e.currentPos,a=n+r.length;this.insertIntoCache({start:n,end:a,bytes:r,view:(0,m.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(var i=0;il.start&&(l.start=a),l.end<=l.start&&(s.holes.splice(u,1),u--)}0===s.holes.length&&(s.resolve(s.bytes),e.pendingSlices.splice(i,1),i--)}for(var d=0;d0){var n=this.cache[r-1];if(n.end>=e.end)return;if(n.end>e.start){var a=new Uint8Array(e.end-n.start);a.set(n.bytes,0),a.set(e.bytes,e.start-n.start),this.currentCacheSize+=e.end-n.end,n.bytes=a,n.view=(0,m.toDataView)(a),n.end=e.end,r--,e=n}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(var i=r+1;i=s.end){this.cache.splice(i,1),this.currentCacheSize-=s.bytes.length,i--;continue}var o=new Uint8Array(s.end-e.start);o.set(e.bytes,0),o.set(s.bytes,s.start-e.start),this.currentCacheSize-=e.end-s.start,e.bytes=o,e.view=(0,m.toDataView)(o),e.end=s.end,this.cache.splice(i,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){for(var c=0,u=this.cache[0],l=1;l4&&void 0!==arguments[4]?arguments[4]:-1,u=arguments.length>5?arguments[5]:void 0,d=arguments.length>6?arguments[6]:void 0;if((0,s._)(this,e),this.data=r,this.type=n,this.timestamp=a,this.duration=i,this.sequenceNumber=o,r===l&&void 0===u)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===u&&(u=r.byteLength),!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==n&&"delta"!==n)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(o))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(u)||u<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==d&&((void 0===d?"undefined":(0,c._)(d))!=="object"||!d))throw TypeError("sideData, when provided, must be an object.");if((null==d?void 0:d.alpha)!==void 0&&!(d.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if((null==d?void 0:d.alphaByteLength)!==void 0&&(!Number.isInteger(d.alphaByteLength)||d.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=u,this.sideData=null!=d?d:{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}return(0,o._)(e,[{key:"isMetadataOnly",get:function(){return this.data===l}},{key:"microsecondTimestamp",get:function(){return Math.trunc(u.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}},{key:"microsecondDuration",get:function(){return Math.trunc(u.SECOND_TO_MICROSECOND_FACTOR*this.duration)}},{key:"toEncodedVideoChunk",value:function(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"alphaToEncodedVideoChunk",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.type;if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"toEncodedAudioChunk",value:function(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}},{key:"clone",value:function(r){var n,a;if(void 0!==r&&((void 0===r?"undefined":(0,c._)(r))!=="object"||null===r))throw TypeError("options, when provided, must be an object.");if((null==r?void 0:r.timestamp)!==void 0&&!Number.isFinite(r.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if((null==r?void 0:r.duration)!==void 0&&!Number.isFinite(r.duration))throw TypeError("options.duration, when provided, must be a number.");return new e(this.data,this.type,null!=(n=null==r?void 0:r.timestamp)?n:this.timestamp,null!=(a=null==r?void 0:r.duration)?a:this.duration,this.sequenceNumber,this.byteLength)}}],[{key:"fromEncodedChunk",value:function(r,n){if(!(r instanceof EncodedVideoChunk||r instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");var a,i=new Uint8Array(r.byteLength);return r.copyTo(i),new e(i,r.type,r.timestamp/1e6,(null!=(a=r.duration)?a:0)/1e6,void 0,void 0,n)}}]),e}()},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_type_of.cjs":"iXhRw","./misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"501Zr":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"toUlaw",function(){return s}),i.export(n,"fromUlaw",function(){return o}),i.export(n,"toAlaw",function(){return c}),i.export(n,"fromAlaw",function(){return u});var s=function(e){var r=e,n=4096,a=0,i=12,s=0;for(r<0&&(r=-r,a=128),(r+=33)>8191&&(r=8191);(r&n)!==n&&i>=5;)n>>=1,i--;return s=r>>i-4&15,255&~(a|i-5<<4|s)},o=function(e){var r=0,n=0,a=~e;128&a&&(a&=-129,r=-1);var i=(1<<(n=((240&a)>>4)+5)|(15&a)<4095&&(s=4095);(s&r)!==r&&a>=5;)r>>=1,a--;return i=s>>(4===a?1:a-4)&15,(n|a-4<<4|i)^85},u=function(e){var r=0,n=0,a=85^e;128&a&&(a&=-129,r=-1);var i=0;return i=4!=(n=((240&a)>>4)+4)?1<=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),h=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-m>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),m=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));var g=function(){"use strict";function e(r,n){if((0,o._)(this,e),this._closed=!1,r instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&r instanceof SharedArrayBuffer||ArrayBuffer.isView(r)){if(!n||(void 0===n?"undefined":(0,l._)(n))!=="object")throw TypeError("init must be an object.");if(!("format"in n)||"string"!=typeof n.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(n.codedWidth)||n.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(n.codedHeight)||n.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==n.rotation&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(n.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==n.duration&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,f.toUint8Array)(r).slice(),this.format=n.format,this.codedWidth=n.codedWidth,this.codedHeight=n.codedHeight,this.rotation=null!=(a=n.rotation)?a:0,this.timestamp=n.timestamp,this.duration=null!=(i=n.duration)?i:0,this.colorSpace=new VideoColorSpace(n.colorSpace)}else if("undefined"!=typeof VideoFrame&&r instanceof VideoFrame){if((null==n?void 0:n.rotation)!==void 0&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if((null==n?void 0:n.timestamp)!==void 0&&!Number.isFinite(null==n?void 0:n.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if((null==n?void 0:n.duration)!==void 0&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=r,this.format=r.format,this.codedWidth=r.displayWidth,this.codedHeight=r.displayHeight,this.rotation=null!=(s=null==n?void 0:n.rotation)?s:0,this.timestamp=null!=(c=null==n?void 0:n.timestamp)?c:r.timestamp/1e6,this.duration=null!=(d=null==n?void 0:n.duration)?d:(null!=(u=r.duration)?u:0)/1e6,this.colorSpace=r.colorSpace}else if("undefined"!=typeof HTMLImageElement&&r instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&r instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&r instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&r instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&r instanceof OffscreenCanvas){if(!n||(void 0===n?"undefined":(0,l._)(n))!=="object")throw TypeError("init must be an object.");if(void 0!==n.rotation&&![0,90,180,270].includes(n.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(n.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==n.duration&&(!Number.isFinite(n.duration)||n.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new e(new VideoFrame(r,{timestamp:Math.trunc(n.timestamp*f.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((null!=(h=n.duration)?h:0)*f.SECOND_TO_MICROSECOND_FACTOR)||void 0}),n);var a,i,s,c,u,d,h,m,g,b=0,k=0;if("naturalWidth"in r?(b=r.naturalWidth,k=r.naturalHeight):"videoWidth"in r?(b=r.videoWidth,k=r.videoHeight):"width"in r&&(b=Number(r.width),k=Number(r.height)),!b||!k)throw TypeError("Could not determine dimensions.");var _=new OffscreenCanvas(b,k),y=_.getContext("2d",{alpha:(0,f.isFirefox)(),willReadFrequently:!0});(0,f.assert)(y),y.drawImage(r,0,0),this._data=_,this.format="RGBX",this.codedWidth=b,this.codedHeight=k,this.rotation=null!=(m=n.rotation)?m:0,this.timestamp=n.timestamp,this.duration=null!=(g=n.duration)?g:0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");null==p||p.register(this,{type:"video",data:this._data},this)}return(0,c._)(e,[{key:"displayWidth",get:function(){return this.rotation%180==0?this.codedWidth:this.codedHeight}},{key:"displayHeight",get:function(){return this.rotation%180==0?this.codedHeight:this.codedWidth}},{key:"microsecondTimestamp",get:function(){return Math.trunc(f.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}},{key:"microsecondDuration",get:function(){return Math.trunc(f.SECOND_TO_MICROSECOND_FACTOR*this.duration)}},{key:"hasAlpha",get:function(){return this.format&&this.format.includes("A")}},{key:"clone",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?new e(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new e(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new e(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}},{key:"close",value:function(){this._closed||(null==p||p.unregister(this),b(this._data)?this._data.close():this._data=null,this._closed=!0)}},{key:"allocationSize",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}},{key:"copyTo",value:function(e){return(0,s._)(function(){var r,n;return(0,d._)(this,function(a){switch(a.label){case 0:if(!(0,f.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,f.assert)(null!==this._data),!b(this._data))return[3,2];return[4,this._data.copyTo(e)];case 1:return a.sent(),[3,3];case 2:this._data instanceof Uint8Array?(0,f.toUint8Array)(e).set(this._data):(r=this._data.getContext("2d"),(0,f.assert)(r),n=r.getImageData(0,0,this.codedWidth,this.codedHeight),(0,f.toUint8Array)(e).set(n.data)),a.label=3;case 3:return[2]}})}).call(this)}},{key:"toVideoFrame",value:function(){if(this._closed)throw Error("VideoSample is closed.");return((0,f.assert)(null!==this._data),b(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}},{key:"draw",value:function(e,r,n,a,i,s,o,c,u){var l,d=0,f=0,h=this.displayWidth,m=this.displayHeight,p=0,g=0,b=this.displayWidth,k=this.displayHeight;if(void 0!==s?(d=r,f=n,h=a,m=i,p=s,g=o,void 0!==c?(b=c,k=u):(b=h,k=m)):(p=r,g=n,void 0!==a&&(b=a,k=i)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(f))throw TypeError("sy must be a number.");if(!Number.isFinite(h)||h<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(m)||m<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(g))throw TypeError("dy must be a number.");if(!Number.isFinite(b)||b<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");d=(l=this._rotateSourceRegion(d,f,h,m,this.rotation)).sx,f=l.sy,h=l.sWidth,m=l.sHeight;var _=this.toCanvasImageSource();e.save();var y=p+b/2,w=g+k/2;e.translate(y,w),e.rotate(this.rotation*Math.PI/180);var S=this.rotation%180==0?1:b/k;e.scale(1/S,S),e.drawImage(_,d,f,h,m,-b/2,-k/2,b,k),e.restore()}},{key:"drawWithFit",value:function(e,r){if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&_(r.crop,"options.");var n,a,i,s,o,c,d,f,h,m,p,g,b,y=e.canvas.width,w=e.canvas.height,S=null!=(o=r.rotation)?o:this.rotation,T=(0,u._)(S%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth],2),x=T[0],I=T[1];r.crop&&k(r.crop,x,I);var E=this._rotateSourceRegion(null!=(m=null==(n=r.crop)?void 0:n.left)?m:0,null!=(p=null==(a=r.crop)?void 0:a.top)?p:0,null!=(g=null==(i=r.crop)?void 0:i.width)?g:x,null!=(b=null==(s=r.crop)?void 0:s.height)?b:I,S),j=E.sx,P=E.sy,C=E.sWidth,A=E.sHeight;if("fill"===r.fit)c=0,d=0,f=y,h=w;else{var B=(0,u._)(r.crop?[r.crop.width,r.crop.height]:[x,I],2),M=B[0],D=B[1],F="contain"===r.fit?Math.min(y/M,w/D):Math.max(y/M,w/D);f=M*F,h=D*F,c=(y-f)/2,d=(w-h)/2}e.save();var R=S%180==0?1:f/h;e.translate(y/2,w/2),e.rotate(S*Math.PI/180),e.scale(1/R,R),e.translate(-y/2,-w/2),e.drawImage(this.toCanvasImageSource(),j,P,C,A,c,d,f,h),e.restore()}},{key:"_rotateSourceRegion",value:function(e,r,n,a,i){var s,o,c;return 90===i?(e=(s=[r,this.codedHeight-e-n,a,n])[0],r=s[1],n=s[2],a=s[3]):180===i?(e=(o=[this.codedWidth-e-n,this.codedHeight-r-a])[0],r=o[1]):270===i&&(e=(c=[this.codedWidth-r-a,e,a,n])[0],r=c[1],n=c[2],a=c[3]),{sx:e,sy:r,sWidth:n,sHeight:a}}},{key:"toCanvasImageSource",value:function(){if(this._closed)throw Error("VideoSample is closed.");if((0,f.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;var e=this.toVideoFrame();return queueMicrotask(function(){return e.close()}),e}},{key:"setRotation",value:function(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}},{key:"setTimestamp",value:function(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}},{key:"setDuration",value:function(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}},{key:Symbol.dispose,value:function(){this.close()}}]),e}(),b=function(e){return"undefined"!=typeof VideoFrame&&e instanceof VideoFrame},k=function(e,r,n){e.left=Math.min(e.left,r),e.top=Math.min(e.top,n),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,n-e.top),(0,f.assert)(e.width>=0),(0,f.assert)(e.height>=0)},_=function(e,r){if(!e||(void 0===e?"undefined":(0,l._)(e))!=="object")throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},y=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]),w=function(){"use strict";function e(r){if((0,o._)(this,e),this._closed=!1,E(r)){if(null===r.format)throw TypeError("AudioData with null format is not supported.");this._data=r,this.format=r.format,this.sampleRate=r.sampleRate,this.numberOfFrames=r.numberOfFrames,this.numberOfChannels=r.numberOfChannels,this.timestamp=r.timestamp/1e6,this.duration=r.numberOfFrames/r.sampleRate}else{if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("Invalid AudioDataInit: must be an object.");if(!y.has(r.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(r.sampleRate)||r.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(r.numberOfChannels)||0===r.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(null==r?void 0:r.timestamp))throw TypeError("init.timestamp must be a number.");var n,a=r.data.byteLength/(S(r.format)*r.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=r.format,this.sampleRate=r.sampleRate,this.numberOfFrames=a,this.numberOfChannels=r.numberOfChannels,this.timestamp=r.timestamp,this.duration=a/r.sampleRate,r.data instanceof ArrayBuffer)n=new Uint8Array(r.data);else if(ArrayBuffer.isView(r.data))n=new Uint8Array(r.data.buffer,r.data.byteOffset,r.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");var i=this.numberOfFrames*this.numberOfChannels*S(this.format);if(n.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");var s=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-i;if(s>this.numberOfFrames-i)throw RangeError("frameCount out of range");var o=S(a),c=T(a);if(c&&e.planeIndex>=this.numberOfChannels||!c&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(c?s:s*this.numberOfChannels)*o}},{key:"copyTo",value:function(e,r){if(!(0,f.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||(void 0===r?"undefined":(0,l._)(r))!=="object")throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!y.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");var n=r.planeIndex,a=r.format,i=r.frameCount,s=r.frameOffset,o=null!=a?a:this.format;if(!o)throw Error("Destination format not determined");var c=this.numberOfFrames,u=this.numberOfChannels,d=null!=s?s:0;if(d>=c)throw RangeError("frameOffset out of range");var h=void 0!==i?i:c-d;if(h>c-d)throw RangeError("frameCount out of range");var m=S(o),p=T(o);if(p&&n>=u||!p&&0!==n)throw RangeError("planeIndex out of range");var g=p?h:h*u;if(e.byteLength0))return[3,3];for(h=0,f=new Float32Array(a*(l=Math.min(o,u)));h0;){for(var d=Math.min(o,u),f=new Float32Array(a*d),h=0;h0){var n=(0,s._)(new Set(e.codecStrings));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fSW0K:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_BOX_HEADER_SIZE",function(){return u}),i.export(n,"MAX_BOX_HEADER_SIZE",function(){return l}),i.export(n,"readBoxHeader",function(){return d}),i.export(n,"readFixed_16_16",function(){return f}),i.export(n,"readFixed_2_30",function(){return h}),i.export(n,"readIsomVariableInteger",function(){return m}),i.export(n,"readMetadataStringShort",function(){return p}),i.export(n,"readDataBox",function(){return g});var s=e("../metadata.js"),o=e("../misc.js"),c=e("../reader.js"),u=8,l=16,d=function(e){var r=(0,c.readU32Be)(e),n=(0,c.readAscii)(e,4),a=8;1===r&&(r=(0,c.readU64Be)(e),a=16);var i=r-a;return i<0?null:{name:n,totalSize:r,headerSize:a,contentSize:i}},f=function(e){return(0,c.readI32Be)(e)/65536},h=function(e){return(0,c.readI32Be)(e)/0x40000000},m=function(e){for(var r=0,n=0;n<4;n++){r<<=7;var a=(0,c.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},p=function(e){var r=(0,c.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,c.readBytes)(e,r))},g=function(e){var r=d(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;var n=(0,c.readU32Be)(e);e.skip(4);var a=(0,c.readBytes)(e,r.contentSize-8);switch(n){case 1:return o.textDecoder.decode(a);case 2:return new TextDecoder("utf-16be").decode(a);case 13:return new(0,s.RichImageData)(a,"image/jpeg");case 14:return new(0,s.RichImageData)(a,"image/png");case 27:return new(0,s.RichImageData)(a,"image/bmp");default:return a}}},{"../metadata.js":"eSjom","../misc.js":"j7iGm","../reader.js":"8KRfO","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],eSjom:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"RichImageData",function(){return c}),i.export(n,"AttachedFile",function(){return u}),i.export(n,"validateMetadataTags",function(){return l}),i.export(n,"metadataTagsAreEmpty",function(){return d}),i.export(n,"DEFAULT_TRACK_DISPOSITION",function(){return f}),i.export(n,"validateTrackDisposition",function(){return h});var s=e("@swc/helpers/cjs/_class_call_check.cjs"),o=e("@swc/helpers/cjs/_type_of.cjs"),c=function e(r,n){"use strict";if((0,s._)(this,e),this.data=r,this.mimeType=n,!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof n)throw TypeError("mimeType must be a string.")},u=function e(r,n,a,i){"use strict";if((0,s._)(this,e),this.data=r,this.mimeType=n,this.name=a,this.description=i,!(r instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==n&&"string"!=typeof n)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")},l=function(e){if(!e||(void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");var r=!0,n=!1,a=void 0;try{for(var i,s=e.images[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var l=i.value;if(!l||(void 0===l?"undefined":(0,o._)(l))!=="object")throw TypeError("Each image in tags.images must be an object.");if(!(l.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof l.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(l.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!==(0,o._)(e.raw))throw TypeError("tags.raw, when provided, must be an object.");var d=!0,f=!1,h=void 0;try{for(var m,p=Object.values(e.raw)[Symbol.iterator]();!(d=(m=p.next()).done);d=!0){var g=m.value;if(null!==g&&"string"!=typeof g&&!(g instanceof Uint8Array)&&!(g instanceof c)&&!(g instanceof u))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}}catch(e){f=!0,h=e}finally{try{d||null==p.return||p.return()}finally{if(f)throw h}}}},d=function(e){return void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length)},f={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},h=function(e){if(!e||(void 0===e?"undefined":(0,o._)(e))!=="object")throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_type_of.cjs":"iXhRw","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fq2QE:[function(e,r,n,a){var i,s,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(n),o.export(n,"EBMLFloat32",function(){return g}),o.export(n,"EBMLFloat64",function(){return b}),o.export(n,"EBMLSignedInt",function(){return k}),o.export(n,"EBMLUnicodeString",function(){return _}),o.export(n,"EBMLId",function(){return s}),o.export(n,"LEVEL_0_EBML_IDS",function(){return y}),o.export(n,"LEVEL_1_EBML_IDS",function(){return w}),o.export(n,"LEVEL_0_AND_1_EBML_IDS",function(){return S}),o.export(n,"measureUnsignedInt",function(){return T}),o.export(n,"measureUnsignedBigInt",function(){return x}),o.export(n,"measureSignedInt",function(){return I}),o.export(n,"measureVarInt",function(){return E}),o.export(n,"EBMLWriter",function(){return j}),o.export(n,"MAX_VAR_INT_SIZE",function(){return P}),o.export(n,"MIN_HEADER_SIZE",function(){return C}),o.export(n,"MAX_HEADER_SIZE",function(){return A}),o.export(n,"readVarIntSize",function(){return B}),o.export(n,"readVarInt",function(){return M}),o.export(n,"readUnsignedInt",function(){return D}),o.export(n,"readUnsignedBigInt",function(){return F}),o.export(n,"readSignedInt",function(){return R}),o.export(n,"readElementId",function(){return U}),o.export(n,"readElementSize",function(){return O}),o.export(n,"readElementHeader",function(){return L}),o.export(n,"readAsciiString",function(){return N}),o.export(n,"readUnicodeString",function(){return z}),o.export(n,"readFloat",function(){return V}),o.export(n,"searchForNextElementId",function(){return H}),o.export(n,"resync",function(){return G}),o.export(n,"CODEC_STRING_MAP",function(){return q}),o.export(n,"assertDefinedSize",function(){return W});var c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_class_call_check.cjs"),l=e("@swc/helpers/cjs/_create_class.cjs"),d=e("@swc/helpers/cjs/_to_consumable_array.cjs"),f=e("@swc/helpers/cjs/_type_of.cjs"),h=e("@swc/helpers/cjs/_ts_generator.cjs"),m=e("../misc.js"),p=e("../reader.js"),g=function e(r){"use strict";(0,u._)(this,e),this.value=r},b=function e(r){"use strict";(0,u._)(this,e),this.value=r},k=function e(r){"use strict";(0,u._)(this,e),this.value=r},_=function e(r){"use strict";(0,u._)(this,e),this.value=r};(i=s||(s={}))[i.EBML=0x1a45dfa3]="EBML",i[i.EBMLVersion=17030]="EBMLVersion",i[i.EBMLReadVersion=17143]="EBMLReadVersion",i[i.EBMLMaxIDLength=17138]="EBMLMaxIDLength",i[i.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",i[i.DocType=17026]="DocType",i[i.DocTypeVersion=17031]="DocTypeVersion",i[i.DocTypeReadVersion=17029]="DocTypeReadVersion",i[i.Void=236]="Void",i[i.Segment=0x18538067]="Segment",i[i.SeekHead=0x114d9b74]="SeekHead",i[i.Seek=19899]="Seek",i[i.SeekID=21419]="SeekID",i[i.SeekPosition=21420]="SeekPosition",i[i.Duration=17545]="Duration",i[i.Info=0x1549a966]="Info",i[i.TimestampScale=2807729]="TimestampScale",i[i.MuxingApp=19840]="MuxingApp",i[i.WritingApp=22337]="WritingApp",i[i.Tracks=0x1654ae6b]="Tracks",i[i.TrackEntry=174]="TrackEntry",i[i.TrackNumber=215]="TrackNumber",i[i.TrackUID=29637]="TrackUID",i[i.TrackType=131]="TrackType",i[i.FlagEnabled=185]="FlagEnabled",i[i.FlagDefault=136]="FlagDefault",i[i.FlagForced=21930]="FlagForced",i[i.FlagOriginal=21934]="FlagOriginal",i[i.FlagHearingImpaired=21931]="FlagHearingImpaired",i[i.FlagVisualImpaired=21932]="FlagVisualImpaired",i[i.FlagCommentary=21935]="FlagCommentary",i[i.FlagLacing=156]="FlagLacing",i[i.Name=21358]="Name",i[i.Language=2274716]="Language",i[i.LanguageBCP47=2274717]="LanguageBCP47",i[i.CodecID=134]="CodecID",i[i.CodecPrivate=25506]="CodecPrivate",i[i.CodecDelay=22186]="CodecDelay",i[i.SeekPreRoll=22203]="SeekPreRoll",i[i.DefaultDuration=2352003]="DefaultDuration",i[i.Video=224]="Video",i[i.PixelWidth=176]="PixelWidth",i[i.PixelHeight=186]="PixelHeight",i[i.AlphaMode=21440]="AlphaMode",i[i.Audio=225]="Audio",i[i.SamplingFrequency=181]="SamplingFrequency",i[i.Channels=159]="Channels",i[i.BitDepth=25188]="BitDepth",i[i.SimpleBlock=163]="SimpleBlock",i[i.BlockGroup=160]="BlockGroup",i[i.Block=161]="Block",i[i.BlockAdditions=30113]="BlockAdditions",i[i.BlockMore=166]="BlockMore",i[i.BlockAdditional=165]="BlockAdditional",i[i.BlockAddID=238]="BlockAddID",i[i.BlockDuration=155]="BlockDuration",i[i.ReferenceBlock=251]="ReferenceBlock",i[i.Cluster=0x1f43b675]="Cluster",i[i.Timestamp=231]="Timestamp",i[i.Cues=0x1c53bb6b]="Cues",i[i.CuePoint=187]="CuePoint",i[i.CueTime=179]="CueTime",i[i.CueTrackPositions=183]="CueTrackPositions",i[i.CueTrack=247]="CueTrack",i[i.CueClusterPosition=241]="CueClusterPosition",i[i.Colour=21936]="Colour",i[i.MatrixCoefficients=21937]="MatrixCoefficients",i[i.TransferCharacteristics=21946]="TransferCharacteristics",i[i.Primaries=21947]="Primaries",i[i.Range=21945]="Range",i[i.Projection=30320]="Projection",i[i.ProjectionType=30321]="ProjectionType",i[i.ProjectionPoseRoll=30325]="ProjectionPoseRoll",i[i.Attachments=0x1941a469]="Attachments",i[i.AttachedFile=24999]="AttachedFile",i[i.FileDescription=18046]="FileDescription",i[i.FileName=18030]="FileName",i[i.FileMediaType=18016]="FileMediaType",i[i.FileData=18012]="FileData",i[i.FileUID=18094]="FileUID",i[i.Chapters=0x1043a770]="Chapters",i[i.Tags=0x1254c367]="Tags",i[i.Tag=29555]="Tag",i[i.Targets=25536]="Targets",i[i.TargetTypeValue=26826]="TargetTypeValue",i[i.TargetType=25546]="TargetType",i[i.TagTrackUID=25541]="TagTrackUID",i[i.TagEditionUID=25545]="TagEditionUID",i[i.TagChapterUID=25540]="TagChapterUID",i[i.TagAttachmentUID=25542]="TagAttachmentUID",i[i.SimpleTag=26568]="SimpleTag",i[i.TagName=17827]="TagName",i[i.TagLanguage=17530]="TagLanguage",i[i.TagString=17543]="TagString",i[i.TagBinary=17541]="TagBinary",i[i.ContentEncodings=28032]="ContentEncodings",i[i.ContentEncoding=25152]="ContentEncoding",i[i.ContentEncodingOrder=20529]="ContentEncodingOrder",i[i.ContentEncodingScope=20530]="ContentEncodingScope",i[i.ContentCompression=20532]="ContentCompression",i[i.ContentCompAlgo=16980]="ContentCompAlgo",i[i.ContentCompSettings=16981]="ContentCompSettings",i[i.ContentEncryption=20533]="ContentEncryption";var y=[s.EBML,s.Segment],w=[s.SeekHead,s.Info,s.Cluster,s.Tracks,s.Cues,s.Attachments,s.Chapters,s.Tags],S=(0,d._)(y).concat((0,d._)(w)),T=function(e){if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},x=function(e){if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},I=function(e){if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},E=function(e){if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x7ffffffff)return 5;else if(e<0x3ffffffffff)return 6;else throw Error("EBML varint size not supported "+e)},j=function(){"use strict";function e(r){(0,u._)(this,e),this.writer=r,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}return(0,l._)(e,[{key:"writeByte",value:function(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}},{key:"writeFloat32",value:function(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}},{key:"writeFloat64",value:function(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}},{key:"writeUnsignedInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:T(e),n=0;switch(r){case 6:this.helperView.setUint8(n++,e/0x10000000000|0);case 5:this.helperView.setUint8(n++,e/0x100000000|0);case 4:this.helperView.setUint8(n++,e>>24);case 3:this.helperView.setUint8(n++,e>>16);case 2:this.helperView.setUint8(n++,e>>8);case 1:this.helperView.setUint8(n++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,n))}},{key:"writeUnsignedBigInt",value:function(e){for(var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x(e),n=0,a=r-1;a>=0;a--)this.helperView.setUint8(n++,Number(e>>BigInt(8*a)&255n));this.writer.write(this.helper.subarray(0,n))}},{key:"writeSignedInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I(e);e<0&&(e+=Math.pow(2,8*r)),this.writeUnsignedInt(e,r)}},{key:"writeVarInt",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E(e),n=0;switch(r){case 1:this.helperView.setUint8(n++,128|e);break;case 2:this.helperView.setUint8(n++,64|e>>8),this.helperView.setUint8(n++,e);break;case 3:this.helperView.setUint8(n++,32|e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 4:this.helperView.setUint8(n++,16|e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 5:this.helperView.setUint8(n++,8|e/0x100000000&7),this.helperView.setUint8(n++,e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;case 6:this.helperView.setUint8(n++,4|e/0x10000000000&3),this.helperView.setUint8(n++,e/0x100000000|0),this.helperView.setUint8(n++,e>>24),this.helperView.setUint8(n++,e>>16),this.helperView.setUint8(n++,e>>8),this.helperView.setUint8(n++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,n))}},{key:"writeAsciiString",value:function(e){this.writer.write(new Uint8Array(e.split("").map(function(e){return e.charCodeAt(0)})))}},{key:"writeEBML",value:function(e){if(null!==e){var r=!0,n=!1,a=void 0;if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))try{for(var i,s=e[Symbol.iterator]();!(r=(i=s.next()).done);r=!0){var o=i.value;this.writeEBML(o)}}catch(e){n=!0,a=e}finally{try{r||null==s.return||s.return()}finally{if(n)throw a}}else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){var c,u=this.writer.getPos(),l=-1===e.size?1:null!=(c=e.size)?c:4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+l);var d=this.writer.getPos();if(this.dataOffsets.set(e,d),this.writeEBML(e.data),-1!==e.size){var h=this.writer.getPos()-d,p=this.writer.getPos();this.writer.seek(u),this.writeVarInt(h,l),this.writer.seek(p)}}else if("number"==typeof e.data){var y,w=null!=(y=e.size)?y:T(e.data);this.writeVarInt(w),this.writeUnsignedInt(e.data,w)}else if("bigint"===(0,f._)(e.data)){var S,E=null!=(S=e.size)?S:x(e.data);this.writeVarInt(E),this.writeUnsignedBigInt(e.data,E)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof g)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof b)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof k){var j,P=null!=(j=e.size)?j:I(e.data.value);this.writeVarInt(P),this.writeSignedInt(e.data.value,P)}else if(e.data instanceof _){var C=m.textEncoder.encode(e.data.value);this.writeVarInt(C.length),this.writer.write(C)}else(0,m.assertNever)(e.data)}}}]),e}(),P=8,C=2,A=16,B=function(e){var r=(0,p.readU8)(e);if(e.skip(-1),0===r)return null;for(var n=1,a=128;(r&a)==0;)n++,a>>=1;return n},M=function(e){var r=(0,p.readU8)(e);if(0===r)return null;for(var n=1,a=128;(r&a)==0;)n++,a>>=1;for(var i=r&a-1,s=1;s8)throw Error("Bad unsigned int size "+r);for(var n=0,a=0;as?a:s,found:!1}]}})})()},G=function(e,r,n,a){return(0,c._)(function(){var i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:i=65536,s=new Set(n),o=r,d.label=1;case 1:if(!(oU&&(U=H.cuePoints.length,R=H)}catch(e){L=!0,N=e}finally{try{O||null==z.return||z.return()}finally{if(L)throw N}}G=!0,q=!1,W=void 0;try{for(K=this.currentSegment.tracks[Symbol.iterator]();!(G=(X=K.next()).done);G=!0)Z=X.value,0===Z.cuePoints.length&&(Z.cuePoints=R.cuePoints)}catch(e){q=!0,W=e}finally{try{G||null==K.return||K.return()}finally{if(q)throw W}}return this.currentSegment=null,[2]}})}).call(this)}},{key:"readCluster",value:function(e,r){return(0,f._)(function(){var n,a,i,s,o,u,l,d,f,h,m,p,g,b,_,w,S,T,x,I,E,P,A,B,M;return(0,y._)(this,function(y){switch(y.label){case 0:if((null==(n=r.lastReadCluster)?void 0:n.elementStartPos)===e)return[2,r.lastReadCluster];if(!((a=this.reader.requestSliceRange(e,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,2];return[4,a];case 1:a=y.sent(),y.label=2;case 2:if((0,j.assert)(a),i=e,s=(0,C.readElementHeader)(a),(0,j.assert)(s),o=s.id,(0,j.assert)(o===C.EBMLId.Cluster),u=s.size,l=a.filePos,null!==u)return[3,4];return[4,(0,C.searchForNextElementId)(this.reader,l,C.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)];case 3:u=y.sent().pos-l,y.label=4;case 4:if(!((d=this.reader.requestSlice(l,u))instanceof Promise))return[3,6];return[4,d];case 5:d=y.sent(),y.label=6;case 6:f={segment:r,elementStartPos:i,elementEndPos:l+u,dataStartPos:l,timestamp:-1,trackData:new Map},this.currentCluster=f,d&&(f.elementEndPos=this.readContiguousElements(d,C.LEVEL_0_AND_1_EBML_IDS)),h=!0,m=!1,p=void 0;try{for(g=f.trackData[Symbol.iterator]();!(h=(b=g.next()).done);h=!0){for(w=(_=(0,k._)(b.value,2)[1]).track,(0,j.assert)(_.blocks.length>0),S=!1,T=0;T<_.blocks.length;T++)x=_.blocks[T],x.timestamp+=f.timestamp,S||(S=x.lacing!==c.None);for(I=0,_.presentationTimestamps=_.blocks.map(function(e,r){return{timestamp:e.timestamp,blockIndex:r}}).sort(function(e,r){return e.timestamp-r.timestamp});I<_.presentationTimestamps.length;I++)E=_.presentationTimestamps[I],P=_.blocks[E.blockIndex],null===_.firstKeyFrameTimestamp&&P.isKeyFrame&&(_.firstKeyFrameTimestamp=P.timestamp),I<_.presentationTimestamps.length-1?P.duration=_.presentationTimestamps[I+1].timestamp-P.timestamp:0===P.duration&&null!=w.defaultDuration&&P.lacing===c.None&&(P.duration=w.defaultDuration);S&&(this.expandLacedBlocks(_.blocks,w),_.presentationTimestamps=_.blocks.map(function(e,r){return{timestamp:e.timestamp,blockIndex:r}}).sort(function(e,r){return e.timestamp-r.timestamp})),A=_.blocks[_.presentationTimestamps[0].blockIndex],B=_.blocks[(0,j.last)(_.presentationTimestamps).blockIndex],_.startTimestamp=A.timestamp,_.endTimestamp=B.timestamp+B.duration,M=(0,j.binarySearchLessOrEqual)(w.clusterPositionCache,_.startTimestamp,function(e){return e.startTimestamp}),(-1===M||w.clusterPositionCache[M].elementStartPos!==i)&&w.clusterPositionCache.splice(M+1,0,{elementStartPos:f.elementStartPos,startTimestamp:_.startTimestamp})}}catch(e){m=!0,p=e}finally{try{h||null==g.return||g.return()}finally{if(m)throw p}}return r.lastReadCluster=f,[2,f]}})}).call(this)}},{key:"getTrackDataInCluster",value:function(e,r){var n=e.trackData.get(r);if(!n){var a=e.segment.tracks.find(function(e){return e.id===r});if(!a)return null;n={track:a,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,n)}return n}},{key:"expandLacedBlocks",value:function(e,r){for(var n=0;n0;eP.blocks.push({timestamp:eC,duration:0,isKeyFrame:eB,data:eM,lacing:eA>>1&3,decoded:!eD,mainAdditional:null});break;case C.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(f,d)),this.currentBlock=null;break;case C.EBMLId.Block:if(!this.currentCluster)break;var eF=(0,C.readVarInt)(e);if(null===eF)break;var eR=this.getTrackDataInCluster(this.currentCluster,eF);if(!eR)break;var eU=(0,B.readI16Be)(e),eO=(0,B.readU8)(e),eL=(0,B.readBytes)(e,d-(e.filePos-f)),eN=eR.track.decodingInstructions.length>0;this.currentBlock={timestamp:eU,duration:0,isKeyFrame:!0,data:eL,lacing:eO>>1&3,decoded:!eN,mainAdditional:null},eR.blocks.push(this.currentBlock);break;case C.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(f,d)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case C.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,B.readBytes)(e,d);break;case C.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case C.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.Targets:this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.TargetTypeValue:50!==(0,C.readUnsignedInt)(e,d)&&(this.currentTagTargetIsMovie=!1);break;case C.EBMLId.TagTrackUID:case C.EBMLId.TagEditionUID:case C.EBMLId.TagChapterUID:case C.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case C.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.TagName:this.currentSimpleTagName=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.TagString:if(!this.currentSimpleTagName)break;var ez=(0,C.readUnicodeString)(e,d);this.processTagValue(this.currentSimpleTagName,ez);break;case C.EBMLId.TagBinary:if(!this.currentSimpleTagName)break;var eV=(0,B.readBytes)(e,d);this.processTagValue(this.currentSimpleTagName,eV);break;case C.EBMLId.AttachedFile:if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(f,d));var eH=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(null!=eH.raw||(eH.raw={}),eH.raw[this.currentAttachedFile.fileUid.toString()]=new(0,E.AttachedFile)(this.currentAttachedFile.fileData,null!=(eq=this.currentAttachedFile.fileMediaType)?eq:void 0,null!=(eW=this.currentAttachedFile.fileName)?eW:void 0,null!=(eK=this.currentAttachedFile.fileDescription)?eK:void 0)),(null==(eG=this.currentAttachedFile.fileMediaType)?void 0:eG.startsWith("image/"))&&this.currentAttachedFile.fileData){var eG,eq,eW,eK,eX,eZ,eQ=this.currentAttachedFile.fileName,eY="unknown";if(eQ){var eJ=eQ.toLowerCase();eJ.startsWith("cover.")?eY="coverFront":eJ.startsWith("back.")&&(eY="coverBack")}null!=eH.images||(eH.images=[]),eH.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:eY,name:null!=(eX=this.currentAttachedFile.fileName)?eX:void 0,description:null!=(eZ=this.currentAttachedFile.fileDescription)?eZ:void 0})}this.currentAttachedFile=null;break;case C.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,C.readUnsignedBigInt)(e,d);break;case C.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,C.readAsciiString)(e,d);break;case C.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,B.readBytes)(e,d);break;case C.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,C.readUnicodeString)(e,d);break;case C.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(f,d)),this.currentTrack.decodingInstructions.sort(function(e,r){return r.order-e.order});break;case C.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:u.Block,data:null},this.readContiguousElements(e.slice(f,d)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case C.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:l.Zlib,settings:null},this.readContiguousElements(e.slice(f,d));break;case C.EBMLId.ContentCompAlgo:if((null==(a=this.currentDecodingInstruction)||null==(n=a.data)?void 0:n.type)!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,C.readUnsignedInt)(e,d);break;case C.EBMLId.ContentCompSettings:if((null==(s=this.currentDecodingInstruction)||null==(i=s.data)?void 0:i.type)!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,B.readBytes)(e,d);break;case C.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=f+d,!0}},{key:"decodeBlockData",value:function(e,r){(0,j.assert)(e.decodingInstructions.length>0);var n=r,a=!0,i=!1,s=void 0;try{for(var o,c=e.decodingInstructions[Symbol.iterator]();!(a=(o=c.next()).done);a=!0){var u=o.value;if((0,j.assert)(u.data),"decompress"===u.data.type&&u.data.algorithm===l.HeaderStripping&&u.data.settings&&u.data.settings.length>0){var d=u.data.settings,f=new Uint8Array(d.length+n.length);f.set(d,0),f.set(n,d.length),n=f}}}catch(e){i=!0,s=e}finally{try{a||null==c.return||c.return()}finally{if(i)throw s}}return n}},{key:"processTagValue",value:function(e,r){if(null==(a=this.currentSegment)?void 0:a.metadataTags){var n=this.currentSegment.metadataTags;if(null!=n.raw||(n.raw={}),null!=(i=n.raw)[e]||(i[e]=r),"string"==typeof r)switch(e.toLowerCase()){case"title":null!=n.title||(n.title=r);break;case"description":null!=n.description||(n.description=r);break;case"artist":null!=n.artist||(n.artist=r);break;case"album":null!=n.album||(n.album=r);break;case"album_artist":null!=n.albumArtist||(n.albumArtist=r);break;case"genre":null!=n.genre||(n.genre=r);break;case"comment":null!=n.comment||(n.comment=r);break;case"lyrics":null!=n.lyrics||(n.lyrics=r);break;case"date":var a,i,s=new Date(r);Number.isNaN(s.getTime())||null!=n.date||(n.date=s);break;case"track_number":case"part_number":var o=r.split("/"),c=Number.parseInt(o[0],10),u=o[1]&&Number.parseInt(o[1],10);Number.isInteger(c)&&c>0&&(null!=n.trackNumber||(n.trackNumber=c)),u&&Number.isInteger(u)&&u>0&&(null!=n.tracksTotal||(n.tracksTotal=u));break;case"disc_number":case"disc":var l=r.split("/"),d=Number.parseInt(l[0],10),f=l[1]&&Number.parseInt(l[1],10);Number.isInteger(d)&&d>0&&(null!=n.discNumber||(n.discNumber=d)),f&&Number.isInteger(f)&&f>0&&(null!=n.discsTotal||(n.discsTotal=f))}}}}]),r}(x.Demuxer),F=function(){"use strict";function e(r){(0,m._)(this,e),this.internalTrack=r,this.packetToClusterLocation=new WeakMap}return(0,p._)(e,[{key:"getId",value:function(){return this.internalTrack.id}},{key:"getCodec",value:function(){throw Error("Not implemented on base class.")}},{key:"getInternalCodecId",value:function(){return this.internalTrack.codecId}},{key:"computeDuration",value:function(){return(0,f._)(function(){var e,r,n;return(0,y._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return this.internalTrack.name}},{key:"getLanguageCode",value:function(){return this.internalTrack.languageCode}},{key:"getFirstTimestamp",value:function(){return(0,f._)(function(){var e,r;return(0,y._)(this,function(n){switch(n.label){case 0:return[4,this.getFirstPacket({metadataOnly:!0})];case 1:return[2,null!=(r=null==(e=n.sent())?void 0:e.timestamp)?r:0]}})}).call(this)}},{key:"getTimeResolution",value:function(){return this.internalTrack.segment.timestampFactor}},{key:"getDisposition",value:function(){return this.internalTrack.disposition}},{key:"getFirstPacket",value:function(e){return(0,f._)(function(){var r;return(0,y._)(this,function(n){return r=this,[2,this.performClusterLookup(null,function(e){return e.trackData.get(r.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,e)]})}).call(this)}},{key:"intoTimescale",value:function(e){return(0,j.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}},{key:"getPacket",value:function(e,r){return(0,f._)(function(){var n,a;return(0,y._)(this,function(i){return n=this,a=this.intoTimescale(e),[2,this.performClusterLookup(null,function(e){var r=e.trackData.get(n.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};var i=(0,j.binarySearchLessOrEqual)(r.presentationTimestamps,a,function(e){return e.timestamp});return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&aa.blockIndex});if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{var i=e.trackData.get(n.internalTrack.id);if(i&&null!==i.firstKeyFrameTimestamp){var s=i.blocks.findIndex(function(e){return e.isKeyFrame});return(0,j.assert)(-1!==s),{blockIndex:s,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)]})}).call(this)}},{key:"fetchPacketInCluster",value:function(e,r,n){return(0,f._)(function(){var a,i,s,o,c,u,l;return(0,y._)(this,function(d){return -1===r?[2,null]:(i=e.trackData.get(this.internalTrack.id).blocks[r],(0,j.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0),s=n.metadataOnly?P.PLACEHOLDER_DATA:i.data,o=i.timestamp/this.internalTrack.segment.timestampFactor,c=i.duration/this.internalTrack.segment.timestampFactor,u={},i.mainAdditional&&(null==(a=this.internalTrack.info)?void 0:a.type)==="video"&&this.internalTrack.info.alphaMode&&(u.alpha=n.metadataOnly?P.PLACEHOLDER_DATA:i.mainAdditional,u.alphaByteLength=i.mainAdditional.byteLength),l=new(0,P.EncodedPacket)(s,i.isKeyFrame?"key":"delta",o,c,e.dataStartPos+r,i.data.byteLength,u),this.packetToClusterLocation.set(l,{cluster:e,blockIndex:r}),[2,l])})}).call(this)}},{key:"performClusterLookup",value:function(e,r,n,a,i){return(0,f._)(function(){var s,o,c,u,l,d,f,h,m,p,g,b,k,_,w,S,T,x,I,E,P,A,B,M,D,F,R,U,O,L,N,z;return(0,y._)(this,function(y){switch(y.label){case 0:if(o=(s=this.internalTrack).demuxer,c=s.segment,u=null,l=null,d=-1,e){if(h=(f=r(e)).blockIndex,f.correctBlockFound)return[2,this.fetchPacketInCluster(e,h,i)];-1!==h&&(l=e,d=h)}p=-1!==(m=(0,j.binarySearchLessOrEqual)(this.internalTrack.cuePoints,n,function(e){return e.time}))?this.internalTrack.cuePoints[m]:null,b=-1!==(g=(0,j.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,n,function(e){return e.startTimestamp}))?this.internalTrack.clusterPositionCache[g]:null,w=Math.max(null!=(k=null==p?void 0:p.clusterPosition)?k:0,null!=(_=null==b?void 0:b.elementStartPos)?_:0)||null,e?null===w||e.elementStartPos>=w?(S=e.elementEndPos,u=e):S=w:S=null!=w?w:c.clusterSeekStartPos,y.label=1;case 1:if(!(null===c.elementEndPos||S<=c.elementEndPos-C.MIN_HEADER_SIZE)||u&&(T=u.trackData.get(this.internalTrack.id))&&T.startTimestamp>a)return[3,13];if(!((x=o.reader.requestSliceRange(S,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,3];return[4,x];case 2:x=y.sent(),y.label=3;case 3:if(!x)return[3,13];if(I=S,!(!(E=(0,C.readElementHeader)(x))||!C.LEVEL_1_EBML_IDS.includes(E.id)&&E.id!==C.EBMLId.Void))return[3,5];return[4,(0,C.resync)(o.reader,I,C.LEVEL_1_EBML_IDS,Math.min(null!=(P=c.elementEndPos)?P:1/0,I+0xa00000))];case 4:if(A=y.sent())return S=A,[3,1];return[3,13];case 5:if(B=E.id,M=E.size,D=x.filePos,B!==C.EBMLId.Cluster)return[3,7];return[4,o.readCluster(I,c)];case 6:if(M=(u=y.sent()).elementEndPos-D,R=(F=r(u)).blockIndex,F.correctBlockFound)return[2,this.fetchPacketInCluster(u,R,i)];-1!==R&&(l=u,d=R),y.label=7;case 7:if(null!==M)return[3,9];return(0,j.assert)(B!==C.EBMLId.Cluster),[4,(0,C.searchForNextElementId)(o.reader,D,C.LEVEL_0_AND_1_EBML_IDS,c.elementEndPos)];case 8:M=y.sent().pos-D,y.label=9;case 9:if(U=D+M,null!==c.elementEndPos)return[3,12];if(!((O=o.reader.requestSliceRange(U,C.MIN_HEADER_SIZE,C.MAX_HEADER_SIZE))instanceof Promise))return[3,11];return[4,O];case 10:O=y.sent(),y.label=11;case 11:if(!O)return[3,13];if((0,C.readElementId)(O)===C.EBMLId.Segment)return c.elementEndPos=U,[3,13];y.label=12;case 12:return S=U,[3,1];case 13:if(p&&(!l||l.elementStartPos0){var n=(0,s._)(new Set(e.codecStrings.filter(Boolean)));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],ifShX:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"Mp3Demuxer",function(){return S});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),h=e("../demuxer.js"),m=e("../input-track.js"),p=e("../metadata.js"),g=e("../misc.js"),b=e("../packet.js"),k=e("../../shared/mp3-misc.js"),_=e("../id3.js"),y=e("./mp3-reader.js"),w=e("../reader.js"),S=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).metadataPromise=null,n.firstFrameHeader=null,n.loadedSamples=[],n.metadataTags=null,n.tracks=[],n.readingMutex=new(0,g.AsyncMutex),n.lastSampleLoaded=!1,n.lastLoadedPos=0,n.nextTimestampInSamples=0,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"readMetadata",value:function(){return(0,s._)(function(){var e,r;return(0,f._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:if(!(!this.firstFrameHeader&&!this.lastSampleLoaded))return[3,2];return[4,this.advanceReader()];case 1:return e.sent(),[3,0];case 2:if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");return this.tracks=[new(0,m.InputAudioTrack)(this.input,new T(this))],[2]}})}).call(e)]})}).call(this)}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o,c,u;return(0,f._)(this,function(l){switch(l.label){case 0:if(0!==this.lastLoadedPos)return[3,4];l.label=1;case 1:if(!((e=this.reader.requestSlice(this.lastLoadedPos,_.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,3];return[4,e];case 2:e=l.sent(),l.label=3;case 3:if(!e)return this.lastSampleLoaded=!0,[2];if(!(r=(0,_.readId3V2Header)(e)))return[3,4];return this.lastLoadedPos=e.filePos+r.size,[3,1];case 4:return[4,(0,y.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize)];case 5:if(!(n=l.sent()))return this.lastSampleLoaded=!0,[2];if(a=n.header,this.lastLoadedPos=n.startPos+a.totalSize-1,i=(0,k.getXingOffset)(a.mpegVersionId,a.channel),!((s=this.reader.requestSlice(n.startPos+i,4))instanceof Promise))return[3,7];return[4,s];case 6:s=l.sent(),l.label=7;case 7:if(s&&((o=(0,w.readU32Be)(s))===k.XING||o===k.INFO))return[2];return this.firstFrameHeader||(this.firstFrameHeader=a),a.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn("MP3 changed sample rate mid-file: ".concat(this.firstFrameHeader.sampleRate," Hz to ").concat(a.sampleRate," Hz.")+" Might be a bug, so please report this file."),c=a.audioSamplesInFrame/this.firstFrameHeader.sampleRate,u={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:c,dataStart:n.startPos,dataSize:a.totalSize},this.loadedSamples.push(u),this.nextTimestampInSamples+=a.audioSamplesInFrame,[2]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,"audio/mpeg"]})})()}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,g.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){var e,r,n,a,i,s,o;return(0,f._)(this,function(c){switch(c.label){case 0:return[4,this.readingMutex.acquire()];case 1:e=c.sent(),c.label=2;case 2:return c.trys.push([2,,13,14]),[4,this.readMetadata()];case 3:if(c.sent(),this.metadataTags)return[2,this.metadataTags];this.metadataTags={},r=0,n=!1,c.label=4;case 4:if(!((a=this.reader.requestSlice(r,_.ID3_V2_HEADER_SIZE))instanceof Promise))return[3,6];return[4,a];case 5:a=c.sent(),c.label=6;case 6:if(!a||!(i=(0,_.readId3V2Header)(a)))return[3,9];if(n=!0,!((s=this.reader.requestSlice(a.filePos,i.size))instanceof Promise))return[3,8];return[4,s];case 7:s=c.sent(),c.label=8;case 8:if(!s)return[3,9];return(0,_.parseId3V2Tag)(s,i,this.metadataTags),r=a.filePos+i.size,[3,4];case 9:if(!(!n&&null!==this.reader.fileSize&&this.reader.fileSize>=_.ID3_V1_TAG_SIZE))return[3,12];if(!((o=this.reader.requestSlice(this.reader.fileSize-_.ID3_V1_TAG_SIZE,_.ID3_V1_TAG_SIZE))instanceof Promise))return[3,11];return[4,o];case 10:o=c.sent(),c.label=11;case 11:(0,g.assert)(o),"TAG"===(0,w.readAscii)(o,3)&&(0,_.parseId3V1Tag)(o,this.metadataTags),c.label=12;case 12:return[2,this.metadataTags];case 13:return e(),[7];case 14:return[2]}})}).call(this)}}]),r}(h.Demuxer),T=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getTimeResolution",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getCodec",value:function(){return"mp3"}},{key:"getInternalCodecId",value:function(){return null}},{key:"getNumberOfChannels",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}},{key:"getSampleRate",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}},{key:"getDisposition",value:function(){return(0,d._)({},p.DEFAULT_TRACK_DISPOSITION)}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return(0,g.assert)(this.demuxer.firstFrameHeader),[2,{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}]})}).call(this)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:if(-1===e||!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.dataStart,n.dataSize))instanceof Promise))return[3,3];return[4,i];case 2:i=s.sent(),s.label=3;case 3:if(!i)return[2,null];a=(0,w.readBytes)(i,n.dataSize),s.label=4;case 4:return[2,new(0,b.EncodedPacket)(a,"key",n.timestamp,n.duration,e,n.dataSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=s.sent(),s.label=2;case 2:if(s.trys.push([2,,6,7]),-1===(a=(0,g.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,function(e){return e.timestamp})))throw Error("Packet was not created from this track.");i=a+1,s.label=3;case 3:if(!(i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return s.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(i,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:i.trys.push([2,,6,7]),i.label=3;case 3:if(-1===(a=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.timestamp}))&&this.demuxer.loadedSamples.length>0)return[2,null];if(this.demuxer.lastSampleLoaded||a>=0&&a+1>>24,i=e>>>16&255,s=e>>>8&255,u=255&e;if(255!==a&&255!==i&&255!==s&&255!==u)return{header:null,bytesAdvanced:4};if(255!==a||(224&i)!=224)return{header:null,bytesAdvanced:1};var l=0,f=0;16&i?l=8&i?0:1:(l=1,f=1);var h=i>>3&3,m=i>>1&3,p=(s>>2&3)%3,g=c[64*l+16*m+(s>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};var b=1e3*g,k=o[p]>>l+f,_=d(l,m,b,k,s>>1&1);return null!==r&&r<_?{header:null,bytesAdvanced:1}:(n=3===h?3===m?384:1152:3===m?384:2===m?1152:576,{header:{totalSize:_,mpegVersionId:h,layer:m,bitrate:b,frequencyIndex:p,sampleRate:k,channel:u>>6&3,modeExtension:u>>4&3,copyright:u>>3&1,original:u>>2&1,emphasis:3&u,audioSamplesInFrame:n},bytesAdvanced:1})},m=function(e){for(var r=127,n=0,a=e;(0x7fffffff^r)!=0;)n=(a&~r)<<1|a&r,r=(r+1<<8)-1,a=n;return n},p=function(e){for(var r=0x7f000000,n=0;0!==r;)n>>=1,n|=e&r,r>>=8;return n}},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"42Y2c":[function(e,r,n,a){var i,s,o,c,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(n),u.export(n,"Id3V2HeaderFlags",function(){return o}),u.export(n,"Id3V2TextEncoding",function(){return c}),u.export(n,"ID3_V1_TAG_SIZE",function(){return p}),u.export(n,"ID3_V2_HEADER_SIZE",function(){return g}),u.export(n,"ID3_V1_GENRES",function(){return b}),u.export(n,"parseId3V1Tag",function(){return k}),u.export(n,"readId3V1String",function(){return _}),u.export(n,"readId3V2Header",function(){return y}),u.export(n,"parseId3V2Tag",function(){return w}),u.export(n,"Id3V2Reader",function(){return S}),u.export(n,"Id3V2Writer",function(){return T});var l=e("@swc/helpers/cjs/_class_call_check.cjs"),d=e("@swc/helpers/cjs/_create_class.cjs"),f=e("../shared/mp3-misc.js"),h=e("./misc.js"),m=e("./reader.js");(i=o||(o={}))[i.Unsynchronisation=128]="Unsynchronisation",i[i.ExtendedHeader=64]="ExtendedHeader",i[i.ExperimentalIndicator=32]="ExperimentalIndicator",i[i.Footer=16]="Footer",(s=c||(c={}))[s.ISO_8859_1=0]="ISO_8859_1",s[s.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",s[s.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",s[s.UTF_8=3]="UTF_8";var p=128,g=10,b=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],k=function(e,r){var n=e.filePos;null!=r.raw||(r.raw={}),null!=(u=r.raw).TAG||(u.TAG=(0,m.readBytes)(e,p-3)),e.filePos=n;var a=_(e,30);a&&(null!=r.title||(r.title=a));var i=_(e,30);i&&(null!=r.artist||(r.artist=i));var s=_(e,30);s&&(null!=r.album||(r.album=s));var o=Number.parseInt(_(e,4),10);Number.isInteger(o)&&o>0&&(null!=r.date||(r.date=new Date(o,0,1)));var c=(0,m.readBytes)(e,30);if(0===c[28]&&0!==c[29]){var u,l,d=c[29];d>0&&(null!=r.trackNumber||(r.trackNumber=d)),e.skip(-30),l=_(e,28),e.skip(2)}else e.skip(-30),l=_(e,30);l&&(null!=r.comment||(r.comment=l));var f=(0,m.readU8)(e);f0&&(null!=n.trackNumber||(n.trackNumber=w)),T&&Number.isInteger(T)&&T>0&&(null!=n.tracksTotal||(n.tracksTotal=T));break;case"TPOS":case"TPA":var x=i.readId3V2EncodingAndText(l).split("/"),I=Number.parseInt(x[0],10),E=x[1]&&Number.parseInt(x[1],10);Number.isInteger(I)&&I>0&&(null!=n.discNumber||(n.discNumber=I)),E&&Number.isInteger(E)&&E>0&&(null!=n.discsTotal||(n.discsTotal=E));break;case"TCON":case"TCO":var j=i.readId3V2EncodingAndText(l),P=/^\((\d+)\)/.exec(j);if(P){var C=Number.parseInt(P[1]);if(void 0!==b[C]){null!=n.genre||(n.genre=b[C]);break}}if(P=/^\d+$/.exec(j)){var A=Number.parseInt(P[0]);if(void 0!==b[A]){null!=n.genre||(n.genre=b[A]);break}}null!=n.genre||(n.genre=j);break;case"TDRC":case"TDAT":var B=new Date(i.readId3V2EncodingAndText(l));Number.isNaN(B.getTime())||null!=n.date||(n.date=B);break;case"TYER":case"TYE":var M=Number.parseInt(i.readId3V2EncodingAndText(l),10);Number.isInteger(M)&&(null!=n.date||(n.date=new Date(M,0,1)));break;case"USLT":case"ULT":var D=i.readU8();i.pos+=3,i.readId3V2Text(D,l),null!=n.lyrics||(n.lyrics=i.readId3V2Text(D,l));break;case"COMM":case"COM":var F=i.readU8();i.pos+=3,i.readId3V2Text(F,l),null!=n.comment||(n.comment=i.readId3V2Text(F,l));break;case"APIC":case"PIC":var R=i.readId3V2TextEncoding(),U=void 0;if(2===r.majorVersion){var O=i.readAscii(3);U="PNG"===O?"image/png":"JPG"===O?"image/jpeg":"image/*"}else U=i.readId3V2Text(R,l);var L=i.readU8(),N=i.readId3V2Text(R,l).trimEnd(),z=l-i.pos;if(z>=0){var V=i.readBytes(z);n.images||(n.images=[]),n.images.push({data:V,mimeType:U,kind:3===L?"coverFront":4===L?"coverBack":"unknown",description:N})}break;default:i.pos+=c.size}i.pos=l}},S=function(){"use strict";function e(r,n){(0,l._)(this,e),this.header=r,this.bytes=n,this.pos=0,this.view=new DataView(n.buffer,n.byteOffset,n.byteLength)}return(0,d._)(e,[{key:"frameHeaderSize",value:function(){return 2===this.header.majorVersion?6:10}},{key:"ununsynchronizeAll",value:function(){for(var e=[],r=0;re.bytes.length)return!1;if(n<=e.bytes.length-e.frameHeaderSize()){e.pos+=r;var a=e.readAscii(4);if("\0\0\0\0"!==a&&!/[0-9A-Z]{4}/.test(a))return!1}return!0};if(!c(i)){var u=4===this.header.majorVersion?a:(0,f.decodeSynchsafe)(a);c(u)&&(i=u)}return this.pos=o,{id:n,size:i,flags:s}}},{key:"readId3V2TextEncoding",value:function(){var e=this.readU8();if(e>3)throw Error("Unsupported text encoding: ".concat(e));return e}},{key:"readId3V2Text",value:function(e,r){var n=this.pos,a=this.readBytes(r-this.pos);switch(e){case c.ISO_8859_1:for(var i="",s=0;s=e)return"";var r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}]),e}(),T=function(){"use strict";function e(r){(0,l._)(this,e),this.helper=new Uint8Array(8),this.helperView=(0,h.toDataView)(this.helper),this.writer=r}return(0,d._)(e,[{key:"writeId3V2Tag",value:function(e){var r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);var n=this.writer.getPos(),a=new Set,i=!0,s=!1,o=void 0;try{for(var u,l=(0,h.keyValueIterator)(e)[Symbol.iterator]();!(i=(u=l.next()).done);i=!0){var d=u.value,f=d.key,m=d.value;switch(f){case"title":this.writeId3V2TextFrame("TIT2",m),a.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",m),a.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",m),a.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",m),a.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",m),a.add("TPE2");break;case"trackNumber":var p=void 0!==e.tracksTotal?"".concat(m,"/").concat(e.tracksTotal):m.toString();this.writeId3V2TextFrame("TRCK",p),a.add("TRCK");break;case"discNumber":var g=void 0!==e.discsTotal?"".concat(m,"/").concat(e.discsTotal):m.toString();this.writeId3V2TextFrame("TPOS",g),a.add("TPOS");break;case"genre":this.writeId3V2TextFrame("TCON",m),a.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",m.toISOString().slice(0,10)),a.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(m),a.add("USLT");break;case"comment":this.writeId3V2CommentFrame(m),a.add("COMM");break;case"images":var b={coverFront:3,coverBack:4,unknown:0},k=!0,_=!1,y=void 0;try{for(var w,S=m[Symbol.iterator]();!(k=(w=S.next()).done);k=!0){var T,x,I=w.value,E=null!=(T=b[I.kind])?T:0,j=null!=(x=I.description)?x:"";this.writeId3V2ApicFrame(I.mimeType,E,j,I.data)}}catch(e){_=!0,y=e}finally{try{k||null==S.return||S.return()}finally{if(_)throw y}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,h.assertNever)(f)}}}catch(e){s=!0,o=e}finally{try{i||null==l.return||l.return()}finally{if(s)throw o}}if(e.raw)for(var P in e.raw){var C=e.raw[P];if(!(null==C||4!==P.length||a.has(P))){var A=void 0;if("string"==typeof C){var B=h.textEncoder.encode(C);(A=new Uint8Array(B.byteLength+2))[0]=c.UTF_8,A.set(B,1)}else{if(!(C instanceof Uint8Array))continue;A=C}this.writeAscii(P),this.writeSynchsafeU32(A.byteLength),this.writeU16(0),this.writer.write(A)}}var M=this.writer.getPos(),D=M-n;return this.writer.seek(r+6),this.writeSynchsafeU32(D),this.writer.seek(M),D+10}},{key:"writeU8",value:function(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}},{key:"writeU16",value:function(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}},{key:"writeU32",value:function(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}},{key:"writeAscii",value:function(e){for(var r=0;r=7&&1===l.data[0]&&118===l.data[1]&&111===l.data[2]&&114===l.data[3]&&98===l.data[4]&&105===l.data[5]&&115===l.data[6]))return[3,9];return[4,this.readVorbisMetadata(l,u)];case 8:return f.sent(),[3,11];case 9:if(!(l.data.byteLength>=8&&79===l.data[0]&&112===l.data[1]&&117===l.data[2]&&115===l.data[3]&&72===l.data[4]&&101===l.data[5]&&97===l.data[6]&&100===l.data[7]))return[3,11];return[4,this.readOpusMetadata(l,u)];case 10:f.sent(),f.label=11;case 11:null!==u.codecInfo.codec&&this.tracks.push(new(0,b.InputAudioTrack)(this.input,new I(u,this))),f.label=12;case 12:return a=!0,[3,6];case 13:return[3,16];case 14:return d=f.sent(),i=!0,s=d,[3,16];case 15:try{a||null==o.return||o.return()}finally{if(i)throw s}return[7];case 16:return[2]}})}).call(e)]})}).call(this)}},{key:"readVorbisMetadata",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:return[4,this.findNextPacketStart(e)];case 1:case 3:if(!(n=d.sent()))return[2];return[4,this.readPacket(n.startPage,n.startSegmentIndex)];case 2:if(!(a=d.sent()))return[2];return[4,this.findNextPacketStart(a)];case 4:if(!(i=d.sent())||3!==a.data[0]||5!==i.data[0])return[2];return s=[],(o=function(e){for(;s.push(Math.min(255,e)),!(e<255);)e-=255})(e.data.length),o(a.data.length),(c=new Uint8Array(1+s.length+e.data.length+a.data.length+i.data.length))[0]=2,c.set(s,1),c.set(e.data,1+s.length),c.set(a.data,1+s.length+e.data.length),c.set(i.data,1+s.length+e.data.length+a.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=i,r.numberOfChannels=(u=(0,_.toDataView)(e.data)).getUint8(11),r.sampleRate=u.getUint32(12,!0),l=u.getUint8(28),r.codecInfo.vorbisInfo={blocksizes:[1<<(15&l),1<<(l>>4)],modeBlockflags:(0,p.parseModesFromVorbisSetupPacket)(i.data).modeBlockflags},(0,p.readVorbisComments)(a.data.subarray(7),this.metadataTags),[2]}})}).call(this)}},{key:"readOpusMetadata",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,h._)(this,function(s){switch(s.label){case 0:return[4,this.findNextPacketStart(e)];case 1:if(!(n=s.sent()))return[2];return[4,this.readPacket(n.startPage,n.startSegmentIndex)];case 2:if(!(a=s.sent()))return[2];return r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=a,r.numberOfChannels=(i=(0,p.parseOpusIdentificationHeader)(e.data)).outputChannelCount,r.sampleRate=m.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:i.preSkip},(0,p.readVorbisComments)(a.data.subarray(8),this.metadataTags),[2]}})}).call(this)}},{key:"readPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l,d,f,m,p,g,b,k,y;return(0,h._)(this,function(h){switch(h.label){case 0:for((0,_.assert)(rn?s=m.headerStartPos:(i=m,o.push(m)),[3,2];case 12:return[3,2];case 13:k=a.startPage,x=!0,I=!1,P=void 0;try{for(C=o[Symbol.iterator]();!(x=(A=C.next()).done)&&(B=A.value).granulePosition!==i.granulePosition;x=!0)(!k||B.headerStartPos>k.headerStartPos)&&(k=B)}catch(e){I=!0,P=e}finally{try{x||null==C.return||C.return()}finally{if(I)throw P}}D=[M=k],h.label=14;case 14:if(M.serialNumber===this.bitstream.serialNumber&&M.granulePosition===i.granulePosition)return[3,17];if(F=M.headerStartPos+M.totalSize,!((R=this.demuxer.reader.requestSliceRange(F,T.MIN_PAGE_HEADER_SIZE,T.MAX_PAGE_HEADER_SIZE))instanceof Promise))return[3,16];return[4,R];case 15:R=h.sent(),h.label=16;case 16:return(0,_.assert)(R),U=(0,T.readPageHeader)(R),(0,_.assert)(U),(M=U).serialNumber===this.bitstream.serialNumber&&D.push(M),[3,14];case 17:if((0,_.assert)(-1!==M.granulePosition),O=null,z=M,V=0,M.headerStartPos!==a.startPage.headerStartPos)return[3,18];return L=this.granulePositionToTimestampInSamples(0),N=!0,O=0,[3,20];case 18:for(L=0,N=!1,H=M.lacingValues.length-1;H>=0;H--)if(M.lacingValues[H]<255){O=H+1;break}if(null===O)throw Error("Invalid page with granule position: no packets end on this page.");return V=O-1,G={data:y.PLACEHOLDER_DATA,endPage:z,endSegmentIndex:V},[4,this.demuxer.findNextPacketStart(G)];case 19:if(h.sent())q=j(D,M,O),(0,_.assert)(q),(W=E(D,q.page,q.segmentIndex))&&(M=W.page,O=W.segmentIndex);else for(;(K=j(D,M,O))&&(X=E(D,K.page,K.segmentIndex));)if(M=X.page,O=X.segmentIndex,K.page.headerStartPos!==z.headerStartPos){z=K.page,V=K.segmentIndex;break}h.label=20;case 20:Z=null,Q=null,h.label=21;case 21:if(null===M)return[3,24];return(0,_.assert)(null!==O),[4,this.demuxer.readPacket(M,O)];case 22:if(!(Y=h.sent())||!(M.headerStartPos===a.startPage.headerStartPos&&On||Math.max(ee.timestampInSamples,0)===n)))return[3,24];return[4,this.demuxer.findNextPacketStart(Y)];case 23:if(!(er=h.sent()))return[3,24];return M=er.startPage,O=er.startSegmentIndex,[3,21];case 24:return[2,Z]}})}).call(this)}},{key:"getPacketSequential",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o,c,u,l;return(0,h._)(this,function(d){switch(d.label){case 0:return[4,this.sequentialScanMutex.acquire()];case 1:n=d.sent(),d.label=2;case 2:if(d.trys.push([2,,9,10]),e=(a=(0,_.roundIfAlmostInteger)(e*this.internalSampleRate))/this.internalSampleRate,-1===(i=(0,_.binarySearchLessOrEqual)(this.sequentialScanCache,a,function(e){return e.timestampInSamples})))return[3,3];return o=this.sequentialScanCache[i],s=this.createEncodedPacketFromOggPacket(o.packet,{timestampInSamples:o.timestampInSamples,vorbisLastBlocksize:o.vorbisLastBlockSize},r),[3,5];case 3:return[4,this.getFirstPacket(r)];case 4:s=d.sent(),d.label=5;case 5:c=0,d.label=6;case 6:if(!(s&&s.timestampe)return[3,8];return s=u,100==++c&&(c=0,l=this.encodedPacketToMetadata.get(s),(0,_.assert)(l),this.sequentialScanCache.length>0&&(0,_.assert)((0,_.last)(this.sequentialScanCache).timestampInSamples<=l.timestampInSamples),this.sequentialScanCache.push(l)),[3,6];case 8:return[2,s];case 9:return n(),[7];case 10:return[2]}})}).call(this)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}}]),e}(),E=function(e,r,n){var a=r,i=n;e:for(;;){for(i--;i>=0;i--)if(a.lacingValues[i]<255){i++;break e}if((0,_.assert)(-1===i),!(1&a.headerType)){i=0;break}var s=(0,_.findLast)(e,function(e){return e.headerStartPos0)return{page:r,segmentIndex:n-1};var a=(0,_.findLast)(e,function(e){return e.headerStartPos>>0}var m=function(e){var r=(0,c.toDataView)(e),n=r.getUint32(22,!0);r.setUint32(22,0,!0);for(var a=0,i=0;i>>24^e[i]])>>>0;return r.setUint32(22,n,!0),a},p=function(e,r,n){var a=0,i=null;if(e.length>0)if("vorbis"===r.codec){(0,c.assert)(r.vorbisInfo);var s=r.vorbisInfo.modeBlockflags.length,u=(1<<(0,c.ilog)(s-1))-1<<1,l=(e[0]&u)>>1;if(l>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");var d=n,f=r.vorbisInfo.modeBlockflags[l];if(i=r.vorbisInfo.blocksizes[f],1===f){var h=e[0]&(1|u)+1?1:0;d=r.vorbisInfo.blocksizes[h]}a=null!==d?d+i>>2:0}else"opus"===r.codec&&(a=(0,o.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:a,vorbisBlockSize:i}},g=function(e){var r="audio/ogg";if(e.codecStrings){var n=(0,s._)(new Set(e.codecStrings));r+='; codecs="'.concat(n.join(", "),'"')}return r}},{"@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","../codec-data.js":"kWTYV","../misc.js":"j7iGm","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],fY5up:[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_PAGE_HEADER_SIZE",function(){return c}),i.export(n,"MAX_PAGE_HEADER_SIZE",function(){return u}),i.export(n,"MAX_PAGE_SIZE",function(){return l}),i.export(n,"readPageHeader",function(){return d}),i.export(n,"findNextPageHeader",function(){return f});var s=e("../reader.js"),o=e("./ogg-misc.js"),c=27,u=282,l=65307,d=function(e){var r=e.filePos;if((0,s.readU32Le)(e)!==o.OGGS)return null;e.skip(1);for(var n=(0,s.readU8)(e),a=(0,s.readI64Le)(e),i=(0,s.readU32Le)(e),c=(0,s.readU32Le)(e),u=(0,s.readU32Le)(e),l=(0,s.readU8)(e),d=new Uint8Array(l),f=0;f>>8&255,c=n>>>16&255,u=n>>>24&255;if(79===a||79===i||79===c||79===u){if(e.skip(-4),n===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"8KRfO","./ogg-misc.js":"g1LsD","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],cokSU:[function(e,r,n,a){var i,s,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(n),o.export(n,"WaveFormat",function(){return s}),o.export(n,"WaveDemuxer",function(){return T});var c=e("@swc/helpers/cjs/_async_to_generator.cjs"),u=e("@swc/helpers/cjs/_call_super.cjs"),l=e("@swc/helpers/cjs/_class_call_check.cjs"),d=e("@swc/helpers/cjs/_create_class.cjs"),f=e("@swc/helpers/cjs/_inherits.cjs"),h=e("@swc/helpers/cjs/_object_spread.cjs"),m=e("@swc/helpers/cjs/_to_consumable_array.cjs"),p=e("@swc/helpers/cjs/_ts_generator.cjs"),g=e("../demuxer.js"),b=e("../input-track.js"),k=e("../metadata.js"),_=e("../misc.js"),y=e("../packet.js"),w=e("../reader.js"),S=e("../id3.js");(i=s||(s={}))[i.PCM=1]="PCM",i[i.IEEE_FLOAT=3]="IEEE_FLOAT",i[i.ALAW=6]="ALAW",i[i.MULAW=7]="MULAW",i[i.EXTENSIBLE=65534]="EXTENSIBLE";var T=function(e){"use strict";function r(e){var n;return(0,l._)(this,r),(n=(0,u._)(this,r,[e])).metadataPromise=null,n.dataStart=-1,n.dataSize=-1,n.audioInfo=null,n.tracks=[],n.lastKnownPacketIndex=0,n.metadataTags={},n.reader=e._reader,n}return(0,f._)(r,e),(0,d._)(r,[{key:"readMetadata",value:function(){return(0,c._)(function(){var e,r;return(0,p._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,c._)(function(){var e,r,n,a,i,s,o,c,u,l,d,f,h,m,g,k,y,S;return(0,p._)(this,function(p){switch(p.label){case 0:if(!((e=this.reader.requestSlice(0,12))instanceof Promise))return[3,2];return[4,e];case 1:e=p.sent(),p.label=2;case 2:if((0,_.assert)(e),n="RIFX"!==(r=(0,w.readAscii)(e,4)),a="RF64"===r,i=(0,w.readU32)(e,n),o=a?this.reader.fileSize:Math.min(i+8,null!=(s=this.reader.fileSize)?s:1/0),"WAVE"!==(0,w.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");c=0,u=null,l=e.filePos,p.label=3;case 3:if(!(null===o||l=18&&357!==i&&Math.min(r-18,(0,w.readU16)(a,n))>=22&&i===s.EXTENSIBLE&&(a.skip(6),i=(d=(0,w.readBytes)(a,16))[0]|d[1]<<8),(i===s.MULAW||i===s.ALAW)&&(l=8),this.audioInfo={format:i,numberOfChannels:o,sampleRate:c,sampleSizeInBytes:Math.ceil(l/8),blockSizeInBytes:u},[2]}})}).call(this)}},{key:"parseListChunk",value:function(e,r,n){return(0,c._)(function(){var a,i,s,o,c,u,l,d,f,h,g,b,k,_,y,S,T,x,I,E,j,P,C,A,B,M;return(0,p._)(this,function(p){switch(p.label){case 0:if(!((a=this.reader.requestSlice(e,r))instanceof Promise))return[3,2];return[4,a];case 1:a=p.sent(),p.label=2;case 2:if(!a||"INFO"!==(i=(0,w.readAscii)(a,4))&&"INF0"!==i)return[2];for(s=a.filePos;s<=e+r-8;){for(h=0,a.filePos=s,u=(0,w.readAscii)(a,4),l=(0,w.readU32)(a,n),d=(0,w.readBytes)(a,l),f=0;h0&&(null!=(S=this.metadataTags).trackNumber||(S.trackNumber=I)),E&&Number.isInteger(E)&&E>0&&(null!=(T=this.metadataTags).tracksTotal||(T.tracksTotal=E));break;case"ICRD":case"IDIT":Number.isNaN((P=new Date(g)).getTime())||null!=(j=this.metadataTags).date||(j.date=P);break;case"YEAR":Number.isInteger(A=Number.parseInt(g,10))&&A>0&&(null!=(C=this.metadataTags).date||(C.date=new Date(A,0,1)));break;case"IGNR":case"GENR":null!=(B=this.metadataTags).genre||(B.genre=g);break;case"ICMT":case"CMNT":case"COMM":null!=(M=this.metadataTags).comment||(M.comment=g)}s+=8+l+(1&l)}return[2]}})}).call(this)}},{key:"parseId3Chunk",value:function(e,r){return(0,c._)(function(){var n,a,i;return(0,p._)(this,function(s){switch(s.label){case 0:if(!((n=this.reader.requestSlice(e,r))instanceof Promise))return[3,2];return[4,n];case 1:n=s.sent(),s.label=2;case 2:if(!n)return[2];return(a=(0,S.readId3V2Header)(n))&&(i=n.slice(e+10,a.size),(0,S.parseId3V2Tag)(i,a,this.metadataTags)),[2]}})}).call(this)}},{key:"getCodec",value:function(){if((0,_.assert)(this.audioInfo),this.audioInfo.format===s.MULAW)return"ulaw";if(this.audioInfo.format===s.ALAW)return"alaw";if(this.audioInfo.format===s.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===s.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}},{key:"getMimeType",value:function(){return(0,c._)(function(){return(0,p._)(this,function(e){return[2,"audio/wav"]})})()}},{key:"computeDuration",value:function(){return(0,c._)(function(){var e;return(0,p._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,_.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getTracks",value:function(){return(0,c._)(function(){return(0,p._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,c._)(function(){return(0,p._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.metadataTags]}})}).call(this)}}]),r}(g.Demuxer),x=function(){"use strict";function e(r){(0,l._)(this,e),this.demuxer=r}return(0,d._)(e,[{key:"getId",value:function(){return 1}},{key:"getCodec",value:function(){return this.demuxer.getCodec()}},{key:"getInternalCodecId",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}},{key:"getDecoderConfig",value:function(){return(0,c._)(function(){var e;return(0,p._)(this,function(r){return(e=this.demuxer.getCodec())?((0,_.assert)(this.demuxer.audioInfo),[2,{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}]):[2,null]})}).call(this)}},{key:"computeDuration",value:function(){return(0,c._)(function(){var e,r,n;return(0,p._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getNumberOfChannels",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}},{key:"getSampleRate",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getTimeResolution",value:function(){return(0,_.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return _.UNDETERMINED_LANGUAGE}},{key:"getDisposition",value:function(){return(0,h._)({},k.DEFAULT_TRACK_DISPOSITION)}},{key:"getFirstTimestamp",value:function(){return(0,c._)(function(){return(0,p._)(this,function(e){return[2,0]})})()}},{key:"getPacketAtIndex",value:function(e,r){return(0,c._)(function(){var n,a,i,s,o,c,u;return(0,p._)(this,function(l){switch(l.label){case 0:if((0,_.assert)(this.demuxer.audioInfo),(n=2048*e*this.demuxer.audioInfo.blockSizeInBytes)>=this.demuxer.dataSize)return[2,null];if(a=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-n),null!==this.demuxer.reader.fileSize)return[3,3];if(!((i=this.demuxer.reader.requestSlice(this.demuxer.dataStart+n,a))instanceof Promise))return[3,2];return[4,i];case 1:i=l.sent(),l.label=2;case 2:if(!i)return[2,null];l.label=3;case 3:if(!r.metadataOnly)return[3,4];return s=y.PLACEHOLDER_DATA,[3,7];case 4:if(!((o=this.demuxer.reader.requestSlice(this.demuxer.dataStart+n,a))instanceof Promise))return[3,6];return[4,o];case 5:o=l.sent(),l.label=6;case 6:(0,_.assert)(o),s=(0,w.readBytes)(o,a),l.label=7;case 7:return c=2048*e/this.demuxer.audioInfo.sampleRate,u=a/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate,this.demuxer.lastKnownPacketIndex=Math.max(e,c),[2,new(0,y.EncodedPacket)(s,"key",c,u,e,a)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getPacket",value:function(e,r){return(0,c._)(function(){var n,a,i,s;return(0,p._)(this,function(o){switch(o.label){case 0:return(0,_.assert)(this.demuxer.audioInfo),n=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),[4,this.getPacketAtIndex(n,r)];case 1:if(a=o.sent())return[2,a];if(0===n)return[2,null];return(0,_.assert)(null===this.demuxer.reader.fileSize),[4,this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r)];case 2:i=o.sent(),o.label=3;case 3:if(!i)return[3,5];return[4,this.getNextPacket(i,r)];case 4:if(!(s=o.sent()))return[3,5];return i=s,[3,3];case 5:return[2,i]}})}).call(this)}},{key:"getNextPacket",value:function(e,r){(0,_.assert)(this.demuxer.audioInfo);var n=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(n+1,r)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}}]),e}()},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_to_consumable_array.cjs":"i81N6","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../demuxer.js":"d4thC","../input-track.js":"b22CJ","../metadata.js":"eSjom","../misc.js":"j7iGm","../packet.js":"QfqGG","../reader.js":"8KRfO","../id3.js":"42Y2c","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"5AUBv":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"MIN_FRAME_HEADER_SIZE",function(){return c}),i.export(n,"MAX_FRAME_HEADER_SIZE",function(){return u}),i.export(n,"readFrameHeader",function(){return l});var s=e("../misc.js"),o=e("../reader.js"),c=7,u=9,l=function(e){var r=e.filePos,n=(0,o.readBytes)(e,9),a=new(0,s.Bitstream)(n);if(4095!==a.readBits(12)||(a.skipBits(1),0!==a.readBits(2)))return null;var i=a.readBits(1),c=a.readBits(2)+1,u=a.readBits(4);if(15===u)return null;a.skipBits(1);var l=a.readBits(3);if(0===l)throw Error("ADTS frames with channel configuration 0 are not supported.");a.skipBits(1),a.skipBits(1),a.skipBits(1),a.skipBits(1);var d=a.readBits(13);a.skipBits(11);var f=a.readBits(2)+1;if(1!==f)throw Error("ADTS frames with more than one AAC frame are not supported.");var h=null;return 1===i?e.filePos-=2:h=a.readBits(16),{objectType:c,samplingFrequencyIndex:u,channelConfiguration:l,frameLength:d,numberOfAacFrames:f,crcCheck:h,startPos:r}}},{"../misc.js":"j7iGm","../reader.js":"8KRfO","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"3t0bF":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"AdtsDemuxer",function(){return w});var s=e("@swc/helpers/cjs/_async_to_generator.cjs"),o=e("@swc/helpers/cjs/_call_super.cjs"),c=e("@swc/helpers/cjs/_class_call_check.cjs"),u=e("@swc/helpers/cjs/_create_class.cjs"),l=e("@swc/helpers/cjs/_inherits.cjs"),d=e("@swc/helpers/cjs/_object_spread.cjs"),f=e("@swc/helpers/cjs/_ts_generator.cjs"),h=e("../codec.js"),m=e("../demuxer.js"),p=e("../input-track.js"),g=e("../misc.js"),b=e("../packet.js"),k=e("../reader.js"),_=e("../metadata.js"),y=e("./adts-reader.js"),w=function(e){"use strict";function r(e){var n;return(0,c._)(this,r),(n=(0,o._)(this,r,[e])).metadataPromise=null,n.firstFrameHeader=null,n.loadedSamples=[],n.tracks=[],n.readingMutex=new(0,g.AsyncMutex),n.lastSampleLoaded=!1,n.lastLoadedPos=0,n.nextTimestampInSamples=0,n.reader=e._reader,n}return(0,l._)(r,e),(0,u._)(r,[{key:"readMetadata",value:function(){return(0,s._)(function(){var e,r;return(0,f._)(this,function(n){return e=this,[2,null!=(r=this.metadataPromise)?r:this.metadataPromise=(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:if(!(!this.firstFrameHeader&&!this.lastSampleLoaded))return[3,2];return[4,this.advanceReader()];case 1:return e.sent(),[3,0];case 2:return(0,g.assert)(this.firstFrameHeader),this.tracks=[new(0,p.InputAudioTrack)(this.input,new S(this))],[2]}})}).call(e)]})}).call(this)}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a,i,s;return(0,f._)(this,function(o){switch(o.label){case 0:if(!((e=this.reader.requestSliceRange(this.lastLoadedPos,y.MIN_FRAME_HEADER_SIZE,y.MAX_FRAME_HEADER_SIZE))instanceof Promise))return[3,2];return[4,e];case 1:e=o.sent(),o.label=2;case 2:if(!e||!(r=(0,y.readFrameHeader)(e))||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize)return this.lastSampleLoaded=!0,[2];return this.firstFrameHeader||(this.firstFrameHeader=r),n=h.aacFrequencyTable[r.samplingFrequencyIndex],(0,g.assert)(void 0!==n),a=1024/n,i=r.crcCheck?y.MAX_FRAME_HEADER_SIZE:y.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/n,duration:a,dataStart:r.startPos+i,dataSize:r.frameLength-i},this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength,[2]}})}).call(this)}},{key:"getMimeType",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,"audio/aac"]})})()}},{key:"getTracks",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){switch(e.label){case 0:return[4,this.readMetadata()];case 1:return e.sent(),[2,this.tracks]}})}).call(this)}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e;return(0,f._)(this,function(r){switch(r.label){case 0:return[4,this.readMetadata()];case 1:return r.sent(),e=this.tracks[0],(0,g.assert)(e),[2,e.computeDuration()]}})}).call(this)}},{key:"getMetadataTags",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,{}]})})()}}]),r}(m.Demuxer),S=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getTimeResolution",value:function(){return this.getSampleRate()/1024}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getCodec",value:function(){return"aac"}},{key:"getInternalCodecId",value:function(){return(0,g.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}},{key:"getNumberOfChannels",value:function(){(0,g.assert)(this.demuxer.firstFrameHeader);var e=h.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,g.assert)(void 0!==e),e}},{key:"getSampleRate",value:function(){(0,g.assert)(this.demuxer.firstFrameHeader);var e=h.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,g.assert)(void 0!==e),e}},{key:"getDisposition",value:function(){return(0,d._)({},_.DEFAULT_TRACK_DISPOSITION)}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){var e,r,n,a,i,s;return(0,f._)(this,function(o){return(0,g.assert)(this.demuxer.firstFrameHeader),e=new Uint8Array(3),r=new(0,g.Bitstream)(e),a=(n=this.demuxer.firstFrameHeader).objectType,i=n.samplingFrequencyIndex,s=n.channelConfiguration,a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),[2,{codec:"mp4a.40.".concat(this.demuxer.firstFrameHeader.objectType),numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}]})}).call(this)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:if(-1===e||!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.dataStart,n.dataSize))instanceof Promise))return[3,3];return[4,i];case 2:i=s.sent(),s.label=3;case 3:if(!i)return[2,null];a=(0,k.readBytes)(i,n.dataSize),s.label=4;case 4:return[2,new(0,b.EncodedPacket)(a,"key",n.timestamp,n.duration,e,n.dataSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return this.getPacketAtIndex(0,e)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a,i;return(0,f._)(this,function(s){switch(s.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=s.sent(),s.label=2;case 2:if(s.trys.push([2,,6,7]),-1===(a=(0,g.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,function(e){return e.timestamp})))throw Error("Packet was not created from this track.");i=a+1,s.label=3;case 3:if(!(i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return s.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(i,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:i.trys.push([2,,6,7]),i.label=3;case 3:if(-1===(a=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.timestamp}))&&this.demuxer.loadedSamples.length>0)return[2,null];if(this.demuxer.lastSampleLoaded||a>=0&&a+1s.end-a)return[2,{num:o.num,blockSize:o.blockSize,sampleRate:o.sampleRate,size:s.end-r,isLastFrame:!0}];if(255===(0,k.readU8)(s)){if(c=s.filePos,(0,k.readU8)(s)!==(1===this.blockingBit?249:248)||(s.skip(-2),u=s.filePos-r,!(l=this.readFlacFrameHeader({slice:s,isFirstPacket:!1})))){s.filePos=c;continue}if(0===this.blockingBit){if(l.num-o.num!=1){s.filePos=c;continue}}else if(l.num-o.num!==o.blockSize){s.filePos=c;continue}return[2,{num:o.num,blockSize:o.blockSize,sampleRate:o.sampleRate,size:u,isLastFrame:!1}]}}return[2]}})}).apply(this,arguments)}},{key:"readFlacFrameHeader",value:function(e){var r=e.slice,n=e.isFirstPacket,a=r.filePos,i=(0,k.readBytes)(r,4),s=new(0,g.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,g.assert)(n);var o=s.readBits(1);this.blockingBit=o}else if(1===this.blockingBit){if((0,g.assert)(!n),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,g.assert)(!n),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");var c=(0,y.getBlockSizeOrUncommon)(s.readBits(4));if(!c)return null;(0,g.assert)(this.audioInfo);var u=(0,y.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!u||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;var l=(0,y.readCodedNumber)(r),d=(0,y.readBlockSize)(r,c),f=(0,y.readSampleRate)(r,u);if(null===f||f!==this.audioInfo.sampleRate)return null;var h=r.filePos-a,m=(0,k.readU8)(r);return(r.skip(-h),r.skip(-1),m!==(0,y.calculateCrc8)((0,k.readBytes)(r,h)))?null:{num:l,blockSize:d,sampleRate:f}}},{key:"advanceReader",value:function(){return(0,s._)(function(){var e,r,n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.readMetadata()];case 1:return i.sent(),(0,g.assert)(null!==this.lastLoadedPos),(0,g.assert)(this.audioInfo),e=this.lastLoadedPos,[4,this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length})];case 2:if(!(r=i.sent()))return this.lastSampleLoaded=!0,[2];return a={blockOffset:(n=this.loadedSamples[this.loadedSamples.length-1])?n.blockOffset+n.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size},this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(a),r.isLastFrame&&(this.lastSampleLoaded=!0),[2]}})}).call(this)}}]),r}(m.Demuxer),S=function(){"use strict";function e(r){(0,c._)(this,e),this.demuxer=r}return(0,u._)(e,[{key:"getId",value:function(){return 1}},{key:"getCodec",value:function(){return"flac"}},{key:"getInternalCodecId",value:function(){return null}},{key:"getNumberOfChannels",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}},{key:"computeDuration",value:function(){return(0,s._)(function(){var e,r,n;return(0,f._)(this,function(a){switch(a.label){case 0:return[4,this.getPacket(1/0,{metadataOnly:!0})];case 1:return[2,(null!=(r=null==(e=a.sent())?void 0:e.timestamp)?r:0)+(null!=(n=null==e?void 0:e.duration)?n:0)]}})}).call(this)}},{key:"getSampleRate",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getName",value:function(){return null}},{key:"getLanguageCode",value:function(){return g.UNDETERMINED_LANGUAGE}},{key:"getTimeResolution",value:function(){return(0,g.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}},{key:"getDisposition",value:function(){return(0,d._)({},_.DEFAULT_TRACK_DISPOSITION)}},{key:"getFirstTimestamp",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return[2,0]})})()}},{key:"getDecoderConfig",value:function(){return(0,s._)(function(){return(0,f._)(this,function(e){return(0,g.assert)(this.demuxer.audioInfo),[2,{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}]})}).call(this)}},{key:"getPacket",value:function(e,r){return(0,s._)(function(){var n,a,i,s;return(0,f._)(this,function(o){switch(o.label){case 0:if(n=this,(0,g.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");return[4,this.demuxer.readingMutex.acquire()];case 1:a=o.sent(),o.label=2;case 2:o.trys.push([2,,9,10]),o.label=3;case 3:if(-1!==(i=(0,g.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,function(e){return e.blockOffset/n.demuxer.audioInfo.sampleRate})))return[3,5];return[4,this.demuxer.advanceReader()];case 4:case 6:return o.sent(),[3,3];case 5:if(!((s=this.demuxer.loadedSamples[i]).blockOffset/this.demuxer.audioInfo.sampleRate+s.blockSize/this.demuxer.audioInfo.sampleRate<=e))return[3,7];if(this.demuxer.lastSampleLoaded)return[2,this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r)];return[4,this.demuxer.advanceReader()];case 7:return[2,this.getPacketAtIndex(i,r)];case 8:return[3,10];case 9:return a(),[7];case 10:return[2]}})}).call(this)}},{key:"getNextPacket",value:function(e,r){return(0,s._)(function(){var n,a;return(0,f._)(this,function(i){switch(i.label){case 0:return[4,this.demuxer.readingMutex.acquire()];case 1:n=i.sent(),i.label=2;case 2:if(i.trys.push([2,,6,7]),a=e.sequenceNumber+1,this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return[2,null];i.label=3;case 3:if(!(a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,5];return[4,this.demuxer.advanceReader()];case 4:return i.sent(),[3,3];case 5:return[2,this.getPacketAtIndex(a,r)];case 6:return n(),[7];case 7:return[2]}})}).call(this)}},{key:"getKeyPacket",value:function(e,r){return this.getPacket(e,r)}},{key:"getNextKeyPacket",value:function(e,r){return this.getNextPacket(e,r)}},{key:"getPacketAtIndex",value:function(e,r){return(0,s._)(function(){var n,a,i,s,o;return(0,f._)(this,function(c){switch(c.label){case 0:if(!(n=this.demuxer.loadedSamples[e]))return[2,null];if(!r.metadataOnly)return[3,1];return a=b.PLACEHOLDER_DATA,[3,4];case 1:if(!((i=this.demuxer.reader.requestSlice(n.byteOffset,n.byteSize))instanceof Promise))return[3,3];return[4,i];case 2:i=c.sent(),c.label=3;case 3:if(!i)return[2,null];a=(0,k.readBytes)(i,n.byteSize),c.label=4;case 4:return(0,g.assert)(this.demuxer.audioInfo),s=n.blockOffset/this.demuxer.audioInfo.sampleRate,o=n.blockSize/this.demuxer.audioInfo.sampleRate,[2,new(0,b.EncodedPacket)(a,"key",s,o,e,n.byteSize)]}})}).call(this)}},{key:"getFirstPacket",value:function(e){return(0,s._)(function(){return(0,f._)(this,function(r){switch(r.label){case 0:if(!(0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded))return[3,2];return[4,this.demuxer.advanceReader()];case 1:return r.sent(),[3,0];case 2:return[2,this.getPacketAtIndex(0,e)]}})}).call(this)}}]),e}()},{"@swc/helpers/cjs/_async_to_generator.cjs":"cZn0e","@swc/helpers/cjs/_call_super.cjs":"clpdF","@swc/helpers/cjs/_class_call_check.cjs":"4Uf9M","@swc/helpers/cjs/_create_class.cjs":"igUuK","@swc/helpers/cjs/_inherits.cjs":"jtSwf","@swc/helpers/cjs/_object_spread.cjs":"kyoEj","@swc/helpers/cjs/_ts_generator.cjs":"eltGh","../codec-data.js":"kWTYV","../demuxer.js":"d4thC","../input-track.js":"b22CJ","../misc.js":"j7iGm","../packet.js":"QfqGG","../reader.js":"8KRfO","../metadata.js":"eSjom","./flac-misc.js":"4iR5P","@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}],"4iR5P":[function(e,r,n,a){var i=e("@parcel/transformer-js/src/esmodule-helpers.js");i.defineInteropFlag(n),i.export(n,"getBlockSizeOrUncommon",function(){return c}),i.export(n,"getSampleRateOrUncommon",function(){return u}),i.export(n,"readCodedNumber",function(){return l}),i.export(n,"readBlockSize",function(){return d}),i.export(n,"readSampleRate",function(){return f}),i.export(n,"calculateCrc8",function(){return h});var s=e("../misc.js"),o=e("../reader.js"),c=function(e){if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*Math.pow(2,e);if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return Math.pow(2,e);else return null},u=function(e,r){switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},l=function(e){for(var r=0,n=new(0,s.Bitstream)((0,o.readBytes)(e,1));1===n.readBits(1);)r++;if(0===r)return n.readBits(7);for(var a=[],i=r-1,c=new(0,s.Bitstream)((0,o.readBytes)(e,i)),u=8-r-1,l=0;l=u&&(a.emit("timeupdate"),P=i),Number.isFinite(E)&&e>=E){L(),a.emit("ended");return}w&&w.timestamp<=e?(n.clearRect(0,0,r.width,r.height),n.drawImage(w.canvas,0,0),w=null,U(T),C&&(a.emit("canplay"),a.emit("playing"),C=!1)):!w&&(U(T),!w&&Number.isFinite(E)&&e=0&&a.splice(i,1)}},emit:function(r,n){var a=new Event(r);a.detail=n;var i=e.get(r);i&&i.forEach(function(e){return e(a)})}}}i.defineInteropFlag(n),i.export(n,"createVideoEventTarget",function(){return s})},{"@parcel/transformer-js/src/esmodule-helpers.js":"qpMMf"}]},["OIaIB"],"OIaIB","parcelRequire4dc0",{}); \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs b/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs deleted file mode 100644 index de69b4078..000000000 --- a/packages/artplayer-proxy-mediabunny/dist/artplayer-proxy-mediabunny.mjs +++ /dev/null @@ -1,8 +0,0 @@ - -/*! - * artplayer-proxy-mediabunny.js v1.0.0 - * Github: https://github.com/zhw2590582/ArtPlayer - * (c) 2017-2025 Harvey Zack - * Released under the MIT License. - */ -!function(e,r,a,i,s,n,o,l){var c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},d="function"==typeof c[i]&&c[i],u=d.i||{},h=d.cache||{},m="undefined"!=typeof module&&"function"==typeof module.require&&module.require.bind(module);function p(r,a){if(!h[r]){if(!e[r]){if(s[r])return s[r];var n="function"==typeof c[i]&&c[i];if(!a&&n)return n(r,!0);if(d)return d(r,!0);if(m&&"string"==typeof r)return m(r);var o=Error("Cannot find module '"+r+"'");throw o.code="MODULE_NOT_FOUND",o}u.resolve=function(a){var i=e[r][1][a];return null!=i?i:a},u.cache={};var l=h[r]=new p.Module(r);e[r][0].call(l.exports,u,l,l.exports,c)}return h[r].exports;function u(e){var r=u.resolve(e);if(!1===r)return{};if(Array.isArray(r)){var a={__esModule:!0};return r.forEach(function(e){var r=e[0],i=e[1],s=e[2]||e[0],n=p(i);"*"===r?Object.keys(n).forEach(function(e){"default"===e||"__esModule"===e||Object.prototype.hasOwnProperty.call(a,e)||Object.defineProperty(a,e,{enumerable:!0,get:function(){return n[e]}})}):"*"===s?Object.defineProperty(a,r,{enumerable:!0,value:n}):Object.defineProperty(a,r,{enumerable:!0,get:function(){return"default"===s?n.__esModule?n.default:n:n[s]}})}),a}return p(r)}}p.isParcelRequire=!0,p.Module=function(e){this.id=e,this.bundle=p,this.require=m,this.exports={}},p.modules=e,p.cache=h,p.parent=d,p.distDir=void 0,p.publicUrl=void 0,p.devServer=void 0,p.i=u,p.register=function(r,a){e[r]=[function(e,r){r.exports=a},{}]},Object.defineProperty(p,"root",{get:function(){return c[i]}}),c[i]=p;for(var f=0;fl);var n=e("./proxy/canvasProxy.js"),o=s.interopDefault(n);function l(e={}){return r=>(0,o.default)(r,e)}"undefined"!=typeof window&&(window.artplayerProxyMediabunny=l)},{"./proxy/canvasProxy.js":"dQEB4","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],dQEB4:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>l);var n=e("../shim/mediabunnyVideoShim.js"),o=s.interopDefault(n);function l(e,r){let{constructor:a}=e,{createElement:i}=a.utils,s=i("canvas"),n=s.getContext("2d"),l=(0,o.default)({art:e,canvas:s,ctx:n,option:r}),c={};for(let e in s)"function"==typeof s[e]&&(c[e]=s[e].bind(s));for(let e in l)e in s||Object.defineProperty(s,e,{get(){let r=l[e];return"function"==typeof r?r.bind(l):r},set(r){l[e]=r},configurable:!0,enumerable:!0});for(let e in c)s[e]=(...r)=>c[e](...r);function d(){e.template?.$player&&!e.option.autoSize&&Object.assign(s.style,{width:"100%",height:"100%",objectFit:"contain"})}return e.on("destroy",()=>{l.destroy()}),e.on("resize",d),e.on("video:loadedmetadata",d),s}},{"../shim/mediabunnyVideoShim.js":"1TXLF","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1TXLF":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>u);var n=e("../engine/mediabunnyEngine.js"),o=s.interopDefault(n),l=e("../utils/clamp.js"),c=s.interopDefault(l),d=e("./videoEvents.js");function u({art:e,canvas:r,ctx:a,option:i}){let s=(0,d.createVideoEventTarget)(),n=(0,o.default)({canvas:r,ctx:a,events:s,option:i}),l=null,u=i.volume??.7,h=!!i.muted,m=1;n.setVolume(u,h);let{events:p}=e.constructor.config;p.forEach(r=>{s.addEventListener(r,r=>{e.emit(`video:${r.type}`,r)})});let f={addEventListener:s.addEventListener,removeEventListener:s.removeEventListener,get src(){return l},set src(v){l=v,v&&n.load(v)},get currentTime(){return n.currentTime},set currentTime(t){n.seek(Number(t)||0)},get duration(){return n.duration},get buffered(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get played(){let e=n.duration,r=n.currentTime;if(!e||Number.isNaN(e)||r<=0)return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>r}},get paused(){return n.paused},get playing(){return!n.paused&&!n.ended},get ended(){return n.ended},get readyState(){return n.readyState},get networkState(){return n.networkState},get error(){return n.error},get seeking(){return n.seeking},get seekable(){let e=n.duration;if(!e||Number.isNaN(e))return{length:0,start:()=>0,end:()=>0};return{length:1,start:()=>0,end:()=>e}},get playbackRate(){return m},set playbackRate(v){let e=Number(v);if(Number.isNaN(e)||e<=0)return;m=e,n.setPlaybackRate(e),s.emit("ratechange")},get volume(){return u},set volume(v){u=(0,c.default)(v,0,1),h=!1,n.setVolume(u,h),s.emit("volumechange")},get muted(){return h},set muted(v){h=!!v,n.setVolume(u,h),s.emit("volumechange")},play:()=>n.play(),pause(){n.pause()},load(){l&&n.load(l)},destroy(){n.destroy()},get videoWidth(){return n.videoWidth},get videoHeight(){return n.videoHeight},get playsInline(){return!0},set playsInline(v){},get autoplay(){return i.autoplay||!1},set autoplay(v){},get loop(){return i.loop||!1},set loop(v){},get controls(){return!1},set controls(v){},get crossOrigin(){return i.crossOrigin||""},set crossOrigin(v){},get currentSrc(){return l},get poster(){return i.poster||""},set poster(v){i.poster=v},get preload(){return"auto"},set preload(v){},get defaultMuted(){return!1},set defaultMuted(v){},get defaultPlaybackRate(){return 1},set defaultPlaybackRate(v){},canPlayType:e=>"maybe",getBoundingClientRect:()=>r.getBoundingClientRect(),requestVideoFrameCallback:e=>requestAnimationFrame(r=>{e(r,{presentationTime:n.currentTime,expectedDisplayTime:r+16.6,width:n.videoWidth,height:n.videoHeight,mediaTime:n.currentTime,presentedFrames:0,processingDuration:0,captureTime:r,receiveTime:r,rtpTimestamp:0})}),cancelVideoFrameCallback(e){cancelAnimationFrame(e)},setAttribute(e,a){"src"===e?this.src=a:"autoplay"===e?this.autoplay=a:"loop"===e?this.loop=a:"muted"===e?this.muted=!0:r.setAttribute(e,a)}};return i.source?f.src=i.source:e.option?.url&&(f.src=e.option.url),f}},{"../engine/mediabunnyEngine.js":"6K82w","../utils/clamp.js":"3foPY","./videoEvents.js":"3OoKk","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6K82w":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>d);var n=e("./audioEngine.js"),o=s.interopDefault(n),l=e("./videoEngine.js"),c=s.interopDefault(l);function d({canvas:e,ctx:r,events:a,option:i={}}){let s=(0,o.default)(a),n=(0,c.default)({canvas:e,ctx:r,events:a,timeupdateInterval:i.timeupdateInterval??250,avSyncTolerance:i.avSyncTolerance??.12,dropLateFrames:i.dropLateFrames??!1,poster:i.poster??"",preflightRange:i.preflightRange??!1}),l=!0,d=!1,u=0,h=0,m=null,p=!1,f=0;async function g(e){let r=++f;b(),d=!1,m=null,h=2,u=0,setTimeout(()=>a.emit("waiting"),0),setTimeout(()=>a.emit("loadstart"),0);let o=Number.isFinite(i.loadTimeout)?i.loadTimeout:12e3,l=null,c=o>0?new Promise((e,r)=>{l=setTimeout(()=>r(Error("Load timeout")),o)}):null,p=(async()=>{try{let i=!1,o=!1,l=()=>{i&&o&&(u=1,a.emit("loadedmetadata"),a.emit("durationchange"))},c=n.load(e,()=>{r===f&&(i=!0,l())}),d=s.load(e,()=>{r===f&&(o=!0,l())});if(await Promise.all([c,d]),r!==f)return;u=4,h=1,a.emit("loadeddata"),a.emit("canplay"),a.emit("canplaythrough")}catch(e){if(r!==f)return;m={code:4,message:e.message},h=3,a.emit("error"),console.error(e)}finally{l&&clearTimeout(l)}})();if(c)try{await Promise.race([p,c])}catch(e){if(r!==f)return;f++,m={code:4,message:e.message},h=3,a.emit("error")}else await p}async function k(){l&&(d=!1,l=!1,await s.play(),n.start(s),a.emit("play"),a.emit("playing"))}function b(){l||(l=!0,s.pause(),n.stop(),a.emit("pause"))}async function T(e){let r=!l;d=!1,p=!0,a.emit("seeking"),a.emit("waiting"),b(),await s.seek(e),await n.seek(e),p=!1,a.emit("seeked"),r&&!d&&await k()}return a.addEventListener?.("ended",()=>{d=!0,l=!0}),{load:g,play:k,pause:b,seek:T,destroy:function(){b(),s.destroy(),n.destroy()},setVolume:s.setVolume,setPlaybackRate(e){s.setPlaybackRate(e),n.setPlaybackRate(e)},get currentTime(){return s.currentTime},get duration(){return s.duration||n.duration},get paused(){return l},get seeking(){return p},get ended(){return d},get readyState(){return u},get networkState(){return h},get error(){return m},get videoWidth(){return n.width},get videoHeight(){return n.height}}}},{"./audioEngine.js":"ijI2X","./videoEngine.js":"8Stti","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],ijI2X:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o(e){let r=null,a=null,i=null,s=null,o=null,l=0,c=0,d=0,u=NaN,h=!0,m=.7,p=!1,f=1,g=0,k=new Set;function b(){return h?c:(i.currentTime-l)*f+c}function T(){if(!s)return;let e=p?0:m;s.gain.value=e*e}function y(e){if(i)return;let r=window.AudioContext||window.webkitAudioContext;try{i=new r({sampleRate:e})}catch{i=new r}(s=i.createGain()).connect(i.destination),T()}function S(){for(let e of k)e.stop();k.clear()}async function w(){await o?.return(),o=null}async function I(r){if(a)for(await w(),o=a.buffers(b());;){let a;if(r!==g||h)return;let n=o.next(),u=setInterval(()=>{r!==g||h?clearInterval(u):"running"===i.state&&i.currentTime>=d-.2&&(i.suspend(),e.emit("waiting"))},50);try{a=await n}catch(e){console.error(e);break}finally{clearInterval(u)}if(r!==g||h)return;if("suspended"===i.state&&(await i.resume(),e.emit("canplay"),e.emit("playing")),a.done)break;let{buffer:m,timestamp:p}=a.value,b=i.createBufferSource();b.buffer=m,b.connect(s),b.playbackRate.value=f;let T=l+(p-c)/f,y=T+m.duration/f;y>d&&(d=y),T>=i.currentTime?b.start(T):b.start(i.currentTime,(i.currentTime-T)*f),k.add(b),b.onended=()=>k.delete(b)}}function x(){h||(c=b(),h=!0,w(),S())}return{load:async function e(e,i){let s=++g;await w(),S(),h=!0,c=0,l=0;let o="string"==typeof e?new(0,n.UrlSource)(e):e instanceof Blob?new(0,n.BlobSource)(e):"undefined"!=typeof ReadableStream&&e instanceof ReadableStream?new(0,n.ReadableStreamSource)(e):e;if(!o||(r=new(0,n.Input)({source:o,formats:n.ALL_FORMATS}),u=await r.computeDuration(),s!==g))return;let d=await r.getPrimaryAudioTrack();if(!d||null===d.codec||!await d.canDecode()){a=null,y(),i&&i();return}y(d.sampleRate),a=new(0,n.AudioBufferSink)(d),i&&i()},play:async function e(){h&&(i||y(),"suspended"===i.state&&await i.resume(),d=l=i.currentTime,h=!1,I(++g))},pause:x,seek:async function e(e){c=Math.max(0,e),d=l=i.currentTime,g++,h||I(g)},destroy:function(){g++,x(),i?.close(),i=null,r=null,a=null},setVolume(e,r){m=e,p=r,T()},setPlaybackRate(e){e!==f&&(h||(c=b(),l=i.currentTime),f=e,h||I(++g))},get currentTime(){return b()},get duration(){return u},get paused(){return h}}}},{mediabunny:[["ALL_FORMATS","gFGfd"],["AudioBufferSink","6e2oW"],["BlobSource","108pa"],["ReadableStreamSource","108pa"],["UrlSource","108pa"],["Input","6K6yf"]],"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],gFGfd:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputFormat",()=>T),s.export(a,"IsobmffInputFormat",()=>y),s.export(a,"Mp4InputFormat",()=>S),s.export(a,"QuickTimeInputFormat",()=>w),s.export(a,"MatroskaInputFormat",()=>I),s.export(a,"WebMInputFormat",()=>x),s.export(a,"Mp3InputFormat",()=>E),s.export(a,"WaveInputFormat",()=>P),s.export(a,"OggInputFormat",()=>C),s.export(a,"FlacInputFormat",()=>B),s.export(a,"AdtsInputFormat",()=>_),s.export(a,"MP4",()=>A),s.export(a,"QTFF",()=>D),s.export(a,"MATROSKA",()=>M),s.export(a,"WEBM",()=>F),s.export(a,"MP3",()=>R),s.export(a,"WAVE",()=>U),s.export(a,"OGG",()=>L),s.export(a,"ADTS",()=>N),s.export(a,"FLAC",()=>j),s.export(a,"ALL_FORMATS",()=>O);var n=e("./isobmff/isobmff-demuxer.js"),o=e("./matroska/ebml.js"),l=e("./matroska/matroska-demuxer.js"),c=e("./mp3/mp3-demuxer.js"),d=e("../shared/mp3-misc.js"),u=e("./id3.js"),h=e("./mp3/mp3-reader.js"),m=e("./ogg/ogg-demuxer.js"),p=e("./wave/wave-demuxer.js"),f=e("./adts/adts-reader.js"),g=e("./adts/adts-demuxer.js"),k=e("./reader.js"),b=e("./flac/flac-demuxer.js");class T{}class y extends T{async _getMajorBrand(e){let r=e._reader.requestSlice(0,12);return(r instanceof Promise&&(r=await r),r)?(r.skip(4),"ftyp"!==(0,k.readAscii)(r,4))?null:(0,k.readAscii)(r,4):null}_createDemuxer(e){return new(0,n.IsobmffDemuxer)(e)}}class S extends y{async _canReadInput(e){let r=await this._getMajorBrand(e);return!!r&&"qt "!==r}get name(){return"MP4"}get mimeType(){return"video/mp4"}}class w extends y{async _canReadInput(e){return"qt "===await this._getMajorBrand(e)}get name(){return"QuickTime File Format"}get mimeType(){return"video/quicktime"}}class I extends T{async isSupportedEBMLOfDocType(e,r){let a=e._reader.requestSlice(0,o.MAX_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)return!1;let i=(0,o.readVarIntSize)(a);if(null===i||i<1||i>8||(0,o.readUnsignedInt)(a,i)!==o.EBMLId.EBML)return!1;let s=(0,o.readElementSize)(a);if(null===s)return!1;let n=e._reader.requestSlice(a.filePos,s);if(n instanceof Promise&&(n=await n),!n)return!1;let l=a.filePos;for(;n.filePos<=l+s-o.MIN_HEADER_SIZE;){let e=(0,o.readElementHeader)(n);if(!e)break;let{id:a,size:i}=e,s=n.filePos;if(null===i)return!1;switch(a){case o.EBMLId.EBMLVersion:case o.EBMLId.EBMLReadVersion:if(1!==(0,o.readUnsignedInt)(n,i))return!1;break;case o.EBMLId.DocType:if((0,o.readAsciiString)(n,i)!==r)return!1;break;case o.EBMLId.DocTypeVersion:if((0,o.readUnsignedInt)(n,i)>4)return!1}n.filePos=s+i}return!0}_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"matroska")}_createDemuxer(e){return new(0,l.MatroskaDemuxer)(e)}get name(){return"Matroska"}get mimeType(){return"video/x-matroska"}}class x extends I{_canReadInput(e){return this.isSupportedEBMLOfDocType(e,"webm")}get name(){return"WebM"}get mimeType(){return"video/webm"}}class E extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,10);if(r instanceof Promise&&(r=await r),!r)return!1;let a=0,i=!1;for(;;){let r=e._reader.requestSlice(a,u.ID3_V2_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let s=(0,u.readId3V2Header)(r);if(!s)break;i=!0,a=r.filePos+s.size}let s=await (0,h.readNextFrameHeader)(e._reader,a,a+4096);if(!s)return!1;if(i)return!0;a=s.startPos+s.header.totalSize;let n=await (0,h.readNextFrameHeader)(e._reader,a,a+d.FRAME_HEADER_SIZE);if(!n)return!1;let o=s.header,l=n.header;return o.channel===l.channel&&o.sampleRate===l.sampleRate}_createDemuxer(e){return new(0,c.Mp3Demuxer)(e)}get name(){return"MP3"}get mimeType(){return"audio/mpeg"}}class P extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,12);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,k.readAscii)(r,4);return("RIFF"===a||"RIFX"===a||"RF64"===a)&&(r.skip(4),"WAVE"===(0,k.readAscii)(r,4))}_createDemuxer(e){return new(0,p.WaveDemuxer)(e)}get name(){return"WAVE"}get mimeType(){return"audio/wav"}}class C extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"OggS"===(0,k.readAscii)(r,4)}_createDemuxer(e){return new(0,m.OggDemuxer)(e)}get name(){return"Ogg"}get mimeType(){return"application/ogg"}}class B extends T{async _canReadInput(e){let r=e._reader.requestSlice(0,4);return r instanceof Promise&&(r=await r),!!r&&"fLaC"===(0,k.readAscii)(r,4)}get name(){return"FLAC"}get mimeType(){return"audio/flac"}_createDemuxer(e){return new(0,b.FlacDemuxer)(e)}}class _ extends T{async _canReadInput(e){let r=e._reader.requestSliceRange(0,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)return!1;let a=(0,f.readFrameHeader)(r);if(!a||((r=e._reader.requestSliceRange(a.frameLength,f.MIN_FRAME_HEADER_SIZE,f.MAX_FRAME_HEADER_SIZE))instanceof Promise&&(r=await r),!r))return!1;let i=(0,f.readFrameHeader)(r);return!!i&&a.objectType===i.objectType&&a.samplingFrequencyIndex===i.samplingFrequencyIndex&&a.channelConfiguration===i.channelConfiguration}_createDemuxer(e){return new(0,g.AdtsDemuxer)(e)}get name(){return"ADTS"}get mimeType(){return"audio/aac"}}let A=new S,D=new w,M=new I,F=new x,R=new E,U=new P,L=new C,N=new _,j=new B,O=[A,D,M,F,U,L,j,R,N]},{"./isobmff/isobmff-demuxer.js":"kdFjc","./matroska/ebml.js":"4qt3Y","./matroska/matroska-demuxer.js":"fO0Ln","./mp3/mp3-demuxer.js":"1xfyp","../shared/mp3-misc.js":"jGy7Y","./id3.js":"8coNE","./mp3/mp3-reader.js":"ixvHZ","./ogg/ogg-demuxer.js":"lRP3H","./wave/wave-demuxer.js":"lP1MW","./adts/adts-reader.js":"iNEYI","./adts/adts-demuxer.js":"b3bBY","./reader.js":"6AkKg","./flac/flac-demuxer.js":"4fsLo","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],kdFjc:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"IsobmffDemuxer",()=>g);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../misc.js"),u=e("../packet.js"),h=e("./isobmff-misc.js"),m=e("./isobmff-reader.js"),p=e("../reader.js"),f=e("../metadata.js");class g extends l.Demuxer{constructor(e){super(e),this.moovSlice=null,this.currentTrack=null,this.tracks=[],this.metadataPromise=null,this.movieTimescale=-1,this.movieDurationInTimescale=-1,this.isQuickTime=!1,this.metadataTags={},this.currentMetadataKeys=null,this.isFragmented=!1,this.fragmentTrackDefaults=[],this.currentFragment=null,this.lastReadFragment=null,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e=await Promise.all(this.tracks.map(e=>e.inputTrack.getCodecParameterString()));return(0,h.buildIsobmffMimeType)({isQuickTime:this.isQuickTime,hasVideo:this.tracks.some(e=>e.info?.type==="video"),hasAudio:this.tracks.some(e=>e.info?.type==="audio"),codecStrings:e.filter(Boolean)})}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,m.MIN_BOX_HEADER_SIZE,m.MAX_BOX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=e,i=(0,m.readBoxHeader)(r);if(!i)break;if("ftyp"===i.name){let e=(0,p.readAscii)(r,4);this.isQuickTime="qt "===e}else if("moov"===i.name){let e=this.reader.requestSlice(r.filePos,i.contentSize);if(e instanceof Promise&&(e=await e),!e)break;for(let r of(this.moovSlice=e,this.readContiguousBoxes(this.moovSlice),this.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default)),this.tracks)){let e=r.editListPreviousSegmentDurations/this.movieTimescale;r.editListOffset-=Math.round(e*r.timescale)}break}e=a+i.totalSize}if(this.isFragmented&&null!==this.reader.fileSize){let e=this.reader.requestSlice(this.reader.fileSize-4,4);e instanceof Promise&&(e=await e),(0,d.assert)(e);let r=(0,p.readU32Be)(e),a=this.reader.fileSize-r;if(a>=0&&a<=this.reader.fileSize-m.MAX_BOX_HEADER_SIZE){let e=this.reader.requestSliceRange(a,m.MIN_BOX_HEADER_SIZE,m.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),e){let r=(0,m.readBoxHeader)(e);if(r&&"mfra"===r.name){let a=this.reader.requestSlice(e.filePos,r.contentSize);a instanceof Promise&&(a=await a),a&&this.readContiguousBoxes(a)}}}}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let r={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:null,presentationTimestampIndexMap:null};e.sampleTable=r,(0,d.assert)(this.moovSlice);let a=this.moovSlice.slice(e.sampleTableByteOffset);if(this.currentTrack=e,this.traverseBox(a),this.currentTrack=null,e.info?.type==="audio"&&e.info.codec&&n.PCM_AUDIO_CODECS.includes(e.info.codec)&&0===r.sampleCompositionTimeOffsets.length){(0,d.assert)(e.info?.type==="audio");let a=(0,n.parsePcmCodec)(e.info.codec),i=[],s=[];for(let n=0;ne.startIndex),h=r.sampleTimingEntries[u],m=(0,d.binarySearchLessOrEqual)(r.sampleTimingEntries,c,e=>e.startIndex),p=r.sampleTimingEntries[m],f=h.startDecodeTimestamp+(l-h.startIndex)*h.delta,g=p.startDecodeTimestamp+(c-p.startIndex)*p.delta-f,k=(0,d.last)(i);k&&k.delta===g?k.count++:i.push({startIndex:o.startChunkIndex+n,startDecodeTimestamp:f,count:1,delta:g});let b=o.samplesPerChunk*a.sampleSize*e.info.numberOfChannels;s.push(b)}o.startSampleIndex=o.startChunkIndex,o.samplesPerChunk=1}r.sampleTimingEntries=i,r.sampleSizes=s}if(r.sampleCompositionTimeOffsets.length>0){for(let e of(r.presentationTimestamps=[],r.sampleTimingEntries))for(let a=0;ae.presentationTimestamp-r.presentationTimestamp),r.presentationTimestampIndexMap=Array(r.presentationTimestamps.length).fill(-1);for(let e=0;ee.moofOffset===s.moofOffset);if(i)x(r,i.timestamp);else{let e=(0,d.binarySearchLessOrEqual)(a,s.moofOffset-1,e=>e.moofOffset);-1!==e&&x(r,a[e].endTimestamp)}r.startTimestampIsFinal=!0}let i=(0,d.binarySearchLessOrEqual)(a,r.startTimestamp,e=>e.startTimestamp);(-1===i||a[i].moofOffset!==s.moofOffset)&&a.splice(i+1,0,{moofOffset:s.moofOffset,startTimestamp:r.startTimestamp,endTimestamp:r.endTimestamp})}return s}readContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-m.MIN_BOX_HEADER_SIZE&&this.traverseBox(e););}*iterateContiguousBoxes(e){let r=e.filePos;for(;e.filePos-r<=e.length-m.MIN_BOX_HEADER_SIZE;){let r=e.filePos,a=(0,m.readBoxHeader)(e);if(!a)break;yield{boxInfo:a,slice:e},e.filePos=r+a.totalSize}}traverseBox(e){let r=e.filePos,a=(0,m.readBoxHeader)(e);if(!a)return!1;let i=e.filePos,s=r+a.totalSize;switch(a.name){case"mdia":case"minf":case"dinf":case"mfra":case"edts":case"wave":this.readContiguousBoxes(e.slice(i,a.contentSize));break;case"mvhd":{let r=(0,p.readU8)(e);e.skip(3),1===r?(e.skip(16),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU64Be)(e)):(e.skip(8),this.movieTimescale=(0,p.readU32Be)(e),this.movieDurationInTimescale=(0,p.readU32Be)(e))}break;case"trak":{let r={id:-1,demuxer:this,inputTrack:null,disposition:{...f.DEFAULT_TRACK_DISPOSITION},info:null,timescale:-1,durationInMovieTimescale:-1,durationInMediaTimescale:-1,rotation:0,internalCodecId:null,name:null,languageCode:d.UNDETERMINED_LANGUAGE,sampleTableByteOffset:-1,sampleTable:null,fragmentLookupTable:[],currentFragmentState:null,fragmentPositionCache:[],editListPreviousSegmentDurations:0,editListOffset:0};this.currentTrack=r,this.readContiguousBoxes(e.slice(i,a.contentSize)),-1!==r.id&&-1!==r.timescale&&null!==r.info&&("video"===r.info.type&&-1!==r.info.width?(r.inputTrack=new(0,c.InputVideoTrack)(this.input,new b(r)),this.tracks.push(r)):"audio"===r.info.type&&-1!==r.info.numberOfChannels&&(r.inputTrack=new(0,c.InputAudioTrack)(this.input,new T(r)),this.tracks.push(r))),this.currentTrack=null}break;case"tkhd":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e);if(r.disposition.default=!!(1&i),0===a)e.skip(8),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU32Be)(e);else if(1===a)e.skip(16),r.id=(0,p.readU32Be)(e),e.skip(4),r.durationInMovieTimescale=(0,p.readU64Be)(e);else throw Error(`Incorrect track header version ${a}.`);e.skip(16);let s=[(0,m.readFixed_16_16)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_2_30)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_2_30)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_16_16)(e),(0,m.readFixed_2_30)(e)],n=(0,d.normalizeRotation)((0,d.roundToMultiple)(E(s),90));(0,d.assert)(0===n||90===n||180===n||270===n),r.rotation=n}break;case"elst":{let r=this.currentTrack;if(!r)break;let a=(0,p.readU8)(e);e.skip(3);let i=!1,s=0,n=(0,p.readU32Be)(e);for(let o=0;o0){r.languageCode="";for(let e=0;e<3;e++)r.languageCode=String.fromCharCode(96+(31&i))+r.languageCode,i>>=5;(0,d.isIso639Dash2LanguageCode)(r.languageCode)||(r.languageCode=d.UNDETERMINED_LANGUAGE)}}break;case"hdlr":{let r=this.currentTrack;if(!r)break;e.skip(8);let a=(0,p.readAscii)(e,4);"vide"===a?r.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}:"soun"===a&&(r.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case"stbl":{let s=this.currentTrack;if(!s)break;s.sampleTableByteOffset=r,this.readContiguousBoxes(e.slice(i,a.contentSize))}break;case"stsd":{let r=this.currentTrack;if(!r||null===r.info||r.sampleTable)break;let a=(0,p.readU8)(e);e.skip(3);let i=(0,p.readU32Be)(e);for(let s=0;s0){if(1===l)e.skip(4),d=8*(0,p.readU32Be)(e),e.skip(8);else if(2===l){e.skip(4),u=(0,p.readF64Be)(e),c=(0,p.readU32Be)(e),e.skip(4),d=(0,p.readU32Be)(e);let a=(0,p.readU32Be)(e);if(e.skip(8),"lpcm"===o){let e=d+7>>3,i=!!(1&a),s=!!(2&a),n=4&a?-1:0;d>0&&d<=64&&(i?32===d&&(r.info.codec=s?"pcm-f32be":"pcm-f32"):n&1<>4,chromaSubsampling:s>>1&7,videoFullRangeFlag:1&s,colourPrimaries:n,transferCharacteristics:o,matrixCoefficients:l}}break;case"av1C":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="video"),e.skip(1);let a=(0,p.readU8)(e),i=a>>5,s=(0,p.readU8)(e),n=s>>6&1;r.info.av1CodecInfo={profile:i,level:31&a,tier:s>>7,bitDepth:2===i&&n?s>>5&1?12:10:n?10:8,monochrome:s>>4&1,chromaSubsamplingX:s>>3&1,chromaSubsamplingY:s>>2&1,chromaSamplePosition:3&s}}break;case"colr":{let r=this.currentTrack;if(!r||((0,d.assert)(r.info?.type==="video"),"nclx"!==(0,p.readAscii)(e,4)))break;let a=(0,p.readU16Be)(e),i=(0,p.readU16Be)(e),s=(0,p.readU16Be)(e),n=!!(128&(0,p.readU8)(e));r.info.colorSpace={primaries:d.COLOR_PRIMARIES_MAP_INVERSE[a],transfer:d.TRANSFER_CHARACTERISTICS_MAP_INVERSE[i],matrix:d.MATRIX_COEFFICIENTS_MAP_INVERSE[s],fullRange:n}}break;case"esds":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=(0,p.readU8)(e);(0,d.assert)(3===a),(0,m.readIsomVariableInteger)(e),e.skip(2);let i=(0,p.readU8)(e);if((128&i)!=0&&e.skip(2),(64&i)!=0){let r=(0,p.readU8)(e);e.skip(r)}(32&i)!=0&&e.skip(2);let s=(0,p.readU8)(e);(0,d.assert)(4===s);let o=(0,m.readIsomVariableInteger)(e),l=e.filePos,c=(0,p.readU8)(e);if(64===c||103===c?(r.info.codec="aac",r.info.aacCodecInfo={isMpeg2:103===c}):105===c||107===c?r.info.codec="mp3":221===c?r.info.codec="vorbis":console.warn(`Unsupported audio codec (objectTypeIndication ${c}) - discarding track.`),e.skip(12),o>e.filePos-l){let a=(0,p.readU8)(e);(0,d.assert)(5===a);let i=(0,m.readIsomVariableInteger)(e);if(r.info.codecDescription=(0,p.readBytes)(e,i),"aac"===r.info.codec){let e=(0,n.parseAacAudioSpecificConfig)(r.info.codecDescription);null!==e.numberOfChannels&&(r.info.numberOfChannels=e.numberOfChannels),null!==e.sampleRate&&(r.info.sampleRate=e.sampleRate)}}}break;case"enda":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),255&(0,p.readU16Be)(e)&&("pcm-s16be"===r.info.codec?r.info.codec="pcm-s16":"pcm-s24be"===r.info.codec?r.info.codec="pcm-s24":"pcm-s32be"===r.info.codec?r.info.codec="pcm-s32":"pcm-f32be"===r.info.codec?r.info.codec="pcm-f32":"pcm-f64be"===r.info.codec&&(r.info.codec="pcm-f64"))}break;case"pcmC":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=!!(1&(0,p.readU8)(e)),i=(0,p.readU8)(e);"pcm-s16be"===r.info.codec?a?16===i?r.info.codec="pcm-s16":24===i?r.info.codec="pcm-s24":32===i?r.info.codec="pcm-s32":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):16===i?r.info.codec="pcm-s16be":24===i?r.info.codec="pcm-s24be":32===i?r.info.codec="pcm-s32be":(console.warn(`Invalid ipcm sample size ${i}.`),r.info.codec=null):"pcm-f32be"===r.info.codec&&(a?32===i?r.info.codec="pcm-f32":64===i?r.info.codec="pcm-f64":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null):32===i?r.info.codec="pcm-f32be":64===i?r.info.codec="pcm-f64be":(console.warn(`Invalid fpcm sample size ${i}.`),r.info.codec=null));break}case"dOps":{let r,a=this.currentTrack;if(!a)break;(0,d.assert)(a.info?.type==="audio"),e.skip(1);let i=(0,p.readU8)(e),s=(0,p.readU16Be)(e),n=(0,p.readU32Be)(e),o=(0,p.readI16Be)(e),l=(0,p.readU8)(e);r=0!==l?(0,p.readBytes)(e,2+i):new Uint8Array(0);let c=new Uint8Array(19+r.byteLength),u=new DataView(c.buffer);u.setUint32(0,0x4f707573,!1),u.setUint32(4,0x48656164,!1),u.setUint8(8,1),u.setUint8(9,i),u.setUint16(10,s,!0),u.setUint32(12,n,!0),u.setInt16(16,o,!0),u.setUint8(18,l),c.set(r,19),a.info.codecDescription=c,a.info.numberOfChannels=i}break;case"dfLa":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.info?.type==="audio"),e.skip(4);let a=e.filePos;for(;e.filePos>>12,s=(a>>9&7)+1;r.info.sampleRate=i,r.info.numberOfChannels=s,e.skip(20)}else e.skip(i);if(128&a)break}let i=e.filePos;e.filePos=a;let n=(0,p.readBytes)(e,i-a),l=new Uint8Array(4+n.byteLength);new DataView(l.buffer).setUint32(0,0x664c6143,!1),l.set(n,4),r.info.codecDescription=l}break;case"stts":{let r=this.currentTrack;if(!r||!r.sampleTable)break;e.skip(4);let a=(0,p.readU32Be)(e),i=0,s=0;for(let n=0;ne.id===a);if(!i)break;let s=(0,p.readU32Be)(e),n=[p.readU8,p.readU16Be,p.readU24Be,p.readU32Be],o=n[(48&s)>>4],l=n[(12&s)>>2],c=n[3&s],d=(0,p.readU32Be)(e);for(let a=0;ae.timestamp-r.timestamp);for(let e=0;ee.id===a);if(!i)break;let s=this.fragmentTrackDefaults.find(e=>e.trackId===a);this.currentTrack=i,i.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:s?.defaultSampleDescriptionIndex??null,defaultSampleDuration:s?.defaultSampleDuration??null,defaultSampleSize:s?.defaultSampleSize??null,defaultSampleFlags:s?.defaultSampleFlags??null,startTimestamp:null},1&r?i.currentFragmentState.baseDataOffset=(0,p.readU64Be)(e):131072&r&&(i.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),2&r&&(i.currentFragmentState.sampleDescriptionIndex=(0,p.readU32Be)(e)),8&r&&(i.currentFragmentState.defaultSampleDuration=(0,p.readU32Be)(e)),16&r&&(i.currentFragmentState.defaultSampleSize=(0,p.readU32Be)(e)),32&r&&(i.currentFragmentState.defaultSampleFlags=(0,p.readU32Be)(e)),65536&r&&(i.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let r=this.currentTrack;if(!r)break;(0,d.assert)(r.currentFragmentState);let a=(0,p.readU8)(e);e.skip(3);let i=0===a?(0,p.readU32Be)(e):(0,p.readU64Be)(e);r.currentFragmentState.startTimestamp=i}break;case"trun":{let r=this.currentTrack;if(!r)break;if((0,d.assert)(this.currentFragment),(0,d.assert)(r.currentFragmentState),this.currentFragment.trackData.has(r.id)){console.warn("Can't have two trun boxes for the same track in one fragment. Ignoring...");break}let a=(0,p.readU8)(e),i=(0,p.readU24Be)(e),s=!!(256&i),n=!!(512&i),o=!!(1024&i),l=!!(2048&i),c=(0,p.readU32Be)(e),u=r.currentFragmentState.baseDataOffset;1&i&&(u+=(0,p.readI32Be)(e));let h=null;4&i&&(h=(0,p.readU32Be)(e));let m=u;if(0===c){this.currentFragment.implicitBaseDataOffset=m;break}let f=0,g={track:r,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(r.id,g);for(let i=0;i({presentationTimestamp:e.presentationTimestamp,sampleIndex:r})).sort((e,r)=>e.presentationTimestamp-r.presentationTimestamp);for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"trkn":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.trackNumber??=r),a>0&&(this.metadataTags.tracksTotal??=a)}break;case"disc":case"disk":if(i instanceof Uint8Array&&i.length>=6){let e=(0,d.toDataView)(i),r=e.getUint16(2,!1),a=e.getUint16(4,!1);r>0&&(this.metadataTags.discNumber??=r),a>0&&(this.metadataTags.discsTotal??=a)}}}}return e.filePos=s,!0}}class k{constructor(e){this.internalTrack=e,this.packetToSampleIndex=new WeakMap,this.packetToFragmentLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.internalCodecId}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}getTimeResolution(){return this.internalTrack.timescale}getDisposition(){return this.internalTrack.disposition}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}async getFirstPacket(e){let r=await this.fetchPacketForSampleIndex(0,e);return r||!this.internalTrack.demuxer.isFragmented?r:this.performFragmentedLookup(null,e=>e.trackData.get(this.internalTrack.id)?{sampleIndex:0,correctSampleFound:!0}:{sampleIndex:-1,correctSampleFound:!1},-1/0,1/0,e)}mapTimestampIntoTimescale(e){return(0,d.roundIfAlmostInteger)(e*this.internalTrack.timescale)+this.internalTrack.editListOffset}async getPacket(e,r){let a=this.mapTimestampIntoTimescale(e),i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=y(i,a),n=await this.fetchPacketForSampleIndex(s,r);return P(i)&&this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.presentationTimestamp);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id);if(i.sampleIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{sampleIndex:-1,correctSampleFound:!1};let i=(0,d.findLastIndex)(r.presentationTimestamps,e=>r.samples[e.sampleIndex].isKeyFrame&&e.presentationTimestamp<=a);return{sampleIndex:-1!==i?r.presentationTimestamps[i].sampleIndex:-1,correctSampleFound:-1!==i&&a{if(e===i.fragment){let r=e.trackData.get(this.internalTrack.id).samples.findIndex((e,r)=>e.isKeyFrame&&r>i.sampleIndex);if(-1!==r)return{sampleIndex:r,correctSampleFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.samples.findIndex(e=>e.isKeyFrame);return(0,d.assert)(-1!==e),{sampleIndex:e,correctSampleFound:!0}}}return{sampleIndex:-1,correctSampleFound:!1}},-1/0,1/0,r)}async fetchPacketForSampleIndex(e,r){let a;if(-1===e)return null;let i=w(this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),e);if(!i)return null;if(r.metadataOnly)a=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(i.sampleOffset,i.sampleSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),a=(0,p.readBytes)(e,i.sampleSize)}let s=(i.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,n=i.duration/this.internalTrack.timescale,o=new(0,u.EncodedPacket)(a,i.isKeyFrame?"key":"delta",s,n,e,i.sampleSize);return this.packetToSampleIndex.set(o,e),o}async fetchPacketInFragment(e,r,a){let i;if(-1===r)return null;let s=e.trackData.get(this.internalTrack.id).samples[r];if((0,d.assert)(s),a.metadataOnly)i=u.PLACEHOLDER_DATA;else{let e=this.internalTrack.demuxer.reader.requestSlice(s.byteOffset,s.byteSize);e instanceof Promise&&(e=await e),(0,d.assert)(e),i=(0,p.readBytes)(e,s.byteSize)}let n=(s.presentationTimestamp-this.internalTrack.editListOffset)/this.internalTrack.timescale,o=s.duration/this.internalTrack.timescale,l=new(0,u.EncodedPacket)(i,s.isKeyFrame?"key":"delta",n,o,e.moofOffset+r,s.byteSize);return this.packetToFragmentLocation.set(l,{fragment:e,sampleIndex:r}),l}async performFragmentedLookup(e,r,a,i,s){let n,o=this.internalTrack.demuxer,l=null,c=null,u=-1;if(e){let{sampleIndex:a,correctSampleFound:i}=r(e);if(i)return this.fetchPacketInFragment(e,a,s);-1!==a&&(c=e,u=a)}let h=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentLookupTable,a,e=>e.timestamp),p=-1!==h?this.internalTrack.fragmentLookupTable[h]:null,f=(0,d.binarySearchLessOrEqual)(this.internalTrack.fragmentPositionCache,a,e=>e.startTimestamp),g=-1!==f?this.internalTrack.fragmentPositionCache[f]:null,k=Math.max(p?.moofOffset??0,g?.moofOffset??0)||null;for(e?null===k||e.moofOffset>=k?(n=e.moofOffset+e.moofSize,l=e):n=k:n=k??0;;){if(l){let e=l.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,m.MIN_BOX_HEADER_SIZE,m.MAX_BOX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,d=(0,m.readBoxHeader)(e);if(!d)break;if("moof"===d.name){let{sampleIndex:e,correctSampleFound:i}=r(l=await o.readFragment(a));if(i)return this.fetchPacketInFragment(l,e,s);-1!==e&&(c=l,u=e)}n=a+d.totalSize}if(p&&(!c||c.moofOffset{if("vp9"!==this.internalTrack.info.codec||this.internalTrack.info.vp9CodecInfo){if("av1"===this.internalTrack.info.codec&&!this.internalTrack.info.av1CodecInfo){let e=await this.getFirstPacket({});this.internalTrack.info.av1CodecInfo=e&&(0,o.extractAv1CodecInfoFromPacket)(e.data)}}else{let e=await this.getFirstPacket({});this.internalTrack.info.vp9CodecInfo=e&&(0,o.extractVp9CodecInfoFromPacket)(e.data)}return{codec:(0,n.extractVideoCodecString)(this.internalTrack.info),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class T extends k{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,n.extractAudioCodecString)(this.internalTrack.info),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}let y=(e,r)=>{if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);return -1===a?-1:e.presentationTimestamps[a].sampleIndex}{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startDecodeTimestamp);if(-1===a)return -1;let i=e.sampleTimingEntries[a];return i.startIndex+Math.min(Math.floor((r-i.startDecodeTimestamp)/i.delta),i.count-1)}},S=(e,r)=>{if(!e.keySampleIndices)return y(e,r);if(e.presentationTimestamps){let a=(0,d.binarySearchLessOrEqual)(e.presentationTimestamps,r,e=>e.presentationTimestamp);if(-1===a)return -1;for(let r=a;r>=0;r--){let a=e.presentationTimestamps[r].sampleIndex;if(-1!==(0,d.binarySearchExact)(e.keySampleIndices,a,e=>e))return a}return -1}{let a=y(e,r),i=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,a,e=>e);return e.keySampleIndices[i]??-1}},w=(e,r)=>{let a=(0,d.binarySearchLessOrEqual)(e.sampleTimingEntries,r,e=>e.startIndex),i=e.sampleTimingEntries[a];if(!i||i.startIndex+i.count<=r)return null;let s=i.startDecodeTimestamp+(r-i.startIndex)*i.delta,n=(0,d.binarySearchLessOrEqual)(e.sampleCompositionTimeOffsets,r,e=>e.startIndex),o=e.sampleCompositionTimeOffsets[n];o&&r-o.startIndexe.startSampleIndex),u=e.sampleToChunk[c];(0,d.assert)(u);let h=u.startChunkIndex+Math.floor((r-u.startSampleIndex)/u.samplesPerChunk),m=e.chunkOffsets[h],p=u.startSampleIndex+(h-u.startChunkIndex)*u.samplesPerChunk,f=0,g=m;if(1===e.sampleSizes.length)g+=l*(r-p),f+=l*u.samplesPerChunk;else for(let a=p;ae)}},I=(e,r)=>{if(!e.keySampleIndices)return r+1;let a=(0,d.binarySearchLessOrEqual)(e.keySampleIndices,r,e=>e);return e.keySampleIndices[a+1]??-1},x=(e,r)=>{for(let a of(e.startTimestamp+=r,e.endTimestamp+=r,e.samples))a.presentationTimestamp+=r;for(let a of e.presentationTimestamps)a.presentationTimestamp+=r},E=e=>{let[r,,,a]=e,i=Math.hypot(r,a),s=-(180/Math.PI*Math.atan2(a/i,r/i));return Number.isFinite(s)?s:0},P=e=>0===e.sampleSizes.length},{"../codec.js":"4GUiq","../codec-data.js":"zx4dz","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../misc.js":"jrq2g","../packet.js":"8dQhf","./isobmff-misc.js":"fHhRy","./isobmff-reader.js":"8zjcB","../reader.js":"6AkKg","../metadata.js":"1RzS5","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4GUiq":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"VIDEO_CODECS",()=>o),s.export(a,"PCM_AUDIO_CODECS",()=>l),s.export(a,"NON_PCM_AUDIO_CODECS",()=>c),s.export(a,"AUDIO_CODECS",()=>d),s.export(a,"SUBTITLE_CODECS",()=>u),s.export(a,"VP9_LEVEL_TABLE",()=>p),s.export(a,"buildVideoCodecString",()=>b),s.export(a,"generateVp9CodecConfigurationFromCodecString",()=>T),s.export(a,"generateAv1CodecConfigurationFromCodecString",()=>y),s.export(a,"extractVideoCodecString",()=>S),s.export(a,"buildAudioCodecString",()=>w),s.export(a,"extractAudioCodecString",()=>I),s.export(a,"aacFrequencyTable",()=>x),s.export(a,"aacChannelMap",()=>E),s.export(a,"parseAacAudioSpecificConfig",()=>P),s.export(a,"buildAacAudioSpecificConfig",()=>C),s.export(a,"OPUS_SAMPLE_RATE",()=>B),s.export(a,"parsePcmCodec",()=>A),s.export(a,"inferCodecFromCodecString",()=>D),s.export(a,"getVideoEncoderConfigExtension",()=>M),s.export(a,"getAudioEncoderConfigExtension",()=>F),s.export(a,"validateVideoChunkMetadata",()=>O),s.export(a,"validateAudioChunkMetadata",()=>V),s.export(a,"validateSubtitleMetadata",()=>H);var n=e("./misc.js");let o=["avc","hevc","vp9","av1","vp8"],l=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],c=["aac","opus","mp3","vorbis","flac"],d=[...c,...l],u=["webvtt"],h=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],m=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:0x2200000,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:186}],p=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:0x2200000,maxBitrate:18e7,level:60},{maxPictureSize:0x2200000,maxBitrate:24e7,level:61},{maxPictureSize:0x2200000,maxBitrate:48e7,level:62}],f=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:0x2200000,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:0x2200000,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:0x2200000,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:0x2200000,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:0x2200000,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:0x2200000,maxBitrate:8e8,tier:"H",level:19}],g=".01.01.01.01.00",k=".0.110.01.01.01.0",b=(e,r,a,i)=>{if("avc"===e){let e=Math.ceil(r/16)*Math.ceil(a/16),s=h.find(r=>e<=r.maxMacroblocks&&i<=r.maxBitrate)??(0,n.last)(h),o=s?s.level:0,l="64".padStart(2,"0"),c=o.toString(16).padStart(2,"0");return`avc1.${l}00${c}`}if("hevc"===e){let e=r*a,s=m.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(m);return`hev1.1.6.${s.tier}${s.level}.B0`}if("vp8"===e)return"vp8";if("vp9"===e){let e=r*a,s=p.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(p);return`vp09.00.${s.level.toString().padStart(2,"0")}.08`}if("av1"===e){let e=r*a,s=f.find(r=>e<=r.maxPictureSize&&i<=r.maxBitrate)??(0,n.last)(f),o=s.level.toString().padStart(2,"0");return`av01.0.${o}${s.tier}.08`}throw TypeError(`Unhandled codec '${e}'.`)},T=e=>{let r=e.split(".");return[1,1,Number(r[1]),2,1,Number(r[2]),3,1,Number(r[3]),4,1,r[4]?Number(r[4]):1]},y=e=>{let r=e.split("."),a=Number(r[1]),i=r[2];return[129,(a<<5)+Number(i.slice(0,-1)),(("H"===i.slice(-1))<<7)+((8!==Number(r[3]))<<6)+0+((r[4]?Number(r[4]):0)<<4)+((r[5]?Number(r[5][0]):1)<<3)+((r[5]?Number(r[5][1]):1)<<2)+(r[5]?Number(r[5][2]):0),0]},S=e=>{let{codec:r,codecDescription:a,colorSpace:i,avcCodecInfo:s,hevcCodecInfo:o,vp9CodecInfo:l,av1CodecInfo:c}=e;if("avc"===r){if((0,n.assert)(null!==e.avcType),s){let r=new Uint8Array([s.avcProfileIndication,s.profileCompatibility,s.avcLevelIndication]);return`avc${e.avcType}.${(0,n.bytesToHexString)(r)}`}if(!a||a.byteLength<4)throw TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${e.avcType}.${(0,n.bytesToHexString)(a.subarray(1,4))}`}if("hevc"===r){let e,r,i,s,l,c;if(o)e=o.generalProfileSpace,r=o.generalProfileIdc,i=(0,n.reverseBitsU32)(o.generalProfileCompatibilityFlags),s=o.generalTierFlag,l=o.generalLevelIdc,c=[...o.generalConstraintIndicatorFlags];else{if(!a||a.byteLength<23)throw TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let o=(0,n.toDataView)(a),d=o.getUint8(1);e=d>>6&3,r=31&d,i=(0,n.reverseBitsU32)(o.getUint32(2)),s=d>>5&1,l=o.getUint8(12),c=[];for(let e=0;e<6;e++)c.push(o.getUint8(6+e))}let d="hev1.";for(d+=["","A","B","C"][e]+r,d+=".",d+=i.toString(16).toUpperCase(),d+=".",d+=0===s?"L":"H",d+=l;c.length>0&&0===c[c.length-1];)c.pop();return c.length>0&&(d+=".",d+=c.map(e=>e.toString(16).toUpperCase()).join(".")),d}if("vp8"===r)return"vp8";if("vp9"===r){if(!l){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`vp09.00.${a.toString().padStart(2,"0")}.08`}let r=l.profile.toString().padStart(2,"0"),a=l.level.toString().padStart(2,"0"),i=l.bitDepth.toString().padStart(2,"0"),s=l.chromaSubsampling.toString().padStart(2,"0"),o=l.colourPrimaries.toString().padStart(2,"0"),c=l.transferCharacteristics.toString().padStart(2,"0"),d=l.matrixCoefficients.toString().padStart(2,"0"),u=l.videoFullRangeFlag.toString().padStart(2,"0"),h=`vp09.${r}.${a}.${i}.${s}`;return(h+=`.${o}.${c}.${d}.${u}`).endsWith(g)&&(h=h.slice(0,-g.length)),h}if("av1"===r){if(!c){let r=e.width*e.height,a=(0,n.last)(p).level;for(let e of p)if(r<=e.maxPictureSize){a=e.level;break}return`av01.0.${a.toString().padStart(2,"0")}M.08`}let r=c.profile,a=c.level.toString().padStart(2,"0"),s=c.tier?"H":"M",o=c.bitDepth.toString().padStart(2,"0"),l=c.monochrome?"1":"0",d=100*c.chromaSubsamplingX+10*c.chromaSubsamplingY+ +(c.chromaSubsamplingX&&c.chromaSubsamplingY?c.chromaSamplePosition:0),u=i?.primaries?n.COLOR_PRIMARIES_MAP[i.primaries]:1,h=i?.transfer?n.TRANSFER_CHARACTERISTICS_MAP[i.transfer]:1,m=i?.matrix?n.MATRIX_COEFFICIENTS_MAP[i.matrix]:1,f=+!!i?.fullRange,g=`av01.${r}.${a}${s}.${o}`;return g+=`.${l}.${d.toString().padStart(3,"0")}`,g+=`.${u.toString().padStart(2,"0")}`,g+=`.${h.toString().padStart(2,"0")}`,g+=`.${m.toString().padStart(2,"0")}`,(g+=`.${f}`).endsWith(k)&&(g=g.slice(0,-k.length)),g}throw TypeError(`Unhandled codec '${r}'.`)},w=(e,r,a)=>{if("aac"===e)return r>=2&&a<=24e3?"mp4a.40.29":a<=24e3?"mp4a.40.5":"mp4a.40.2";if("mp3"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if(l.includes(e))return e;throw TypeError(`Unhandled codec '${e}'.`)},I=e=>{let{codec:r,codecDescription:a,aacCodecInfo:i}=e;if("aac"===r){if(!i)throw TypeError("AAC codec info must be provided.");if(i.isMpeg2)return"mp4a.67";{let e=P(a);return`mp4a.40.${e.objectType}`}}if("mp3"===r)return"mp3";if("opus"===r)return"opus";if("vorbis"===r)return"vorbis";if("flac"===r)return"flac";else if(r&&l.includes(r))return r;throw TypeError(`Unhandled codec '${r}'.`)},x=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],E=[-1,1,2,3,4,5,6,8],P=e=>{if(!e||e.byteLength<2)throw TypeError("AAC description must be at least 2 bytes long.");let r=new(0,n.Bitstream)(e),a=r.readBits(5);31===a&&(a=32+r.readBits(6));let i=r.readBits(4),s=null;15===i?s=r.readBits(24):i=1&&o<=7&&(l=E[o]),{objectType:a,frequencyIndex:i,sampleRate:s,channelConfiguration:o,numberOfChannels:l}},C=e=>{let r=x.indexOf(e.sampleRate),a=null;-1===r&&(r=15,a=e.sampleRate);let i=E.indexOf(e.numberOfChannels);if(-1===i)throw TypeError(`Unsupported number of channels: ${e.numberOfChannels}`);let s=13;e.objectType>=32&&(s+=6),15===r&&(s+=24);let o=new Uint8Array(Math.ceil(s/8)),l=new(0,n.Bitstream)(o);return e.objectType<32?l.writeBits(5,e.objectType):(l.writeBits(5,31),l.writeBits(6,e.objectType-32)),l.writeBits(4,r),15===r&&l.writeBits(24,a),l.writeBits(4,i),o},B=48e3,_=/^pcm-([usf])(\d+)+(be)?$/,A=e=>{let r;if((0,n.assert)(l.includes(e)),"ulaw"===e)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===e)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};let a=_.exec(e);(0,n.assert)(a),r="u"===a[1]?"unsigned":"s"===a[1]?"signed":"float";let i=Number(a[2])/8;return{dataType:r,sampleSize:i,littleEndian:"be"!==a[3],silentValue:128*("pcm-u8"===e)}},D=e=>{if(e.startsWith("avc1")||e.startsWith("avc3"))return"avc";if(e.startsWith("hev1")||e.startsWith("hvc1"))return"hevc";if("vp8"===e)return"vp8";if(e.startsWith("vp09"))return"vp9";if(e.startsWith("av01"))return"av1";if(e.startsWith("mp4a.40")||"mp4a.67"===e)return"aac";if("mp3"===e||"mp4a.69"===e||"mp4a.6B"===e||"mp4a.6b"===e)return"mp3";if("opus"===e)return"opus";if("vorbis"===e)return"vorbis";if("flac"===e)return"flac";else if("ulaw"===e)return"ulaw";else if("alaw"===e)return"alaw";else if(_.test(e))return e;return"webvtt"===e?"webvtt":null},M=e=>"avc"===e?{avc:{format:"avc"}}:"hevc"===e?{hevc:{format:"hevc"}}:{},F=e=>"aac"===e?{aac:{format:"aac"}}:"opus"===e?{opus:{format:"opus"}}:{},R=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],U=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,L=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,N=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,j=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,O=e=>{if(!e)throw TypeError("Video chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Video chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!R.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.codedWidth)||e.decoderConfig.codedWidth<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(e.decoderConfig.codedHeight)||e.decoderConfig.codedHeight<=0)throw TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==e.decoderConfig.colorSpace){let{colorSpace:r}=e.decoderConfig;if("object"!=typeof r)throw TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let a=Object.keys(n.COLOR_PRIMARIES_MAP);if(null!=r.primaries&&!a.includes(r.primaries))throw TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${a.join(", ")}.`);let i=Object.keys(n.TRANSFER_CHARACTERISTICS_MAP);if(null!=r.transfer&&!i.includes(r.transfer))throw TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(n.MATRIX_COEFFICIENTS_MAP);if(null!=r.matrix&&!s.includes(r.matrix))throw TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(null!=r.fullRange&&"boolean"!=typeof r.fullRange)throw TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(e.decoderConfig.codec.startsWith("avc1")||e.decoderConfig.codec.startsWith("avc3")){if(!U.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(e.decoderConfig.codec.startsWith("hev1")||e.decoderConfig.codec.startsWith("hvc1")){if(!L.test(e.decoderConfig.codec))throw TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(e.decoderConfig.codec.startsWith("vp8")){if("vp8"!==e.decoderConfig.codec)throw TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(e.decoderConfig.codec.startsWith("vp09")){if(!N.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(e.decoderConfig.codec.startsWith("av01")&&!j.test(e.decoderConfig.codec))throw TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},z=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm"],V=e=>{if(!e)throw TypeError("Audio chunk metadata must be provided.");if("object"!=typeof e)throw TypeError("Audio chunk metadata must be an object.");if(!e.decoderConfig)throw TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof e.decoderConfig)throw TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof e.decoderConfig.codec)throw TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!z.some(r=>e.decoderConfig.codec.startsWith(r)))throw TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");if(!Number.isInteger(e.decoderConfig.sampleRate)||e.decoderConfig.sampleRate<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(e.decoderConfig.numberOfChannels)||e.decoderConfig.numberOfChannels<=0)throw TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==e.decoderConfig.description&&!(0,n.isAllowSharedBufferSource)(e.decoderConfig.description))throw TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(e.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(e.decoderConfig.codec))throw TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.");if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for AAC must include a description, which is expected to be an AudioSpecificConfig as specified in ISO 14496-3.")}else if(e.decoderConfig.codec.startsWith("mp3")||e.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==e.decoderConfig.codec&&"mp4a.69"!==e.decoderConfig.codec&&"mp4a.6B"!==e.decoderConfig.codec&&"mp4a.6b"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(e.decoderConfig.codec.startsWith("opus")){if("opus"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(e.decoderConfig.description&&e.decoderConfig.description.byteLength<18)throw TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(e.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!e.decoderConfig.description)throw TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(e.decoderConfig.codec.startsWith("flac")){if("flac"!==e.decoderConfig.codec)throw TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!e.decoderConfig.description||e.decoderConfig.description.byteLength<42)throw TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if((e.decoderConfig.codec.startsWith("pcm")||e.decoderConfig.codec.startsWith("ulaw")||e.decoderConfig.codec.startsWith("alaw"))&&!l.includes(e.decoderConfig.codec))throw TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${l.join(", ")}).`)},H=e=>{if(!e)throw TypeError("Subtitle metadata must be provided.");if("object"!=typeof e)throw TypeError("Subtitle metadata must be an object.");if(!e.config)throw TypeError("Subtitle metadata must include a config object.");if("object"!=typeof e.config)throw TypeError("Subtitle metadata config must be an object.");if("string"!=typeof e.config.description)throw TypeError("Subtitle metadata config description must be a string.")}},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],jrq2g:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(e){if(!e)throw Error("Assertion failed.")}s.defineInteropFlag(a),s.export(a,"assert",()=>n),s.export(a,"normalizeRotation",()=>o),s.export(a,"last",()=>l),s.export(a,"isU32",()=>c),s.export(a,"Bitstream",()=>d),s.export(a,"readExpGolomb",()=>u),s.export(a,"readSignedExpGolomb",()=>h),s.export(a,"writeBits",()=>m),s.export(a,"toUint8Array",()=>p),s.export(a,"toDataView",()=>f),s.export(a,"textDecoder",()=>g),s.export(a,"textEncoder",()=>k),s.export(a,"isIso88591Compatible",()=>b),s.export(a,"COLOR_PRIMARIES_MAP",()=>y),s.export(a,"COLOR_PRIMARIES_MAP_INVERSE",()=>S),s.export(a,"TRANSFER_CHARACTERISTICS_MAP",()=>w),s.export(a,"TRANSFER_CHARACTERISTICS_MAP_INVERSE",()=>I),s.export(a,"MATRIX_COEFFICIENTS_MAP",()=>x),s.export(a,"MATRIX_COEFFICIENTS_MAP_INVERSE",()=>E),s.export(a,"colorSpaceIsComplete",()=>P),s.export(a,"isAllowSharedBufferSource",()=>C),s.export(a,"AsyncMutex",()=>B),s.export(a,"bytesToHexString",()=>_),s.export(a,"reverseBitsU32",()=>A),s.export(a,"binarySearchExact",()=>D),s.export(a,"binarySearchLessOrEqual",()=>M),s.export(a,"insertSorted",()=>F),s.export(a,"promiseWithResolvers",()=>R),s.export(a,"removeItem",()=>U),s.export(a,"findLast",()=>L),s.export(a,"findLastIndex",()=>N),s.export(a,"toAsyncIterator",()=>j),s.export(a,"validateAnyIterable",()=>O),s.export(a,"assertNever",()=>z),s.export(a,"getUint24",()=>V),s.export(a,"getInt24",()=>H),s.export(a,"setUint24",()=>q),s.export(a,"setInt24",()=>G),s.export(a,"setInt64",()=>W),s.export(a,"mapAsyncGenerator",()=>X),s.export(a,"clamp",()=>K),s.export(a,"UNDETERMINED_LANGUAGE",()=>$),s.export(a,"roundIfAlmostInteger",()=>Q),s.export(a,"roundToMultiple",()=>Z),s.export(a,"ilog",()=>Y),s.export(a,"isIso639Dash2LanguageCode",()=>ee),s.export(a,"SECOND_TO_MICROSECOND_FACTOR",()=>et),s.export(a,"mergeRequestInit",()=>er),s.export(a,"retriedFetch",()=>ei),s.export(a,"computeRationalApproximation",()=>es),s.export(a,"CallSerializer",()=>en),s.export(a,"isWebKit",()=>el),s.export(a,"isFirefox",()=>ed),s.export(a,"isChromium",()=>eh),s.export(a,"getChromiumVersion",()=>ep),s.export(a,"coalesceIndex",()=>ef),s.export(a,"closedIntervalsOverlap",()=>eg),s.export(a,"keyValueIterator",()=>ek),s.export(a,"imageMimeTypeToExtension",()=>eb),s.export(a,"base64ToBytes",()=>eT),s.export(a,"bytesToBase64",()=>ey),s.export(a,"uint8ArraysAreEqual",()=>eS),s.export(a,"polyfillSymbolDispose",()=>ew),s.export(a,"isNumber",()=>eI);let o=e=>{let r=(e%360+360)%360;if(0===r||90===r||180===r||270===r)return r;throw Error(`Invalid rotation ${e}.`)},l=e=>e&&e[e.length-1],c=e=>e>=0&&e<0x100000000;class d{constructor(e){this.bytes=e,this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,a=7-(7&this.pos);return this.pos++,(r&1<>a}readBits(e){if(1===e)return this.readBit();let r=0;for(let a=0;a>a-e-1<{let r=0;for(;0===e.readBits(1)&&r<32;)r++;if(r>=32)throw Error("Invalid exponential-Golomb code.");return(1<{let r=u(e);return(1&r)==0?-(r>>1):r+1>>1},m=(e,r,a,i)=>{for(let s=r;s>a-s-1<e.constructor===Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e),f=e=>e.constructor===DataView?e:ArrayBuffer.isView(e)?new DataView(e.buffer,e.byteOffset,e.byteLength):new DataView(e),g=new TextDecoder,k=new TextEncoder,b=e=>{for(let r=0;r255)return!1;return!0},T=e=>Object.fromEntries(Object.entries(e).map(([e,r])=>[r,e])),y={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},S=T(y),w={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},I=T(w),x={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},E=T(x),P=e=>!!e&&!!e.primaries&&!!e.transfer&&!!e.matrix&&void 0!==e.fullRange,C=e=>e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e);class B{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let e,r=new Promise(r=>{e=r}),a=this.currentPromise;return this.currentPromise=r,await a,e}}let _=e=>[...e].map(e=>e.toString(16).padStart(2,"0")).join(""),A=e=>(e=(e=(e=(e=(e=e>>1&0x55555555|(0x55555555&e)<<1)>>2&0x33333333|(0x33333333&e)<<2)>>4&0xf0f0f0f|(0xf0f0f0f&e)<<4)>>8&0xff00ff|(0xff00ff&e)<<8)>>16&65535|(65535&e)<<16)>>>0,D=(e,r,a)=>{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+s>>1,l=a(e[o]);l===r?(n=o,s=o-1):l{let i=0,s=e.length-1,n=-1;for(;i<=s;){let o=i+(s-i+1)/2|0;a(e[o])<=r?(n=o,i=o+1):s=o-1}return n},F=(e,r,a)=>{let i=M(e,a(r),a);e.splice(i+1,0,r)},R=()=>{let e,r;return{promise:new Promise((a,i)=>{e=a,r=i}),resolve:e,reject:r}},U=(e,r)=>{let a=e.indexOf(r);-1!==a&&e.splice(a,1)},L=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return e[a]},N=(e,r)=>{for(let a=e.length-1;a>=0;a--)if(r(e[a]))return a;return -1},j=async function*(e){Symbol.iterator in e?yield*e[Symbol.iterator]():yield*e[Symbol.asyncIterator]()},O=e=>{if(!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))throw TypeError("Argument must be an iterable or async iterable.")},z=e=>{throw Error(`Unexpected value: ${e}`)},V=(e,r,a)=>{let i=e.getUint8(r),s=e.getUint8(r+1),n=e.getUint8(r+2);return a?i|s<<8|n<<16:i<<16|s<<8|n},H=(e,r,a)=>V(e,r,a)<<8>>8,q=(e,r,a,i)=>{a>>>=0,a&=0xffffff,i?(e.setUint8(r,255&a),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,a>>>16&255)):(e.setUint8(r,a>>>16&255),e.setUint8(r+1,a>>>8&255),e.setUint8(r+2,255&a))},G=(e,r,a,i)=>{(a=K(a,-8388608,8388607))<0&&(a=a+0x1000000&0xffffff),q(e,r,a,i)},W=(e,r,a,i)=>{i?(e.setUint32(r+0,a,!0),e.setInt32(r+4,Math.floor(a/0x100000000),!0)):(e.setInt32(r+0,Math.floor(a/0x100000000),!0),e.setUint32(r+4,a,!0))},X=(e,r)=>({async next(){let a=await e.next();return a.done?{value:void 0,done:!0}:{value:r(a.value),done:!1}},return:()=>e.return(),throw:r=>e.throw(r),[Symbol.asyncIterator](){return this}}),K=(e,r,a)=>Math.max(r,Math.min(a,e)),$="und",Q=e=>{let r=Math.round(e);return Math.abs(e/r-1)<10*Number.EPSILON?r:e},Z=(e,r)=>Math.round(e/r)*r,Y=e=>{let r=0;for(;e;)r++,e>>=1;return r},J=/^[a-z]{3}$/,ee=e=>J.test(e),et=1e6*(1+Number.EPSILON),er=(e,r)=>{let a={...e,...r};if(e.headers||r.headers){let i=e.headers?ea(e.headers):{},s=r.headers?ea(r.headers):{},n={...i};Object.entries(s).forEach(([e,r])=>{let a=Object.keys(n).find(r=>r.toLowerCase()===e.toLowerCase());a&&delete n[a],n[e]=r}),a.headers=n}return a},ea=e=>{if(e instanceof Headers){let r={};return e.forEach((e,a)=>{r[a]=e}),r}if(Array.isArray(e)){let r={};return e.forEach(([e,a])=>{r[e]=a}),r}return e},ei=async(e,r,a,i,s)=>{let n=0;for(;;)try{return await e(r,a)}catch(a){if(s())throw a;let e=i(++n,a,r);if(null===e)throw a;if(console.error("Retrying failed fetch. Error:",a),!Number.isFinite(e)||e<0)throw TypeError("Retry delay must be a non-negative finite number.");if(e>0&&await new Promise(r=>setTimeout(r,1e3*e)),s())throw a}},es=(e,r)=>{let a=e<0?-1:1,i=0,s=1,n=1,o=0,l=e=Math.abs(e);for(;;){let e=Math.floor(l),a=e*n+i,c=e*o+s;if(c>r||(i=n,s=o,n=a,o=c,!isFinite(l=1/(l-e))))break}return{numerator:a*n,denominator:o}};class en{constructor(){this.currentPromise=Promise.resolve()}call(e){return this.currentPromise=this.currentPromise.then(e)}}let eo=null,el=()=>null!==eo?eo:eo=!!("undefined"!=typeof navigator&&(navigator.vendor?.match(/apple/i)||/AppleWebKit/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)||/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent))),ec=null,ed=()=>null!==ec?ec:ec="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),eu=null,eh=()=>null!==eu?eu:eu=!!("undefined"!=typeof navigator&&(navigator.vendor?.includes("Google Inc")||/Chrome/.test(navigator.userAgent))),em=null,ep=()=>{if(null!==em)return em;if("undefined"==typeof navigator)return null;let e=/\bChrome\/(\d+)/.exec(navigator.userAgent);return e?em=Number(e[1]):null},ef=(e,r)=>-1!==e?e:r,eg=(e,r,a,i)=>e<=i&&a<=r,ek=function*(e){for(let r in e){let a=e[r];void 0!==a&&(yield{key:r,value:a})}},eb=e=>{switch(e.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},eT=e=>{let r=atob(e),a=new Uint8Array(r.length);for(let e=0;e{let r="";for(let a=0;a{if(e.length!==r.length)return!1;for(let a=0;a{Symbol.dispose??=Symbol("Symbol.dispose")},eI=e=>"number"==typeof e&&!Number.isNaN(e)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],loqXi:[function(e,r,a,i){a.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},a.defineInteropFlag=function(e){Object.defineProperty(e,"__esModule",{value:!0})},a.exportAll=function(e,r){return Object.keys(e).forEach(function(a){"default"===a||"__esModule"===a||Object.prototype.hasOwnProperty.call(r,a)||Object.defineProperty(r,a,{enumerable:!0,get:function(){return e[a]}})}),r},a.export=function(e,r,a){Object.defineProperty(e,r,{enumerable:!0,get:a})}},{}],zx4dz:[function(e,r,a,i){var s,n,o,l,c,d,u=e("@parcel/transformer-js/src/esmodule-helpers.js");u.defineInteropFlag(a),u.export(a,"AvcNalUnitType",()=>l),u.export(a,"HevcNalUnitType",()=>c),u.export(a,"findNalUnitsInAnnexB",()=>p),u.export(a,"transformAnnexBToLengthPrefixed",()=>k),u.export(a,"extractAvcNalUnits",()=>b),u.export(a,"extractAvcDecoderConfigurationRecord",()=>y),u.export(a,"serializeAvcDecoderConfigurationRecord",()=>S),u.export(a,"deserializeAvcDecoderConfigurationRecord",()=>w),u.export(a,"parseAvcSps",()=>I),u.export(a,"extractHevcNalUnits",()=>x),u.export(a,"extractNalUnitTypeForHevc",()=>E),u.export(a,"extractHevcDecoderConfigurationRecord",()=>P),u.export(a,"serializeHevcDecoderConfigurationRecord",()=>R),u.export(a,"extractVp9CodecInfoFromPacket",()=>U),u.export(a,"iterateAv1PacketObus",()=>L),u.export(a,"extractAv1CodecInfoFromPacket",()=>N),u.export(a,"parseOpusIdentificationHeader",()=>j),u.export(a,"parseOpusTocByte",()=>z),u.export(a,"parseModesFromVorbisSetupPacket",()=>V),u.export(a,"determineVideoPacketType",()=>H),u.export(a,"FlacBlockType",()=>d),u.export(a,"readVorbisComments",()=>q),u.export(a,"createVorbisComments",()=>G);var h=e("./codec.js"),m=e("./misc.js");(s=l||(l={}))[s.IDR=5]="IDR",s[s.SEI=6]="SEI",s[s.SPS=7]="SPS",s[s.PPS=8]="PPS",s[s.SPS_EXT=13]="SPS_EXT",(n=c||(c={}))[n.RASL_N=8]="RASL_N",n[n.RASL_R=9]="RASL_R",n[n.BLA_W_LP=16]="BLA_W_LP",n[n.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",n[n.VPS_NUT=32]="VPS_NUT",n[n.SPS_NUT=33]="SPS_NUT",n[n.PPS_NUT=34]="PPS_NUT",n[n.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",n[n.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT";let p=e=>{let r=[],a=0;for(;a0&&i>a){let s=e.subarray(a,i);s.length>0&&r.push(s)}a=i+s}if(a0&&r.push(i)}return r},f=(e,r)=>{let a=[],i=0,s=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;i+r<=e.length;){let n;1===r?n=s.getUint8(i):2===r?n=s.getUint16(i,!1):3===r?n=(0,m.getUint24)(s,i,!1):4===r?n=s.getUint32(i,!1):((0,m.assertNever)(r),(0,m.assert)(!1)),i+=r;let o=e.subarray(i,i+n);a.push(o),i+=n}return a},g=e=>{let r=[],a=e.length;for(let i=0;i{let r=p(e);if(0===r.length)return null;let a=0;for(let e of r)a+=4+e.byteLength;let i=new Uint8Array(a),s=new DataView(i.buffer),n=0;for(let e of r){let r=e.byteLength;s.setUint32(n,r,!1),n+=4,i.set(e,n),n+=e.byteLength}return i},b=(e,r)=>r.description?f(e,(3&(0,m.toUint8Array)(r.description)[4])+1):p(e),T=e=>31&e[0],y=e=>{try{let r=p(e),a=r.filter(e=>T(e)===l.SPS),i=r.filter(e=>T(e)===l.PPS),s=r.filter(e=>T(e)===l.SPS_EXT);if(0===a.length||0===i.length)return null;let n=a[0],o=I(n);(0,m.assert)(null!==o);let c=100===o.profileIdc||110===o.profileIdc||122===o.profileIdc||144===o.profileIdc;return{configurationVersion:1,avcProfileIndication:o.profileIdc,profileCompatibility:o.constraintFlags,avcLevelIndication:o.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:a,pictureParameterSets:i,chromaFormat:c?o.chromaFormatIdc:null,bitDepthLumaMinus8:c?o.bitDepthLumaMinus8:null,bitDepthChromaMinus8:c?o.bitDepthChromaMinus8:null,sequenceParameterSetExt:c?s:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},S=e=>{let r=[];for(let a of(r.push(e.configurationVersion),r.push(e.avcProfileIndication),r.push(e.profileCompatibility),r.push(e.avcLevelIndication),r.push(252|3&e.lengthSizeMinusOne),r.push(224|31&e.sequenceParameterSets.length),e.sequenceParameterSets)){let e=a.byteLength;r.push(e>>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i>8),r.push(255&e);for(let i=0;i{try{let r=(0,m.toDataView)(e),a=0,i=r.getUint8(a++),s=r.getUint8(a++),n=r.getUint8(a++),o=r.getUint8(a++),l=3&r.getUint8(a++),c=31&r.getUint8(a++),d=[];for(let i=0;i{try{let r=new(0,m.Bitstream)(g(e));r.skipBits(1),r.skipBits(2);let a=r.readBits(5);if(7!==a)return null;let i=r.readAlignedByte(),s=r.readAlignedByte(),n=r.readAlignedByte();(0,m.readExpGolomb)(r);let o=null,l=null,c=null;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=(0,m.readExpGolomb)(r),3===o&&r.skipBits(1),l=(0,m.readExpGolomb)(r),c=(0,m.readExpGolomb)(r),r.skipBits(1),r.readBits(1))){for(let e=0;e<(3!==o?8:12);e++)if(r.readBits(1)){let a=e<6?16:64,i=8,s=8;for(let e=0;er.description?f(e,(3&(0,m.toUint8Array)(r.description)[21])+1):p(e),E=e=>e[0]>>1&63,P=e=>{try{let r=p(e),a=r.filter(e=>E(e)===c.VPS_NUT),i=r.filter(e=>E(e)===c.SPS_NUT),s=r.filter(e=>E(e)===c.PPS_NUT),n=r.filter(e=>E(e)===c.PREFIX_SEI_NUT||E(e)===c.SUFFIX_SEI_NUT);if(0===i.length||0===s.length)return null;let o=i[0],l=new(0,m.Bitstream)(g(o));l.skipBits(16),l.readBits(4);let d=l.readBits(3),u=l.readBits(1),{general_profile_space:h,general_tier_flag:f,general_profile_idc:k,general_profile_compatibility_flags:b,general_constraint_indicator_flags:T,general_level_idc:y}=C(l,d);(0,m.readExpGolomb)(l);let S=(0,m.readExpGolomb)(l);3===S&&l.skipBits(1),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),l.readBits(1)&&((0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l));let w=(0,m.readExpGolomb)(l),I=(0,m.readExpGolomb)(l);(0,m.readExpGolomb)(l);let x=l.readBits(1)?0:d;for(let e=x;e<=d;e++)(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l);(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),l.readBits(1)&&l.readBits(1)&&B(l),l.skipBits(1),l.skipBits(1),l.readBits(1)&&(l.skipBits(4),l.skipBits(4),(0,m.readExpGolomb)(l),(0,m.readExpGolomb)(l),l.skipBits(1));let P=(0,m.readExpGolomb)(l);if(_(l,P),l.readBits(1)){let e=(0,m.readExpGolomb)(l);for(let r=0;r0){let e=s[0],r=new(0,m.Bitstream)(g(e));r.skipBits(16),(0,m.readExpGolomb)(r),(0,m.readExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(3),r.skipBits(1),r.skipBits(1),(0,m.readExpGolomb)(r),(0,m.readExpGolomb)(r),(0,m.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.readBits(1)&&(0,m.readExpGolomb)(r),(0,m.readSignedExpGolomb)(r),(0,m.readSignedExpGolomb)(r),r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);let a=r.readBits(1),i=r.readBits(1);M=a||i?a&&!i?2:!a&&i?3:0:0}let F=[...a.length?[{arrayCompleteness:1,nalUnitType:c.VPS_NUT,nalUnits:a}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:c.SPS_NUT,nalUnits:i}]:[],...s.length?[{arrayCompleteness:1,nalUnitType:c.PPS_NUT,nalUnits:s}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:E(n[0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:h,generalTierFlag:f,generalProfileIdc:k,generalProfileCompatibilityFlags:b,generalConstraintIndicatorFlags:T,generalLevelIdc:y,minSpatialSegmentationIdc:A,parallelismType:M,chromaFormatIdc:S,bitDepthLumaMinus8:w,bitDepthChromaMinus8:I,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:d+1,temporalIdNested:u,lengthSizeMinusOne:3,arrays:F}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},C=(e,r)=>{let a=e.readBits(2),i=e.readBits(1),s=e.readBits(5),n=0;for(let r=0;r<32;r++)n=n<<1|e.readBits(1);let o=new Uint8Array(6);for(let r=0;r<6;r++)o[r]=e.readBits(8);let l=e.readBits(8),c=[],d=[];for(let a=0;a0)for(let a=r;a<8;a++)e.skipBits(2);for(let a=0;a{for(let r=0;r<4;r++)for(let a=0;a<(3===r?2:6);a++)if(e.readBits(1)){let a=Math.min(64,1<<4+(r<<1));r>1&&(0,m.readSignedExpGolomb)(e);for(let r=0;r{let a=[];for(let i=0;i{let s=0,n=0,o=0;if(0!==r&&(n=e.readBits(1)),n){o=r===a?r-((0,m.readExpGolomb)(e)+1):r-1,e.readBits(1),(0,m.readExpGolomb)(e);let n=i[o]??0;for(let r=0;r<=n;r++)e.readBits(1)||e.readBits(1);s=i[o]}else{let r=(0,m.readExpGolomb)(e),a=(0,m.readExpGolomb)(e);for(let a=0;a{if(e.readBits(1)&&255===e.readBits(8)&&(e.readBits(16),e.readBits(16)),e.readBits(1)&&e.readBits(1),e.readBits(1)&&(e.readBits(3),e.readBits(1),e.readBits(1)&&(e.readBits(8),e.readBits(8),e.readBits(8))),e.readBits(1)&&((0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e)),e.readBits(1),e.readBits(1),e.readBits(1),e.readBits(1)&&((0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e)),e.readBits(1)&&(e.readBits(32),e.readBits(32),e.readBits(1)&&(0,m.readExpGolomb)(e),e.readBits(1)&&M(e,!0,r)),e.readBits(1)){e.readBits(1),e.readBits(1),e.readBits(1);let r=(0,m.readExpGolomb)(e);return(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),(0,m.readExpGolomb)(e),r}return 0},M=(e,r,a)=>{let i=!1,s=!1,n=!1;r&&(i=1===e.readBits(1),s=1===e.readBits(1),(i||s)&&((n=1===e.readBits(1))&&(e.readBits(8),e.readBits(5),e.readBits(1),e.readBits(5)),e.readBits(4),e.readBits(4),n&&e.readBits(4),e.readBits(5),e.readBits(5),e.readBits(5)));for(let r=0;r<=a;r++){let r=1===e.readBits(1),a=!0;r||(a=1===e.readBits(1));let o=!1;a?(0,m.readExpGolomb)(e):o=1===e.readBits(1);let l=1;o||(l=(0,m.readExpGolomb)(e)+1),i&&F(e,l,n),s&&F(e,l,n)}},F=(e,r,a)=>{for(let i=0;i{let r=[];for(let a of(r.push(e.configurationVersion),r.push((3&e.generalProfileSpace)<<6|(1&e.generalTierFlag)<<5|31&e.generalProfileIdc),r.push(e.generalProfileCompatibilityFlags>>>24&255),r.push(e.generalProfileCompatibilityFlags>>>16&255),r.push(e.generalProfileCompatibilityFlags>>>8&255),r.push(255&e.generalProfileCompatibilityFlags),r.push(...e.generalConstraintIndicatorFlags),r.push(255&e.generalLevelIdc),r.push(240|e.minSpatialSegmentationIdc>>8&15),r.push(255&e.minSpatialSegmentationIdc),r.push(252|3&e.parallelismType),r.push(252|3&e.chromaFormatIdc),r.push(248|7&e.bitDepthLumaMinus8),r.push(248|7&e.bitDepthChromaMinus8),r.push(e.avgFrameRate>>8&255),r.push(255&e.avgFrameRate),r.push((3&e.constantFrameRate)<<6|(7&e.numTemporalLayers)<<3|(1&e.temporalIdNested)<<2|3&e.lengthSizeMinusOne),r.push(255&e.arrays.length),e.arrays))for(let e of(r.push((1&a.arrayCompleteness)<<7|63&a.nalUnitType),r.push(a.nalUnits.length>>8&255),r.push(255&a.nalUnits.length),a.nalUnits)){r.push(e.length>>8&255),r.push(255&e.length);for(let a=0;a{let r=new(0,m.Bitstream)(e);if(2!==r.readBits(2))return null;let a=r.readBits(1),i=(r.readBits(1)<<1)+a;if(3===i&&r.skipBits(1),1===r.readBits(1)||0!==r.readBits(1)||(r.skipBits(2),4817730!==r.readBits(24)))return null;let s=8;i>=2&&(s=r.readBits(1)?12:10);let n=r.readBits(3),o=0,l=0;if(7!==n)if(l=r.readBits(1),1===i||3===i){let e=r.readBits(1),a=r.readBits(1);o=e||a?e&&!a?2:1:3,r.skipBits(1)}else o=1;else o=3,l=1;let c=(r.readBits(16)+1)*(r.readBits(16)+1),d=(0,m.last)(h.VP9_LEVEL_TABLE).level;for(let e of h.VP9_LEVEL_TABLE)if(c<=e.maxPictureSize){d=e.level;break}return{profile:i,level:d,bitDepth:s,chromaSubsampling:o,videoFullRangeFlag:l,colourPrimaries:2===n?1:1===n?6:2,transferCharacteristics:2===n?1:1===n?6:2,matrixCoefficients:7===n?0:2===n?1:1===n?6:2}},L=function*(e){let r=new(0,m.Bitstream)(e),a=()=>{let e=0;for(let a=0;a<8;a++){let i=r.readAlignedByte();if(e|=(127&i)<<7*a,!(128&i))break;if(7===a&&128&i)return null}return e>=0x100000000-1?null:e};for(;r.getBitsLeft()>=8;){let i;r.skipBits(1);let s=r.readBits(4),n=r.readBits(1),o=r.readBits(1);if(r.skipBits(1),n&&r.skipBits(8),o){let e=a();if(null===e)return;i=e}else i=Math.floor(r.getBitsLeft()/8);(0,m.assert)(r.pos%8==0),yield{type:s,data:e.subarray(r.pos/8,r.pos/8+i)},r.skipBits(8*i)}},N=e=>{for(let{type:r,data:a}of L(e)){if(1!==r)continue;let e=new(0,m.Bitstream)(a),i=e.readBits(3);e.readBits(1);let s=e.readBits(1),n=0,o=0,l=0;if(s)n=e.readBits(5);else{if(e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.readBits(1)))return null;let r=e.readBits(1);r&&(l=e.readBits(5),e.skipBits(32),e.skipBits(5),e.skipBits(5));let a=e.readBits(5);for(let i=0;i<=a;i++){e.skipBits(12);let a=e.readBits(5);if(0===i&&(n=a),a>7){let r=e.readBits(1);0===i&&(o=r)}if(r&&e.readBits(1)){let r=l+1;e.skipBits(r),e.skipBits(r),e.skipBits(1)}e.readBits(1)&&e.skipBits(4)}}let c=e.readBits(4),d=e.readBits(4),u=c+1;e.skipBits(u);let h=d+1;e.skipBits(h);if((s?0:e.readBits(1))&&(e.skipBits(4),e.skipBits(3)),e.skipBits(1),e.skipBits(1),e.skipBits(1),!s){e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);let r=e.readBits(1);r&&(e.skipBits(1),e.skipBits(1));let a=e.readBits(1);(a?2:e.readBits(1))>0&&(e.readBits(1)||e.skipBits(1)),r&&e.skipBits(3)}e.skipBits(1),e.skipBits(1),e.skipBits(1);let p=e.readBits(1),f=8;2===i&&p?f=e.readBits(1)?12:10:i<=2&&(f=p?10:8);let g=0;1!==i&&(g=e.readBits(1));let k=1,b=1,T=0;return!g&&(0===i?(k=1,b=1):1===i?(k=0,b=0):12===f&&(k=e.readBits(1))&&(b=e.readBits(1)),k&&b&&(T=e.readBits(2))),{profile:i,level:n,tier:o,bitDepth:f,monochrome:g,chromaSubsamplingX:k,chromaSubsamplingY:b,chromaSamplePosition:T}}return null},j=e=>{let r=(0,m.toDataView)(e),a=r.getUint8(9),i=r.getUint16(10,!0),s=r.getUint32(12,!0),n=r.getInt16(16,!0),o=r.getUint8(18),l=null;return o&&(l=e.subarray(19,21+a)),{outputChannelCount:a,preSkip:i,inputSampleRate:s,outputGain:n,channelMappingFamily:o,channelMappingTable:l}},O=[480,960,1920,2880,480,960,1920,2880,480,960,1920,2880,480,960,480,960,120,240,480,960,120,240,480,960,120,240,480,960,120,240,480,960],z=e=>({durationInSamples:O[e[0]>>3]}),V=e=>{if(e.length<7)throw Error("Setup header is too short.");if(5!==e[0])throw Error("Wrong packet type in Setup header.");if("vorbis"!==String.fromCharCode(...e.slice(1,7)))throw Error("Invalid packet signature in Setup header.");let r=e.length,a=new Uint8Array(r);for(let i=0;i97;)if(1===i.readBits(1)){s=i.pos;break}if(0===s)throw Error("Invalid Setup header: framing bit not found.");let n=0,o=!1,l=0;for(;i.getBitsLeft()>=97;){let e=i.pos,r=i.readBits(8),a=i.readBits(16),s=i.readBits(16);if(r>63||0!==a||0!==s){i.pos=e;break}if(i.skipBits(1),++n>64)break;i.clone().readBits(6)+1===n&&(o=!0,l=n)}if(!o)throw Error("Invalid Setup header: mode header not found.");if(l>63)throw Error(`Unsupported mode count: ${l}.`);let c=l;i.pos=0,i.skipBits(s);let d=Array(c).fill(0);for(let e=c-1;e>=0;e--)i.skipBits(40),d[e]=i.readBits(1);return{modeBlockflags:d}},H=(e,r,a)=>{switch(e){case"avc":{let e=b(a,r),i=e.some(e=>T(e)===l.IDR);if(!i&&(!(0,m.isChromium)()||(0,m.getChromiumVersion)()>=144))for(let r of e){if(T(r)!==l.SEI)continue;let e=g(r),a=1;do{let r=0;for(;;){let i=e[a++];if(void 0===i||(r+=i,i<255))break}let s=0;for(;;){let r=e[a++];if(void 0===r||(s+=r,r<255))break}if(6===r){let r=new(0,m.Bitstream)(e);r.pos=8*a;let s=(0,m.readExpGolomb)(r),n=r.readBits(1);if(0===s&&1===n){i=!0;break}}a+=s}while(a{let r=E(e);return c.BLA_W_LP<=r&&r<=c.RSV_IRAP_VCL23})?"key":"delta";case"vp8":return 0==(1&a[0])?"key":"delta";case"vp9":{let e=new(0,m.Bitstream)(a);if(2!==e.readBits(2))return null;let r=e.readBits(1);if(3===(e.readBits(1)<<1)+r&&e.skipBits(1),e.readBits(1))return null;return 0===e.readBits(1)?"key":"delta"}case"av1":{let e=!1;for(let{type:r,data:i}of L(a))if(1===r){let r=new(0,m.Bitstream)(i);r.skipBits(4),e=!!r.readBits(1)}else if(3===r||6===r||7===r){if(e)return"key";let r=new(0,m.Bitstream)(i);if(r.readBits(1))return null;return 0===r.readBits(2)?"key":"delta"}return null}default:(0,m.assertNever)(e),(0,m.assert)(!1)}};(o=d||(d={}))[o.STREAMINFO=0]="STREAMINFO",o[o.VORBIS_COMMENT=4]="VORBIS_COMMENT",o[o.PICTURE=6]="PICTURE";let q=(e,r)=>{let a=(0,m.toDataView)(e),i=0,s=a.getUint32(i,!0);i+=4;let n=m.textDecoder.decode(e.subarray(i,i+s));i+=s,s>0&&(r.raw??={},r.raw.vendor??=n);let o=a.getUint32(i,!0);i+=4;for(let s=0;s0&&(r.trackNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.tracksTotal??=i)}break;case"TRACKTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.tracksTotal??=e)}break;case"DISCNUMBER":{let e=c.split("/"),a=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(a)&&a>0&&(r.discNumber??=a),i&&Number.isInteger(i)&&i>0&&(r.discsTotal??=i)}break;case"DISCTOTAL":{let e=Number.parseInt(c,10);Number.isInteger(e)&&e>0&&(r.discsTotal??=e)}break;case"DATE":{let e=new Date(c);Number.isNaN(e.getTime())||(r.date??=e)}break;case"GENRE":r.genre??=c;break;case"METADATA_BLOCK_PICTURE":{let e=(0,m.base64ToBytes)(c),a=(0,m.toDataView)(e),i=a.getUint32(0,!1),s=a.getUint32(4,!1),n=String.fromCharCode(...e.subarray(8,8+s)),o=a.getUint32(8+s,!1),l=m.textDecoder.decode(e.subarray(12+s,12+s+o)),d=a.getUint32(s+o+28),u=e.subarray(s+o+32,s+o+32+d);r.images??=[],r.images.push({data:u,mimeType:n,kind:3===i?"coverFront":4===i?"coverBack":"unknown",name:void 0,description:l||void 0})}}}},G=(e,r,a)=>{let i=[e],s=m.textEncoder.encode("Mediabunny"),n=new Uint8Array(4+s.length),o=new DataView(n.buffer);o.setUint32(0,s.length,!0),n.set(s,4),i.push(n);let l=new Set,c=(e,r)=>{let a=`${e}=${r}`,s=m.textEncoder.encode(a);(o=new DataView((n=new Uint8Array(4+s.length)).buffer)).setUint32(0,s.length,!0),n.set(s,4),i.push(n),l.add(e)};for(let{key:e,value:i}of(0,m.keyValueIterator)(r))switch(e){case"title":c("TITLE",i);break;case"description":c("DESCRIPTION",i);break;case"artist":c("ARTIST",i);break;case"album":c("ALBUM",i);break;case"albumArtist":c("ALBUMARTIST",i);break;case"genre":c("GENRE",i);break;case"date":{let e=r.raw?.DATE??r.raw?.date;c("DATE",e&&"string"==typeof e?e:i.toISOString().slice(0,10))}break;case"comment":c("COMMENT",i);break;case"lyrics":c("LYRICS",i);break;case"trackNumber":c("TRACKNUMBER",i.toString());break;case"tracksTotal":c("TRACKTOTAL",i.toString());break;case"discNumber":c("DISCNUMBER",i.toString());break;case"discsTotal":c("DISCTOTAL",i.toString());break;case"images":if(!a)break;for(let e of i){let r="coverFront"===e.kind?3:4*("coverBack"===e.kind),a=new Uint8Array(e.mimeType.length);for(let r=0;re+r.length,0)),h=0;for(let e of i)u.set(e,h),h+=e.length;return u}},{"./codec.js":"4GUiq","./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"73Qqp":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Demuxer",()=>n);class n{constructor(e){this.input=e}}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],aU0uf:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"InputTrack",()=>u),s.export(a,"InputVideoTrack",()=>h),s.export(a,"InputAudioTrack",()=>m);var n=e("./codec-data.js"),o=e("./custom-coder.js"),l=e("./media-sink.js"),c=e("./misc.js"),d=e("./packet.js");class u{constructor(e,r){this.input=e,this._backing=r}isVideoTrack(){return this instanceof h}isAudioTrack(){return this instanceof m}get id(){return this._backing.getId()}get internalCodecId(){return this._backing.getInternalCodecId()}get languageCode(){return this._backing.getLanguageCode()}get name(){return this._backing.getName()}get timeResolution(){return this._backing.getTimeResolution()}get disposition(){return this._backing.getDisposition()}getFirstTimestamp(){return this._backing.getFirstTimestamp()}computeDuration(){return this._backing.computeDuration()}async computePacketStats(e=1/0){let r=new(0,l.EncodedPacketSink)(this),a=1/0,i=-1/0,s=0,n=0;for await(let o of r.packets(void 0,void 0,{metadataOnly:!0})){if(s>=e&&o.timestamp>=i)break;a=Math.min(a,o.timestamp),i=Math.max(i,o.timestamp+o.duration),s++,n+=o.byteLength}return{packetCount:s,averagePacketRate:s?Number((s/(i-a)).toPrecision(16)):0,averageBitrate:s?Number((8*n/(i-a)).toPrecision(16)):0}}}class h extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"video"}get codec(){return this._backing.getCodec()}get codedWidth(){return this._backing.getCodedWidth()}get codedHeight(){return this._backing.getCodedHeight()}get rotation(){return this._backing.getRotation()}get displayWidth(){return this._backing.getRotation()%180==0?this._backing.getCodedWidth():this._backing.getCodedHeight()}get displayHeight(){return this._backing.getRotation()%180==0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getColorSpace(){return this._backing.getColorSpace()}async hasHighDynamicRange(){let e=await this._backing.getColorSpace();return"bt2020"===e.primaries||"smpte432"===e.primaries||"pg"===e.transfer||"hlg"===e.transfer||"bt2020-ncl"===e.matrix}canBeTransparent(){return this._backing.canBeTransparent()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customVideoDecoders.some(a=>a.supports(r,e)))return!0;if("undefined"==typeof VideoDecoder)return!1;let a=await VideoDecoder.isConfigSupported(e);return!0===a.supported}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(e.isMetadataOnly)throw TypeError("packet must not be metadata-only to determine its type.");if(null===this.codec)return null;let r=await this.getDecoderConfig();return(0,c.assert)(r),(0,n.determineVideoPacketType)(this.codec,r,e.data)}}class m extends u{constructor(e,r){super(e,r),this._backing=r}get type(){return"audio"}get codec(){return this._backing.getCodec()}get numberOfChannels(){return this._backing.getNumberOfChannels()}get sampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecParameterString(){let e=await this._backing.getDecoderConfig();return e?.codec??null}async canDecode(){try{let e=await this._backing.getDecoderConfig();if(!e)return!1;let r=this._backing.getCodec();if((0,c.assert)(null!==r),o.customAudioDecoders.some(a=>a.supports(r,e))||e.codec.startsWith("pcm-"))return!0;{if("undefined"==typeof AudioDecoder)return!1;let r=await AudioDecoder.isConfigSupported(e);return!0===r.supported}}catch(e){return console.error("Error during decodability check:",e),!1}}async determinePacketType(e){if(!(e instanceof d.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");return null===this.codec?null:"key"}}},{"./codec-data.js":"zx4dz","./custom-coder.js":"57K5K","./media-sink.js":"6e2oW","./misc.js":"jrq2g","./packet.js":"8dQhf","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"57K5K":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"CustomVideoDecoder",()=>n),s.export(a,"CustomAudioDecoder",()=>o),s.export(a,"CustomVideoEncoder",()=>l),s.export(a,"CustomAudioEncoder",()=>c),s.export(a,"customVideoDecoders",()=>d),s.export(a,"customAudioDecoders",()=>u),s.export(a,"customVideoEncoders",()=>h),s.export(a,"customAudioEncoders",()=>m),s.export(a,"registerDecoder",()=>p),s.export(a,"registerEncoder",()=>f);class n{static supports(e,r){return!1}}class o{static supports(e,r){return!1}}class l{static supports(e,r){return!1}}class c{static supports(e,r){return!1}}let d=[],u=[],h=[],m=[],p=e=>{if(e.prototype instanceof n){if(d.includes(e))return void console.warn("Video decoder already registered.");d.push(e)}else if(e.prototype instanceof o){if(u.includes(e))return void console.warn("Audio decoder already registered.");u.push(e)}else throw TypeError("Decoder must be a CustomVideoDecoder or CustomAudioDecoder.")},f=e=>{if(e.prototype instanceof l){if(h.includes(e))return void console.warn("Video encoder already registered.");h.push(e)}else if(e.prototype instanceof c){if(m.includes(e))return void console.warn("Audio encoder already registered.");m.push(e)}else throw TypeError("Encoder must be a CustomVideoEncoder or CustomAudioEncoder.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6e2oW":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"EncodedPacketSink",()=>b),s.export(a,"BaseMediaSampleSink",()=>y),s.export(a,"VideoSampleSink",()=>x),s.export(a,"CanvasSink",()=>E),s.export(a,"AudioSampleSink",()=>B),s.export(a,"AudioBufferSink",()=>_);var n=e("./codec.js"),o=e("./codec-data.js"),l=e("./custom-coder.js"),c=e("./input.js"),d=e("./input-track.js"),u=e("./misc.js"),h=e("./packet.js"),m=e("./pcm.js"),p=e("./sample.js");let f=e=>{if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if(void 0!==e.metadataOnly&&"boolean"!=typeof e.metadataOnly)throw TypeError("options.metadataOnly, when defined, must be a boolean.");if(void 0!==e.verifyKeyPackets&&"boolean"!=typeof e.verifyKeyPackets)throw TypeError("options.verifyKeyPackets, when defined, must be a boolean.");if(e.verifyKeyPackets&&e.metadataOnly)throw TypeError("options.verifyKeyPackets and options.metadataOnly cannot be enabled together.")},g=e=>{if(!(0,u.isNumber)(e))throw TypeError("timestamp must be a number.")},k=(e,r,a)=>a.verifyKeyPackets?r.then(async r=>{if(!r||"delta"===r.type)return r;let a=await e.determinePacketType(r);return a&&(r.type=a),r}):r;class b{constructor(e){if(!(e instanceof d.InputTrack))throw TypeError("track must be an InputTrack.");this._track=e}getFirstPacket(e={}){if(f(e),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getFirstPacket(e),e)}getPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getPacket(e,r),r)}getNextPacket(e,r={}){if(!(e instanceof h.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);return k(this._track,this._track._backing.getNextPacket(e,r),r)}async getKeyPacket(e,r={}){if(g(e),f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getKeyPacket(e,r);let a=await this._track._backing.getKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getKeyPacket(a.timestamp-1/this._track.timeResolution,r):a}async getNextKeyPacket(e,r={}){if(!(e instanceof h.EncodedPacket))throw TypeError("packet must be an EncodedPacket.");if(f(r),this._track.input._disposed)throw new(0,c.InputDisposedError);if(!r.verifyKeyPackets)return this._track._backing.getNextKeyPacket(e,r);let a=await this._track._backing.getNextKeyPacket(e,r);return a&&((0,u.assert)("key"===a.type),"delta"===await this._track.determinePacketType(a))?this.getNextKeyPacket(a,r):a}packets(e,r,a={}){if(void 0!==e&&!(e instanceof h.EncodedPacket))throw TypeError("startPacket must be an EncodedPacket.");if(void 0!==e&&e.isMetadataOnly&&!a?.metadataOnly)throw TypeError("startPacket can only be metadata-only if options.metadataOnly is enabled.");if(void 0!==r&&!(r instanceof h.EncodedPacket))throw TypeError("endPacket must be an EncodedPacket.");if(f(a),this._track.input._disposed)throw new(0,c.InputDisposedError);let i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,m=!1,p=null,g=[],k=()=>Math.max(2,g.length);(async()=>{let c=e??await this.getFirstPacket(a);for(;c&&!m&&!this._track.input._disposed&&!(r&&c.sequenceNumber>=r?.sequenceNumber);){if(i.length>k()){({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;continue}i.push(c),n(),({promise:s,resolve:n}=(0,u.promiseWithResolvers)()),c=await this.getNextPacket(c,a)}d=!0,n()})().catch(e=>{p||(p=e,n())});let b=this._track;return{async next(){for(;;)if(b.input._disposed)throw new(0,c.InputDisposedError);else if(m)return{value:void 0,done:!0};else if(p)throw p;else if(i.length>0){let e=i.shift(),r=performance.now();for(g.push(r);g.length>0&&r-g[0]>=1e3;)g.shift();return l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(m=!0,l(),n(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}class T{constructor(e,r){this.onSample=e,this.onError=r}}class y{mediaSamplesInRange(e=0,r=1/0){g(e),g(r);let a=[],i=!1,s=null,{promise:n,resolve:o}=(0,u.promiseWithResolvers)(),{promise:l,resolve:d}=(0,u.promiseWithResolvers)(),h=!1,m=!1,p=!1,f=null;(async()=>{let c,g=Error(),k=await this._createDecoder(l=>{(d(),l.timestamp>=r&&(m=!0),m)?l.close():(s&&(l.timestamp>e?(a.push(s),i=!0):s.close()),l.timestamp>=e&&(a.push(l),i=!0),s=i?null:l,a.length>0&&(o(),{promise:n,resolve:o}=(0,u.promiseWithResolvers)()))},e=>{f||(e.stack=g.stack,f=e,o())}),b=this._createPacketSink(),T=await b.getKeyPacket(e,{verifyKeyPackets:!0})??await b.getFirstPacket(),y=T;if(r<1/0){let e=await b.getPacket(r),a=e?"key"===e.type&&e.timestamp===r?e:await b.getNextKeyPacket(e,{verifyKeyPackets:!0}):null;a&&(c=a)}let w=b.packets(T??void 0,c);for(await w.next();y&&!m&&!this._track.input._disposed;){let e=S(a.length);if(a.length+k.getDecodeQueueSize()>e){({promise:l,resolve:d}=(0,u.promiseWithResolvers)()),await l;continue}k.decode(y);let r=await w.next();if(r.done)break;y=r.value}await w.return(),p||this._track.input._disposed||await k.flush(),k.close(),!i&&s&&a.push(s),h=!0,o()})().catch(e=>{f||(f=e,o())});let k=this._track,b=()=>{for(let e of(s?.close(),a))e.close()};return{async next(){for(;;)if(k.input._disposed)throw b(),new(0,c.InputDisposedError);else if(p)return{value:void 0,done:!0};else if(f)throw b(),f;else if(a.length>0){let e=a.shift();return d(),{value:e,done:!1}}else{if(h)return{value:void 0,done:!0};await n}},return:async()=>(p=!0,m=!0,d(),o(),b(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}mediaSamplesAtTimestamps(e){(0,u.validateAnyIterable)(e);let r=(0,u.toAsyncIterator)(e),a=[],i=[],{promise:s,resolve:n}=(0,u.promiseWithResolvers)(),{promise:o,resolve:l}=(0,u.promiseWithResolvers)(),d=!1,h=!1,m=null,p=e=>{i.push(e),n(),{promise:s,resolve:n}=(0,u.promiseWithResolvers)()};(async()=>{let e=Error(),s=await this._createDecoder(e=>{if(l(),h)return void e.close();let r=0;for(;a.length>0&&e.timestamp-a[0]>-1e-10;)r++,a.shift();if(r>0)for(let a=0;a{m||(r.stack=e.stack,m=r,n())}),c=this._createPacketSink(),f=null,k=null,b=-1,T=async()=>{(0,u.assert)(k);let e=k;for(s.decode(e);e.sequenceNumberr&&!h;)({promise:o,resolve:l}=(0,u.promiseWithResolvers)()),await o;if(h)break;let a=await c.getNextPacket(e);(0,u.assert)(a),s.decode(a),e=a}b=-1},y=async()=>{await s.flush();for(let e=0;e{m||(m=e,n())});let f=this._track,k=()=>{for(let e of i)e?.close()};return{async next(){for(;;)if(f.input._disposed)throw k(),new(0,c.InputDisposedError);else if(h)return{value:void 0,done:!0};else if(m)throw k(),m;else if(i.length>0){let e=i.shift();return(0,u.assert)(void 0!==e),l(),{value:e,done:!1}}else{if(d)return{value:void 0,done:!0};await s}},return:async()=>(h=!0,l(),n(),k(),{value:void 0,done:!0}),async throw(e){throw e},[Symbol.asyncIterator](){return this}}}}let S=e=>0===e?40:8;class w extends T{constructor(e,r,a,i,s,n){super(e,r),this.codec=a,this.decoderConfig=i,this.rotation=s,this.timeResolution=n,this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.inputTimestamps=[],this.sampleQueue=[],this.currentPacketIndex=0,this.raslSkipped=!1,this.alphaDecoder=null,this.alphaHadKeyframe=!1,this.colorQueue=[],this.alphaQueue=[],this.merger=null,this.mergerCreationFailed=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue=[],this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1;let c=l.customVideoDecoders.find(e=>e.supports(a,i));if(c)this.customDecoder=new c,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.VideoSample))throw TypeError("The argument passed to onSample must be a VideoSample.");this.finalizeAndEmitSample(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init());else{let e=e=>{if(this.alphaQueue.length>0){let r=this.alphaQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(e,r)}else this.colorQueue.push(e)};if("avc"===a&&this.decoderConfig.description&&(0,u.isChromium)()){let e=(0,o.deserializeAvcDecoderConfigurationRecord)((0,u.toUint8Array)(this.decoderConfig.description));if(e&&e.sequenceParameterSets.length>0){let r=(0,o.parseAvcSps)(e.sequenceParameterSets[0]);r&&0===r.frameMbsOnlyFlag&&(this.decoderConfig={...this.decoderConfig,hardwareAcceleration:"prefer-software"})}}this.decoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:r}),this.decoder.configure(this.decoderConfig)}}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),Math.max(this.decoder.decodeQueueSize,this.alphaDecoder?.decodeQueueSize??0))}decode(e){if("hevc"===this.codec&&this.currentPacketIndex>0&&!this.raslSkipped){if(this.hasHevcRaslPicture(e.data))return;this.raslSkipped=!0}this.currentPacketIndex++,this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),(0,u.isWebKit)()||(0,u.insertSorted)(this.inputTimestamps,e.timestamp,e=>e),this.decoder.decode(e.toEncodedVideoChunk()),this.decodeAlphaData(e))}decodeAlphaData(e){if(!e.sideData.alpha||this.mergerCreationFailed)return void this.pushNullAlphaFrame();if(!this.merger)try{this.merger=new I}catch(r){console.error("Due to an error, only color data will be decoded.",r),this.mergerCreationFailed=!0,this.decodeAlphaData(e);return}if(!this.alphaDecoder){let e=e=>{if(this.alphaDecoderQueueSize--,this.colorQueue.length>0){let r=this.colorQueue.shift();(0,u.assert)(void 0!==r),this.mergeAlpha(r,e)}else this.alphaQueue.push(e);for(this.decodedAlphaChunkCount++;this.nullAlphaFrameQueue.length>0&&this.nullAlphaFrameQueue[0]===this.decodedAlphaChunkCount;)if(this.nullAlphaFrameQueue.shift(),this.colorQueue.length>0){let e=this.colorQueue.shift();(0,u.assert)(void 0!==e),this.mergeAlpha(e,null)}else this.alphaQueue.push(null)};this.alphaDecoder=new VideoDecoder({output:r=>{try{e(r)}catch(e){this.onError(e)}},error:this.onError}),this.alphaDecoder.configure(this.decoderConfig)}let r=(0,o.determineVideoPacketType)(this.codec,this.decoderConfig,e.sideData.alpha);if(this.alphaHadKeyframe||(this.alphaHadKeyframe="key"===r),this.alphaHadKeyframe){if("hevc"===this.codec&&this.currentAlphaPacketIndex>0&&!this.alphaRaslSkipped){if(this.hasHevcRaslPicture(e.sideData.alpha))return void this.pushNullAlphaFrame();this.alphaRaslSkipped=!0}this.currentAlphaPacketIndex++,this.alphaDecoder.decode(e.alphaToEncodedVideoChunk(r??e.type)),this.alphaDecoderQueueSize++}else this.pushNullAlphaFrame()}pushNullAlphaFrame(){0===this.alphaDecoderQueueSize?this.alphaQueue.push(null):this.nullAlphaFrameQueue.push(this.decodedAlphaChunkCount+this.alphaDecoderQueueSize)}hasHevcRaslPicture(e){return(0,o.extractHevcNalUnits)(e,this.decoderConfig).some(e=>{let r=(0,o.extractNalUnitTypeForHevc)(e);return r===o.HevcNalUnitType.RASL_N||r===o.HevcNalUnitType.RASL_R})}sampleHandler(e){if((0,u.isWebKit)()){if(this.sampleQueue.length>0&&e.timestamp>=(0,u.last)(this.sampleQueue).timestamp){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}(0,u.insertSorted)(this.sampleQueue,e,e=>e.timestamp)}else{let r=this.inputTimestamps.shift();(0,u.assert)(void 0!==r),e.setTimestamp(r),this.finalizeAndEmitSample(e)}}finalizeAndEmitSample(e){e.setTimestamp(Math.round(e.timestamp*this.timeResolution)/this.timeResolution),e.setDuration(Math.round(e.duration*this.timeResolution)/this.timeResolution),e.setRotation(this.rotation),this.onSample(e)}mergeAlpha(e,r){if(!r){let r=new(0,p.VideoSample)(e);this.sampleHandler(r);return}(0,u.assert)(this.merger),this.merger.update(e,r),e.close(),r.close();let a=new VideoFrame(this.merger.canvas,{timestamp:e.timestamp,duration:e.duration??void 0}),i=new(0,p.VideoSample)(a);this.sampleHandler(i)}async flush(){if(this.customDecoder?await this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),await Promise.all([this.decoder.flush(),this.alphaDecoder?.flush()]),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.alphaHadKeyframe=!1,this.decodedAlphaChunkCount=0,this.alphaDecoderQueueSize=0,this.nullAlphaFrameQueue.length=0,this.currentAlphaPacketIndex=0,this.alphaRaslSkipped=!1),(0,u.isWebKit)()){for(let e of this.sampleQueue)this.finalizeAndEmitSample(e);this.sampleQueue.length=0}this.currentPacketIndex=0,this.raslSkipped=!1}close(){for(let e of(this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close(),this.alphaDecoder?.close(),this.colorQueue.forEach(e=>e.close()),this.colorQueue.length=0,this.alphaQueue.forEach(e=>e?.close()),this.alphaQueue.length=0,this.merger?.close()),this.sampleQueue))e.close();this.sampleQueue.length=0}}class I{constructor(){"undefined"!=typeof OffscreenCanvas?this.canvas=new OffscreenCanvas(300,150):this.canvas=document.createElement("canvas");let e=this.canvas.getContext("webgl2",{premultipliedAlpha:!1});if(!e)throw Error("Couldn't acquire WebGL 2 context.");this.gl=e,this.program=this.createProgram(),this.vao=this.createVAO(),this.colorTexture=this.createTexture(),this.alphaTexture=this.createTexture(),this.gl.useProgram(this.program),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_colorTexture"),0),this.gl.uniform1i(this.gl.getUniformLocation(this.program,"u_alphaTexture"),1)}createProgram(){let e=this.createShader(this.gl.VERTEX_SHADER,`#version 300 es in vec2 a_position; in vec2 a_texCoord; out vec2 v_texCoord; void main() { gl_Position = vec4(a_position, 0.0, 1.0); v_texCoord = a_texCoord; } `),r=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es precision highp float; uniform sampler2D u_colorTexture; uniform sampler2D u_alphaTexture; in vec2 v_texCoord; out vec4 fragColor; void main() { vec3 color = texture(u_colorTexture, v_texCoord).rgb; float alpha = texture(u_alphaTexture, v_texCoord).r; fragColor = vec4(color, alpha); } `),a=this.gl.createProgram();return this.gl.attachShader(a,e),this.gl.attachShader(a,r),this.gl.linkProgram(a),a}createShader(e,r){let a=this.gl.createShader(e);return this.gl.shaderSource(a,r),this.gl.compileShader(a),a}createVAO(){let e=this.gl.createVertexArray();this.gl.bindVertexArray(e);let r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),a=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a),this.gl.bufferData(this.gl.ARRAY_BUFFER,r,this.gl.STATIC_DRAW);let i=this.gl.getAttribLocation(this.program,"a_position"),s=this.gl.getAttribLocation(this.program,"a_texCoord");return this.gl.enableVertexAttribArray(i),this.gl.vertexAttribPointer(i,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),e}createTexture(){let e=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,e),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),e}update(e,r){(e.displayWidth!==this.canvas.width||e.displayHeight!==this.canvas.height)&&(this.canvas.width=e.displayWidth,this.canvas.height=e.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.colorTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,e),this.gl.activeTexture(this.gl.TEXTURE1),this.gl.bindTexture(this.gl.TEXTURE_2D,this.alphaTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,r),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4)}close(){this.gl.getExtension("WEBGL_lose_context")?.loseContext(),this.gl=null}}class x extends y{constructor(e){if(!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This video track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=this._track.rotation,s=await this._track.getDecoderConfig(),n=this._track.timeResolution;return(0,u.assert)(a&&s),new w(e,r,a,s,i,n)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class E{constructor(e,r={}){if(this._nextCanvasIndex=0,!(e instanceof d.InputVideoTrack))throw TypeError("videoTrack must be an InputVideoTrack.");if(r&&"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.alpha&&"boolean"!=typeof r.alpha)throw TypeError("options.alpha, when provided, must be a boolean.");if(void 0!==r.width&&(!Number.isInteger(r.width)||r.width<=0))throw TypeError("options.width, when defined, must be a positive integer.");if(void 0!==r.height&&(!Number.isInteger(r.height)||r.height<=0))throw TypeError("options.height, when defined, must be a positive integer.");if(void 0!==r.fit&&!["fill","contain","cover"].includes(r.fit))throw TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==r.width&&void 0!==r.height&&void 0===r.fit)throw TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180 or 270.");if(void 0!==r.crop&&(0,p.validateCropRectangle)(r.crop,"options."),void 0!==r.poolSize&&("number"!=typeof r.poolSize||!Number.isInteger(r.poolSize)||r.poolSize<0))throw TypeError("poolSize must be a non-negative integer.");let a=r.rotation??e.rotation,[i,s]=a%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],n=r.crop;n&&(0,p.clampCropRectangle)(n,i,s);let[o,l]=n?[n.width,n.height]:[i,s],c=o/l;void 0!==r.width&&void 0===r.height?l=Math.round((o=r.width)/c):void 0===r.width&&void 0!==r.height?o=Math.round((l=r.height)*c):void 0!==r.width&&void 0!==r.height&&(o=r.width,l=r.height),this._videoTrack=e,this._alpha=r.alpha??!1,this._width=o,this._height=l,this._rotation=a,this._crop=n,this._fit=r.fit??"fill",this._videoSampleSink=new x(e),this._canvasPool=Array.from({length:r.poolSize??0},()=>null)}_videoSampleToWrappedCanvas(e){let r=this._canvasPool[this._nextCanvasIndex],a=!1;r||("undefined"!=typeof document?((r=document.createElement("canvas")).width=this._width,r.height=this._height):r=new OffscreenCanvas(this._width,this._height),this._canvasPool.length>0&&(this._canvasPool[this._nextCanvasIndex]=r),a=!0),this._canvasPool.length>0&&(this._nextCanvasIndex=(this._nextCanvasIndex+1)%this._canvasPool.length);let i=r.getContext("2d",{alpha:this._alpha||(0,u.isFirefox)()});(0,u.assert)(i),i.resetTransform(),a||(!this._alpha&&(0,u.isFirefox)()?(i.fillStyle="black",i.fillRect(0,0,this._width,this._height)):i.clearRect(0,0,this._width,this._height)),e.drawWithFit(i,{fit:this._fit,rotation:this._rotation,crop:this._crop});let s={canvas:r,timestamp:e.timestamp,duration:e.duration};return e.close(),s}async getCanvas(e){g(e);let r=await this._videoSampleSink.getSample(e);return r&&this._videoSampleToWrappedCanvas(r)}canvases(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samples(e,r),e=>this._videoSampleToWrappedCanvas(e))}canvasesAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._videoSampleSink.samplesAtTimestamps(e),e=>e&&this._videoSampleToWrappedCanvas(e))}}class P extends T{constructor(e,r,a,i){super(e,r),this.decoder=null,this.customDecoder=null,this.customDecoderCallSerializer=new(0,u.CallSerializer),this.customDecoderQueueSize=0,this.currentTimestamp=null;let s=r=>{(null===this.currentTimestamp||Math.abs(r.timestamp-this.currentTimestamp)>=r.duration)&&(this.currentTimestamp=r.timestamp);let a=this.currentTimestamp;if(this.currentTimestamp+=r.duration,0===r.numberOfFrames)return void r.close();let s=i.sampleRate;r.setTimestamp(Math.round(a*s)/s),e(r)},n=l.customAudioDecoders.find(e=>e.supports(a,i));n?(this.customDecoder=new n,this.customDecoder.codec=a,this.customDecoder.config=i,this.customDecoder.onSample=e=>{if(!(e instanceof p.AudioSample))throw TypeError("The argument passed to onSample must be an AudioSample.");s(e)},this.customDecoderCallSerializer.call(()=>this.customDecoder.init())):(this.decoder=new AudioDecoder({output:e=>{try{s(new(0,p.AudioSample)(e))}catch(e){this.onError(e)}},error:r}),this.decoder.configure(i))}getDecodeQueueSize(){return this.customDecoder?this.customDecoderQueueSize:((0,u.assert)(this.decoder),this.decoder.decodeQueueSize)}decode(e){this.customDecoder?(this.customDecoderQueueSize++,this.customDecoderCallSerializer.call(()=>this.customDecoder.decode(e)).then(()=>this.customDecoderQueueSize--)):((0,u.assert)(this.decoder),this.decoder.decode(e.toEncodedAudioChunk()))}flush(){return this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.flush()):((0,u.assert)(this.decoder),this.decoder.flush())}close(){this.customDecoder?this.customDecoderCallSerializer.call(()=>this.customDecoder.close()):((0,u.assert)(this.decoder),this.decoder.close())}}class C extends T{constructor(e,r,a){super(e,r),this.decoderConfig=a,this.currentTimestamp=null,(0,u.assert)(n.PCM_AUDIO_CODECS.includes(a.codec)),this.codec=a.codec;let{dataType:i,sampleSize:s,littleEndian:o}=(0,n.parsePcmCodec)(this.codec);switch(this.inputSampleSize=s,s){case 1:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint8(r)-128:"signed"===i?this.readInputValue=(e,r)=>e.getInt8(r):"ulaw"===i?this.readInputValue=(e,r)=>(0,m.fromUlaw)(e.getUint8(r)):"alaw"===i?this.readInputValue=(e,r)=>(0,m.fromAlaw)(e.getUint8(r)):(0,u.assert)(!1);break;case 2:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint16(r,o)-32768:"signed"===i?this.readInputValue=(e,r)=>e.getInt16(r,o):(0,u.assert)(!1);break;case 3:"unsigned"===i?this.readInputValue=(e,r)=>(0,u.getUint24)(e,r,o)-8388608:"signed"===i?this.readInputValue=(e,r)=>(0,u.getInt24)(e,r,o):(0,u.assert)(!1);break;case 4:"unsigned"===i?this.readInputValue=(e,r)=>e.getUint32(r,o)-0x80000000:"signed"===i?this.readInputValue=(e,r)=>e.getInt32(r,o):"float"===i?this.readInputValue=(e,r)=>e.getFloat32(r,o):(0,u.assert)(!1);break;case 8:"float"===i?this.readInputValue=(e,r)=>e.getFloat64(r,o):(0,u.assert)(!1);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}switch(s){case 1:"ulaw"===i||"alaw"===i?(this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0)):(this.outputSampleSize=1,this.outputFormat="u8",this.writeOutputValue=(e,r,a)=>e.setUint8(r,a+128));break;case 2:this.outputSampleSize=2,this.outputFormat="s16",this.writeOutputValue=(e,r,a)=>e.setInt16(r,a,!0);break;case 3:this.outputSampleSize=4,this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a<<8,!0);break;case 4:this.outputSampleSize=4,"float"===i?(this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0)):(this.outputFormat="s32",this.writeOutputValue=(e,r,a)=>e.setInt32(r,a,!0));break;case 8:this.outputSampleSize=4,this.outputFormat="f32",this.writeOutputValue=(e,r,a)=>e.setFloat32(r,a,!0);break;default:(0,u.assertNever)(s),(0,u.assert)(!1)}}getDecodeQueueSize(){return 0}decode(e){let r=(0,u.toDataView)(e.data),a=e.byteLength/this.decoderConfig.numberOfChannels/this.inputSampleSize,i=new ArrayBuffer(a*this.decoderConfig.numberOfChannels*this.outputSampleSize),s=new DataView(i);for(let e=0;e=n)&&(this.currentTimestamp=e.timestamp);let o=this.currentTimestamp;this.currentTimestamp+=n;let l=new(0,p.AudioSample)({format:this.outputFormat,data:i,numberOfChannels:this.decoderConfig.numberOfChannels,sampleRate:this.decoderConfig.sampleRate,numberOfFrames:a,timestamp:o});this.onSample(l)}async flush(){}close(){}}class B extends y{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");super(),this._track=e}async _createDecoder(e,r){if(!await this._track.canDecode())throw Error("This audio track cannot be decoded by this browser. Make sure to check decodability before using a track.");let a=this._track.codec,i=await this._track.getDecoderConfig();return((0,u.assert)(a&&i),n.PCM_AUDIO_CODECS.includes(i.codec))?new C(e,r,i):new P(e,r,a,i)}_createPacketSink(){return new b(this._track)}async getSample(e){for await(let r of(g(e),this.mediaSamplesAtTimestamps([e])))return r;throw Error("Internal error: Iterator returned nothing.")}samples(e=0,r=1/0){return this.mediaSamplesInRange(e,r)}samplesAtTimestamps(e){return this.mediaSamplesAtTimestamps(e)}}class _{constructor(e){if(!(e instanceof d.InputAudioTrack))throw TypeError("audioTrack must be an InputAudioTrack.");this._audioSampleSink=new B(e)}_audioSampleToWrappedArrayBuffer(e){let r={buffer:e.toAudioBuffer(),timestamp:e.timestamp,duration:e.duration};return e.close(),r}async getBuffer(e){g(e);let r=await this._audioSampleSink.getSample(e);return r&&this._audioSampleToWrappedArrayBuffer(r)}buffers(e=0,r=1/0){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samples(e,r),e=>this._audioSampleToWrappedArrayBuffer(e))}buffersAtTimestamps(e){return(0,u.mapAsyncGenerator)(this._audioSampleSink.samplesAtTimestamps(e),e=>e&&this._audioSampleToWrappedArrayBuffer(e))}}},{"./codec.js":"4GUiq","./codec-data.js":"zx4dz","./custom-coder.js":"57K5K","./input.js":"6K6yf","./input-track.js":"aU0uf","./misc.js":"jrq2g","./packet.js":"8dQhf","./pcm.js":"3X3Vq","./sample.js":"1yEK7","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6K6yf":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Input",()=>d),s.export(a,"InputDisposedError",()=>u);var n=e("./input-format.js"),o=e("./misc.js"),l=e("./reader.js"),c=e("./source.js");(0,o.polyfillSymbolDispose)();class d{get disposed(){return this._disposed}constructor(e){if(this._demuxerPromise=null,this._format=null,this._disposed=!1,!e||"object"!=typeof e)throw TypeError("options must be an object.");if(!Array.isArray(e.formats)||e.formats.some(e=>!(e instanceof n.InputFormat)))throw TypeError("options.formats must be an array of InputFormat.");if(!(e.source instanceof c.Source))throw TypeError("options.source must be a Source.");if(e.source._disposed)throw Error("options.source must not be disposed.");this._formats=e.formats,this._source=e.source,this._reader=new(0,l.Reader)(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{for(let e of(this._reader.fileSize=await this._source.getSizeOrNull(),this._formats))if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw Error("Input has an unsupported or unrecognizable format.")})()}get source(){return this._source}async getFormat(){return await this._getDemuxer(),(0,o.assert)(this._format),this._format}async computeDuration(){return(await this._getDemuxer()).computeDuration()}async getTracks(){return(await this._getDemuxer()).getTracks()}async getVideoTracks(){return(await this.getTracks()).filter(e=>e.isVideoTrack())}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}async getMetadataTags(){return(await this._getDemuxer()).getMetadataTags()}dispose(){this._disposed||(this._disposed=!0,this._source._disposed=!0,this._source._dispose())}[Symbol.dispose](){this.dispose()}}class u extends Error{constructor(e="Input has been disposed."){super(e),this.name="InputDisposedError"}}},{"./input-format.js":"gFGfd","./misc.js":"jrq2g","./reader.js":"6AkKg","./source.js":"108pa","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"6AkKg":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Reader",()=>l),s.export(a,"FileSlice",()=>c),s.export(a,"readBytes",()=>u),s.export(a,"readU8",()=>h),s.export(a,"readU16",()=>m),s.export(a,"readU16Be",()=>p),s.export(a,"readU24Be",()=>f),s.export(a,"readI16Be",()=>g),s.export(a,"readU32",()=>k),s.export(a,"readU32Be",()=>b),s.export(a,"readU32Le",()=>T),s.export(a,"readI32Be",()=>y),s.export(a,"readI32Le",()=>S),s.export(a,"readU64",()=>w),s.export(a,"readU64Be",()=>I),s.export(a,"readI64Be",()=>x),s.export(a,"readI64Le",()=>E),s.export(a,"readF32Be",()=>P),s.export(a,"readF64Be",()=>C),s.export(a,"readAscii",()=>B);var n=e("./input.js"),o=e("./misc.js");class l{constructor(e){this.source=e}requestSlice(e,r){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize&&e+r>this.fileSize)return null;let a=e+r,i=this.source._read(e,a);return i instanceof Promise?i.then(r=>r?new c(r.bytes,r.view,r.offset,e,a):null):i?new c(i.bytes,i.view,i.offset,e,a):null}requestSliceRange(e,r,a){if(this.source._disposed)throw new(0,n.InputDisposedError);if(null!==this.fileSize)return this.requestSlice(e,(0,o.clamp)(this.fileSize-e,r,a));{let i=this.requestSlice(e,a),s=i=>{if(i)return i;let s=i=>((0,o.assert)(null!==i),this.requestSlice(e,(0,o.clamp)(i-e,r,a))),n=this.source._retrieveSize();return n instanceof Promise?n.then(s):s(n)};return i instanceof Promise?i.then(s):s(i)}}}class c{constructor(e,r,a,i,s){this.bytes=e,this.view=r,this.offset=a,this.start=i,this.end=s,this.bufferPos=i-a}static tempFromBytes(e){return new c(e,(0,o.toDataView)(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(e){this.bufferPos=e-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(e){this.bufferPos+=e}slice(e,r=this.end-e){if(ethis.end)throw RangeError("Slicing outside of original slice.");return new c(this.bytes,this.view,this.offset,e,e+r)}}let d=(e,r)=>{if(e.filePose.end)throw RangeError(`Tried reading [${e.filePos}, ${e.filePos+r}), but slice is [${e.start}, ${e.end}). This is likely an internal error, please report it alongside the file that caused it.`)},u=(e,r)=>{d(e,r);let a=e.bytes.subarray(e.bufferPos,e.bufferPos+r);return e.bufferPos+=r,a},h=e=>(d(e,1),e.view.getUint8(e.bufferPos++)),m=(e,r)=>{d(e,2);let a=e.view.getUint16(e.bufferPos,r);return e.bufferPos+=2,a},p=e=>{d(e,2);let r=e.view.getUint16(e.bufferPos,!1);return e.bufferPos+=2,r},f=e=>{d(e,3);let r=(0,o.getUint24)(e.view,e.bufferPos,!1);return e.bufferPos+=3,r},g=e=>{d(e,2);let r=e.view.getInt16(e.bufferPos,!1);return e.bufferPos+=2,r},k=(e,r)=>{d(e,4);let a=e.view.getUint32(e.bufferPos,r);return e.bufferPos+=4,a},b=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!1);return e.bufferPos+=4,r},T=e=>{d(e,4);let r=e.view.getUint32(e.bufferPos,!0);return e.bufferPos+=4,r},y=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!1);return e.bufferPos+=4,r},S=e=>{d(e,4);let r=e.view.getInt32(e.bufferPos,!0);return e.bufferPos+=4,r},w=(e,r)=>{let a,i;return r?(a=k(e,!0),i=k(e,!0)):(i=k(e,!1),a=k(e,!1)),0x100000000*i+a},I=e=>0x100000000*b(e)+b(e),x=e=>0x100000000*y(e)+b(e),E=e=>{let r=T(e);return 0x100000000*S(e)+r},P=e=>{d(e,4);let r=e.view.getFloat32(e.bufferPos,!1);return e.bufferPos+=4,r},C=e=>{d(e,8);let r=e.view.getFloat64(e.bufferPos,!1);return e.bufferPos+=8,r},B=(e,r)=>{d(e,r);let a="";for(let i=0;id),s.export(a,"BufferSource",()=>u),s.export(a,"BlobSource",()=>h),s.export(a,"UrlSource",()=>p),s.export(a,"FilePathSource",()=>f),s.export(a,"StreamSource",()=>g),s.export(a,"ReadableStreamSource",()=>k);var n=e("./misc.js"),o=e("./node.js"),l=e("./input.js");let c=void 0!==o?o:void 0;class d{constructor(){this._disposed=!1,this._sizePromise=null,this.onread=null}async getSizeOrNull(){if(this._disposed)throw new(0,l.InputDisposedError);return this._sizePromise??=Promise.resolve(this._retrieveSize())}async getSize(){if(this._disposed)throw new(0,l.InputDisposedError);let e=await this.getSizeOrNull();if(null===e)throw Error("Cannot determine the size of an unsized source.");return e}}class u extends d{constructor(e){if(!(e instanceof ArrayBuffer)&&!("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)&&!ArrayBuffer.isView(e))throw TypeError("buffer must be an ArrayBuffer, SharedArrayBuffer, or ArrayBufferView.");super(),this._onreadCalled=!1,this._bytes=(0,n.toUint8Array)(e),this._view=(0,n.toDataView)(e)}_retrieveSize(){return this._bytes.byteLength}_read(){return this._onreadCalled||(this.onread?.(0,this._bytes.byteLength),this._onreadCalled=!0),{bytes:this._bytes,view:this._view,offset:0}}_dispose(){}}class h extends d{constructor(e,r={}){if(!(e instanceof Blob))throw TypeError("blob must be a Blob.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._readers=new WeakMap,this._blob=e,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??8388608,maxWorkerCount:4,runWorker:this._runWorker.bind(this),prefetchProfile:b.fileSystem})}_retrieveSize(){let e=this._blob.size;return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){let r=this._readers.get(e);for(void 0===r&&(r=("stream"in this._blob)&&!(0,n.isWebKit)()?this._blob.slice(e.currentPos).stream().getReader():null,this._readers.set(e,r));e.currentPos{if(r instanceof Error&&(r.message.includes("Failed to fetch")||r.message.includes("Load failed")||r.message.includes("NetworkError when attempting to fetch resource"))){let e=null;try{"undefined"!=typeof window&&void 0!==window.location&&(e=new URL(a instanceof Request?a.url:a,window.location.href).origin)}catch{}if(("undefined"==typeof navigator||"boolean"!=typeof navigator.onLine||navigator.onLine)&&null!==e&&e!==window.location.origin)return console.warn("Request will not be retried because a CORS error was suspected due to different origins. You can modify this behavior by providing your own function for the 'getRetryDelay' option."),null}return Math.min(2**(e-2),16)};class p extends d{constructor(e,r={}){if("string"!=typeof e&&!(e instanceof URL)&&!("undefined"!=typeof Request&&e instanceof Request))throw TypeError("url must be a string, URL or Request.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.requestInit&&(!r.requestInit||"object"!=typeof r.requestInit))throw TypeError("options.requestInit, when provided, must be an object.");if(void 0!==r.getRetryDelay&&"function"!=typeof r.getRetryDelay)throw TypeError("options.getRetryDelay, when provided, must be a function.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(void 0!==r.fetchFn&&"function"!=typeof r.fetchFn)throw TypeError("options.fetchFn, when provided, must be a function.");super(),this._existingResponses=new WeakMap,this._url=e,this._options=r,this._getRetryDelay=r.getRetryDelay??m,this._orchestrator=new T({maxCacheSize:r.maxCacheSize??0x4000000,maxWorkerCount:2,runWorker:this._runWorker.bind(this),prefetchProfile:b.network})}async _retrieveSize(){let e,r,a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:"bytes=0-"},signal:a.signal}),this._getRetryDelay,()=>this._disposed);if(!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(206===i.status)r=this._getTotalLengthFromRangeResponse(i),e=this._orchestrator.createWorker(0,Math.min(r,524288));else{let a=i.headers.get("Content-Length");if(a)r=Number(a),e=this._orchestrator.createWorker(0,r),this._orchestrator.options.maxCacheSize=1/0,console.warn("HTTP server did not respond with 206 Partial Content, meaning the entire remote resource now has to be downloaded. For efficient media file streaming across a network, please make sure your server supports range requests.");else throw Error(`HTTP response (status ${i.status}) must surface Content-Length header.`)}return this._orchestrator.fileSize=r,this._existingResponses.set(e,{response:i,abortController:a}),this._orchestrator.runWorker(e),r}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;;){let r=this._existingResponses.get(e);this._existingResponses.delete(e);let a=r?.abortController,i=r?.response;if(a||(a=new AbortController,i=await (0,n.retriedFetch)(this._options.fetchFn??fetch,this._url,(0,n.mergeRequestInit)(this._options.requestInit??{},{headers:{Range:`bytes=${e.currentPos}-`},signal:a.signal}),this._getRetryDelay,()=>this._disposed)),(0,n.assert)(i),!i.ok)throw Error(`Error fetching ${String(this._url)}: ${i.status} ${i.statusText}`);if(e.currentPos>0&&206!==i.status)throw Error("HTTP server did not respond with 206 Partial Content to a range request. To enable efficient media file streaming across a network, please make sure your server supports range requests.");if(!i.body)throw Error("Missing HTTP response body stream. The used fetch function must provide the response body as a ReadableStream.");let s=i.body.getReader();for(;;){let r;if(e.currentPos>=e.targetPos||e.aborted){a.abort(),e.running=!1;return}try{r=await s.read()}catch(r){if(this._disposed)throw r;let e=this._getRetryDelay(1,r,this._url);if(null!==e){console.error("Error while reading response stream. Attempting to resume.",r),await new Promise(r=>setTimeout(r,1e3*e));break}throw r}if(e.aborted)break;let{done:i,value:n}=r;if(i){if(e.currentPos>=e.targetPos){this._orchestrator.forgetWorker(e),e.running=!1;return}break}this.onread?.(e.currentPos,e.currentPos+n.length),this._orchestrator.supplyWorkerData(e,n)}if(e.aborted)break}e.running=!1}_getTotalLengthFromRangeResponse(e){let r=e.headers.get("Content-Range");if(r){let e=/\/(\d+)/.exec(r);if(e)return Number(e[1])}let a=e.headers.get("Content-Length");if(a)return Number(a);throw Error("Partial HTTP response (status 206) must surface either Content-Range or Content-Length header.")}_dispose(){this._orchestrator.dispose()}}class f extends d{constructor(e,r={}){if("string"!=typeof e)throw TypeError("filePath must be a string.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(void 0!==r.maxCacheSize&&(!(0,n.isNumber)(r.maxCacheSize)||r.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");super(),this._fileHandle=null,this._streamSource=new g({getSize:async()=>(this._fileHandle=await c.fs.open(e,"r"),(await this._fileHandle.stat()).size),read:async(e,r)=>{(0,n.assert)(this._fileHandle);let a=new Uint8Array(r-e);return await this._fileHandle.read(a,0,r-e,e),a},maxCacheSize:r.maxCacheSize,prefetchProfile:"fileSystem"})}_read(e,r){return this._streamSource._read(e,r)}_retrieveSize(){return this._streamSource._retrieveSize()}_dispose(){this._streamSource._dispose(),this._fileHandle?.close(),this._fileHandle=null}}class g extends d{constructor(e){if(!e||"object"!=typeof e)throw TypeError("options must be an object.");if("function"!=typeof e.getSize)throw TypeError("options.getSize must be a function.");if("function"!=typeof e.read)throw TypeError("options.read must be a function.");if(void 0!==e.dispose&&"function"!=typeof e.dispose)throw TypeError("options.dispose, when provided, must be a function.");if(void 0!==e.maxCacheSize&&(!(0,n.isNumber)(e.maxCacheSize)||e.maxCacheSize<0))throw TypeError("options.maxCacheSize, when provided, must be a non-negative number.");if(e.prefetchProfile&&!["none","fileSystem","network"].includes(e.prefetchProfile))throw TypeError("options.prefetchProfile, when provided, must be one of 'none', 'fileSystem' or 'network'.");super(),this._options=e,this._orchestrator=new T({maxCacheSize:e.maxCacheSize??8388608,maxWorkerCount:2,prefetchProfile:b[e.prefetchProfile??"none"],runWorker:this._runWorker.bind(this)})}_retrieveSize(){let e=this._options.getSize();if(e instanceof Promise)return e.then(e=>{if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e});if(!Number.isInteger(e)||e<0)throw TypeError("options.getSize must return or resolve to a non-negative integer.");return this._orchestrator.fileSize=e,e}_read(e,r){return this._orchestrator.read(e,r)}async _runWorker(e){for(;e.currentPosthis._endIndex)return null;this._maxRequestedIndex=Math.max(this._maxRequestedIndex,r);let a=(0,n.binarySearchLessOrEqual)(this._cache,e,e=>e.start),i=-1!==a?this._cache[a]:null;if(i&&i.start<=e&&r<=i.end)return{bytes:i.bytes,view:i.view,offset:i.start};let s=e,o=new Uint8Array(r-e);if(-1!==a)for(let i=a;i=r)break;let n=Math.max(e,a.start);n>s&&this._throwDueToCacheMiss();let l=Math.min(r,a.end);ns&&this._throwDueToCacheMiss();let{promise:l,resolve:c,reject:d}=(0,n.promiseWithResolvers)();return this._pendingSlices.push({start:e,end:r,bytes:o,resolve:c,reject:d}),this._targetIndex=Math.max(this._targetIndex,r),this._pulling||(this._pulling=!0,this._pull().catch(e=>{if(this._pulling=!1,this._pendingSlices.length>0)this._pendingSlices.forEach(r=>r.reject(e)),this._pendingSlices.length=0;else throw e})),l}_throwDueToCacheMiss(){throw Error("Read is before the cached region. With ReadableStreamSource, you must access the data more sequentially or increase the size of its cache.")}async _pull(){for(this._reader??=this._stream.getReader();this._currentIndex0;){let e=this._cache[0];if(this._maxRequestedIndex-e.end<=this._maxCacheSize)break;this._cache.shift()}this._currentIndex+=r.byteLength}this._pulling=!1}_dispose(){this._pendingSlices.length=0,this._cache.length=0}}let b={none:(e,r)=>({start:e,end:r}),fileSystem:(e,r)=>({start:e=65536*Math.floor((e-65536)/65536),end:r=65536*Math.ceil((r+65536)/65536)}),network:(e,r,a)=>{for(let i of(e=Math.max(0,65536*Math.floor((e-65536)/65536)),a)){let a=Math.max((i.startPos+i.targetPos)/2,i.targetPos-8388608);if((0,n.closedIntervalsOverlap)(e,r,a,i.targetPos)){let e=i.targetPos-i.startPos,a=8388608*Math.ceil((e+1)/8388608),s=Math.min(2**Math.ceil(Math.log2(e+1)),a);r=Math.max(r,i.startPos+s)}}return r=Math.max(r,e+524288),{start:e,end:r}}};class T{constructor(e){this.options=e,this.fileSize=null,this.nextAge=0,this.workers=[],this.cache=[],this.currentCacheSize=0,this.disposed=!1}read(e,r){(0,n.assert)(null!==this.fileSize);let a=this.options.prefetchProfile(e,r,this.workers),i=Math.max(a.start,0),s=Math.min(a.end,this.fileSize);(0,n.assert)(i<=e&&r<=s);let o=null,l=(0,n.binarySearchLessOrEqual)(this.cache,e,e=>e.start),c=-1!==l?this.cache[l]:null;c&&c.start<=e&&r<=c.end&&(c.age=this.nextAge++,o={bytes:c.bytes,view:c.view,offset:c.start});let d=(0,n.binarySearchLessOrEqual)(this.cache,i,e=>e.start),u=o?null:new Uint8Array(r-e),h=0,m=i,p=[];if(-1!==d){for(let a=d;a=s)break;if(o.end<=i)continue;let l=Math.max(i,o.start),c=Math.min(s,o.end);if((0,n.assert)(l<=c),m=u.length&&(o={bytes:u,view:(0,n.toDataView)(u),offset:e}),0===p.length)return(0,n.assert)(o),o;let{promise:f,resolve:g,reject:k}=(0,n.promiseWithResolvers)(),b=[];for(let a of p){let i=Math.max(e,a.start),s=Math.min(r,a.end);i===a.start&&s===a.end?b.push(a):i({bytes:r,view:(0,n.toDataView)(r),offset:e}))),o}createWorker(e,r){let a={startPos:e,currentPos:e,targetPos:r,running:!1,aborted:this.disposed,pendingSlices:[],age:this.nextAge++};for(this.workers.push(a);this.workers.length>this.options.maxWorkerCount;){let e=0,r=this.workers[0];for(let a=1;a0)break;r.aborted=!0,this.workers.splice(e,1)}return a}runWorker(e){(0,n.assert)(!e.running),(0,n.assert)(e.currentPos{if(e.running=!1,e.pendingSlices.length>0)e.pendingSlices.forEach(e=>e.reject(r)),e.pendingSlices.length=0;else throw r})}supplyWorkerData(e,r){(0,n.assert)(!e.aborted);let a=e.currentPos,i=a+r.length;this.insertIntoCache({start:a,end:i,bytes:r,view:(0,n.toDataView)(r),age:this.nextAge++}),e.currentPos+=r.length,e.targetPos=Math.max(e.targetPos,e.currentPos);for(let s=0;sr.start&&(r.start=i),r.end<=r.start&&(n.holes.splice(e,1),e--)}0===n.holes.length&&(n.resolve(n.bytes),e.pendingSlices.splice(s,1),s--)}for(let r=0;re.start)+1;if(r>0){let a=this.cache[r-1];if(a.end>=e.end)return;if(a.end>e.start){let i=new Uint8Array(e.end-a.start);i.set(a.bytes,0),i.set(e.bytes,e.start-a.start),this.currentCacheSize+=e.end-a.end,a.bytes=i,a.view=(0,n.toDataView)(i),a.end=e.end,r--,e=a}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length}else this.cache.splice(r,0,e),this.currentCacheSize+=e.bytes.length;for(let a=r+1;a=r.end){this.cache.splice(a,1),this.currentCacheSize-=r.bytes.length,a--;continue}let i=new Uint8Array(r.end-e.start);i.set(e.bytes,0),i.set(r.bytes,r.start-e.start),this.currentCacheSize-=e.end-r.start,e.bytes=i,e.view=(0,n.toDataView)(i),e.end=r.end,this.cache.splice(a,1);break}for(;this.currentCacheSize>this.options.maxCacheSize;){let e=0,r=this.cache[0];for(let a=1;ao),s.export(a,"EncodedPacket",()=>l);var n=e("./misc.js");let o=new Uint8Array(0);class l{constructor(e,r,a,i,s=-1,n,l){if(this.data=e,this.type=r,this.timestamp=a,this.duration=i,this.sequenceNumber=s,e===o&&void 0===n)throw Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===n&&(n=e.byteLength),!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("key"!==r&&"delta"!==r)throw TypeError('type must be either "key" or "delta".');if(!Number.isFinite(a))throw TypeError("timestamp must be a number.");if(!Number.isFinite(i)||i<0)throw TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw TypeError("sequenceNumber must be a number.");if(!Number.isInteger(n)||n<0)throw TypeError("byteLength must be a non-negative integer.");if(void 0!==l&&("object"!=typeof l||!l))throw TypeError("sideData, when provided, must be an object.");if(l?.alpha!==void 0&&!(l.alpha instanceof Uint8Array))throw TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(l?.alphaByteLength!==void 0&&(!Number.isInteger(l.alphaByteLength)||l.alphaByteLength<0))throw TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=n,this.sideData=l??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===o}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(e=this.type){if(!this.sideData.alpha)throw TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:e,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,r){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");let a=new Uint8Array(e.byteLength);return e.copyTo(a),new l(a,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,r)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw TypeError("options, when provided, must be an object.");if(e?.timestamp!==void 0&&!Number.isFinite(e.timestamp))throw TypeError("options.timestamp, when provided, must be a number.");if(e?.duration!==void 0&&!Number.isFinite(e.duration))throw TypeError("options.duration, when provided, must be a number.");return new l(this.data,this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,this.sequenceNumber,this.byteLength)}}},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3X3Vq":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"toUlaw",()=>n),s.export(a,"fromUlaw",()=>o),s.export(a,"toAlaw",()=>l),s.export(a,"fromAlaw",()=>c);let n=e=>{let r=e,a=4096,i=0,s=12,n=0;for(r<0&&(r=-r,i=128),(r+=33)>8191&&(r=8191);(r&a)!==a&&s>=5;)a>>=1,s--;return n=r>>s-4&15,255&~(i|s-5<<4|n)},o=e=>{let r=0,a=0,i=~e;128&i&&(i&=-129,r=-1);let s=(1<<(a=((240&i)>>4)+5)|(15&i)<{let r=2048,a=0,i=11,s=0,n=e;for(n<0&&(n=-n,a=128),n>4095&&(n=4095);(n&r)!==r&&i>=5;)r>>=1,i--;return s=n>>(4===i?1:i-4)&15,(a|i-4<<4|s)^85},c=e=>{let r=0,a=0,i=85^e;128&i&&(i&=-129,r=-1);let s=0;return s=4!=(a=((240&i)>>4)+4)?1<d),s.export(a,"clampCropRectangle",()=>h),s.export(a,"validateCropRectangle",()=>m),s.export(a,"AudioSample",()=>f);var n=e("./misc.js");(0,n.polyfillSymbolDispose)();let o=-1/0,l=-1/0,c=null;"undefined"!=typeof FinalizationRegistry&&(c=new FinalizationRegistry(e=>{let r=Date.now();"video"===e.type?(r-o>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),o=r),"undefined"!=typeof VideoFrame&&e.data instanceof VideoFrame&&e.data.close()):(r-l>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),l=r),"undefined"!=typeof AudioData&&e.data instanceof AudioData&&e.data.close())}));class d{get displayWidth(){return this.rotation%180==0?this.codedWidth:this.codedHeight}get displayHeight(){return this.rotation%180==0?this.codedHeight:this.codedWidth}get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,r){if(this._closed=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(!("format"in r)||"string"!=typeof r.format)throw TypeError("init.format must be a string.");if(!Number.isInteger(r.codedWidth)||r.codedWidth<=0)throw TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(r.codedHeight)||r.codedHeight<=0)throw TypeError("init.codedHeight must be a positive integer.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=(0,n.toUint8Array)(e).slice(),this.format=r.format,this.codedWidth=r.codedWidth,this.codedHeight=r.codedHeight,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace(r.colorSpace)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(r?.rotation!==void 0&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(r?.timestamp!==void 0&&!Number.isFinite(r?.timestamp))throw TypeError("init.timestamp, when provided, must be a number.");if(r?.duration!==void 0&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");this._data=e,this.format=e.format,this.codedWidth=e.displayWidth,this.codedHeight=e.displayHeight,this.rotation=r?.rotation??0,this.timestamp=r?.timestamp??e.timestamp/1e6,this.duration=r?.duration??(e.duration??0)/1e6,this.colorSpace=e.colorSpace}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!r||"object"!=typeof r)throw TypeError("init must be an object.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(r.timestamp))throw TypeError("init.timestamp must be a number.");if(void 0!==r.duration&&(!Number.isFinite(r.duration)||r.duration<0))throw TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new d(new VideoFrame(e,{timestamp:Math.trunc(r.timestamp*n.SECOND_TO_MICROSECOND_FACTOR),duration:Math.trunc((r.duration??0)*n.SECOND_TO_MICROSECOND_FACTOR)||void 0}),r);let a=0,i=0;if("naturalWidth"in e?(a=e.naturalWidth,i=e.naturalHeight):"videoWidth"in e?(a=e.videoWidth,i=e.videoHeight):"width"in e&&(a=Number(e.width),i=Number(e.height)),!a||!i)throw TypeError("Could not determine dimensions.");let s=new OffscreenCanvas(a,i),o=s.getContext("2d",{alpha:(0,n.isFirefox)(),willReadFrequently:!0});(0,n.assert)(o),o.drawImage(e,0,0),this._data=s,this.format="RGBX",this.codedWidth=a,this.codedHeight=i,this.rotation=r.rotation??0,this.timestamp=r.timestamp,this.duration=r.duration??0,this.colorSpace=new VideoColorSpace({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else throw TypeError("Invalid data type: Must be a BufferSource or CanvasImageSource.");c?.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new d(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?new d(this._data.slice(),{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation}):new d(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation})}close(){this._closed||(c?.unregister(this),u(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?this._data.allocationSize():this._data instanceof Uint8Array?this._data.byteLength:this.codedWidth*this.codedHeight*4}async copyTo(e){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),u(this._data))await this._data.copyTo(e);else if(this._data instanceof Uint8Array)(0,n.toUint8Array)(e).set(this._data);else{let r=this._data.getContext("2d");(0,n.assert)(r);let a=r.getImageData(0,0,this.codedWidth,this.codedHeight);(0,n.toUint8Array)(e).set(a.data)}}toVideoFrame(){if(this._closed)throw Error("VideoSample is closed.");return((0,n.assert)(null!==this._data),u(this._data))?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(e,r,a,i,s,n,o,l,c){let d=0,u=0,h=this.displayWidth,m=this.displayHeight,p=0,f=0,g=this.displayWidth,k=this.displayHeight;if(void 0!==n?(d=r,u=a,h=i,m=s,p=n,f=o,void 0!==l?(g=l,k=c):(g=h,k=m)):(p=r,f=a,void 0!==i&&(g=i,k=s)),!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw TypeError("sx must be a number.");if(!Number.isFinite(u))throw TypeError("sy must be a number.");if(!Number.isFinite(h)||h<0)throw TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(m)||m<0)throw TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw TypeError("dx must be a number.");if(!Number.isFinite(f))throw TypeError("dy must be a number.");if(!Number.isFinite(g)||g<0)throw TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(k)||k<0)throw TypeError("dHeight must be a non-negative number.");if(this._closed)throw Error("VideoSample is closed.");({sx:d,sy:u,sWidth:h,sHeight:m}=this._rotateSourceRegion(d,u,h,m,this.rotation));let b=this.toCanvasImageSource();e.save();let T=p+g/2,y=f+k/2;e.translate(T,y),e.rotate(this.rotation*Math.PI/180);let S=this.rotation%180==0?1:g/k;e.scale(1/S,S),e.drawImage(b,d,u,h,m,-g/2,-k/2,g,k),e.restore()}drawWithFit(e,r){let a,i,s,n;if(!("undefined"!=typeof CanvasRenderingContext2D&&e instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&e instanceof OffscreenCanvasRenderingContext2D))throw TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!["fill","contain","cover"].includes(r.fit))throw TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==r.rotation&&![0,90,180,270].includes(r.rotation))throw TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==r.crop&&m(r.crop,"options.");let o=e.canvas.width,l=e.canvas.height,c=r.rotation??this.rotation,[d,u]=c%180==0?[this.codedWidth,this.codedHeight]:[this.codedHeight,this.codedWidth];r.crop&&h(r.crop,d,u);let{sx:p,sy:f,sWidth:g,sHeight:k}=this._rotateSourceRegion(r.crop?.left??0,r.crop?.top??0,r.crop?.width??d,r.crop?.height??u,c);if("fill"===r.fit)a=0,i=0,s=o,n=l;else{let[e,c]=r.crop?[r.crop.width,r.crop.height]:[d,u],h="contain"===r.fit?Math.min(o/e,l/c):Math.max(o/e,l/c);s=e*h,n=c*h,a=(o-s)/2,i=(l-n)/2}e.save();let b=c%180==0?1:s/n;e.translate(o/2,l/2),e.rotate(c*Math.PI/180),e.scale(1/b,b),e.translate(-o/2,-l/2),e.drawImage(this.toCanvasImageSource(),p,f,g,k,a,i,s,n),e.restore()}_rotateSourceRegion(e,r,a,i,s){return 90===s?[e,r,a,i]=[r,this.codedHeight-e-a,i,a]:180===s?[e,r]=[this.codedWidth-e-a,this.codedHeight-r-i]:270===s&&([e,r,a,i]=[this.codedWidth-r-i,e,i,a]),{sx:e,sy:r,sWidth:a,sHeight:i}}toCanvasImageSource(){if(this._closed)throw Error("VideoSample is closed.");if((0,n.assert)(null!==this._data),!(this._data instanceof Uint8Array))return this._data;{let e=this.toVideoFrame();return queueMicrotask(()=>e.close()),e}}setRotation(e){if(![0,90,180,270].includes(e))throw TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=e}setTimestamp(e){if(!Number.isFinite(e))throw TypeError("newTimestamp must be a number.");this.timestamp=e}setDuration(e){if(!Number.isFinite(e)||e<0)throw TypeError("newDuration must be a non-negative number.");this.duration=e}[Symbol.dispose](){this.close()}}let u=e=>"undefined"!=typeof VideoFrame&&e instanceof VideoFrame,h=(e,r,a)=>{e.left=Math.min(e.left,r),e.top=Math.min(e.top,a),e.width=Math.min(e.width,r-e.left),e.height=Math.min(e.height,a-e.top),(0,n.assert)(e.width>=0),(0,n.assert)(e.height>=0)},m=(e,r)=>{if(!e||"object"!=typeof e)throw TypeError(r+"crop, when provided, must be an object.");if(!Number.isInteger(e.left)||e.left<0)throw TypeError(r+"crop.left must be a non-negative integer.");if(!Number.isInteger(e.top)||e.top<0)throw TypeError(r+"crop.top must be a non-negative integer.");if(!Number.isInteger(e.width)||e.width<0)throw TypeError(r+"crop.width must be a non-negative integer.");if(!Number.isInteger(e.height)||e.height<0)throw TypeError(r+"crop.height must be a non-negative integer.")},p=new Set(["f32","f32-planar","s16","s16-planar","s32","s32-planar","u8","u8-planar"]);class f{get microsecondTimestamp(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.timestamp)}get microsecondDuration(){return Math.trunc(n.SECOND_TO_MICROSECOND_FACTOR*this.duration)}constructor(e){if(this._closed=!1,y(e)){if(null===e.format)throw TypeError("AudioData with null format is not supported.");this._data=e,this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=e.numberOfFrames,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp/1e6,this.duration=e.numberOfFrames/e.sampleRate}else{let r;if(!e||"object"!=typeof e)throw TypeError("Invalid AudioDataInit: must be an object.");if(!p.has(e.format))throw TypeError("Invalid AudioDataInit: invalid format.");if(!Number.isFinite(e.sampleRate)||e.sampleRate<=0)throw TypeError("Invalid AudioDataInit: sampleRate must be >0.");if(!Number.isInteger(e.numberOfChannels)||0===e.numberOfChannels)throw TypeError("Invalid AudioDataInit: numberOfChannels must be an integer > 0.");if(!Number.isFinite(e?.timestamp))throw TypeError("init.timestamp must be a number.");let a=e.data.byteLength/(g(e.format)*e.numberOfChannels);if(!Number.isInteger(a))throw TypeError("Invalid AudioDataInit: data size is not a multiple of frame size.");if(this.format=e.format,this.sampleRate=e.sampleRate,this.numberOfFrames=a,this.numberOfChannels=e.numberOfChannels,this.timestamp=e.timestamp,this.duration=a/e.sampleRate,e.data instanceof ArrayBuffer)r=new Uint8Array(e.data);else if(ArrayBuffer.isView(e.data))r=new Uint8Array(e.data.buffer,e.data.byteOffset,e.data.byteLength);else throw TypeError("Invalid AudioDataInit: data is not a BufferSource.");let i=this.numberOfFrames*this.numberOfChannels*g(this.format);if(r.byteLength=this.numberOfFrames)throw RangeError("frameOffset out of range");let i=void 0!==e.frameCount?e.frameCount:this.numberOfFrames-a;if(i>this.numberOfFrames-a)throw RangeError("frameCount out of range");let s=g(r),n=k(r);if(n&&e.planeIndex>=this.numberOfChannels||!n&&0!==e.planeIndex)throw RangeError("planeIndex out of range");return(n?i:i*this.numberOfChannels)*s}copyTo(e,r){if(!(0,n.isAllowSharedBufferSource)(e))throw TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(!r||"object"!=typeof r)throw TypeError("options must be an object.");if(!Number.isInteger(r.planeIndex)||r.planeIndex<0)throw TypeError("planeIndex must be a non-negative integer.");if(void 0!==r.format&&!p.has(r.format))throw TypeError("Invalid format.");if(void 0!==r.frameOffset&&(!Number.isInteger(r.frameOffset)||r.frameOffset<0))throw TypeError("frameOffset must be a non-negative integer.");if(void 0!==r.frameCount&&(!Number.isInteger(r.frameCount)||r.frameCount<0))throw TypeError("frameCount must be a non-negative integer.");if(this._closed)throw Error("AudioSample is closed.");let{planeIndex:a,format:i,frameCount:s,frameOffset:o}=r,l=i??this.format;if(!l)throw Error("Destination format not determined");let c=this.numberOfFrames,d=this.numberOfChannels,u=o??0;if(u>=c)throw RangeError("frameOffset out of range");let h=void 0!==s?s:c-u;if(h>c-u)throw RangeError("frameCount out of range");let m=g(l),f=k(l);if(f&&a>=d||!f&&0!==a)throw RangeError("planeIndex out of range");let S=f?h:h*d;if(e.byteLength0;){let s=Math.min(n,l),c=new Float32Array(a*s);for(let r=0;r0;){let s=Math.min(n,l),d=new Float32Array(a*s);for(let r=0;r{switch(e){case"u8":case"u8-planar":return 1;case"s16":case"s16-planar":return 2;case"s32":case"s32-planar":case"f32":case"f32-planar":return 4;default:throw Error("Unknown AudioSampleFormat")}},k=e=>{switch(e){case"u8-planar":case"s16-planar":case"s32-planar":case"f32-planar":return!0;default:return!1}},b=e=>{switch(e){case"u8":case"u8-planar":return(e,r)=>(e.getUint8(r)-128)/128;case"s16":case"s16-planar":return(e,r)=>e.getInt16(r,!0)/32768;case"s32":case"s32-planar":return(e,r)=>e.getInt32(r,!0)/0x80000000;case"f32":case"f32-planar":return(e,r)=>e.getFloat32(r,!0)}},T=e=>{switch(e){case"u8":case"u8-planar":return(e,r,a)=>e.setUint8(r,(0,n.clamp)((a+1)*127.5,0,255));case"s16":case"s16-planar":return(e,r,a)=>e.setInt16(r,(0,n.clamp)(Math.round(32767*a),-32768,32767),!0);case"s32":case"s32-planar":return(e,r,a)=>e.setInt32(r,(0,n.clamp)(Math.round(0x7fffffff*a),-0x80000000,0x7fffffff),!0);case"f32":case"f32-planar":return(e,r,a)=>e.setFloat32(r,a,!0)}},y=e=>"undefined"!=typeof AudioData&&e instanceof AudioData},{"./misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],fHhRy:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildIsobmffMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8zjcB":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_BOX_HEADER_SIZE",()=>c),s.export(a,"MAX_BOX_HEADER_SIZE",()=>d),s.export(a,"readBoxHeader",()=>u),s.export(a,"readFixed_16_16",()=>h),s.export(a,"readFixed_2_30",()=>m),s.export(a,"readIsomVariableInteger",()=>p),s.export(a,"readMetadataStringShort",()=>f),s.export(a,"readDataBox",()=>g);var n=e("../metadata.js"),o=e("../misc.js"),l=e("../reader.js");let c=8,d=16,u=e=>{let r=(0,l.readU32Be)(e),a=(0,l.readAscii)(e,4),i=8;1===r&&(r=(0,l.readU64Be)(e),i=16);let s=r-i;return s<0?null:{name:a,totalSize:r,headerSize:i,contentSize:s}},h=e=>(0,l.readI32Be)(e)/65536,m=e=>(0,l.readI32Be)(e)/0x40000000,p=e=>{let r=0;for(let a=0;a<4;a++){r<<=7;let a=(0,l.readU8)(e);if(r|=127&a,(128&a)==0)break}return r},f=e=>{let r=(0,l.readU16Be)(e);return e.skip(2),r=Math.min(r,e.remainingLength),o.textDecoder.decode((0,l.readBytes)(e,r))},g=e=>{let r=u(e);if(!r||"data"!==r.name||e.remainingLength<8)return null;let a=(0,l.readU32Be)(e);e.skip(4);let i=(0,l.readBytes)(e,r.contentSize-8);switch(a){case 1:return o.textDecoder.decode(i);case 2:return new TextDecoder("utf-16be").decode(i);case 13:return new(0,n.RichImageData)(i,"image/jpeg");case 14:return new(0,n.RichImageData)(i,"image/png");case 27:return new(0,n.RichImageData)(i,"image/bmp");default:return i}}},{"../metadata.js":"1RzS5","../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1RzS5":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"RichImageData",()=>n),s.export(a,"AttachedFile",()=>o),s.export(a,"validateMetadataTags",()=>l),s.export(a,"metadataTagsAreEmpty",()=>c),s.export(a,"DEFAULT_TRACK_DISPOSITION",()=>d),s.export(a,"validateTrackDisposition",()=>u);class n{constructor(e,r){if(this.data=e,this.mimeType=r,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if("string"!=typeof r)throw TypeError("mimeType must be a string.")}}class o{constructor(e,r,a,i){if(this.data=e,this.mimeType=r,this.name=a,this.description=i,!(e instanceof Uint8Array))throw TypeError("data must be a Uint8Array.");if(void 0!==r&&"string"!=typeof r)throw TypeError("mimeType, when provided, must be a string.");if(void 0!==a&&"string"!=typeof a)throw TypeError("name, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw TypeError("description, when provided, must be a string.")}}let l=e=>{if(!e||"object"!=typeof e)throw TypeError("tags must be an object.");if(void 0!==e.title&&"string"!=typeof e.title)throw TypeError("tags.title, when provided, must be a string.");if(void 0!==e.description&&"string"!=typeof e.description)throw TypeError("tags.description, when provided, must be a string.");if(void 0!==e.artist&&"string"!=typeof e.artist)throw TypeError("tags.artist, when provided, must be a string.");if(void 0!==e.album&&"string"!=typeof e.album)throw TypeError("tags.album, when provided, must be a string.");if(void 0!==e.albumArtist&&"string"!=typeof e.albumArtist)throw TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==e.trackNumber&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==e.tracksTotal&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==e.discNumber&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==e.discsTotal&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==e.genre&&"string"!=typeof e.genre)throw TypeError("tags.genre, when provided, must be a string.");if(void 0!==e.date&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==e.lyrics&&"string"!=typeof e.lyrics)throw TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==e.images){if(!Array.isArray(e.images))throw TypeError("tags.images, when provided, must be an array.");for(let r of e.images){if(!r||"object"!=typeof r)throw TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof r.mimeType)throw TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==e.comment&&"string"!=typeof e.comment)throw TypeError("tags.comment, when provided, must be a string.");if(void 0!==e.raw){if(!e.raw||"object"!=typeof e.raw)throw TypeError("tags.raw, when provided, must be an object.");for(let r of Object.values(e.raw))if(null!==r&&"string"!=typeof r&&!(r instanceof Uint8Array)&&!(r instanceof n)&&!(r instanceof o))throw TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.")}},c=e=>void 0===e.title&&void 0===e.description&&void 0===e.artist&&void 0===e.album&&void 0===e.albumArtist&&void 0===e.trackNumber&&void 0===e.tracksTotal&&void 0===e.discNumber&&void 0===e.discsTotal&&void 0===e.genre&&void 0===e.date&&void 0===e.lyrics&&(!e.images||0===e.images.length)&&void 0===e.comment&&(void 0===e.raw||0===Object.keys(e.raw).length),d={default:!0,forced:!1,original:!1,commentary:!1,hearingImpaired:!1,visuallyImpaired:!1},u=e=>{if(!e||"object"!=typeof e)throw TypeError("disposition must be an object.");if(void 0!==e.default&&"boolean"!=typeof e.default)throw TypeError("disposition.default must be a boolean.");if(void 0!==e.forced&&"boolean"!=typeof e.forced)throw TypeError("disposition.forced must be a boolean.");if(void 0!==e.original&&"boolean"!=typeof e.original)throw TypeError("disposition.original must be a boolean.");if(void 0!==e.commentary&&"boolean"!=typeof e.commentary)throw TypeError("disposition.commentary must be a boolean.");if(void 0!==e.hearingImpaired&&"boolean"!=typeof e.hearingImpaired)throw TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==e.visuallyImpaired&&"boolean"!=typeof e.visuallyImpaired)throw TypeError("disposition.visuallyImpaired must be a boolean.")}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"4qt3Y":[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"EBMLFloat32",()=>d),o.export(a,"EBMLFloat64",()=>u),o.export(a,"EBMLSignedInt",()=>h),o.export(a,"EBMLUnicodeString",()=>m),o.export(a,"EBMLId",()=>n),o.export(a,"LEVEL_0_EBML_IDS",()=>p),o.export(a,"LEVEL_1_EBML_IDS",()=>f),o.export(a,"LEVEL_0_AND_1_EBML_IDS",()=>g),o.export(a,"measureUnsignedInt",()=>k),o.export(a,"measureUnsignedBigInt",()=>b),o.export(a,"measureSignedInt",()=>T),o.export(a,"measureVarInt",()=>y),o.export(a,"EBMLWriter",()=>S),o.export(a,"MAX_VAR_INT_SIZE",()=>w),o.export(a,"MIN_HEADER_SIZE",()=>I),o.export(a,"MAX_HEADER_SIZE",()=>x),o.export(a,"readVarIntSize",()=>E),o.export(a,"readVarInt",()=>P),o.export(a,"readUnsignedInt",()=>C),o.export(a,"readUnsignedBigInt",()=>B),o.export(a,"readSignedInt",()=>_),o.export(a,"readElementId",()=>A),o.export(a,"readElementSize",()=>D),o.export(a,"readElementHeader",()=>M),o.export(a,"readAsciiString",()=>F),o.export(a,"readUnicodeString",()=>R),o.export(a,"readFloat",()=>U),o.export(a,"searchForNextElementId",()=>L),o.export(a,"resync",()=>N),o.export(a,"CODEC_STRING_MAP",()=>j),o.export(a,"assertDefinedSize",()=>O);var l=e("../misc.js"),c=e("../reader.js");class d{constructor(e){this.value=e}}class u{constructor(e){this.value=e}}class h{constructor(e){this.value=e}}class m{constructor(e){this.value=e}}(s=n||(n={}))[s.EBML=0x1a45dfa3]="EBML",s[s.EBMLVersion=17030]="EBMLVersion",s[s.EBMLReadVersion=17143]="EBMLReadVersion",s[s.EBMLMaxIDLength=17138]="EBMLMaxIDLength",s[s.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",s[s.DocType=17026]="DocType",s[s.DocTypeVersion=17031]="DocTypeVersion",s[s.DocTypeReadVersion=17029]="DocTypeReadVersion",s[s.Void=236]="Void",s[s.Segment=0x18538067]="Segment",s[s.SeekHead=0x114d9b74]="SeekHead",s[s.Seek=19899]="Seek",s[s.SeekID=21419]="SeekID",s[s.SeekPosition=21420]="SeekPosition",s[s.Duration=17545]="Duration",s[s.Info=0x1549a966]="Info",s[s.TimestampScale=2807729]="TimestampScale",s[s.MuxingApp=19840]="MuxingApp",s[s.WritingApp=22337]="WritingApp",s[s.Tracks=0x1654ae6b]="Tracks",s[s.TrackEntry=174]="TrackEntry",s[s.TrackNumber=215]="TrackNumber",s[s.TrackUID=29637]="TrackUID",s[s.TrackType=131]="TrackType",s[s.FlagEnabled=185]="FlagEnabled",s[s.FlagDefault=136]="FlagDefault",s[s.FlagForced=21930]="FlagForced",s[s.FlagOriginal=21934]="FlagOriginal",s[s.FlagHearingImpaired=21931]="FlagHearingImpaired",s[s.FlagVisualImpaired=21932]="FlagVisualImpaired",s[s.FlagCommentary=21935]="FlagCommentary",s[s.FlagLacing=156]="FlagLacing",s[s.Name=21358]="Name",s[s.Language=2274716]="Language",s[s.LanguageBCP47=2274717]="LanguageBCP47",s[s.CodecID=134]="CodecID",s[s.CodecPrivate=25506]="CodecPrivate",s[s.CodecDelay=22186]="CodecDelay",s[s.SeekPreRoll=22203]="SeekPreRoll",s[s.DefaultDuration=2352003]="DefaultDuration",s[s.Video=224]="Video",s[s.PixelWidth=176]="PixelWidth",s[s.PixelHeight=186]="PixelHeight",s[s.AlphaMode=21440]="AlphaMode",s[s.Audio=225]="Audio",s[s.SamplingFrequency=181]="SamplingFrequency",s[s.Channels=159]="Channels",s[s.BitDepth=25188]="BitDepth",s[s.SimpleBlock=163]="SimpleBlock",s[s.BlockGroup=160]="BlockGroup",s[s.Block=161]="Block",s[s.BlockAdditions=30113]="BlockAdditions",s[s.BlockMore=166]="BlockMore",s[s.BlockAdditional=165]="BlockAdditional",s[s.BlockAddID=238]="BlockAddID",s[s.BlockDuration=155]="BlockDuration",s[s.ReferenceBlock=251]="ReferenceBlock",s[s.Cluster=0x1f43b675]="Cluster",s[s.Timestamp=231]="Timestamp",s[s.Cues=0x1c53bb6b]="Cues",s[s.CuePoint=187]="CuePoint",s[s.CueTime=179]="CueTime",s[s.CueTrackPositions=183]="CueTrackPositions",s[s.CueTrack=247]="CueTrack",s[s.CueClusterPosition=241]="CueClusterPosition",s[s.Colour=21936]="Colour",s[s.MatrixCoefficients=21937]="MatrixCoefficients",s[s.TransferCharacteristics=21946]="TransferCharacteristics",s[s.Primaries=21947]="Primaries",s[s.Range=21945]="Range",s[s.Projection=30320]="Projection",s[s.ProjectionType=30321]="ProjectionType",s[s.ProjectionPoseRoll=30325]="ProjectionPoseRoll",s[s.Attachments=0x1941a469]="Attachments",s[s.AttachedFile=24999]="AttachedFile",s[s.FileDescription=18046]="FileDescription",s[s.FileName=18030]="FileName",s[s.FileMediaType=18016]="FileMediaType",s[s.FileData=18012]="FileData",s[s.FileUID=18094]="FileUID",s[s.Chapters=0x1043a770]="Chapters",s[s.Tags=0x1254c367]="Tags",s[s.Tag=29555]="Tag",s[s.Targets=25536]="Targets",s[s.TargetTypeValue=26826]="TargetTypeValue",s[s.TargetType=25546]="TargetType",s[s.TagTrackUID=25541]="TagTrackUID",s[s.TagEditionUID=25545]="TagEditionUID",s[s.TagChapterUID=25540]="TagChapterUID",s[s.TagAttachmentUID=25542]="TagAttachmentUID",s[s.SimpleTag=26568]="SimpleTag",s[s.TagName=17827]="TagName",s[s.TagLanguage=17530]="TagLanguage",s[s.TagString=17543]="TagString",s[s.TagBinary=17541]="TagBinary",s[s.ContentEncodings=28032]="ContentEncodings",s[s.ContentEncoding=25152]="ContentEncoding",s[s.ContentEncodingOrder=20529]="ContentEncodingOrder",s[s.ContentEncodingScope=20530]="ContentEncodingScope",s[s.ContentCompression=20532]="ContentCompression",s[s.ContentCompAlgo=16980]="ContentCompAlgo",s[s.ContentCompSettings=16981]="ContentCompSettings",s[s.ContentEncryption=20533]="ContentEncryption";let p=[n.EBML,n.Segment],f=[n.SeekHead,n.Info,n.Cluster,n.Tracks,n.Cues,n.Attachments,n.Chapters,n.Tags],g=[...p,...f],k=e=>{if(e<256)return 1;if(e<65536)return 2;if(e<0x1000000)return 3;if(e<0x100000000)return 4;if(e<0x10000000000)return 5;else return 6},b=e=>{if(e<1n<<8n)return 1;if(e<1n<<16n)return 2;if(e<1n<<24n)return 3;if(e<1n<<32n)return 4;if(e<1n<<40n)return 5;else if(e<1n<<48n)return 6;else if(e<1n<<56n)return 7;else return 8},T=e=>{if(e>=-64&&e<64)return 1;if(e>=-8192&&e<8192)return 2;if(e>=-1048576&&e<1048576)return 3;if(e>=-0x8000000&&e<0x8000000)return 4;if(e>=-0x400000000&&e<0x400000000)return 5;else return 6},y=e=>{if(e<127)return 1;if(e<16383)return 2;if(e<2097151)return 3;if(e<0xfffffff)return 4;if(e<0x800000000-1)return 5;else if(e<0x40000000000-1)return 6;else throw Error("EBML varint size not supported "+e)};class S{constructor(e){this.writer=e,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(e){this.helperView.setUint8(0,e),this.writer.write(this.helper.subarray(0,1))}writeFloat32(e){this.helperView.setFloat32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(e){this.helperView.setFloat64(0,e,!1),this.writer.write(this.helper)}writeUnsignedInt(e,r=k(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/0x10000000000|0);case 5:this.helperView.setUint8(a++,e/0x100000000|0);case 4:this.helperView.setUint8(a++,e>>24);case 3:this.helperView.setUint8(a++,e>>16);case 2:this.helperView.setUint8(a++,e>>8);case 1:this.helperView.setUint8(a++,e);break;default:throw Error("Bad unsigned int size "+r)}this.writer.write(this.helper.subarray(0,a))}writeUnsignedBigInt(e,r=b(e)){let a=0;for(let i=r-1;i>=0;i--)this.helperView.setUint8(a++,Number(e>>BigInt(8*i)&255n));this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=T(e)){e<0&&(e+=2**(8*r)),this.writeUnsignedInt(e,r)}writeVarInt(e,r=y(e)){let a=0;switch(r){case 1:this.helperView.setUint8(a++,128|e);break;case 2:this.helperView.setUint8(a++,64|e>>8),this.helperView.setUint8(a++,e);break;case 3:this.helperView.setUint8(a++,32|e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 4:this.helperView.setUint8(a++,16|e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 5:this.helperView.setUint8(a++,8|e/0x100000000&7),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;case 6:this.helperView.setUint8(a++,4|e/0x10000000000&3),this.helperView.setUint8(a++,e/0x100000000|0),this.helperView.setUint8(a++,e>>24),this.helperView.setUint8(a++,e>>16),this.helperView.setUint8(a++,e>>8),this.helperView.setUint8(a++,e);break;default:throw Error("Bad EBML varint size "+r)}this.writer.write(this.helper.subarray(0,a))}writeAsciiString(e){this.writer.write(new Uint8Array(e.split("").map(e=>e.charCodeAt(0))))}writeEBML(e){if(null!==e)if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let r of e)this.writeEBML(r);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let r=this.writer.getPos(),a=-1===e.size?1:e.size??4;-1===e.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let i=this.writer.getPos();if(this.dataOffsets.set(e,i),this.writeEBML(e.data),-1!==e.size){let e=this.writer.getPos()-i,s=this.writer.getPos();this.writer.seek(r),this.writeVarInt(e,a),this.writer.seek(s)}}else if("number"==typeof e.data){let r=e.size??k(e.data);this.writeVarInt(r),this.writeUnsignedInt(e.data,r)}else if("bigint"==typeof e.data){let r=e.size??b(e.data);this.writeVarInt(r),this.writeUnsignedBigInt(e.data,r)}else if("string"==typeof e.data)this.writeVarInt(e.data.length),this.writeAsciiString(e.data);else if(e.data instanceof Uint8Array)this.writeVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof d)this.writeVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof u)this.writeVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof h){let r=e.size??T(e.data.value);this.writeVarInt(r),this.writeSignedInt(e.data.value,r)}else if(e.data instanceof m){let r=l.textEncoder.encode(e.data.value);this.writeVarInt(r.length),this.writer.write(r)}else(0,l.assertNever)(e.data)}}let w=8,I=2,x=16,E=e=>{let r=(0,c.readU8)(e);if(e.skip(-1),0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;return a},P=e=>{let r=(0,c.readU8)(e);if(0===r)return null;let a=1,i=128;for(;(r&i)==0;)a++,i>>=1;let s=r&i-1;for(let r=1;r{if(r<1||r>8)throw Error("Bad unsigned int size "+r);let a=0;for(let i=0;i{if(r<1)throw Error("Bad unsigned int size "+r);let a=0n;for(let i=0;i{let a=C(e,r);return a&1<<8*r-1&&(a-=2**(8*r)),a},A=e=>{let r=E(e);return null===r?null:C(e,r)},D=e=>{let r=(0,c.readU8)(e);return 255===r?r=null:(e.skip(-1),0x100000000000000===(r=P(e))&&(r=null)),r},M=e=>{let r=A(e);return null===r?null:{id:r,size:D(e)}},F=(e,r)=>{let a=(0,c.readBytes)(e,r),i=0;for(;i{let a=(0,c.readBytes)(e,r),i=0;for(;i{if(0===r)return 0;if(4!==r&&8!==r)throw Error("Bad float size "+r);return 4===r?(0,c.readF32Be)(e):(0,c.readF64Be)(e)},L=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;null===i||nn?i:n,found:!1}},N=async(e,r,a,i)=>{let s=new Set(a),n=r;for(;nI);var h=e("../codec-data.js"),m=e("../codec.js"),p=e("../demuxer.js"),f=e("../input-track.js"),g=e("../metadata.js"),k=e("../misc.js"),b=e("../packet.js"),T=e("./ebml.js"),y=e("./matroska-misc.js"),S=e("../reader.js");(s=l||(l={}))[s.None=0]="None",s[s.Xiph=1]="Xiph",s[s.FixedSize=2]="FixedSize",s[s.Ebml=3]="Ebml",(n=c||(c={}))[n.Block=1]="Block",n[n.Private=2]="Private",n[n.Next=4]="Next",(o=d||(d={}))[o.Zlib=0]="Zlib",o[o.Bzlib=1]="Bzlib",o[o.lzo1x=2]="lzo1x",o[o.HeaderStripping=3]="HeaderStripping";let w=[{id:T.EBMLId.SeekHead,flag:"seekHeadSeen"},{id:T.EBMLId.Info,flag:"infoSeen"},{id:T.EBMLId.Tracks,flag:"tracksSeen"},{id:T.EBMLId.Cues,flag:"cuesSeen"}];class I extends p.Demuxer{constructor(e){super(e),this.readMetadataPromise=null,this.segments=[],this.currentSegment=null,this.currentTrack=null,this.currentCluster=null,this.currentBlock=null,this.currentBlockAdditional=null,this.currentCueTime=null,this.currentDecodingInstruction=null,this.currentTagTargetIsMovie=!0,this.currentSimpleTagName=null,this.currentAttachedFile=null,this.isWebM=!1,this.reader=e._reader}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getTracks(){return await this.readMetadata(),this.segments.flatMap(e=>e.tracks.map(e=>e.inputTrack))}async getMimeType(){await this.readMetadata();let e=await this.getTracks(),r=await Promise.all(e.map(e=>e.getCodecParameterString()));return(0,y.buildMatroskaMimeType)({isWebM:this.isWebM,hasVideo:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="video")),hasAudio:this.segments.some(e=>e.tracks.some(e=>e.info?.type==="audio")),codecStrings:r.filter(Boolean)})}async getMetadataTags(){for(let e of(await this.readMetadata(),this.segments))e.metadataTagsCollected||(null!==this.reader.fileSize&&await this.loadSegmentMetadata(e),e.metadataTagsCollected=!0);let e={};for(let r of this.segments)e={...e,...r.metadataTags};return e}readMetadata(){return this.readMetadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,T.readElementHeader)(r);if(!a)break;let i=a.id,s=a.size,n=r.filePos;if(i===T.EBMLId.EBML){(0,T.assertDefinedSize)(s);let e=this.reader.requestSlice(n,s);if(e instanceof Promise&&(e=await e),!e)break;this.readContiguousElements(e)}else if(i===T.EBMLId.Segment){if(await this.readSegment(n,s),null===s||null===this.reader.fileSize)break}else if(i===T.EBMLId.Cluster){if(null===this.reader.fileSize)break;null===s&&(s=(await (0,T.searchForNextElementId)(this.reader,n,T.LEVEL_0_AND_1_EBML_IDS,this.reader.fileSize)).pos-n);let e=(0,k.last)(this.segments);e&&(e.elementEndPos=n+s)}(0,T.assertDefinedSize)(s),e=n+s}})()}async readSegment(e,r){this.currentSegment={seekHeadSeen:!1,infoSeen:!1,tracksSeen:!1,cuesSeen:!1,tagsSeen:!1,attachmentsSeen:!1,timestampScale:-1,timestampFactor:-1,duration:-1,seekEntries:[],tracks:[],cuePoints:[],dataStartPos:e,elementEndPos:null===r?null:e+r,clusterSeekStartPos:e,lastReadCluster:null,metadataTags:{},metadataTagsCollected:!1},this.segments.push(this.currentSegment);let a=e;for(;null===this.currentSegment.elementEndPos||ae.id===s);if(-1!==l){let e=w[l].flag;this.currentSegment[e]=!0,(0,T.assertDefinedSize)(n);let r=this.reader.requestSlice(o,n);r instanceof Promise&&(r=await r),r&&this.readContiguousElements(r)}else if(s===T.EBMLId.Tags||s===T.EBMLId.Attachments){s===T.EBMLId.Tags?this.currentSegment.tagsSeen=!0:this.currentSegment.attachmentsSeen=!0,(0,T.assertDefinedSize)(n);let e=this.reader.requestSlice(o,n);e instanceof Promise&&(e=await e),e&&this.readContiguousElements(e)}else if(s===T.EBMLId.Cluster){this.currentSegment.clusterSeekStartPos=r;break}if(null===n)break;a=o+n}if(this.currentSegment.seekEntries.sort((e,r)=>e.segmentPosition-r.segmentPosition),null!==this.reader.fileSize)for(let r of this.currentSegment.seekEntries){let a=w.find(e=>e.id===r.id);if(!a||this.currentSegment[a.flag])continue;let i=this.reader.requestSliceRange(e+r.segmentPosition,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(i instanceof Promise&&(i=await i),!i)continue;let s=(0,T.readElementHeader)(i);if(!s)continue;let{id:n,size:o}=s;if(n!==a.id)continue;(0,T.assertDefinedSize)(o),this.currentSegment[a.flag]=!0;let l=this.reader.requestSlice(i.filePos,o);l instanceof Promise&&(l=await l),l&&this.readContiguousElements(l)}-1===this.currentSegment.timestampScale&&(this.currentSegment.timestampScale=1e6,this.currentSegment.timestampFactor=1e3),this.currentSegment.tracks.sort((e,r)=>Number(r.disposition.default)-Number(e.disposition.default));let i=new Map(this.currentSegment.tracks.map(e=>[e.id,e]));for(let e of this.currentSegment.cuePoints){let r=i.get(e.trackId);r&&r.cuePoints.push(e)}for(let e of this.currentSegment.tracks){e.cuePoints.sort((e,r)=>e.time-r.time);for(let r=0;rn&&(n=e.cuePoints.length,s=e);for(let e of this.currentSegment.tracks)0===e.cuePoints.length&&(e.cuePoints=s.cuePoints);this.currentSegment=null}async readCluster(e,r){if(r.lastReadCluster?.elementStartPos===e)return r.lastReadCluster;let a=this.reader.requestSliceRange(e,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);a instanceof Promise&&(a=await a),(0,k.assert)(a);let i=(0,T.readElementHeader)(a);(0,k.assert)(i);let s=i.id;(0,k.assert)(s===T.EBMLId.Cluster);let n=i.size,o=a.filePos;null===n&&(n=(await (0,T.searchForNextElementId)(this.reader,o,T.LEVEL_0_AND_1_EBML_IDS,r.elementEndPos)).pos-o);let c=this.reader.requestSlice(o,n);c instanceof Promise&&(c=await c);let d={segment:r,elementStartPos:e,elementEndPos:o+n,dataStartPos:o,timestamp:-1,trackData:new Map};for(let[,r]of(this.currentCluster=d,c&&(d.elementEndPos=this.readContiguousElements(c,T.LEVEL_0_AND_1_EBML_IDS)),d.trackData)){let a=r.track;(0,k.assert)(r.blocks.length>0);let i=!1;for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp);for(let e=0;e({timestamp:e.timestamp,blockIndex:r})).sort((e,r)=>e.timestamp-r.timestamp));let s=r.blocks[r.presentationTimestamps[0].blockIndex],n=r.blocks[(0,k.last)(r.presentationTimestamps).blockIndex];r.startTimestamp=s.timestamp,r.endTimestamp=n.timestamp+n.duration;let o=(0,k.binarySearchLessOrEqual)(a.clusterPositionCache,r.startTimestamp,e=>e.startTimestamp);(-1===o||a.clusterPositionCache[o].elementStartPos!==e)&&a.clusterPositionCache.splice(o+1,0,{elementStartPos:d.elementStartPos,startTimestamp:r.startTimestamp})}return r.lastReadCluster=d,d}getTrackDataInCluster(e,r){let a=e.trackData.get(r);if(!a){let i=e.segment.tracks.find(e=>e.id===r);if(!i)return null;a={track:i,startTimestamp:0,endTimestamp:0,firstKeyFrameTimestamp:null,blocks:[],presentationTimestamps:[]},e.trackData.set(r,a)}return a}expandLacedBlocks(e,r){for(let a=0;ae.data?.type!=="decompress"||e.scope!==c.Block||e.data.algorithm!==d.HeaderStripping)&&(console.warn(`Track #${this.currentTrack.id} has an unsupported content encoding; dropping.`),this.currentTrack=null),this.currentTrack&&-1!==this.currentTrack.id&&this.currentTrack.codecId&&this.currentTrack.info){let e=this.currentTrack.codecId.indexOf("/"),r=-1===e?this.currentTrack.codecId:this.currentTrack.codecId.slice(0,e);if("video"===this.currentTrack.info.type&&-1!==this.currentTrack.info.width&&-1!==this.currentTrack.info.height){this.currentTrack.codecId===T.CODEC_STRING_MAP.avc?(this.currentTrack.info.codec="avc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.hevc?(this.currentTrack.info.codec="hevc",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.vp8?this.currentTrack.info.codec="vp8":r===T.CODEC_STRING_MAP.vp9?this.currentTrack.info.codec="vp9":r===T.CODEC_STRING_MAP.av1&&(this.currentTrack.info.codec="av1");let e=this.currentTrack,a=new(0,f.InputVideoTrack)(this.input,new E(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}else if("audio"===this.currentTrack.info.type&&-1!==this.currentTrack.info.numberOfChannels&&-1!==this.currentTrack.info.sampleRate){r===T.CODEC_STRING_MAP.aac?(this.currentTrack.info.codec="aac",this.currentTrack.info.aacCodecInfo={isMpeg2:this.currentTrack.codecId.includes("MPEG2")},this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):this.currentTrack.codecId===T.CODEC_STRING_MAP.mp3?this.currentTrack.info.codec="mp3":r===T.CODEC_STRING_MAP.opus?(this.currentTrack.info.codec="opus",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate,this.currentTrack.info.sampleRate=m.OPUS_SAMPLE_RATE):r===T.CODEC_STRING_MAP.vorbis?(this.currentTrack.info.codec="vorbis",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):r===T.CODEC_STRING_MAP.flac?(this.currentTrack.info.codec="flac",this.currentTrack.info.codecDescription=this.currentTrack.codecPrivate):"A_PCM/INT/LIT"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32"):"A_PCM/INT/BIG"===this.currentTrack.codecId?8===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-u8":16===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s16be":24===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-s24be":32===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-s32be"):"A_PCM/FLOAT/IEEE"===this.currentTrack.codecId&&(32===this.currentTrack.info.bitDepth?this.currentTrack.info.codec="pcm-f32":64===this.currentTrack.info.bitDepth&&(this.currentTrack.info.codec="pcm-f64"));let e=this.currentTrack,a=new(0,f.InputAudioTrack)(this.input,new P(e));this.currentTrack.inputTrack=a,this.currentSegment.tracks.push(this.currentTrack)}}this.currentTrack=null;break;case T.EBMLId.TrackNumber:if(!this.currentTrack)break;this.currentTrack.id=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TrackType:{if(!this.currentTrack)break;let r=(0,T.readUnsignedInt)(e,s);1===r?this.currentTrack.info={type:"video",width:-1,height:-1,rotation:0,codec:null,codecDescription:null,colorSpace:null,alphaMode:!1}:2===r&&(this.currentTrack.info={type:"audio",numberOfChannels:-1,sampleRate:-1,bitDepth:-1,codec:null,codecDescription:null,aacCodecInfo:null})}break;case T.EBMLId.FlagEnabled:if(!this.currentTrack)break;(0,T.readUnsignedInt)(e,s)||(this.currentSegment.tracks.pop(),this.currentTrack=null);break;case T.EBMLId.FlagDefault:if(!this.currentTrack)break;this.currentTrack.disposition.default=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagForced:if(!this.currentTrack)break;this.currentTrack.disposition.forced=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagOriginal:if(!this.currentTrack)break;this.currentTrack.disposition.original=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagHearingImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.hearingImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagVisualImpaired:if(!this.currentTrack)break;this.currentTrack.disposition.visuallyImpaired=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.FlagCommentary:if(!this.currentTrack)break;this.currentTrack.disposition.commentary=!!(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CodecID:if(!this.currentTrack)break;this.currentTrack.codecId=(0,T.readAsciiString)(e,s);break;case T.EBMLId.CodecPrivate:if(!this.currentTrack)break;this.currentTrack.codecPrivate=(0,S.readBytes)(e,s);break;case T.EBMLId.DefaultDuration:if(!this.currentTrack)break;this.currentTrack.defaultDuration=this.currentTrack.segment.timestampFactor*(0,T.readUnsignedInt)(e,s)/1e9;break;case T.EBMLId.Name:if(!this.currentTrack)break;this.currentTrack.name=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.Language:if(!this.currentTrack||this.currentTrack.languageCode!==k.UNDETERMINED_LANGUAGE)break;this.currentTrack.languageCode=(0,T.readAsciiString)(e,s),(0,k.isIso639Dash2LanguageCode)(this.currentTrack.languageCode)||(this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE);break;case T.EBMLId.LanguageBCP47:{if(!this.currentTrack)break;let r=(0,T.readAsciiString)(e,s).split("-")[0];r?this.currentTrack.languageCode=r:this.currentTrack.languageCode=k.UNDETERMINED_LANGUAGE}break;case T.EBMLId.Video:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.PixelWidth:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.width=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.PixelHeight:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.height=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.AlphaMode:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.alphaMode=1===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.Colour:if(this.currentTrack?.info?.type!=="video")break;this.currentTrack.info.colorSpace={},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.MatrixCoefficients:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.MATRIX_COEFFICIENTS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.matrix=a}break;case T.EBMLId.Range:if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;this.currentTrack.info.colorSpace.fullRange=2===(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.TransferCharacteristics:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.TRANSFER_CHARACTERISTICS_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.transfer=a}break;case T.EBMLId.Primaries:{if(this.currentTrack?.info?.type!=="video"||!this.currentTrack.info.colorSpace)break;let r=(0,T.readUnsignedInt)(e,s),a=k.COLOR_PRIMARIES_MAP_INVERSE[r]??null;this.currentTrack.info.colorSpace.primaries=a}break;case T.EBMLId.Projection:if(this.currentTrack?.info?.type!=="video")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ProjectionPoseRoll:{if(this.currentTrack?.info?.type!=="video")break;let r=(0,T.readFloat)(e,s);try{this.currentTrack.info.rotation=(0,k.normalizeRotation)(-r)}catch{}}break;case T.EBMLId.Audio:if(this.currentTrack?.info?.type!=="audio")break;this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.SamplingFrequency:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.sampleRate=(0,T.readFloat)(e,s);break;case T.EBMLId.Channels:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.numberOfChannels=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BitDepth:if(this.currentTrack?.info?.type!=="audio")break;this.currentTrack.info.bitDepth=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CuePoint:if(!this.currentSegment)break;this.readContiguousElements(e.slice(n,s)),this.currentCueTime=null;break;case T.EBMLId.CueTime:this.currentCueTime=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.CueTrackPositions:{if(null===this.currentCueTime)break;(0,k.assert)(this.currentSegment);let r={time:this.currentCueTime,trackId:-1,clusterPosition:-1};this.currentSegment.cuePoints.push(r),this.readContiguousElements(e.slice(n,s)),(-1===r.trackId||-1===r.clusterPosition)&&this.currentSegment.cuePoints.pop()}break;case T.EBMLId.CueTrack:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;r.trackId=(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.CueClusterPosition:{let r=this.currentSegment?.cuePoints[this.currentSegment.cuePoints.length-1];if(!r)break;(0,k.assert)(this.currentSegment),r.clusterPosition=this.currentSegment.dataStartPos+(0,T.readUnsignedInt)(e,s)}break;case T.EBMLId.Timestamp:if(!this.currentCluster)break;this.currentCluster.timestamp=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.SimpleBlock:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,S.readI16Be)(e),o=(0,S.readU8)(e),l=!!(128&o);a.track.info?.type==="audio"&&a.track.info.codec&&(l=!0);let c=(0,S.readBytes)(e,s-(e.filePos-n)),d=a.track.decodingInstructions.length>0;a.blocks.push({timestamp:i,duration:0,isKeyFrame:l,data:c,lacing:o>>1&3,decoded:!d,mainAdditional:null})}break;case T.EBMLId.BlockGroup:if(!this.currentCluster)break;this.readContiguousElements(e.slice(n,s)),this.currentBlock=null;break;case T.EBMLId.Block:{if(!this.currentCluster)break;let r=(0,T.readVarInt)(e);if(null===r)break;let a=this.getTrackDataInCluster(this.currentCluster,r);if(!a)break;let i=(0,S.readI16Be)(e),o=(0,S.readU8)(e),l=(0,S.readBytes)(e,s-(e.filePos-n)),c=a.track.decodingInstructions.length>0;this.currentBlock={timestamp:i,duration:0,isKeyFrame:!0,data:l,lacing:o>>1&3,decoded:!c,mainAdditional:null},a.blocks.push(this.currentBlock)}break;case T.EBMLId.BlockAdditions:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.BlockMore:if(!this.currentBlock)break;this.currentBlockAdditional={addId:1,data:null},this.readContiguousElements(e.slice(n,s)),this.currentBlockAdditional.data&&1===this.currentBlockAdditional.addId&&(this.currentBlock.mainAdditional=this.currentBlockAdditional.data),this.currentBlockAdditional=null;break;case T.EBMLId.BlockAdditional:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.data=(0,S.readBytes)(e,s);break;case T.EBMLId.BlockAddID:if(!this.currentBlockAdditional)break;this.currentBlockAdditional.addId=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.BlockDuration:if(!this.currentBlock)break;this.currentBlock.duration=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ReferenceBlock:if(!this.currentBlock)break;this.currentBlock.isKeyFrame=!1;break;case T.EBMLId.Tag:this.currentTagTargetIsMovie=!0,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.Targets:this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TargetTypeValue:50!==(0,T.readUnsignedInt)(e,s)&&(this.currentTagTargetIsMovie=!1);break;case T.EBMLId.TagTrackUID:case T.EBMLId.TagEditionUID:case T.EBMLId.TagChapterUID:case T.EBMLId.TagAttachmentUID:this.currentTagTargetIsMovie=!1;break;case T.EBMLId.SimpleTag:if(!this.currentTagTargetIsMovie)break;this.currentSimpleTagName=null,this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.TagName:this.currentSimpleTagName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.TagString:{if(!this.currentSimpleTagName)break;let r=(0,T.readUnicodeString)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.TagBinary:{if(!this.currentSimpleTagName)break;let r=(0,S.readBytes)(e,s);this.processTagValue(this.currentSimpleTagName,r)}break;case T.EBMLId.AttachedFile:{if(!this.currentSegment)break;this.currentAttachedFile={fileUid:null,fileName:null,fileMediaType:null,fileData:null,fileDescription:null},this.readContiguousElements(e.slice(n,s));let r=this.currentSegment.metadataTags;if(this.currentAttachedFile.fileUid&&this.currentAttachedFile.fileData&&(r.raw??={},r.raw[this.currentAttachedFile.fileUid.toString()]=new(0,g.AttachedFile)(this.currentAttachedFile.fileData,this.currentAttachedFile.fileMediaType??void 0,this.currentAttachedFile.fileName??void 0,this.currentAttachedFile.fileDescription??void 0)),this.currentAttachedFile.fileMediaType?.startsWith("image/")&&this.currentAttachedFile.fileData){let e=this.currentAttachedFile.fileName,a="unknown";if(e){let r=e.toLowerCase();r.startsWith("cover.")?a="coverFront":r.startsWith("back.")&&(a="coverBack")}r.images??=[],r.images.push({data:this.currentAttachedFile.fileData,mimeType:this.currentAttachedFile.fileMediaType,kind:a,name:this.currentAttachedFile.fileName??void 0,description:this.currentAttachedFile.fileDescription??void 0})}this.currentAttachedFile=null}break;case T.EBMLId.FileUID:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileUid=(0,T.readUnsignedBigInt)(e,s);break;case T.EBMLId.FileName:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileName=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.FileMediaType:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileMediaType=(0,T.readAsciiString)(e,s);break;case T.EBMLId.FileData:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileData=(0,S.readBytes)(e,s);break;case T.EBMLId.FileDescription:if(!this.currentAttachedFile)break;this.currentAttachedFile.fileDescription=(0,T.readUnicodeString)(e,s);break;case T.EBMLId.ContentEncodings:if(!this.currentTrack)break;this.readContiguousElements(e.slice(n,s)),this.currentTrack.decodingInstructions.sort((e,r)=>r.order-e.order);break;case T.EBMLId.ContentEncoding:this.currentDecodingInstruction={order:0,scope:c.Block,data:null},this.readContiguousElements(e.slice(n,s)),this.currentDecodingInstruction.data&&this.currentTrack.decodingInstructions.push(this.currentDecodingInstruction),this.currentDecodingInstruction=null;break;case T.EBMLId.ContentEncodingOrder:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.order=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentEncodingScope:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.scope=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompression:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decompress",algorithm:d.Zlib,settings:null},this.readContiguousElements(e.slice(n,s));break;case T.EBMLId.ContentCompAlgo:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.algorithm=(0,T.readUnsignedInt)(e,s);break;case T.EBMLId.ContentCompSettings:if(this.currentDecodingInstruction?.data?.type!=="decompress")break;this.currentDecodingInstruction.data.settings=(0,S.readBytes)(e,s);break;case T.EBMLId.ContentEncryption:if(!this.currentDecodingInstruction)break;this.currentDecodingInstruction.data={type:"decrypt"}}return e.filePos=n+s,!0}decodeBlockData(e,r){(0,k.assert)(e.decodingInstructions.length>0);let a=r;for(let r of e.decodingInstructions)if((0,k.assert)(r.data),"decompress"===r.data.type&&r.data.algorithm===d.HeaderStripping&&r.data.settings&&r.data.settings.length>0){let e=r.data.settings,i=new Uint8Array(e.length+a.length);i.set(e,0),i.set(a,e.length),a=i}return a}processTagValue(e,r){if(!this.currentSegment?.metadataTags)return;let a=this.currentSegment.metadataTags;if(a.raw??={},a.raw[e]??=r,"string"==typeof r)switch(e.toLowerCase()){case"title":a.title??=r;break;case"description":a.description??=r;break;case"artist":a.artist??=r;break;case"album":a.album??=r;break;case"album_artist":a.albumArtist??=r;break;case"genre":a.genre??=r;break;case"comment":a.comment??=r;break;case"lyrics":a.lyrics??=r;break;case"date":{let e=new Date(r);Number.isNaN(e.getTime())||(a.date??=e)}break;case"track_number":case"part_number":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.trackNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.tracksTotal??=s)}break;case"disc_number":case"disc":{let e=r.split("/"),i=Number.parseInt(e[0],10),s=e[1]&&Number.parseInt(e[1],10);Number.isInteger(i)&&i>0&&(a.discNumber??=i),s&&Number.isInteger(s)&&s>0&&(a.discsTotal??=s)}}}}class x{constructor(e){this.internalTrack=e,this.packetToClusterLocation=new WeakMap}getId(){return this.internalTrack.id}getCodec(){throw Error("Not implemented on base class.")}getInternalCodecId(){return this.internalTrack.codecId}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return this.internalTrack.name}getLanguageCode(){return this.internalTrack.languageCode}async getFirstTimestamp(){let e=await this.getFirstPacket({metadataOnly:!0});return e?.timestamp??0}getTimeResolution(){return this.internalTrack.segment.timestampFactor}getDisposition(){return this.internalTrack.disposition}async getFirstPacket(e){return this.performClusterLookup(null,e=>e.trackData.get(this.internalTrack.id)?{blockIndex:0,correctBlockFound:!0}:{blockIndex:-1,correctBlockFound:!1},-1/0,1/0,e)}intoTimescale(e){return(0,k.roundIfAlmostInteger)(e*this.internalTrack.segment.timestampFactor)}async getPacket(e,r){let a=this.intoTimescale(e);return this.performClusterLookup(null,e=>{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.binarySearchLessOrEqual)(r.presentationTimestamps,a,e=>e.timestamp);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id);if(a.blockIndex+1{let r=e.trackData.get(this.internalTrack.id);if(!r)return{blockIndex:-1,correctBlockFound:!1};let i=(0,k.findLastIndex)(r.presentationTimestamps,e=>r.blocks[e.blockIndex].isKeyFrame&&e.timestamp<=a);return{blockIndex:-1!==i?r.presentationTimestamps[i].blockIndex:-1,correctBlockFound:-1!==i&&a{if(e===a.cluster){let r=e.trackData.get(this.internalTrack.id).blocks.findIndex((e,r)=>e.isKeyFrame&&r>a.blockIndex);if(-1!==r)return{blockIndex:r,correctBlockFound:!0}}else{let r=e.trackData.get(this.internalTrack.id);if(r&&null!==r.firstKeyFrameTimestamp){let e=r.blocks.findIndex(e=>e.isKeyFrame);return(0,k.assert)(-1!==e),{blockIndex:e,correctBlockFound:!0}}}return{blockIndex:-1,correctBlockFound:!1}},-1/0,1/0,r)}async fetchPacketInCluster(e,r,a){if(-1===r)return null;let i=e.trackData.get(this.internalTrack.id).blocks[r];(0,k.assert)(i),i.decoded||(i.data=this.internalTrack.demuxer.decodeBlockData(this.internalTrack,i.data),i.decoded=!0);let s=a.metadataOnly?b.PLACEHOLDER_DATA:i.data,n=i.timestamp/this.internalTrack.segment.timestampFactor,o=i.duration/this.internalTrack.segment.timestampFactor,l={};i.mainAdditional&&this.internalTrack.info?.type==="video"&&this.internalTrack.info.alphaMode&&(l.alpha=a.metadataOnly?b.PLACEHOLDER_DATA:i.mainAdditional,l.alphaByteLength=i.mainAdditional.byteLength);let c=new(0,b.EncodedPacket)(s,i.isKeyFrame?"key":"delta",n,o,e.dataStartPos+r,i.data.byteLength,l);return this.packetToClusterLocation.set(c,{cluster:e,blockIndex:r}),c}async performClusterLookup(e,r,a,i,s){let n,{demuxer:o,segment:l}=this.internalTrack,c=null,d=null,u=-1;if(e){let{blockIndex:a,correctBlockFound:i}=r(e);if(i)return this.fetchPacketInCluster(e,a,s);-1!==a&&(d=e,u=a)}let h=(0,k.binarySearchLessOrEqual)(this.internalTrack.cuePoints,a,e=>e.time),m=-1!==h?this.internalTrack.cuePoints[h]:null,p=(0,k.binarySearchLessOrEqual)(this.internalTrack.clusterPositionCache,a,e=>e.startTimestamp),f=-1!==p?this.internalTrack.clusterPositionCache[p]:null,g=Math.max(m?.clusterPosition??0,f?.elementStartPos??0)||null;for(e?null===g||e.elementStartPos>=g?(n=e.elementEndPos,c=e):n=g:n=g??l.clusterSeekStartPos;null===l.elementEndPos||n<=l.elementEndPos-T.MIN_HEADER_SIZE;){if(c){let e=c.trackData.get(this.internalTrack.id);if(e&&e.startTimestamp>i)break}let e=o.reader.requestSliceRange(n,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;let a=n,h=(0,T.readElementHeader)(e);if(!h||!T.LEVEL_1_EBML_IDS.includes(h.id)&&h.id!==T.EBMLId.Void){let e=await (0,T.resync)(o.reader,a,T.LEVEL_1_EBML_IDS,Math.min(l.elementEndPos??1/0,a+0xa00000));if(e){n=e;continue}break}let m=h.id,p=h.size,f=e.filePos;if(m===T.EBMLId.Cluster){p=(c=await o.readCluster(a,l)).elementEndPos-f;let{blockIndex:e,correctBlockFound:i}=r(c);if(i)return this.fetchPacketInCluster(c,e,s);-1!==e&&(d=c,u=e)}null===p&&((0,k.assert)(m!==T.EBMLId.Cluster),p=(await (0,T.searchForNextElementId)(o.reader,f,T.LEVEL_0_AND_1_EBML_IDS,l.elementEndPos)).pos-f);let g=f+p;if(null===l.elementEndPos){let e=o.reader.requestSliceRange(g,T.MIN_HEADER_SIZE,T.MAX_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e)break;if((0,T.readElementId)(e)===T.EBMLId.Segment){l.elementEndPos=g;break}}n=g}if(m&&(!d||d.elementStartPos{let e=null;return"vp9"!==this.internalTrack.info.codec&&"av1"!==this.internalTrack.info.codec&&("avc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)&&("hevc"!==this.internalTrack.info.codec||this.internalTrack.info.codecDescription)||(e=await this.getFirstPacket({})),{codec:(0,m.extractVideoCodecString)({width:this.internalTrack.info.width,height:this.internalTrack.info.height,codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,colorSpace:this.internalTrack.info.colorSpace,avcType:1,avcCodecInfo:"avc"===this.internalTrack.info.codec&&e?(0,h.extractAvcDecoderConfigurationRecord)(e.data):null,hevcCodecInfo:"hevc"===this.internalTrack.info.codec&&e?(0,h.extractHevcDecoderConfigurationRecord)(e.data):null,vp9CodecInfo:"vp9"===this.internalTrack.info.codec&&e?(0,h.extractVp9CodecInfoFromPacket)(e.data):null,av1CodecInfo:"av1"===this.internalTrack.info.codec&&e?(0,h.extractAv1CodecInfoFromPacket)(e.data):null}),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}})():null}}class P extends x{constructor(e){super(e),this.decoderConfig=null,this.internalTrack=e}getCodec(){return this.internalTrack.info.codec}getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return this.internalTrack.info.codec?this.decoderConfig??={codec:(0,m.extractAudioCodecString)({codec:this.internalTrack.info.codec,codecDescription:this.internalTrack.info.codecDescription,aacCodecInfo:this.internalTrack.info.aacCodecInfo}),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}:null}}},{"../codec-data.js":"zx4dz","../codec.js":"4GUiq","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../metadata.js":"1RzS5","../misc.js":"jrq2g","../packet.js":"8dQhf","./ebml.js":"4qt3Y","./matroska-misc.js":"civYS","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],civYS:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"buildMatroskaMimeType",()=>n);let n=e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");if(e.codecStrings.length>0){let a=[...new Set(e.codecStrings.filter(Boolean))];r+=`; codecs="${a.join(", ")}"`}return r}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"1xfyp":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"Mp3Demuxer",()=>f);var n=e("../demuxer.js"),o=e("../input-track.js"),l=e("../metadata.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../../shared/mp3-misc.js"),h=e("../id3.js"),m=e("./mp3-reader.js"),p=e("../reader.js");class f extends n.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.metadataTags=null,this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();if(!this.firstFrameHeader)throw Error("No valid MP3 frame found.");this.tracks=[new(0,o.InputAudioTrack)(this.input,new g(this))]})()}async advanceReader(){if(0===this.lastLoadedPos)for(;;){let e=this.reader.requestSlice(this.lastLoadedPos,h.ID3_V2_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,h.readId3V2Header)(e);if(!r)break;this.lastLoadedPos=e.filePos+r.size}let e=await (0,m.readNextFrameHeader)(this.reader,this.lastLoadedPos,this.reader.fileSize);if(!e){this.lastSampleLoaded=!0;return}let r=e.header;this.lastLoadedPos=e.startPos+r.totalSize-1;let a=(0,u.getXingOffset)(r.mpegVersionId,r.channel),i=this.reader.requestSlice(e.startPos+a,4);if(i instanceof Promise&&(i=await i),i){let e=(0,p.readU32Be)(i);if(e===u.XING||e===u.INFO)return}this.firstFrameHeader||(this.firstFrameHeader=r),r.sampleRate!==this.firstFrameHeader.sampleRate&&console.warn(`MP3 changed sample rate mid-file: ${this.firstFrameHeader.sampleRate} Hz to ${r.sampleRate} Hz. Might be a bug, so please report this file.`);let s=r.audioSamplesInFrame/this.firstFrameHeader.sampleRate,n={timestamp:this.nextTimestampInSamples/this.firstFrameHeader.sampleRate,duration:s,dataStart:e.startPos,dataSize:r.totalSize};this.loadedSamples.push(n),this.nextTimestampInSamples+=r.audioSamplesInFrame}async getMimeType(){return"audio/mpeg"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){let e=await this.readingMutex.acquire();try{if(await this.readMetadata(),this.metadataTags)return this.metadataTags;this.metadataTags={};let e=0,r=!1;for(;;){let a=this.reader.requestSlice(e,h.ID3_V2_HEADER_SIZE);if(a instanceof Promise&&(a=await a),!a)break;let i=(0,h.readId3V2Header)(a);if(!i)break;r=!0;let s=this.reader.requestSlice(a.filePos,i.size);if(s instanceof Promise&&(s=await s),!s)break;(0,h.parseId3V2Tag)(s,i,this.metadataTags),e=a.filePos+i.size}if(!r&&null!==this.reader.fileSize&&this.reader.fileSize>=h.ID3_V1_TAG_SIZE){let e=this.reader.requestSlice(this.reader.fileSize-h.ID3_V1_TAG_SIZE,h.ID3_V1_TAG_SIZE);e instanceof Promise&&(e=await e),(0,c.assert)(e);let r=(0,p.readAscii)(e,3);"TAG"===r&&(0,h.parseId3V1Tag)(e,this.metadataTags)}return this.metadataTags}finally{e()}}}class g{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate/this.demuxer.firstFrameHeader.audioSamplesInFrame}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"mp3"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.firstFrameHeader),3===this.demuxer.firstFrameHeader.channel?1:2}getSampleRate(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.sampleRate}getDisposition(){return{...l.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){return(0,c.assert)(this.demuxer.firstFrameHeader),{codec:"mp3",numberOfChannels:3===this.demuxer.firstFrameHeader.channel?1:2,sampleRate:this.demuxer.firstFrameHeader.sampleRate}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,p.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1n),s.export(a,"SAMPLING_RATES",()=>o),s.export(a,"KILOBIT_RATES",()=>l),s.export(a,"XING",()=>c),s.export(a,"INFO",()=>d),s.export(a,"computeMp3FrameSize",()=>u),s.export(a,"getXingOffset",()=>h),s.export(a,"readFrameHeader",()=>m),s.export(a,"encodeSynchsafe",()=>p),s.export(a,"decodeSynchsafe",()=>f);let n=4,o=[44100,48e3,32e3],l=[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1,-1,32,48,56,64,80,96,112,128,160,192,224,256,320,384,-1,-1,32,64,96,128,160,192,224,256,288,320,352,384,416,448,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1,-1,32,48,56,64,80,96,112,128,144,160,176,192,224,256,-1],c=0x58696e67,d=0x496e666f,u=(e,r,a,i,s)=>0===r?0:1===r?Math.floor(144*a/(i<3===e?3===r?21:36:3===r?13:21,m=(e,r)=>{let a,i=e>>>24,s=e>>>16&255,n=e>>>8&255,c=255&e;if(255!==i&&255!==s&&255!==n&&255!==c)return{header:null,bytesAdvanced:4};if(255!==i||(224&s)!=224)return{header:null,bytesAdvanced:1};let d=0,h=0;16&s?d=8&s?0:1:(d=1,h=1);let m=s>>3&3,p=s>>1&3,f=(n>>2&3)%3,g=l[64*d+16*p+(n>>4&15)];if(-1===g)return{header:null,bytesAdvanced:1};let k=1e3*g,b=o[f]>>d+h,T=u(d,p,k,b,n>>1&1);return null!==r&&r>6&3,modeExtension:c>>4&3,copyright:c>>3&1,original:c>>2&1,emphasis:3&c,audioSamplesInFrame:a},bytesAdvanced:1})},p=e=>{let r=127,a=0,i=e;for(;(0x7fffffff^r)!=0;)a=(i&~r)<<1|i&r,r=(r+1<<8)-1,i=a;return a},f=e=>{let r=0x7f000000,a=0;for(;0!==r;)a>>=1,a|=e&r,r>>=8;return a}},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8coNE":[function(e,r,a,i){var s,n,o,l,c=e("@parcel/transformer-js/src/esmodule-helpers.js");c.defineInteropFlag(a),c.export(a,"Id3V2HeaderFlags",()=>o),c.export(a,"Id3V2TextEncoding",()=>l),c.export(a,"ID3_V1_TAG_SIZE",()=>m),c.export(a,"ID3_V2_HEADER_SIZE",()=>p),c.export(a,"ID3_V1_GENRES",()=>f),c.export(a,"parseId3V1Tag",()=>g),c.export(a,"readId3V1String",()=>k),c.export(a,"readId3V2Header",()=>b),c.export(a,"parseId3V2Tag",()=>T),c.export(a,"Id3V2Reader",()=>y),c.export(a,"Id3V2Writer",()=>S);var d=e("../shared/mp3-misc.js"),u=e("./misc.js"),h=e("./reader.js");(s=o||(o={}))[s.Unsynchronisation=128]="Unsynchronisation",s[s.ExtendedHeader=64]="ExtendedHeader",s[s.ExperimentalIndicator=32]="ExperimentalIndicator",s[s.Footer=16]="Footer",(n=l||(l={}))[n.ISO_8859_1=0]="ISO_8859_1",n[n.UTF_16_WITH_BOM=1]="UTF_16_WITH_BOM",n[n.UTF_16_BE_NO_BOM=2]="UTF_16_BE_NO_BOM",n[n.UTF_8=3]="UTF_8";let m=128,p=10,f=["Blues","Classic rock","Country","Dance","Disco","Funk","Grunge","Hip-hop","Jazz","Metal","New age","Oldies","Other","Pop","Rhythm and blues","Rap","Reggae","Rock","Techno","Industrial","Alternative","Ska","Death metal","Pranks","Soundtrack","Euro-techno","Ambient","Trip-hop","Vocal","Jazz & funk","Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound clip","Gospel","Noise","Alternative rock","Bass","Soul","Punk","Space","Meditative","Instrumental pop","Instrumental rock","Ethnic","Gothic","Darkwave","Techno-industrial","Electronic","Pop-folk","Eurodance","Dream","Southern rock","Comedy","Cult","Gangsta","Top 40","Christian rap","Pop/funk","Jungle music","Native US","Cabaret","New wave","Psychedelic","Rave","Showtunes","Trailer","Lo-fi","Tribal","Acid punk","Acid jazz","Polka","Retro","Musical","Rock 'n' roll","Hard rock","Folk","Folk rock","National folk","Swing","Fast fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic rock","Progressive rock","Psychedelic rock","Symphonic rock","Slow rock","Big band","Chorus","Easy listening","Acoustic","Humour","Speech","Chanson","Opera","Chamber music","Sonata","Symphony","Booty bass","Primus","Porn groove","Satire","Slow jam","Club","Tango","Samba","Folklore","Ballad","Power ballad","Rhythmic Soul","Freestyle","Duet","Punk rock","Drum solo","A cappella","Euro-house","Dance hall","Goa music","Drum & bass","Club-house","Hardcore techno","Terror","Indie","Britpop","Negerpunk","Polsk punk","Beat","Christian gangsta rap","Heavy metal","Black metal","Crossover","Contemporary Christian","Christian rock","Merengue","Salsa","Thrash metal","Anime","Jpop","Synthpop","Christmas","Art rock","Baroque","Bhangra","Big beat","Breakbeat","Chillout","Downtempo","Dub","EBM","Eclectic","Electro","Electroclash","Emo","Experimental","Garage","Global","IDM","Illbient","Industro-Goth","Jam Band","Krautrock","Leftfield","Lounge","Math rock","New romantic","Nu-breakz","Post-punk","Post-rock","Psytrance","Shoegaze","Space rock","Trop rock","World music","Neoclassical","Audiobook","Audio theatre","Neue Deutsche Welle","Podcast","Indie rock","G-Funk","Dubstep","Garage rock","Psybient"],g=(e,r)=>{let a,i=e.filePos;r.raw??={},r.raw.TAG??=(0,h.readBytes)(e,m-3),e.filePos=i;let s=k(e,30);s&&(r.title??=s);let n=k(e,30);n&&(r.artist??=n);let o=k(e,30);o&&(r.album??=o);let l=Number.parseInt(k(e,4),10);Number.isInteger(l)&&l>0&&(r.date??=new Date(l,0,1));let c=(0,h.readBytes)(e,30);if(0===c[28]&&0!==c[29]){let i=c[29];i>0&&(r.trackNumber??=i),e.skip(-30),a=k(e,28),e.skip(2)}else e.skip(-30),a=k(e,30);a&&(r.comment??=a);let d=(0,h.readU8)(e);d{let a=(0,h.readBytes)(e,r),i=(0,u.coalesceIndex)(a.indexOf(0),a.length),s=a.subarray(0,i),n="";for(let e=0;e{let r=e.filePos,a=(0,h.readAscii)(e,3),i=(0,h.readU8)(e),s=(0,h.readU8)(e),n=(0,h.readU8)(e),o=(0,h.readU32Be)(e);return"ID3"!==a||255===i||255===s||(0x80808080&o)!=0?(e.filePos=r,null):{majorVersion:i,revision:s,flags:n,size:(0,d.decodeSynchsafe)(o)}},T=(e,r,a)=>{if(![2,3,4].includes(r.majorVersion))return void console.warn(`Unsupported ID3v2 major version: ${r.majorVersion}`);let i=(0,h.readBytes)(e,r.size),s=new y(r,i);if(r.flags&o.Footer&&s.removeFooter(),r.flags&o.Unsynchronisation&&3===r.majorVersion&&s.ununsynchronizeAll(),r.flags&o.ExtendedHeader){let e=s.readU32();3===r.majorVersion?s.pos+=e:s.pos+=e-4}for(;s.pos<=s.bytes.length-s.frameHeaderSize();){let e=s.readId3V2Frame();if(!e)break;let i=s.pos,n=s.pos+e.size,l=!1,c=!1,d=!1;if(3===r.majorVersion?(l=!!(64&e.flags),c=!!(128&e.flags)):4===r.majorVersion&&(l=!!(4&e.flags),c=!!(8&e.flags),d=!!(2&e.flags)||!!(r.flags&o.Unsynchronisation)),l){console.warn(`Skipping encrypted ID3v2 frame ${e.id}`),s.pos=n;continue}if(c){console.warn(`Skipping compressed ID3v2 frame ${e.id}`),s.pos=n;continue}switch(d&&s.ununsynchronizeRegion(s.pos,n),a.raw??={},"T"===e.id[0]?a.raw[e.id]??=s.readId3V2EncodingAndText(n):a.raw[e.id]??=s.readBytes(e.size),s.pos=i,e.id){case"TIT2":case"TT2":a.title??=s.readId3V2EncodingAndText(n);break;case"TIT3":case"TT3":a.description??=s.readId3V2EncodingAndText(n);break;case"TPE1":case"TP1":a.artist??=s.readId3V2EncodingAndText(n);break;case"TALB":case"TAL":a.album??=s.readId3V2EncodingAndText(n);break;case"TPE2":case"TP2":a.albumArtist??=s.readId3V2EncodingAndText(n);break;case"TRCK":case"TRK":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.trackNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.tracksTotal??=i)}break;case"TPOS":case"TPA":{let e=s.readId3V2EncodingAndText(n).split("/"),r=Number.parseInt(e[0],10),i=e[1]&&Number.parseInt(e[1],10);Number.isInteger(r)&&r>0&&(a.discNumber??=r),i&&Number.isInteger(i)&&i>0&&(a.discsTotal??=i)}break;case"TCON":case"TCO":{let e=s.readId3V2EncodingAndText(n),r=/^\((\d+)\)/.exec(e);if(r){let e=Number.parseInt(r[1]);if(void 0!==f[e]){a.genre??=f[e];break}}if(r=/^\d+$/.exec(e)){let e=Number.parseInt(r[0]);if(void 0!==f[e]){a.genre??=f[e];break}}a.genre??=e}break;case"TDRC":case"TDAT":{let e=new Date(s.readId3V2EncodingAndText(n));Number.isNaN(e.getTime())||(a.date??=e)}break;case"TYER":case"TYE":{let e=Number.parseInt(s.readId3V2EncodingAndText(n),10);Number.isInteger(e)&&(a.date??=new Date(e,0,1))}break;case"USLT":case"ULT":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.lyrics??=s.readId3V2Text(e,n)}break;case"COMM":case"COM":{let e=s.readU8();s.pos+=3,s.readId3V2Text(e,n),a.comment??=s.readId3V2Text(e,n)}break;case"APIC":case"PIC":{let e,i=s.readId3V2TextEncoding();if(2===r.majorVersion){let r=s.readAscii(3);e="PNG"===r?"image/png":"JPG"===r?"image/jpeg":"image/*"}else e=s.readId3V2Text(i,n);let o=s.readU8(),l=s.readId3V2Text(i,n).trimEnd(),c=n-s.pos;if(c>=0){let r=s.readBytes(c);a.images||(a.images=[]),a.images.push({data:r,mimeType:e,kind:3===o?"coverFront":4===o?"coverBack":"unknown",description:l})}}break;default:s.pos+=e.size}s.pos=n}};class y{constructor(e,r){this.header=e,this.bytes=r,this.pos=0,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength)}frameHeaderSize(){return 2===this.header.majorVersion?6:10}ununsynchronizeAll(){let e=[];for(let r=0;r{let r=this.pos+e;if(r>this.bytes.length)return!1;if(r<=this.bytes.length-this.frameHeaderSize()){this.pos+=e;let r=this.readAscii(4);if("\0\0\0\0"!==r&&!/[0-9A-Z]{4}/.test(r))return!1}return!0};if(!n(a)){let e=4===this.header.majorVersion?r:(0,d.decodeSynchsafe)(r);n(e)&&(a=e)}return this.pos=s,{id:e,size:a,flags:i}}}readId3V2TextEncoding(){let e=this.readU8();if(e>3)throw Error(`Unsupported text encoding: ${e}`);return e}readId3V2Text(e,r){let a=this.pos,i=this.readBytes(r-this.pos);switch(e){case l.ISO_8859_1:{let e="";for(let r=0;r0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}if(254===i[0]&&255===i[1]){let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(2,r))}{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}case l.UTF_16_BE_NO_BOM:{let e=new TextDecoder("utf-16be"),r=(0,u.coalesceIndex)(i.findIndex((e,r)=>0===e&&0===i[r+1]&&r%2==0),i.length);return this.pos=a+Math.min(r+2,i.length),e.decode(i.subarray(0,r))}case l.UTF_8:{let e=(0,u.coalesceIndex)(i.findIndex(e=>0===e),i.length);return this.pos=a+Math.min(e+1,i.length),u.textDecoder.decode(i.subarray(0,e))}}}readId3V2EncodingAndText(e){if(this.pos>=e)return"";let r=this.readId3V2TextEncoding();return this.readId3V2Text(r,e)}}class S{constructor(e){this.helper=new Uint8Array(8),this.helperView=(0,u.toDataView)(this.helper),this.writer=e}writeId3V2Tag(e){let r=this.writer.getPos();this.writeAscii("ID3"),this.writeU8(4),this.writeU8(0),this.writeU8(0),this.writeSynchsafeU32(0);let a=this.writer.getPos(),i=new Set;for(let{key:r,value:a}of(0,u.keyValueIterator)(e))switch(r){case"title":this.writeId3V2TextFrame("TIT2",a),i.add("TIT2");break;case"description":this.writeId3V2TextFrame("TIT3",a),i.add("TIT3");break;case"artist":this.writeId3V2TextFrame("TPE1",a),i.add("TPE1");break;case"album":this.writeId3V2TextFrame("TALB",a),i.add("TALB");break;case"albumArtist":this.writeId3V2TextFrame("TPE2",a),i.add("TPE2");break;case"trackNumber":{let r=void 0!==e.tracksTotal?`${a}/${e.tracksTotal}`:a.toString();this.writeId3V2TextFrame("TRCK",r),i.add("TRCK")}break;case"discNumber":{let r=void 0!==e.discsTotal?`${a}/${e.discsTotal}`:a.toString();this.writeId3V2TextFrame("TPOS",r),i.add("TPOS")}break;case"genre":this.writeId3V2TextFrame("TCON",a),i.add("TCON");break;case"date":this.writeId3V2TextFrame("TDRC",a.toISOString().slice(0,10)),i.add("TDRC");break;case"lyrics":this.writeId3V2LyricsFrame(a),i.add("USLT");break;case"comment":this.writeId3V2CommentFrame(a),i.add("COMM");break;case"images":{let e={coverFront:3,coverBack:4,unknown:0};for(let r of a){let a=e[r.kind]??0,i=r.description??"";this.writeId3V2ApicFrame(r.mimeType,a,i,r.data)}}break;case"tracksTotal":case"discsTotal":case"raw":break;default:(0,u.assertNever)(r)}if(e.raw)for(let r in e.raw){let a,s=e.raw[r];if(!(null==s||4!==r.length||i.has(r))){if("string"==typeof s){let e=u.textEncoder.encode(s);(a=new Uint8Array(e.byteLength+2))[0]=l.UTF_8,a.set(e,1)}else{if(!(s instanceof Uint8Array))continue;a=s}this.writeAscii(r),this.writeSynchsafeU32(a.byteLength),this.writeU16(0),this.writer.write(a)}}let s=this.writer.getPos(),n=s-a;return this.writer.seek(r+6),this.writeSynchsafeU32(n),this.writer.seek(s),n+10}writeU8(e){this.helper[0]=e,this.writer.write(this.helper.subarray(0,1))}writeU16(e){this.helperView.setUint16(0,e,!1),this.writer.write(this.helper.subarray(0,2))}writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeAscii(e){for(let r=0;rl);var n=e("../../shared/mp3-misc.js"),o=e("../reader.js");let l=async(e,r,a)=>{let i=r;for(;null===a||ig);var n=e("../codec.js"),o=e("../codec-data.js"),l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),h=e("../packet.js"),m=e("../reader.js"),p=e("./ogg-misc.js"),f=e("./ogg-reader.js");class g extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.bitstreams=[],this.tracks=[],this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=0;for(;;){let r=this.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);if(r instanceof Promise&&(r=await r),!r)break;let a=(0,f.readPageHeader)(r);if(!a||!(2&a.headerType))break;this.bitstreams.push({serialNumber:a.serialNumber,bosPage:a,description:null,numberOfChannels:-1,sampleRate:-1,codecInfo:{codec:null,vorbisInfo:null,opusInfo:null},lastMetadataPacket:null}),e=a.headerStartPos+a.totalSize}for(let e of this.bitstreams){let r=await this.readPacket(e.bosPage,0);r&&(r.data.byteLength>=7&&1===r.data[0]&&118===r.data[1]&&111===r.data[2]&&114===r.data[3]&&98===r.data[4]&&105===r.data[5]&&115===r.data[6]?await this.readVorbisMetadata(r,e):r.data.byteLength>=8&&79===r.data[0]&&112===r.data[1]&&117===r.data[2]&&115===r.data[3]&&72===r.data[4]&&101===r.data[5]&&97===r.data[6]&&100===r.data[7]&&await this.readOpusMetadata(r,e),null!==e.codecInfo.codec&&this.tracks.push(new(0,c.InputAudioTrack)(this.input,new k(e,this))))}})()}async readVorbisMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i||!(a=await this.findNextPacketStart(i)))return;let s=await this.readPacket(a.startPage,a.startSegmentIndex);if(!s||3!==i.data[0]||5!==s.data[0])return;let n=[],l=e=>{for(;n.push(Math.min(255,e)),!(e<255);)e-=255};l(e.data.length),l(i.data.length);let c=new Uint8Array(1+n.length+e.data.length+i.data.length+s.data.length);c[0]=2,c.set(n,1),c.set(e.data,1+n.length),c.set(i.data,1+n.length+e.data.length),c.set(s.data,1+n.length+e.data.length+i.data.length),r.codecInfo.codec="vorbis",r.description=c,r.lastMetadataPacket=s;let d=(0,u.toDataView)(e.data);r.numberOfChannels=d.getUint8(11),r.sampleRate=d.getUint32(12,!0);let h=d.getUint8(28);r.codecInfo.vorbisInfo={blocksizes:[1<<(15&h),1<<(h>>4)],modeBlockflags:(0,o.parseModesFromVorbisSetupPacket)(s.data).modeBlockflags},(0,o.readVorbisComments)(i.data.subarray(7),this.metadataTags)}async readOpusMetadata(e,r){let a=await this.findNextPacketStart(e);if(!a)return;let i=await this.readPacket(a.startPage,a.startSegmentIndex);if(!i)return;r.codecInfo.codec="opus",r.description=e.data,r.lastMetadataPacket=i;let s=(0,o.parseOpusIdentificationHeader)(e.data);r.numberOfChannels=s.outputChannelCount,r.sampleRate=n.OPUS_SAMPLE_RATE,r.codecInfo.opusInfo={preSkip:s.preSkip},(0,o.readVorbisComments)(i.data.subarray(8),this.metadataTags)}async readPacket(e,r){(0,u.assert)(re+r.length,0)),c=0;for(let e=0;ee.getCodecParameterString()));return(0,p.buildOggMimeType)({codecStrings:e.filter(Boolean)})}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){let e=await this.getTracks();return Math.max(0,...await Promise.all(e.map(e=>e.computeDuration())))}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class k{constructor(e,r){this.bitstream=e,this.demuxer=r,this.encodedPacketToMetadata=new WeakMap,this.sequentialScanCache=[],this.sequentialScanMutex=new(0,u.AsyncMutex),this.internalSampleRate="opus"===e.codecInfo.codec?n.OPUS_SAMPLE_RATE:e.sampleRate}getId(){return this.bitstream.serialNumber}getNumberOfChannels(){return this.bitstream.numberOfChannels}getSampleRate(){return this.bitstream.sampleRate}getTimeResolution(){return this.bitstream.sampleRate}getCodec(){return this.bitstream.codecInfo.codec}getInternalCodecId(){return null}async getDecoderConfig(){return(0,u.assert)(this.bitstream.codecInfo.codec),{codec:this.bitstream.codecInfo.codec,numberOfChannels:this.bitstream.numberOfChannels,sampleRate:this.bitstream.sampleRate,description:this.bitstream.description??void 0}}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}granulePositionToTimestampInSamples(e){return"opus"===this.bitstream.codecInfo.codec?((0,u.assert)(this.bitstream.codecInfo.opusInfo),e-this.bitstream.codecInfo.opusInfo.preSkip):e}createEncodedPacketFromOggPacket(e,r,a){if(!e)return null;let{durationInSamples:i,vorbisBlockSize:s}=(0,p.extractSampleMetadata)(e.data,this.bitstream.codecInfo,r.vorbisLastBlocksize),n=new(0,h.EncodedPacket)(a.metadataOnly?h.PLACEHOLDER_DATA:e.data,"key",Math.max(0,r.timestampInSamples)/this.internalSampleRate,i/this.internalSampleRate,e.endPage.headerStartPos+e.endSegmentIndex,e.data.byteLength);return this.encodedPacketToMetadata.set(n,{packet:e,timestampInSamples:r.timestampInSamples,durationInSamples:i,vorbisLastBlockSize:r.vorbisLastBlocksize,vorbisBlockSize:s}),n}async getFirstPacket(e){(0,u.assert)(this.bitstream.lastMetadataPacket);let r=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!r)return null;let a=0;"opus"===this.bitstream.codecInfo.codec&&((0,u.assert)(this.bitstream.codecInfo.opusInfo),a-=this.bitstream.codecInfo.opusInfo.preSkip);let i=await this.demuxer.readPacket(r.startPage,r.startSegmentIndex);return this.createEncodedPacketFromOggPacket(i,{timestampInSamples:a,vorbisLastBlocksize:null},e)}async getNextPacket(e,r){let a=this.encodedPacketToMetadata.get(e);if(!a)throw Error("Packet was not created from this track.");let i=await this.demuxer.findNextPacketStart(a.packet);if(!i)return null;let s=a.timestampInSamples+a.durationInSamples,n=await this.demuxer.readPacket(i.startPage,i.startSegmentIndex);return this.createEncodedPacketFromOggPacket(n,{timestampInSamples:s,vorbisLastBlocksize:a.vorbisBlockSize},r)}async getPacket(e,r){let a,i;if(null===this.demuxer.reader.fileSize)return this.getPacketSequential(e,r);let s=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);if(0===s)return this.getFirstPacket(r);if(s<0)return null;(0,u.assert)(this.bitstream.lastMetadataPacket);let n=await this.demuxer.findNextPacketStart(this.bitstream.lastMetadataPacket);if(!n)return null;let o=n.startPage,l=this.demuxer.reader.fileSize,c=[o];e:for(;o.headerStartPos+o.totalSizes?l=d.headerStartPos:(o=d,c.push(d));continue e}}let d=n.startPage;for(let e of c){if(e.granulePosition===o.granulePosition)break;(!d||e.headerStartPos>d.headerStartPos)&&(d=e)}let g=d,k=[g];for(;g.serialNumber!==this.bitstream.serialNumber||g.granulePosition!==o.granulePosition;){let e=g.headerStartPos+g.totalSize,r=this.demuxer.reader.requestSliceRange(e,f.MIN_PAGE_HEADER_SIZE,f.MAX_PAGE_HEADER_SIZE);r instanceof Promise&&(r=await r),(0,u.assert)(r);let a=(0,f.readPageHeader)(r);(0,u.assert)(a),(g=a).serialNumber===this.bitstream.serialNumber&&k.push(g)}(0,u.assert)(-1!==g.granulePosition);let y=null,S=g,w=0;if(g.headerStartPos===n.startPage.headerStartPos)a=this.granulePositionToTimestampInSamples(0),i=!0,y=0;else{a=0,i=!1;for(let e=g.lacingValues.length-1;e>=0;e--)if(g.lacingValues[e]<255){y=e+1;break}if(null===y)throw Error("Invalid page with granule position: no packets end on this page.");w=y-1;let e={data:h.PLACEHOLDER_DATA,endPage:S,endSegmentIndex:w};if(await this.demuxer.findNextPacketStart(e)){let e=T(k,g,y);(0,u.assert)(e);let r=b(k,e.page,e.segmentIndex);r&&(g=r.page,y=r.segmentIndex)}else for(;;){let e=T(k,g,y);if(!e)break;let r=b(k,e.page,e.segmentIndex);if(!r)break;if(g=r.page,y=r.segmentIndex,e.page.headerStartPos!==S.headerStartPos){S=e.page,w=e.segmentIndex;break}}}let I=null,x=null;for(;null!==g;){(0,u.assert)(null!==y);let e=await this.demuxer.readPacket(g,y);if(!e)break;if(!(g.headerStartPos===n.startPage.headerStartPos&&ys||Math.max(o.timestampInSamples,0)===s))break}let o=await this.demuxer.findNextPacketStart(e);if(!o)break;g=o.startPage,y=o.startSegmentIndex}return I}async getPacketSequential(e,r){let a=await this.sequentialScanMutex.acquire();try{let a,i=(0,u.roundIfAlmostInteger)(e*this.internalSampleRate);e=i/this.internalSampleRate;let s=(0,u.binarySearchLessOrEqual)(this.sequentialScanCache,i,e=>e.timestampInSamples);if(-1!==s){let e=this.sequentialScanCache[s];a=this.createEncodedPacketFromOggPacket(e.packet,{timestampInSamples:e.timestampInSamples,vorbisLastBlocksize:e.vorbisLastBlockSize},r)}else a=await this.getFirstPacket(r);let n=0;for(;a&&a.timestampe)break;if(a=i,n++,100===n){n=0;let e=this.encodedPacketToMetadata.get(a);(0,u.assert)(e),this.sequentialScanCache.length>0&&(0,u.assert)((0,u.last)(this.sequentialScanCache).timestampInSamples<=e.timestampInSamples),this.sequentialScanCache.push(e)}}return a}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}let b=(e,r,a)=>{let i=r,s=a;e:for(;;){for(s--;s>=0;s--)if(i.lacingValues[s]<255){s++;break e}if((0,u.assert)(-1===s),!(1&i.headerType)){s=0;break}let r=(0,u.findLast)(e,e=>e.headerStartPos{if(a>0)return{page:r,segmentIndex:a-1};let i=(0,u.findLast)(e,e=>e.headerStartPosl),s.export(a,"computeOggPageCrc",()=>d),s.export(a,"extractSampleMetadata",()=>u),s.export(a,"buildOggMimeType",()=>h);var n=e("../codec-data.js"),o=e("../misc.js");let l=0x5367674f,c=new Uint32Array(256);for(let e=0;e<256;e++){let r=e<<24;for(let e=0;e<8;e++)r=0x80000000&r?r<<1^0x4c11db7:r<<1;c[e]=r>>>0}let d=e=>{let r=(0,o.toDataView)(e),a=r.getUint32(22,!0);r.setUint32(22,0,!0);let i=0;for(let r=0;r>>24^e[r]])>>>0;return r.setUint32(22,a,!0),i},u=(e,r,a)=>{let i=0,s=null;if(e.length>0)if("vorbis"===r.codec){(0,o.assert)(r.vorbisInfo);let n=r.vorbisInfo.modeBlockflags.length,l=(1<<(0,o.ilog)(n-1))-1<<1,c=(e[0]&l)>>1;if(c>=r.vorbisInfo.modeBlockflags.length)throw Error("Invalid mode number.");let d=a,u=r.vorbisInfo.modeBlockflags[c];if(s=r.vorbisInfo.blocksizes[u],1===u){let a=e[0]&(1|l)+1?1:0;d=r.vorbisInfo.blocksizes[a]}i=null!==d?d+s>>2:0}else"opus"===r.codec&&(i=(0,n.parseOpusTocByte)(e).durationInSamples);return{durationInSamples:i,vorbisBlockSize:s}},h=e=>{let r="audio/ogg";if(e.codecStrings){let a=[...new Set(e.codecStrings)];r+=`; codecs="${a.join(", ")}"`}return r}},{"../codec-data.js":"zx4dz","../misc.js":"jrq2g","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],frvPd:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_PAGE_HEADER_SIZE",()=>l),s.export(a,"MAX_PAGE_HEADER_SIZE",()=>c),s.export(a,"MAX_PAGE_SIZE",()=>d),s.export(a,"readPageHeader",()=>u),s.export(a,"findNextPageHeader",()=>h);var n=e("../reader.js"),o=e("./ogg-misc.js");let l=27,c=282,d=65307,u=e=>{let r=e.filePos;if((0,n.readU32Le)(e)!==o.OGGS)return null;e.skip(1);let a=(0,n.readU8)(e),i=(0,n.readI64Le)(e),s=(0,n.readU32Le)(e),l=(0,n.readU32Le)(e),c=(0,n.readU32Le)(e),d=(0,n.readU8)(e),u=new Uint8Array(d);for(let r=0;re+r,0);return{headerStartPos:r,totalSize:h+m,dataStartPos:r+h,dataSize:m,headerType:a,granulePosition:i,serialNumber:s,sequenceNumber:l,checksum:c,lacingValues:u}},h=(e,r)=>{for(;e.filePos>>8&255,s=r>>>16&255,l=r>>>24&255;if(79===a||79===i||79===s||79===l){if(e.skip(-4),r===o.OGGS)return!0;e.skip(1)}}return!1}},{"../reader.js":"6AkKg","./ogg-misc.js":"lbYXN","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],lP1MW:[function(e,r,a,i){var s,n,o=e("@parcel/transformer-js/src/esmodule-helpers.js");o.defineInteropFlag(a),o.export(a,"WaveFormat",()=>n),o.export(a,"WaveDemuxer",()=>f);var l=e("../demuxer.js"),c=e("../input-track.js"),d=e("../metadata.js"),u=e("../misc.js"),h=e("../packet.js"),m=e("../reader.js"),p=e("../id3.js");(s=n||(n={}))[s.PCM=1]="PCM",s[s.IEEE_FLOAT=3]="IEEE_FLOAT",s[s.ALAW=6]="ALAW",s[s.MULAW=7]="MULAW",s[s.EXTENSIBLE=65534]="EXTENSIBLE";class f extends l.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.dataStart=-1,this.dataSize=-1,this.audioInfo=null,this.tracks=[],this.lastKnownPacketIndex=0,this.metadataTags={},this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{let e=this.reader.requestSlice(0,12);e instanceof Promise&&(e=await e),(0,u.assert)(e);let r=(0,m.readAscii)(e,4),a="RIFX"!==r,i="RF64"===r,s=(0,m.readU32)(e,a),n=i?this.reader.fileSize:Math.min(s+8,this.reader.fileSize??1/0);if("WAVE"!==(0,m.readAscii)(e,4))throw Error("Invalid WAVE file - wrong format");let o=0,l=null,d=e.filePos;for(;null===n||d=18&&357!==o)&&Math.min(r-18,(0,m.readU16)(s,a))>=22&&o===n.EXTENSIBLE){s.skip(6);let e=(0,m.readBytes)(s,16);o=e[0]|e[1]<<8}(o===n.MULAW||o===n.ALAW)&&(i=8),this.audioInfo={format:o,numberOfChannels:l,sampleRate:c,sampleSizeInBytes:Math.ceil(i/8),blockSizeInBytes:d}}async parseListChunk(e,r,a){let i=this.reader.requestSlice(e,r);if(i instanceof Promise&&(i=await i),!i)return;let s=(0,m.readAscii)(i,4);if("INFO"!==s&&"INF0"!==s)return;let n=i.filePos;for(;n<=e+r-8;){i.filePos=n;let e=(0,m.readAscii)(i,4),r=(0,m.readU32)(i,a),s=(0,m.readBytes)(i,r),o=0;for(let e=0;e0&&(this.metadataTags.trackNumber??=r),a&&Number.isInteger(a)&&a>0&&(this.metadataTags.tracksTotal??=a)}break;case"ICRD":case"IDIT":{let e=new Date(l);Number.isNaN(e.getTime())||(this.metadataTags.date??=e)}break;case"YEAR":{let e=Number.parseInt(l,10);Number.isInteger(e)&&e>0&&(this.metadataTags.date??=new Date(e,0,1))}break;case"IGNR":case"GENR":this.metadataTags.genre??=l;break;case"ICMT":case"CMNT":case"COMM":this.metadataTags.comment??=l}n+=8+r+(1&r)}}async parseId3Chunk(e,r){let a=this.reader.requestSlice(e,r);if(a instanceof Promise&&(a=await a),!a)return;let i=(0,p.readId3V2Header)(a);if(i){let r=a.slice(e+10,i.size);(0,p.parseId3V2Tag)(r,i,this.metadataTags)}}getCodec(){if((0,u.assert)(this.audioInfo),this.audioInfo.format===n.MULAW)return"ulaw";if(this.audioInfo.format===n.ALAW)return"alaw";if(this.audioInfo.format===n.PCM){if(1===this.audioInfo.sampleSizeInBytes)return"pcm-u8";else if(2===this.audioInfo.sampleSizeInBytes)return"pcm-s16";else if(3===this.audioInfo.sampleSizeInBytes)return"pcm-s24";else if(4===this.audioInfo.sampleSizeInBytes)return"pcm-s32"}return this.audioInfo.format===n.IEEE_FLOAT&&4===this.audioInfo.sampleSizeInBytes?"pcm-f32":null}async getMimeType(){return"audio/wav"}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,u.assert)(e),e.computeDuration()}async getTracks(){return await this.readMetadata(),this.tracks}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}}class g{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return this.demuxer.getCodec()}getInternalCodecId(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.format}async getDecoderConfig(){let e=this.demuxer.getCodec();return e?((0,u.assert)(this.demuxer.audioInfo),{codec:e,numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate}):null}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getNumberOfChannels(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}getSampleRate(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getTimeResolution(){return(0,u.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return u.UNDETERMINED_LANGUAGE}getDisposition(){return{...d.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getPacketAtIndex(e,r){let a;(0,u.assert)(this.demuxer.audioInfo);let i=2048*e*this.demuxer.audioInfo.blockSizeInBytes;if(i>=this.demuxer.dataSize)return null;let s=Math.min(2048*this.demuxer.audioInfo.blockSizeInBytes,this.demuxer.dataSize-i);if(null===this.demuxer.reader.fileSize){let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);if(e instanceof Promise&&(e=await e),!e)return null}if(r.metadataOnly)a=h.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(this.demuxer.dataStart+i,s);e instanceof Promise&&(e=await e),(0,u.assert)(e),a=(0,m.readBytes)(e,s)}let n=2048*e/this.demuxer.audioInfo.sampleRate,o=s/this.demuxer.audioInfo.blockSizeInBytes/this.demuxer.audioInfo.sampleRate;return this.demuxer.lastKnownPacketIndex=Math.max(e,n),new(0,h.EncodedPacket)(a,"key",n,o,e,s)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.floor(Math.min(e*this.demuxer.audioInfo.sampleRate/2048,(this.demuxer.dataSize-1)/(2048*this.demuxer.audioInfo.blockSizeInBytes))),i=await this.getPacketAtIndex(a,r);if(i)return i;if(0===a)return null;(0,u.assert)(null===this.demuxer.reader.fileSize);let s=await this.getPacketAtIndex(this.demuxer.lastKnownPacketIndex,r);for(;s;){let e=await this.getNextPacket(s,r);if(!e)break;s=e}return s}getNextPacket(e,r){(0,u.assert)(this.demuxer.audioInfo);let a=Math.round(e.timestamp*this.demuxer.audioInfo.sampleRate/2048);return this.getPacketAtIndex(a+1,r)}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}}},{"../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../metadata.js":"1RzS5","../misc.js":"jrq2g","../packet.js":"8dQhf","../reader.js":"6AkKg","../id3.js":"8coNE","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],iNEYI:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"MIN_FRAME_HEADER_SIZE",()=>l),s.export(a,"MAX_FRAME_HEADER_SIZE",()=>c),s.export(a,"readFrameHeader",()=>d);var n=e("../misc.js"),o=e("../reader.js");let l=7,c=9,d=e=>{let r=e.filePos,a=(0,o.readBytes)(e,9),i=new(0,n.Bitstream)(a);if(4095!==i.readBits(12)||(i.skipBits(1),0!==i.readBits(2)))return null;let s=i.readBits(1),l=i.readBits(2)+1,c=i.readBits(4);if(15===c)return null;i.skipBits(1);let d=i.readBits(3);if(0===d)throw Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let u=i.readBits(13);i.skipBits(11);let h=i.readBits(2)+1;if(1!==h)throw Error("ADTS frames with more than one AAC frame are not supported.");let m=null;return 1===s?e.filePos-=2:m=i.readBits(16),{objectType:l,samplingFrequencyIndex:c,channelConfiguration:d,frameLength:u,numberOfAacFrames:h,crcCheck:m,startPos:r}}},{"../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],b3bBY:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"AdtsDemuxer",()=>p);var n=e("../codec.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),h=e("../metadata.js"),m=e("./adts-reader.js");class p extends o.Demuxer{constructor(e){super(e),this.metadataPromise=null,this.firstFrameHeader=null,this.loadedSamples=[],this.tracks=[],this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.lastLoadedPos=0,this.nextTimestampInSamples=0,this.reader=e._reader}async readMetadata(){return this.metadataPromise??=(async()=>{for(;!this.firstFrameHeader&&!this.lastSampleLoaded;)await this.advanceReader();(0,c.assert)(this.firstFrameHeader),this.tracks=[new(0,l.InputAudioTrack)(this.input,new f(this))]})()}async advanceReader(){let e=this.reader.requestSliceRange(this.lastLoadedPos,m.MIN_FRAME_HEADER_SIZE,m.MAX_FRAME_HEADER_SIZE);if(e instanceof Promise&&(e=await e),!e){this.lastSampleLoaded=!0;return}let r=(0,m.readFrameHeader)(e);if(!r||null!==this.reader.fileSize&&r.startPos+r.frameLength>this.reader.fileSize){this.lastSampleLoaded=!0;return}this.firstFrameHeader||(this.firstFrameHeader=r);let a=n.aacFrequencyTable[r.samplingFrequencyIndex];(0,c.assert)(void 0!==a);let i=r.crcCheck?m.MAX_FRAME_HEADER_SIZE:m.MIN_FRAME_HEADER_SIZE,s={timestamp:this.nextTimestampInSamples/a,duration:1024/a,dataStart:r.startPos+i,dataSize:r.frameLength-i};this.loadedSamples.push(s),this.nextTimestampInSamples+=1024,this.lastLoadedPos=r.startPos+r.frameLength}async getMimeType(){return"audio/aac"}async getTracks(){return await this.readMetadata(),this.tracks}async computeDuration(){await this.readMetadata();let e=this.tracks[0];return(0,c.assert)(e),e.computeDuration()}async getMetadataTags(){return{}}}class f{constructor(e){this.demuxer=e}getId(){return 1}async getFirstTimestamp(){return 0}getTimeResolution(){return this.getSampleRate()/1024}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getCodec(){return"aac"}getInternalCodecId(){return(0,c.assert)(this.demuxer.firstFrameHeader),this.demuxer.firstFrameHeader.objectType}getNumberOfChannels(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacChannelMap[this.demuxer.firstFrameHeader.channelConfiguration];return(0,c.assert)(void 0!==e),e}getSampleRate(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=n.aacFrequencyTable[this.demuxer.firstFrameHeader.samplingFrequencyIndex];return(0,c.assert)(void 0!==e),e}getDisposition(){return{...h.DEFAULT_TRACK_DISPOSITION}}async getDecoderConfig(){(0,c.assert)(this.demuxer.firstFrameHeader);let e=new Uint8Array(3),r=new(0,c.Bitstream)(e),{objectType:a,samplingFrequencyIndex:i,channelConfiguration:s}=this.demuxer.firstFrameHeader;return a>31?(r.writeBits(5,31),r.writeBits(6,a-32)):r.writeBits(5,a),r.writeBits(4,i),r.writeBits(4,s),{codec:`mp4a.40.${this.demuxer.firstFrameHeader.objectType}`,numberOfChannels:this.getNumberOfChannels(),sampleRate:this.getSampleRate(),description:e.subarray(0,Math.ceil((r.pos-1)/8))}}async getPacketAtIndex(e,r){let a;if(-1===e)return null;let i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.dataStart,i.dataSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.dataSize)}return new(0,d.EncodedPacket)(a,"key",i.timestamp,i.duration,e,i.dataSize)}getFirstPacket(e){return this.getPacketAtIndex(0,e)}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=(0,c.binarySearchExact)(this.demuxer.loadedSamples,e.timestamp,e=>e.timestamp);if(-1===a)throw Error("Packet was not created from this track.");let i=a+1;for(;i>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(i,r)}finally{a()}}async getPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.timestamp);if(-1===a&&this.demuxer.loadedSamples.length>0)return null;if(this.demuxer.lastSampleLoaded||a>=0&&a+1p);var n=e("../codec-data.js"),o=e("../demuxer.js"),l=e("../input-track.js"),c=e("../misc.js"),d=e("../packet.js"),u=e("../reader.js"),h=e("../metadata.js"),m=e("./flac-misc.js");class p extends o.Demuxer{constructor(e){super(e),this.loadedSamples=[],this.metadataPromise=null,this.track=null,this.metadataTags={},this.audioInfo=null,this.lastLoadedPos=null,this.blockingBit=null,this.readingMutex=new(0,c.AsyncMutex),this.lastSampleLoaded=!1,this.reader=e._reader}async computeDuration(){return await this.readMetadata(),(0,c.assert)(this.track),this.track.computeDuration()}async getMetadataTags(){return await this.readMetadata(),this.metadataTags}async getTracks(){return await this.readMetadata(),(0,c.assert)(this.track),[this.track]}async getMimeType(){return"audio/flac"}async readMetadata(){let e=4;return this.metadataPromise??=(async()=>{for(;null===this.reader.fileSize||ei.end-6)return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:i.end-e,isLastFrame:!0};if(255===(0,u.readU8)(i)){let r=i.filePos;if((0,u.readU8)(i)!==(1===this.blockingBit?249:248)){i.filePos=r;continue}i.skip(-2);let a=i.filePos-e,n=this.readFlacFrameHeader({slice:i,isFirstPacket:!1});if(!n){i.filePos=r;continue}if(0===this.blockingBit){if(n.num-s.num!=1){i.filePos=r;continue}}else if(n.num-s.num!==s.blockSize){i.filePos=r;continue}return{num:s.num,blockSize:s.blockSize,sampleRate:s.sampleRate,size:a,isLastFrame:!1}}}}readFlacFrameHeader({slice:e,isFirstPacket:r}){let a=e.filePos,i=(0,u.readBytes)(e,4),s=new(0,c.Bitstream)(i);if(32764!==s.readBits(15))return null;if(null===this.blockingBit){(0,c.assert)(r);let e=s.readBits(1);this.blockingBit=e}else if(1===this.blockingBit){if((0,c.assert)(!r),1!==s.readBits(1))return null}else if(0===this.blockingBit){if((0,c.assert)(!r),0!==s.readBits(1))return null}else throw Error("Invalid blocking bit");let n=(0,m.getBlockSizeOrUncommon)(s.readBits(4));if(!n)return null;(0,c.assert)(this.audioInfo);let o=(0,m.getSampleRateOrUncommon)(s.readBits(4),this.audioInfo.sampleRate);if(!o||(s.readBits(4),s.readBits(3),0!==s.readBits(1)))return null;let l=(0,m.readCodedNumber)(e),d=(0,m.readBlockSize)(e,n),h=(0,m.readSampleRate)(e,o);if(null===h||h!==this.audioInfo.sampleRate)return null;let p=e.filePos-a,f=(0,u.readU8)(e);return(e.skip(-p),e.skip(-1),f!==(0,m.calculateCrc8)((0,u.readBytes)(e,p)))?null:{num:l,blockSize:d,sampleRate:h}}async advanceReader(){await this.readMetadata(),(0,c.assert)(null!==this.lastLoadedPos),(0,c.assert)(this.audioInfo);let e=this.lastLoadedPos,r=await this.readNextFlacFrame({startPos:e,isFirstPacket:0===this.loadedSamples.length});if(!r){this.lastSampleLoaded=!0;return}let a=this.loadedSamples[this.loadedSamples.length-1],i={blockOffset:a?a.blockOffset+a.blockSize:0,blockSize:r.blockSize,byteOffset:e,byteSize:r.size};if(this.lastLoadedPos=this.lastLoadedPos+r.size,this.loadedSamples.push(i),r.isLastFrame){this.lastSampleLoaded=!0;return}}}class f{constructor(e){this.demuxer=e}getId(){return 1}getCodec(){return"flac"}getInternalCodecId(){return null}getNumberOfChannels(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.numberOfChannels}async computeDuration(){let e=await this.getPacket(1/0,{metadataOnly:!0});return(e?.timestamp??0)+(e?.duration??0)}getSampleRate(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getName(){return null}getLanguageCode(){return c.UNDETERMINED_LANGUAGE}getTimeResolution(){return(0,c.assert)(this.demuxer.audioInfo),this.demuxer.audioInfo.sampleRate}getDisposition(){return{...h.DEFAULT_TRACK_DISPOSITION}}async getFirstTimestamp(){return 0}async getDecoderConfig(){return(0,c.assert)(this.demuxer.audioInfo),{codec:"flac",numberOfChannels:this.demuxer.audioInfo.numberOfChannels,sampleRate:this.demuxer.audioInfo.sampleRate,description:this.demuxer.audioInfo.description}}async getPacket(e,r){if((0,c.assert)(this.demuxer.audioInfo),e<0)throw Error("Timestamp cannot be negative");let a=await this.demuxer.readingMutex.acquire();try{for(;;){let a=(0,c.binarySearchLessOrEqual)(this.demuxer.loadedSamples,e,e=>e.blockOffset/this.demuxer.audioInfo.sampleRate);if(-1===a){await this.demuxer.advanceReader();continue}let i=this.demuxer.loadedSamples[a],s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;if(s+n<=e){if(this.demuxer.lastSampleLoaded)return this.getPacketAtIndex(this.demuxer.loadedSamples.length-1,r);await this.demuxer.advanceReader();continue}return this.getPacketAtIndex(a,r)}}finally{a()}}async getNextPacket(e,r){let a=await this.demuxer.readingMutex.acquire();try{let a=e.sequenceNumber+1;if(this.demuxer.lastSampleLoaded&&a>=this.demuxer.loadedSamples.length)return null;for(;a>=this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(a,r)}finally{a()}}getKeyPacket(e,r){return this.getPacket(e,r)}getNextKeyPacket(e,r){return this.getNextPacket(e,r)}async getPacketAtIndex(e,r){let a,i=this.demuxer.loadedSamples[e];if(!i)return null;if(r.metadataOnly)a=d.PLACEHOLDER_DATA;else{let e=this.demuxer.reader.requestSlice(i.byteOffset,i.byteSize);if(e instanceof Promise&&(e=await e),!e)return null;a=(0,u.readBytes)(e,i.byteSize)}(0,c.assert)(this.demuxer.audioInfo);let s=i.blockOffset/this.demuxer.audioInfo.sampleRate,n=i.blockSize/this.demuxer.audioInfo.sampleRate;return new(0,d.EncodedPacket)(a,"key",s,n,e,i.byteSize)}async getFirstPacket(e){for(;0===this.demuxer.loadedSamples.length&&!this.demuxer.lastSampleLoaded;)await this.demuxer.advanceReader();return this.getPacketAtIndex(0,e)}}},{"../codec-data.js":"zx4dz","../demuxer.js":"73Qqp","../input-track.js":"aU0uf","../misc.js":"jrq2g","../packet.js":"8dQhf","../reader.js":"6AkKg","../metadata.js":"1RzS5","./flac-misc.js":"G9NqQ","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],G9NqQ:[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"getBlockSizeOrUncommon",()=>l),s.export(a,"getSampleRateOrUncommon",()=>c),s.export(a,"readCodedNumber",()=>d),s.export(a,"readBlockSize",()=>u),s.export(a,"readSampleRate",()=>h),s.export(a,"calculateCrc8",()=>m);var n=e("../misc.js"),o=e("../reader.js");let l=e=>{if(0===e)return null;if(1===e)return 192;if(e>=2&&e<=5)return 144*2**e;if(6===e)return"uncommon-u8";if(7===e)return"uncommon-u16";else if(e>=8&&e<=15)return 2**e;else return null},c=(e,r)=>{switch(e){case 0:return r;case 1:return 88200;case 2:return 176400;case 3:return 192e3;case 4:return 8e3;case 5:return 16e3;case 6:return 22050;case 7:return 24e3;case 8:return 32e3;case 9:return 44100;case 10:return 48e3;case 11:return 96e3;case 12:return"uncommon-u8";case 13:return"uncommon-u16";case 14:return"uncommon-u16-10";default:return null}},d=e=>{let r=0,a=new(0,n.Bitstream)((0,o.readBytes)(e,1));for(;1===a.readBits(1);)r++;if(0===r)return a.readBits(7);let i=[],s=r-1,l=new(0,n.Bitstream)((0,o.readBytes)(e,s)),c=8-r-1;for(let e=0;ee|r<"uncommon-u16"===r?(0,o.readU16Be)(e)+1:"uncommon-u8"===r?(0,o.readU8)(e)+1:"number"==typeof r?r:void((0,n.assertNever)(r),(0,n.assert)(!1)),h=(e,r)=>"uncommon-u16"===r?(0,o.readU16Be)(e):"uncommon-u16-10"===r?10*(0,o.readU16Be)(e):"uncommon-u8"===r?(0,o.readU8)(e):"number"==typeof r?r:null,m=e=>{let r=0;for(let a of e){r^=a;for(let e=0;e<8;e++)(128&r)!=0?r=r<<1^7:r<<=1,r&=255}return r}},{"../misc.js":"jrq2g","../reader.js":"6AkKg","@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"8Stti":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");s.defineInteropFlag(a),s.export(a,"default",()=>o);var n=e("mediabunny");function o({canvas:e,ctx:r,events:a,timeupdateInterval:i=250,avSyncTolerance:s=.12,dropLateFrames:o=!1,poster:l="",preflightRange:c=!1}){let d=null,u=null,h=null,m=null,p=0,f=0,g=0,k=0,b=NaN,T=null,y=0,S=!1,w=1,I=!1;async function x(e){if(!c||"string"!=typeof e)return!0;try{let r=(await fetch(e,{method:"HEAD"})).headers.get("accept-ranges");if(!r||"none"===r)return a.emit("error",new Event("RangeNotSupported")),!1;return!0}catch(e){return console.warn("preflight failed",e),!0}}function E(){if(!l||I)return;let a=new Image;a.onload=()=>{r.clearRect(0,0,e.width,e.height),e.width=a.naturalWidth||e.width,e.height=a.naturalHeight||e.height,r.drawImage(a,0,0,e.width,e.height),I=!0},a.src=l}async function P(){await h?.return(),h=null}function C(){r.clearRect(0,0,e.width,e.height)}async function B(e){if(await P(),!u)return;h=u.canvases(e);let i=(await h.next()).value??null;m=(await h.next()).value??null,i?(r.drawImage(i.canvas,0,0),a.emit("loadeddata")):E()}async function _(a){if(h)for(;;){let i=(await h.next()).value??null;if(!i||a!==f)return;let n=T.currentTime;if(o){let a=Math.max(.06,s/Math.max(1,w));if(i.timestamp=i&&(a.emit("timeupdate"),y=n),Number.isFinite(b)&&s>=b){D(),a.emit("ended");return}m&&m.timestamp<=s?(r.clearRect(0,0,e.width,e.height),r.drawImage(m.canvas,0,0),m=null,_(f),S&&(a.emit("canplay"),a.emit("playing"),S=!1)):!m&&(_(f),!m&&Number.isFinite(b)&&sn)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}],"3OoKk":[function(e,r,a,i){var s=e("@parcel/transformer-js/src/esmodule-helpers.js");function n(){let e=new Map;return{addEventListener:function(r,a){e.has(r)||e.set(r,[]),e.get(r).push(a)},removeEventListener:function(r,a){let i=e.get(r);if(!i)return;let s=i.indexOf(a);s>=0&&i.splice(s,1)},emit:function(r,a){let i=new Event(r);i.detail=a;let s=e.get(r);s&&s.forEach(e=>e(i))}}}s.defineInteropFlag(a),s.export(a,"createVideoEventTarget",()=>n)},{"@parcel/transformer-js/src/esmodule-helpers.js":"loqXi"}]},["2x2Ir"],"2x2Ir","parcelRequire4dc0",{});let{default:e}=parcelRequire4dc0("2x2Ir");export{e as default}; \ No newline at end of file diff --git a/packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt b/packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt deleted file mode 100644 index 7488c6f42..000000000 --- a/packages/artplayer-proxy-mediabunny/mediabunny/llms-full.txt +++ /dev/null @@ -1,5067 +0,0 @@ ---- -url: /guide/extensions/mp3-encoder.md ---- -# @mediabunny/mp3-encoder - -Browsers typically have no support for MP3 encoding in their WebCodecs implementations. Given the ubiquity of the format, this extension package provides an MP3 encoder for use with Mediabunny. It is implemented using Mediabunny's [custom coder API](../supported-formats-and-codecs#custom-coders) and uses a highly-performant WASM build of the [LAME MP3 Encoder](https://lame.sourceforge.io/) under the hood. - -## Installation - -This library peer-depends on Mediabunny. Install both using npm: - -```bash -npm install mediabunny @mediabunny/mp3-encoder -``` - -Alternatively, directly include them using a script tag: - -```html - - -``` - -This will expose the global objects `Mediabunny` and `MediabunnyMp3Encoder`. Use `mediabunny-mp3-encoder.d.ts` to provide types for these globals. You can download the built distribution files from the [releases page](https://github.com/Vanilagy/mediabunny/releases). - -## Usage - -```ts -import { registerMp3Encoder } from '@mediabunny/mp3-encoder'; - -registerMp3Encoder(); -``` - -That's it - Mediabunny now uses the registered MP3 encoder automatically. - -If you want to be more correct, check for native browser support first: - -```ts -import { canEncodeAudio } from 'mediabunny'; -import { registerMp3Encoder } from '@mediabunny/mp3-encoder'; - -if (!(await canEncodeAudio('mp3'))) { - registerMp3Encoder(); -} -``` - -## Example - -Here, we convert an input file to an MP3: - -```ts -import { - Input, - ALL_FORMATS, - BlobSource, - Output, - BufferTarget, - Mp3OutputFormat, - canEncodeAudio, - Conversion, -} from 'mediabunny'; -import { registerMp3Encoder } from '@mediabunny/mp3-encoder'; - -if (!(await canEncodeAudio('mp3'))) { - // Only register the custom encoder if there's no native support - registerMp3Encoder(); -} - -const input = new Input({ - source: new BlobSource(file), // From a file picker, for example - formats: ALL_FORMATS, -}); -const output = new Output({ - format: new Mp3OutputFormat(), - target: new BufferTarget(), -}); - -const conversion = await Conversion.init({ - input, - output, -}); -await conversion.execute(); - -output.target.buffer; // => ArrayBuffer containing the MP3 file -``` - -## Implementation details - -This library implements an MP3 encoder by registering a custom encoder class with Mediabunny. This class, when initialized, spawns a worker which then immediately loads a WASM build of the LAME MP3 encoder. Then, raw data is sent to the worker and encoded data is received from it. These encoded chunks are then concatenated in the main thread and properly split into separate MP3 frames. - -Great care was put into ensuring maximum compatibility of this package; it works with bundlers, directly in the browser, as well as in Node, Deno, and Bun. All code (including worker & WASM) are bundled into a single file, eliminating the need for CDNs or WASM path arguments. This packages therefore serves as a reference implementation of WASM-based encoder extensions for Mediabunny. - -The WASM build itself is a performance-optimized, SIMD-enabled build of LAME 3.100, with all unneeded features disabled. Because maximum performance was the priority, the build is slighter bigger, but ~130 kB gzipped is still very reasonable in my opinion. In my tests, it encodes 5 seconds of audio in ~90 milliseconds (55x real-time speed). - ---- - ---- -url: /guide/converting-media-files.md ---- -# Converting media files - -The [reading](./reading-media-files) and [writing](./writing-media-files) primitives in Mediabunny provide everything you need to convert media files. However, since this is such a common operation and the details can be tricky, Mediabunny ships with a built-in file conversion abstraction. - -It has the following features: - -* Transmuxing (changing the container format) -* Transcoding (changing a track's codec) -* Track removal -* Compression -* Trimming -* Video resizing & fitting -* Video rotation -* Video cropping -* Video frame rate adjustment -* Video transparency removal/preservation -* Audio resampling -* Audio up/downmixing -* User-defined video & audio processing - -The conversion API was built to be simple, versatile and extremely performant. - -## Basic usage - -### Running a conversion - -Each conversion process is represented by an instance of `Conversion`. Create a new instance using `Conversion.init(...)`, then run the conversion using `.execute()`. - -Here, we're converting to WebM: - -```ts -import { - Input, - Output, - WebMOutputFormat, - BufferTarget, - Conversion, -} from 'mediabunny'; - -const input = new Input({ ... }); -const output = new Output({ - format: new WebMOutputFormat(), - target: new BufferTarget(), -}); - -const conversion = await Conversion.init({ input, output }); -if (!conversion.isValid) { - // Conversion is invalid and cannot be executed without error. - // This field gives reasons for why tracks were discarded: - conversion.discardedTracks; // => DiscardedTrack[] - - return; -} - -await conversion.execute(); - -// output.target.buffer contains the final file -``` - -That's it! A `Conversion` simply takes an instance of `Input` and `Output`, then reads the data from the input and writes it to the output. If you're unfamiliar with [`Input`](./reading-media-files) and [`Output`](./writing-media-files), check out their respective guides. - -::: info -The `Output` passed to the `Conversion` must be *fresh*; that is, it must have no added tracks or metadata tags and be in the `'pending'` state (not started yet). -::: - -Unconfigured, the conversion process handles all the details automatically, such as: - -* Copying media data whenever possible, otherwise transcoding it -* Dropping tracks that aren't supported in the output format - -You should consider inspecting `isValid` and the [discarded tracks](#discarded-tracks) before executing a `Conversion`. - -### Monitoring progress - -To monitor the progress of a `Conversion`, set its `onProgress` property *before* calling `execute`: - -```ts -const conversion = await Conversion.init({ input, output }); - -conversion.onProgress = (progress: number) => { - // `progress` is a number between 0 and 1 (inclusive) -}; - -await conversion.execute(); -``` - -This callback is called each time the progress of the conversion advances. - -::: warning -A progress of `1` doesn't indicate the conversion has finished; the conversion is only finished once the promise returned by `.execute()` resolves. -::: - -::: warning -Tracking conversion progress can slightly affect performance as it requires knowledge of the input file's total duration. This is usually negligible but should be avoided when using append-only input sources such as [`ReadableStreamSource`](./reading-media-files#readablestreamsource). -::: - -If you want to monitor the output size of the conversion (in bytes), simply use the `onwrite` callback on your `Target`: - -```ts -let currentFileSize = 0; - -output.target.onwrite = (start, end) => { - currentFileSize = Math.max(currentFileSize, end); -}; -``` - -### Canceling a conversion - -Sometimes, you may want to cancel an ongoing conversion process. For this, use the `cancel` method: - -```ts -await conversion.cancel(); // Resolves once the conversion is canceled -``` - -This automatically frees up all resources used by the conversion process. - -## Video options - -You can set the `video` property in the conversion options to configure the converter's behavior for video tracks. The options are: - -```ts -type ConversionVideoOptions = { - discard?: boolean; - width?: number; - height?: number; - fit?: 'fill' | 'contain' | 'cover'; - rotate?: 0 | 90 | 180 | 270; - allowRotationMetadata?: boolean; - crop?: { left: number; top: number; width: number; height: number }; - frameRate?: number; - codec?: VideoCodec; - bitrate?: number | Quality; - alpha?: 'discard' | 'keep'; // Defaults to 'discard' - keyFrameInterval?: number; - forceTranscode?: boolean; - process?: (sample: VideoSample) => MaybePromise< - CanvasImageSource | VideoSample | (CanvasImageSource | VideoSample)[] | null - >; - processedWidth?: number; - processedHeight?: number; -}; - -type MaybePromise = T | Promise; -``` - -For example, here we resize the video track to 720p: - -```ts -const conversion = await Conversion.init({ - input, - output, - video: { - width: 1280, - height: 720, - fit: 'contain', - }, -}); -``` - -::: info -The provided configuration will apply equally to all video tracks of the input. If you want to apply a separate configuration to each video track, check [track-specific options](#track-specific-options). -::: - -### Discarding video - -If you want to get rid of the video track, use `discard: true`. - -### Resizing video - -The `width`, `height` and `fit` properties control how the video is resized. If only `width` or `height` is provided, the other value is deduced automatically to preserve the video's original aspect ratio. If both are used, `fit` must be set to control the fitting algorithm: - -* `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. -* `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to letterboxing. -* `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. - -If `width` or `height` is used in conjunction with `rotation` or `crop`, they control the post-rotation, post-crop dimensions. - -If you want to apply max/min constraints to a video's dimensions, check out [track-specific options](#track-specific-options). - -In the rare case that the input video changes size over time, the `fit` field can be used to control the size change behavior (see [`VideoEncodingConfig`](./media-sources#video-encoding-config)). When unset, the behavior is `'passThrough'`. - -### Rotating video - -`rotation` rotates the video by the specified number of degrees clockwise. This rotation is applied on top of any rotation metadata in the original input file and happens before cropping and resizing. - -By default, Mediabunny will try to make use of rotation metadata in the output file to perform the rotation whenever possible. However, if you don't want this to happen, or you want to use Mediabunny to strip all rotation metadata from a file, you can set `allowRotationMetadata` to `false`. - -### Cropping video - -`crop` can be used to extract a rectangular region from the original video. The rectangle is specified using `left`, `top`, `width` and `height` and is clamped to the dimensions of the video. Cropping is applied after rotation but before resizing. - -### Adjusting frame rate - -The `frameRate` property can be used to set the frame rate of the output video in Hz. If not specified, the original input frame rate will be used (which may be variable). - -### Transcoding video - -Use the `codec` property to control the codec of the output track. This should be set to a [codec](./supported-formats-and-codecs#video-codecs) supported by the output file, or else the track will be [discarded](#discarded-tracks). - -Use the `bitrate` property to control the bitrate of the output video. For example, you can use this field to compress the video track. Accepted values are the number of bits per second or a [subjective quality](./media-sources#subjective-qualities). If this property is set, transcoding will always happen. If this property is not set but transcoding is still required, `QUALITY_HIGH` will be used as the value. - -Use the `keyFrameInterval` property to control the maximum interval in seconds between key frames in the output video. Setting this fields forces a transcode. - -If you want to prevent direct copying of media data and force a transcoding step, use `forceTranscode: true`. - -### Processing video - -The `process` property can be used to define a custom video sample processing function, e.g. for [applying overlays](./quick-start#add-a-video-overlay), color transformations, or timestamp modifications. You are expected to perform this processing yourself, for example using the Canvas API. - -An example: - -```ts -let ctx: CanvasRenderingContext2D | null = null; -const conversion = await Conversion.init({ - video: { - process: (sample) => { - if (!ctx) { - const canvas = new OffscreenCanvas( - sample.displayWidth, - sample.displayHeight, - ); - ctx = canvas.getContext('2d')!; - - // Convert the video to grayscale - ctx.filter = 'saturate(0)'; - } - - sample.draw(ctx, 0, 0); - - return ctx.canvas; - }, - }, -}); -``` - -The function is called for each input video sample after transformations and frame rate corrections. It must return a [`VideoSample`](./packets-and-samples#videosample), something that can convert to a `VideoSample`, an array of them, or `null` for dropping the frame. - -This function can also be used to manually resize frames. When doing so, you should signal the post-process dimensions using the `processedWidth` and `processedHeight` fields, which enables the encoder to better know what to expect. - -## Audio options - -You can set the `audio` property in the conversion options to configure the converter's behavior for audio tracks. The options are: - -```ts -type ConversionAudioOptions = { - discard?: boolean; - codec?: AudioCodec; - bitrate?: number | Quality; - numberOfChannels?: number; - sampleRate?: number; - forceTranscode?: boolean; - process?: (sample: AudioSample) => MaybePromise< - AudioSample | AudioSample[] | null - >; - processedNumberOfChannels?: number; - processedSampleRate?: number; -}; - -type MaybePromise = T | Promise; -``` - -For example, here we convert the audio track to mono and set a specific sample rate: - -```ts -const conversion = await Conversion.init({ - input, - output, - audio: { - numberOfChannels: 1, - sampleRate: 48000, - }, -}); -``` - -::: info -The provided configuration will apply equally to all audio tracks of the input. If you want to apply a separate configuration to each audio track, check [track-specific options](#track-specific-options). -::: - -### Discarding audio - -If you want to get rid of the audio track, use `discard: true`. - -### Resampling audio - -The `numberOfChannels` property controls the channel count of the output audio (e.g., 1 for mono, 2 for stereo). If this value differs from the number of channels in the input track, Mediabunny will perform up/downmixing of the channel data using [the same algorithm as the Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Basic_concepts_behind_Web_Audio_API#audio_channels). - -The `sampleRate` property controls the sample rate in Hz (e.g., 44100, 48000). If this value differs from the input track's sample rate, Mediabunny will resample the audio. - -### Transcoding audio - -Use the `codec` property to control the codec of the output track. This should be set to a [codec](./supported-formats-and-codecs#audio-codecs) supported by the output file, or else the track will be [discarded](#discarded-tracks). - -Use the `bitrate` property to control the bitrate of the output audio. For example, you can use this field to compress the audio track. Accepted values are the number of bits per second or a [subjective quality](./media-sources#subjective-qualities). If this property is set, transcoding will always happen. If this property is not set but transcoding is still required, `QUALITY_HIGH` will be used as the value. - -If you want to prevent direct copying of media data and force a transcoding step, use `forceTranscode: true`. - -### Processing audio - -The `process` property can be used to define a custom audio sample processing function, e.g. for applying audio effects, transformations, or timestamp modifications. You are expected to perform this processing yourself. - -The function is called for each input audio sample after remixing and resampling. It must return an [`AudioSample`](./packets-and-samples#audiosample), an array of them, or `null` for dropping the sample. - -This function can also be used to manually perform remixing or resampling. When doing so, you should signal the post-process parameters using the `processedNumberOfChannels` and `processedSampleRate` fields, which enables the encoder to better know what to expect. - -## Track-specific options - -You may want to configure your video and audio options differently depending on the specifics of the input track. Or, in case a media file has multiple video or audio tracks, you may want to discard only specific tracks or configure each track separately. - -For this, instead of passing an object for `video` and `audio`, you can instead pass a function: - -```ts -const conversion = await Conversion.init({ - input, - output, - - // Function gets invoked for each video track: - video: (videoTrack, n) => { - if (n > 1) { - // Keep only the first video track - return { discard: true }; - } - - return { - // Shrink width to 640 only if the track is wider - width: Math.min(videoTrack.displayWidth, 640), - }; - }, - - // Async functions work too: - audio: async (audioTrack, n) => { - if (audioTrack.languageCode !== 'rus') { - // Keep only Russian audio tracks - return { discard: true }; - } - - return { - codec: 'aac', - }; - }, -}); -``` - -For documentation about the properties of video and audio tracks, refer to [Reading track metadata](./reading-media-files#reading-track-metadata). - -## Trimming - -Use the `trim` property in the conversion options to extract only a section of the input file into the output file: - -```ts -type ConversionOptions = { - // ... - trim?: { - start: number; // in seconds - end: number; // in seconds - }; - // ... -}; -``` - -For example, here we extract a clip from 10s to 25s: - -```ts -const conversion = await Conversion.init({ - input, - output, - trim: { - start: 10, - end: 25, - }, -}); -``` - -In this case, the output will be 15 seconds long. - -If only `start` is set, the clip will run until the end of the input file. If only `end` is set, the clip will start at the beginning of the input file. - -## Metadata tags - -By default, any [descriptive metadata tags](../api/MetadataTags.md) of the input will be copied to the output. If you want to further control the metadata tags written to the output, you can use the `tags` options: - -```ts -// Set your own metadata: -const conversion = await Conversion.init({ - // ... - tags: { - title: 're:Turning', - artist: 'Alexander Panos', - }, - // ... -}); - -// Or, augment the input's metadata: -const conversion = await Conversion.init({ - // ... - tags: (inputTags) => ({ - ...inputTags, // Keep the existing metadata - images: [{ // And add cover art - data: new Uint8Array(...), - mimeType: 'image/jpeg', - kind: 'coverFront', - }], - comment: undefined, // And remove any comments - }), - // ... -}); - -// Or, remove all metadata -const conversion = await Conversion.init({ - // ... - tags: {}, - // ... -}); -``` - -## Discarded tracks - -If an input track is excluded from the output file, it is considered *discarded*. The list of discarded tracks can be accessed after initializing a `Conversion`: - -```ts -const conversion = await Conversion.init({ input, output }); -conversion.discardedTracks; // => DiscardedTrack[] - -type DiscardedTrack = { - // The track that was discarded - track: InputTrack; - // The reason for discarding the track - reason: - | 'discarded_by_user' - | 'max_track_count_reached' - | 'max_track_count_of_type_reached' - | 'unknown_source_codec' - | 'undecodable_source_codec' - | 'no_encodable_target_codec'; -}; -``` - -Since you can inspect this list before executing a `Conversion`, this gives you the option to decide if you still want to move forward with the conversion process. - -If `isValid` is `false`, then the discarded tracks caused the `Conversion` to become invalid. For example, this can happen when a format requires a specific codec but that codec cannot be encoded. - -*** - -The following reasons exist: - -* `discarded_by_user`\ - You discarded this track by setting `discard: true`. -* `max_track_count_reached`\ - The output had no more room for another track. -* `max_track_count_of_type_reached`\ - The output had no more room for another track of this type, or the output doesn't support this track type at all. -* `unknown_source_codec`\ - We don't know the codec of the input track and therefore don't know what to do with it. -* `undecodable_source_codec`\ - The input track's codec is known, but we are unable to decode it. -* `no_encodable_target_codec`\ - We can't find a codec that we are able to encode and that can be contained within the output format. This reason can be hit if the environment doesn't support the necessary encoders, or if you requested a codec that cannot be contained within the output format. - -*** - -On the flip side, you can always query which input tracks made it into the output: - -```ts -const conversion = await Conversion.init({ input, output }); -conversion.utilizedTracks; // => InputTrack[] -``` - ---- - ---- -url: /examples.md ---- - - ---- - ---- -url: /guide/input-formats.md ---- -# Input formats - -Mediabunny supports a wide variety of commonly used container formats for reading input files. These *input formats* are used in two ways: - -* When creating an `Input`, they are used to specify the list of supported container formats. See [Creating a new input](./reading-media-files#creating-a-new-input) for more. -* Given an existing `Input`, its `getFormat` method returns the *actual* format of the file as an `InputFormat`. - -## Input format properties - -Retrieve the full written name of the format like this: - -```ts -inputFormat.name; // => 'MP4' -``` - -You can also retrieve the format's base MIME type: - -```ts -inputFormat.mimeType; // => 'video/mp4' -``` - -If you want a file's full MIME type, which depends on track codecs, use [`getMimeType`](./reading-media-files#reading-file-metadata) on `Input` instead. - -## Input format singletons - -Since input formats don't require any additional configuration, each input format is directly available as an exported singleton instance: - -```ts -import { - MP4, // MP4 input format singleton - QTFF, // QuickTime File Format input format singleton - MATROSKA, // Matroska input format singleton - WEBM, // WebM input format singleton - MP3, // MP3 input format singleton - WAVE, // WAVE input format singleton - OGG, // Ogg input format singleton - ADTS, // ADTS input format singleton - FLAC, // FLAC input format singleton -} from 'mediabunny'; -``` - -You can use these singletons when creating an input: - -```ts -import { Input, MP3, WAVE, OGG } from 'mediabunny'; - -const input = new Input({ - formats: [MP3, WAVE, OGG], - // ... -}); -``` - -You can also use them for checking the actual format of an `Input`: - -```ts -import { MP3 } from 'mediabunny'; - -const isMp3 = (await input.getFormat()) === MP3; -``` - -There is a special `ALL_FORMATS` constant exported by Mediabunny which contains every input format singleton. Use this constant if you want to support as many formats as possible: - -```ts -import { Input, ALL_FORMATS } from 'mediabunny'; - -const input = new Input({ - formats: ALL_FORMATS, - // ... -}); -``` - -::: info -Using `ALL_FORMATS` means [demuxers](https://en.wikipedia.org/wiki/Demultiplexer_\(media_file\)) for all formats must be included in the bundle, which can increase the bundle size significantly. Use it only if you need to support all formats. -::: - -## Input format class hierarchy - -In addition to singletons, input format classes are structured hierarchically: - -* `InputFormat` (abstract) - * `IsobmffInputFormat` (abstract) - * `Mp4InputFormat` - * `QuickTimeInputFormat` - * `MatroskaInputFormat` - * `WebMInputFormat` - * `Mp3InputFormat` - * `WaveInputFormat` - * `OggInputFormat` - * `AdtsInputFormat` - * `FlacInputFormat` - -This means you can also perform input format checks using `instanceof` instead of `===` comparisons. For example: - -```ts -import { Mp3InputFormat } from 'mediabunny'; - -// Check if the file is MP3: -(await input.getFormat()) instanceof Mp3InputFormat; - -// Check if the file is Matroska (MKV + WebM): -(await input.getFormat()) instanceof MatroskaInputFormat; - -// Check if the file is MP4 or QuickTime: -(await input.getFormat()) instanceof IsobmffInputFormat; -``` - -::: info -Well, actually 🤓☝️, the QuickTime File Format is technically not an instance of the ISO Base Media File Format (ISOBMFF) - instead, ISOBMFF is a standard originally inspired by QTFF. However, as the two are extremely similar and are used in the same way, we consider QTFF an instance of `IsobmffInputFormat` for convenience. -::: - ---- - ---- -url: /guide/installation.md ---- -# Installation - -Install Mediabunny using your favorite package manager: - -::: code-group - -```bash [npm] -npm install mediabunny -``` - -```bash [yarn] -yarn add mediabunny -``` - -```bash [pnpm] -pnpm add mediabunny -``` - -```bash [bun] -bun add mediabunny -``` - -::: - -::: info -Requires any JavaScript environment that can run ECMAScript 2021 or later. Mediabunny is expected to be run in modern browsers. For types, TypeScript 5.7 or later is required. -::: - -Then, simply import it like this: - -```ts -import { ... } from 'mediabunny'; // ESM -const { ... } = require('mediabunny'); // or CommonJS -``` - -ESM is preferred because it gives you tree shaking. - -You can also just include the library using a script tag in your HTML: - -```html - -``` - -This will add a `Mediabunny` object to the global scope. You can provide types for this global using `mediabunny.d.ts`. - -You can download a built distribution file from the [releases page](https://github.com/Vanilagy/mediabunny/releases). Use the `*.cjs` builds for normal script tag inclusion, or the `*.mjs` builds for script tags with `type="module"` or direct imports via ESM. Including the `mediabunny.d.ts` declaration file in your TypeScript project will declare a global `Mediabunny` namespace. - ---- - ---- -url: /guide/introduction.md ---- -# Introduction - -Mediabunny is a JavaScript library for reading, writing, and converting media files (like MP4 or WebM), directly in the browser. It aims to be a complete toolkit for high-performance media operations on the web. It's written from scratch in pure TypeScript, has zero dependencies, and is extremely tree-shakable, meaning you only include what you use. You can think of it a bit like [FFmpeg](https://ffmpeg.org/), but built for the web's needs. - -## Features - -Here's a long list of stuff this library does: - -* Reading metadata from media files -* Extracting media data from media files -* Creating new media files -* Converting media files -* Hardware-accelerated decoding & encoding (via the WebCodecs API) -* Support for multiple video, audio and subtitle tracks -* Read & write support for many container formats (.mp4, .mov, .webm, .mkv, .mp3, .wav, .ogg, .aac, .flac), including variations such as MP4 with Fast Start, fragmented MP4, streamable Matroska, transparent WebM, etc. -* Support for 25 different codecs -* Lazy, optimized, on-demand file reading -* Input and output streaming, arbitrary file size support -* File location independence (memory, disk, network, ...) -* Utilities for compression, resizing, rotation, cropping, resampling, trimming -* Metadata tag reading & writing (title, artist, cover art, custom tags, attached files, etc.) -* Transmuxing and transcoding -* Microsecond-accurate reading and writing precision -* Efficient seeking through time -* Pipelined design for efficient hardware usage and automatic backpressure -* Custom encoder & decoder support for polyfilling -* Low- & high-level abstractions for different use cases -* Performant everything -* Node.js support - -...and there's probably more. - -## Use cases - -Mediabunny is a general-purpose toolkit and can be used in infinitely many ways. But, here are a few ideas: - -* File conversion & compression -* Displaying file metadata (duration, dimensions, ...) -* Extracting thumbnails -* Creating videos in the browser -* Building a video editor -* Live recording & streaming -* Efficient, sample-accurate playback of large files via the Web Audio API - -Check out the [Examples](/examples) page for demo implementations of many of these ideas! - -## Getting started - -To get going with Mediabunny, here are some starting points: - -* Check out [Quick start](./quick-start) for a collection of useful code snippets -* Start with [Reading media files](./reading-media-files) if you want to do read operations. -* Start with [Writing media files](./writing-media-files) if you want to do write operations. -* Start with [Converting media files](./converting-media-files) if you care about file conversions. -* Dive into [Packets & samples](./packets-and-samples) for a deeper understanding of the concepts underlying this library. - -## Motivation - -Mediabunny is the evolution of my previous libraries, [mp4-muxer](https://github.com/Vanilagy/mp4-muxer) and [webm-muxer](https://github.com/Vanilagy/webm-muxer), which were both created due to the advent of the WebCodecs API. While they fulfilled their job just fine, I saw a few painpoints: - -* Lots of duplicated code between the two libraries, otherwise very similar API. -* No help with the difficulties of navigating the WebCodecs API & related browser APIs. -* "mp4-demuxer when??" - -This library is the result of unifying these libraries into one, solving all the above issues, and expanding the scope. Now: - -* Changing the output file format is a single-line change; the rest of the API is identical. -* Lots of abstractions on top of the WebCodecs API & browser APIs are provided. -* mp4-demuxer now. - -Due to tree shaking, if you only need an MP4 or WebM muxer, this library's bundle size will still be very small. - -### Migration - -If you're coming from mp4-muxer or webm-muxer, you should migrate to Mediabunny. For that, refer to these guides: - -* [Guide: Migrating from mp4-muxer to Mediabunny](https://github.com/Vanilagy/mp4-muxer/blob/main/MIGRATION-GUIDE.md) -* [Guide: Migrating from webm-muxer to Mediabunny](https://github.com/Vanilagy/webm-muxer/blob/main/MIGRATION-GUIDE.md) - -## Technical overview - -At its core, Mediabunny is a collection of multiplexers and demultiplexers, one of each for every container format. Demultiplexers stream data from *sources*, while multiplexers stream data to *targets*. Every demultiplexer is capable of extracting file metadata as well as compressed media data, while multiplexers write metadata and encoded media data into a new file. - -Mediabunny then provides several wrappers around the WebCodecs API to simplify usage: for reading, it creates decoders with the correct codec configuration and efficiently decodes media data in a pipelined way. For writing, it figures out the necessary codec configuration and sets up encoders which are then used to encode raw media data, while respecting the backpressure applied by the encoder. Extracting the right decoder configuration from a media file can be tricky and sometimes involves diving into encoded media packet bitstreams. - -The conversion abstraction is built on top of Mediabunny's reading and writing primitives and combines them both in a heavily-pipelined way, making sure reading and writing happen in lockstep. It also consists of a lot of conditional logic probing output track compatibility, decoding support, and finding encodable codec configurations. It makes use of the Canvas API for video processing operations, and uses a custom implementation for audio resampling and up/downmixing. - ---- - ---- -url: /guide/media-sinks.md ---- -# Media sinks - -## Introduction - -*Media sinks* offer ways to extract media data from an `InputTrack`. Different media sinks provide different levels of abstraction and cater to different use cases. - -For information on how to obtain input tracks, or how to generally read data from media files, refer to [Reading media files](./reading-media-files). - -### General usage - -> General usage patterns of media sinks will be demonstrated using a fictional `FooSink`. - -Media sinks are like miniature "namespaces" for retrieving media data, scoped to a specific track. This means that you'll typically only need to construct one sink per type for a track. - -```ts -const track = await input.getPrimaryVideoTrack(); -const sink = new FooSink(track); -``` - -Constructing the sink is virtually free and does not perform any media data reads. - -To read media data, each sink offers a different set of methods. You can call these methods as many times as you want; their calls will be independent since media sinks are stateless\[^1]. - -```ts -await sink.getFoo(1); -await sink.getFoo(2); -await sink.getFoo(3); -``` - -\[^1]: Almost: `CanvasSink` becomes stateful when using a [canvas pool](#canvas-pool). - -### Async iterators - -Media sinks make heavy use of [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncIterator). They allow you to iterate over a set of media data (like all frames in a video track) efficiently, only having to read small sections of the file at any given point. - -Async iterators are extremely ergonomic with `for await...of` loops: - -```ts -for await (const foo of sink.foos()) { - console.log(foo.timestamp); -} -``` - -Just like in regular `for` loops, the `break` statement can be used to exit the loop early. This will automatically clean up any internal resources (such as decoders) used by the async iterator: - -```ts -// Loop only over the first 5 foos -let count = 0; -for await (const foo of sink.foos()) { - console.log(foo.timestamp); - if (++count === 5) break; -} -``` - -Async iterators are also useful outside of `for` loops. Here, the `next` method is used to retrieve the next item in the iteration: - -```ts -const foos = sink.foos(); - -const foo1Result = await foos.next(); -const foo2Result = await foos.next(); - -const foo1 = foo1Result.value; // Might be `undefined` if the iteration is complete -``` - -::: warning -When you manually use async iterators, make sure to call `return` on them once you're done: - -```ts -await foos.return(); -``` - -This ensures all internally held resources are freed. -::: - -### Decode vs. presentation order - -Packets may appear out-of-order in the file, meaning the order in which they are decoded does not correspond to the order in which the decoded data is displayed (see [B-frames](./media-sources#b-frames)). The methods on media sinks differ with respect to which ordering they use to query and retrieve packets. So, just keep these definitions in mind: - -* **Presentation order:** The order in which the data is to be presented; sorted by timestamp. -* **Decode order:** The order in which packets must be decoded; not always sorted by timestamp. - -## General sinks - -There is one media sink which can be used with any `InputTrack`: - -### `EncodedPacketSink` - -This sink can be used to extract raw, [encoded packets](./packets-and-samples#encodedpacket) from media files and is the most elementary media sink. `EncodedPacketSink` is useful if you don't care about the decoded media data (for example, you're only interested in timestamps), or if you want to roll your own decoding logic. - -Start by constructing the sink from any `InputTrack`: - -```ts -import { EncodedPacketSink } from 'mediabunny'; - -const sink = new EncodedPacketSink(track); -``` - -You can retrieve specific packets given a timestamp in seconds: - -```ts -await sink.getPacket(5); // => EncodedPacket | null - -// Or, retrieving only packets with type 'key': -await sink.getKeyPacket(5); // => EncodedPacket | null -``` - -When retrieving a packet using a timestamp, the last packet (in [presentation order](#decode-vs-presentation-order)) with a timestamp less than or equal to the search timestamp will be returned. The methods return `null` if there exists no such packet. - -There is a special method for retrieving the first packet (in [decode order](#decode-vs-presentation-order)): - -```ts -await sink.getFirstPacket(); // => EncodedPacket | null -``` - -The last packet (in [presentation order](#decode-vs-presentation-order)) can be retrieved like so: - -```ts -await sink.getPacket(Infinity); // => EncodedPacket | null -``` - -Once you have a packet, you can retrieve the packet's successor (in [decode order](#decode-vs-presentation-order)) like so: - -```ts -await sink.getNextPacket(packet); // => EncodedPacket | null - -// Or jump straight to the next packet with type 'key': -await sink.getNextKeyPacket(packet); // => EncodedPacket | null -``` - -These methods return `null` if there is no next packet. - -These methods can be combined to iterate over a range of packets. Starting from an initial packet, call `getNextPacket` in a loop to iterate over packets: - -```ts -let currentPacket = await sink.getFirstPacket(); -while (currentPacket) { - console.log('Packet:', currentPacket); - // Do something with the packet - - currentPacket = await sink.getNextPacket(currentPacket); -} -``` - -While this approach works, `EncodedPacketSink` also provides a dedicated `packets` iterator function, which iterates over packets in [decode order](#decode-vs-presentation-order): - -```ts -for await (const packet of sink.packets()) { - // ... -} -``` - -You can also constrain the iteration using a packet range, where the iteration will go from the starting packet up to (but excluding) the end packet: - -```ts -const start = await sink.getPacket(5); -const end = await sink.getPacket(10, { metadataOnly: true }); - -for await (const packet of sink.packets(start, end)) { - // ... -} -``` - -The `packets` method is more performant than manual iteration as it will intelligently preload future packets before they are needed. - -#### Verifying key packets - -By default, packet types are determined using the metadata provided by the containing file. Some files can erroneously label some delta packets as key packets, leading to potential decoder errors. To be guaranteed that a key packet is actually a key packet, you can enable the `verifyKeyPackets` option: - -```ts -// If the packet returned by this method has type: 'key', it's guaranteed -// to be a key packet. -await sink.getPacket(5, { verifyKeyPackets: true }); - -// Returned packets are guaranteed to be key packets -await sink.getKeyPacket(10, { verifyKeyPackets: true }); -await sink.getNextKeyPacket(packet, { verifyKeyPackets: true }); - -// Also works for the iterator: -for await (const packet of sink.packets( - undefined, - undefined, - { verifyKeyPackets: true }, -)) { - // ... -} -``` - -::: info -`verifyKeyPackets` only works when `metadataOnly` is not also enabled. -::: - -#### Metadata-only packet retrieval - -Sometimes, you're only interested in a packet's metadata (timestamp, duration, type, ...) and not in its encoded media data. All methods on `EncodedPacketSink` accept a final `options` parameter which you can use to retrieve [metadata-only packets](./packets-and-samples#metadata-only-packets): - -```ts -const packet = await sink.getPacket(5, { metadataOnly: true }); - -packet.isMetadataOnly; // => true -packet.data; // => Uint8Array([]) -``` - -Retrieving metadata-only packets is more efficient for some input formats: Only the metadata section of the file must be read, not the media data section. - -## Video data sinks - -These sinks can only be used with an `InputVideoTrack`. - -### `VideoSampleSink` - -Use this sink to extract decoded [video samples](./packets-and-samples#videosample) (frames) from a video track. The sink will automatically handle the decoding internally. - -::: info -All operations of this sink use [presentation order](#decode-vs-presentation-order). -::: - -Create the sink like so: - -```ts -import { VideoSampleSink } from 'mediabunny'; - -const sink = new VideoSampleSink(videoTrack); -``` - -#### Single retrieval - -You can retrieve the sample presented at a given timestamp in seconds: - -```ts -await sink.getSample(5); - -// Extracting the first sample: -await sink.getSample(await videoTrack.getFirstTimestamp()); - -// Extracting the last sample: -await sink.getSample(Infinity); -``` - -This method returns the last sample with a timestamp less than or equal to the search timestamp, or `null` if there is no such sample. - -#### Range iteration - -You can use the `samples` iterator method to iterate over a contiguous range of samples: - -```ts -// Iterate over all samples: -for await (const sample of sink.samples()) { - console.log('Sample:', sample); - // Do something with the sample - - sample.close(); -} - -// Iterate over all samples in a specific time range: -for await (const sample of sink.samples(5, 10)) { - // ... - sample.close(); -} -``` - -The `samples` iterator yields the samples in [presentation order](#decode-vs-presentation-order) (sorted by timestamp). - -#### Sparse iteration - -Sometimes, you may want to retrieve the samples for multiple timestamps at once (for example, for generating thumbnails). While you could call `getSample` multiple times, the `samplesAtTimestamps` method provides a more efficient way: - -```ts -for await (const sample of sink.samplesAtTimestamps([0, 1, 2, 3, 4, 5])) { - // `sample` is either VideoSample or null - sample.close(); -} - -// Any timestamp sequence is allowed: -sink.samplesAtTimestamps([1, 2, 3]); -sink.samplesAtTimestamps([4, 5, 5, 5]); -sink.samplesAtTimestamps([10, -2, 3]); -``` - -This method is more efficient than multiple calls to `getSample` because it avoids decoding the same packet twice. - -In addition to arrays, you can pass any iterable into this method: - -```ts -sink.samplesAtTimestamps(new Set([2, 3, 3, 4])); - -sink.samplesAtTimestamps((function* () { - for (let i = 0; i < 5; i++) { - yield i; - } -})()); - -sink.samplesAtTimestamps((async function* () { - const firstTimestamp = await videoTrack.getFirstTimestamp(); - const lastTimestamp = await videoTrack.computeDuration(); - - for (let i = 0; i <= 100; i++) { - yield firstTimestamp + (lastTimestamp - firstTimestamp) * i / 100; - } -})()); -``` - -Passing an async iterable is especially useful when paired with `EncodedPacketSink`. Imagine you want to retrieve every key frame. A naive implementation might look like this: - -```ts -// Naive, bad implementation: // [!code error] -const packetSink = new EncodedPacketSink(videoTrack); -const keyFrameTimestamps: number[] = []; - -let currentPacket = await packetSink.getFirstPacket(); -while (currentPacket) { - keyFrameTimestamps.push(currentPacket.timestamp); - currentPacket = await packetSink.getNextKeyPacket(currentPacket); -} - -const sampleSink = new VideoSampleSink(videoTrack); -const keyFrameSamples = sampleSink.samplesAtTimestamps(keyFrameTimestamps); - -for await (const sample of keyFrameSamples) { - // ... - sample.close(); -} -``` - -The issue with this implementation is that it first iterates over all key packets before yielding the first sample. The better implementation is this: - -```ts -// Better implementation: -const packetSink = new EncodedPacketSink(videoTrack); -const sampleSink = new VideoSampleSink(videoTrack); - -const keyFrameSamples = sampleSink.samplesAtTimestamps((async function* () { - let currentPacket = await packetSink.getFirstPacket(); - - while (currentPacket) { - yield currentPacket.timestamp; - currentPacket = await packetSink.getNextKeyPacket(currentPacket); - } -})()); - -for await (const sample of keyFrameSamples) { - // ... - sample.close(); -} -``` - -### `CanvasSink` - -While `VideoSampleSink` extracts raw decoded video samples, you can use `CanvasSink` to extract these samples as canvases instead. In doing so, certain operations such as scaling, rotating, and cropping can also be handled by the sink. The downside is the additional VRAM requirements for the canvases' framebuffers. - -::: info -This sink yields `HTMLCanvasElement` whenever possible, and falls back to `OffscreenCanvas` otherwise (in Worker contexts, for example). -::: - -Create the sink like so: - -```ts -import { CanvasSink } from 'mediabunny'; - -const sink = new CanvasSink(videoTrack, options); -``` - -Here, `options` has the following type: - -```ts -type CanvasSinkOptions = { - width?: number; - height?: number; - fit?: 'fill' | 'contain' | 'cover'; - rotation?: 0 | 90 | 180 | 270; - crop?: { left: number; top: number; width: number; height: number }; - poolSize?: number; -}; -``` - -* `width`\ - The width of the output canvas in pixels. When omitted but `height` is set, the width will be calculated automatically to maintain the original aspect ratio. Otherwise, the width will be set to the original width of the video. -* `height`\ - The height of the output canvas in pixels. When omitted but `width` is set, the height will be calculated automatically to maintain the original aspect ratio. Otherwise, the height will be set to the original height of the video. -* `fit`\ - *Required* when both `width` and `height` are set, this option sets the fitting algorithm to use. - * `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. - * `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to letterboxing. - * `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. -* `rotation`\ - The clockwise rotation by which to rotate the raw video frame. Defaults to the rotation set in the file metadata. Rotation is applied before cropping and resizing. -* `crop`\ - Specifies the rectangular region of the input video to crop to. The crop region will automatically be clamped to the dimensions of the input video track. Cropping is performed after rotation but before resizing. -* `poolSize`\ - See [Canvas pool](#canvas-pool). - -Some examples: - -```ts -// This sink yields canvases with the unaltered display dimensions of the track, -// and respecting the track's rotation metadata. -new CanvasSink(videoTrack); - -// This sink yields canvases with a width of 1280 and a height that maintains the -// original display aspect ratio. -new CanvasSink(videoTrack, { - width: 1280, -}); - -// This sink yields square canvases, with the video frame scaled to completely -// cover the canvas. -new CanvasSink(videoTrack, { - width: 512, - height: 512, - fit: 'cover', -}); - -// This sink yields canvases with the unaltered coded dimensions of the track, -// and without applying any rotation. -new CanvasSink(videoTrack, { - rotation: 0, -}); -``` - -The methods for retrieving canvases are analogous to those on `VideoSampleSink`: - -* `getCanvas`\ - Gets the canvas for a given timestamp; see [Single retrieval](#single-retrieval). -* `canvases`\ - Iterates over a range of canvases; see [Range iteration](#range-iteration). -* `canvasesAtTimestamps`\ - Iterates over canvases at specific timestamps; see [Sparse iteration](#sparse-iteration). - -These methods yield `WrappedCanvas` instances: - -```ts -type WrappedCanvas = { - // A canvas element or offscreen canvas. - canvas: HTMLCanvasElement | OffscreenCanvas; - // The timestamp of the corresponding video sample, in seconds. - timestamp: number; - // The duration of the corresponding video sample, in seconds. - duration: number; -}; -``` - -#### Canvas pool - -By default, a new canvas is created for every canvas yielded by this sink. If you know you'll keep only a few canvases around at any given time, you should make use of the `poolSize` option. This integer value specifies the number of canvases in the pool; these canvases are then reused in a ring buffer / round-robin type fashion. This keeps the amount of allocated VRAM constant and relieves the browser from constantly allocating/deallocating canvases. A pool size of 0 or `undefined` disables the pool. - -An illustration using a pool size of 3: - -```ts -const sink = new CanvasSink(videoTrack, { poolSize: 3 }); - -const a = await sink.getCanvas(42); -const b = await sink.getCanvas(42); -const c = await sink.getCanvas(42); -const d = await sink.getCanvas(42); -const e = await sink.getCanvas(42); -const f = await sink.getCanvas(42); - -assert(a.canvas === d.canvas); -assert(b.canvas === e.canvas); -assert(c.canvas === f.canvas); -assert(a.canvas !== b.canvas); -assert(a.canvas !== c.canvas); -``` - -For closed iterators, a pool size of 1 is sufficient: - -```ts -const sink = new CanvasSink(videoTrack, { poolSize: 1 }); -const canvases = sink.canvases(); - -for await (const { canvas, timestamp } of canvases) { - // ... -} -``` - -## Audio data sinks - -These sinks can only be used with an `InputAudioTrack`. - -### `AudioSampleSink` - -Use this sink to extract decoded [audio samples](./packets-and-samples#audiosample) from an audio track. The sink will automatically handle the decoding internally. - -Create the sink like so: - -```ts -import { AudioSampleSink } from 'mediabunny'; - -const sink = new AudioSampleSink(audioTrack); -``` - -The methods for retrieving samples are analogous to those on `VideoSampleSink`. - -* `getSample`\ - Gets the sample for a given timestamp; see [Single retrieval](#single-retrieval). -* `samples`\ - Iterates over a range of samples; see [Range iteration](#range-iteration). -* `samplesAtTimestamps`\ - Iterates over samples at specific timestamps; see [Sparse iteration](#sparse-iteration). - -These methods yield [`AudioSample`](./packets-and-samples#audiosample) instances. - -For example, let's use this sink to calculate the average loudness of an audio track using [root mean square](https://en.wikipedia.org/wiki/Root_mean_square): - -```ts -const sink = new AudioSampleSink(audioTrack); - -let sumOfSquares = 0; -let totalSampleCount = 0; - -for await (const sample of sink.samples()) { - const bytesNeeded = sample.allocationSize({ format: 'f32', planeIndex: 0 }); - const floats = new Float32Array(bytesNeeded / 4); - sample.copyTo(floats, { format: 'f32', planeIndex: 0 }); - - for (let i = 0; i < floats.length; i++) { - sumOfSquares += floats[i] ** 2; - } - - totalSampleCount += floats.length; -} - -const averageLoudness = Math.sqrt(sumOfSquares / totalSampleCount); -``` - -### `AudioBufferSink` - -While `AudioSampleSink` extracts raw decoded audio samples, you can use `AudioBufferSink` to directly extract [`AudioBuffer`](https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer) instances instead. This is particularly useful when working with the Web Audio API. - -Create the sink like so: - -```ts -import { AudioBufferSink } from 'mediabunny'; - -const sink = new AudioBufferSink(audioTrack); -``` - -The methods for retrieving audio buffers are analogous to those on `VideoSampleSink`: - -* `getBuffer`\ - Gets the buffer for a given timestamp; see [Single retrieval](#single-retrieval). -* `buffers`\ - Iterates over a range of buffers; see [Range iteration](#range-iteration). -* `buffersAtTimestamps`\ - Iterates over buffers at specific timestamps; see [Sparse iteration](#sparse-iteration). - -These methods yield `WrappedAudioBuffer` instances: - -```ts -type WrappedAudioBuffer = { - // An AudioBuffer that can be used with the Web Audio API. - buffer: AudioBuffer; - // The timestamp of the corresponding audio sample, in seconds. - timestamp: number; - // The duration of the corresponding audio sample, in seconds. - duration: number; -}; -``` - -For example, let's use this sink to play the last 10 seconds of an audio track: - -```ts -const sink = new AudioBufferSink(audioTrack); -const audioContext = new AudioContext(); -const lastTimestamp = await audioTrack.computeDuration(); -const baseTime = audioContext.currentTime; - -for await (const { buffer, timestamp } of sink.buffers(lastTimestamp - 10)) { - const source = audioContext.createBufferSource(); - source.buffer = buffer; - source.connect(audioContext.destination); - source.start(baseTime + timestamp); -} -``` - ---- - ---- -url: /guide/media-sources.md ---- -# Media sources - -## Introduction - -*Media sources* provide APIs for adding media data to an output file. Different media sources provide different levels of abstraction and cater to different use cases. - -For information on how to use media sources to create output tracks, check [Writing media files](./writing-media-files). - -Most media sources follow this code pattern to add media data: - -```ts -await mediaSource.add(...); -``` - -### Closing sources - -When you're done using the source, meaning no additional media data will be added, it's best to close the source as soon as possible: - -```ts -mediaSource.close(); -``` - -Closing sources manually is *technically* not required and will happen automatically when finalizing the `Output`. However, if your `Output` has multiple tracks and not all of them finish supplying their data at the same time (for example, adding all audio first and then all video), closing sources early will improve performance and lower memory usage. This is because the `Output` can better "plan ahead", knowing it doesn't have to wait for certain tracks anymore (see [Packet buffering](./writing-media-files#packet-buffering)). Therefore, it is good practice to always manually close all media sources as soon as you are done using them. - -### Backpressure - -Media sources are the means by which backpressure is propagated from the output pipeline into your application logic. The `Output` may want to apply backpressure if the encoders or the [StreamTarget](./writing-media-files#streamtarget)'s writable can't keep up. - -Backpressure is communicated by media sources via promises. All media sources with an `add` method return a promise: - -```ts -mediaSource.add(...); // => Promise -``` - -This promise resolves when the source is ready to receive more data. In most cases, the promise will resolve instantly, but if some part of the output pipeline is overworked, it will remain pending until the output is ready to continue. Therefore, by awaiting this promise, you automatically propagate backpressure into your application logic: - -```ts -// Wrong: // [!code error] -while (notDone) { // [!code error] - mediaSource.add(...); // [!code error] -} // [!code error] - -// Correct: -while (notDone) { - await mediaSource.add(...); -} -``` - -### Video encoding config - -All video sources that handle encoding internally require you to specify a `VideoEncodingConfig`, specifying the codec configuration to use: - -```ts -type VideoEncodingConfig = { - codec: VideoCodec; - bitrate: number | Quality; - alpha?: 'discard' | 'keep'; - bitrateMode?: 'constant' | 'variable'; - latencyMode?: 'quality' | 'realtime'; - keyFrameInterval?: number; - fullCodecString?: string; - hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software'; - scalabilityMode?: string; - contentHint?: string; - sizeChangeBehavior?: 'deny' | 'passThrough' | 'fill' | 'contain' | 'cover'; - - onEncodedPacket?: ( - packet: EncodedPacket, - meta: EncodedVideoChunkMetadata | undefined - ) => unknown; - onEncoderConfig?: ( - config: VideoEncoderConfig - ) => unknown; -}; -``` - -* `codec`: The [video codec](./supported-formats-and-codecs#video-codecs) used for encoding. -* `bitrate`: The target number of bits per second. Alternatively, this can be a [subjective quality](#subjective-qualities). -* `alpha`: What to do with alpha data contained in the video samples. - * `'discard'` (default): Only the samples' color data is kept; the video is opaque. - * `'keep'`: The samples' alpha data is also encoded as side data. Make sure to pair this mode with a container format that supports transparency (such as WebM or Matroska). -* `bitrateMode`: Can be used to control constant vs. variable bitrate. -* `latencyMode`: The latency mode as specified by the WebCodecs API. Browsers default to `quality`. Media stream-driven video sources will automatically use the `realtime` setting. -* `keyFrameInterval`: The maximum interval in seconds between two adjacent key frames. Defaults to 5 seconds. More frequent key frames improve seeking behavior but increase file size. When using multiple video tracks, this value should be set to the same value for all tracks. -* `fullCodecString`: Allows you to optionally specify the full codec string used by the video encoder, as specified in the [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/). For example, you may set it to `'avc1.42001f'` when using AVC. Keep in mind that the codec string must still match the codec specified in `codec`. If you don't set this field, a codec string will be generated automatically. -* `hardwareAcceleration`: A hint that configures the hardware acceleration method of this codec. This is best left on `'no-preference'`. -* `scalabilityMode`: An encoding scalability mode identifier as defined by [WebRTC-SVC](https://w3c.github.io/webrtc-svc/#scalabilitymodes*). -* `contentHint`: An encoding video content hint as defined by [mst-content-hint](https://w3c.github.io/mst-content-hint/#video-content-hints). -* `sizeChangeBehavior`: Video frames may change size overtime. This field controls the behavior in case this happens. Defaults to `'deny'`. -* `onEncodedPacket`: Called for each successfully encoded packet. Useful for determining encoding progress. -* `onEncoderConfig`: Called when the internal encoder config, as used by the WebCodecs API, is created. You can use this to introspect the full codec string. - -### Audio encoding config - -All audio sources that handle encoding internally require you to specify an `AudioEncodingConfig`, specifying the codec configuration to use: - -```ts -type AudioEncodingConfig = { - codec: AudioCodec; - bitrate?: number | Quality; - bitrateMode?: 'constant' | 'variable'; - fullCodecString?: string; - - onEncodedPacket?: ( - packet: EncodedPacket, - meta: EncodedAudioChunkMetadata | undefined - ) => unknown; - onEncoderConfig?: ( - config: AudioEncoderConfig - ) => unknown; -}; -``` - -* `codec`: The [audio codec](./supported-formats-and-codecs#audio-codecs) used for encoding. Can be omitted for uncompressed PCM codecs. -* `bitrate`: The target number of bits per second. Alternatively, this can be a [subjective quality](#subjective-qualities). -* `bitrateMode`: Can be used to control constant vs. variable bitrate. -* `fullCodecString`: Allows you to optionally specify the full codec string used by the audio encoder, as specified in the [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/). For example, you may set it to `'mp4a.40.2'` when using AAC. Keep in mind that the codec string must still match the codec specified in `codec`. If you don't set this field, a codec string will be generated automatically. -* `onEncodedPacket`: Called for each successfully encoded packet. Useful for determining encoding progress. -* `onEncoderConfig`: Called when the internal encoder config, as used by the WebCodecs API, is created. You can use this to introspect the full codec string. - -### Subjective qualities - -Mediabunny provides five subjective quality options as an alternative to manually providing a bitrate. From a subjective quality, a bitrate will be calculated internally based on the codec and track information (width, height, sample rate, ...). - -```ts -import { - QUALITY_VERY_LOW, - QUALITY_LOW, - QUALITY_MEDIUM, - QUALITY_HIGH, - QUALITY_VERY_HIGH, -} from 'mediabunny'; -``` - -## Video sources - -Video sources feed data to video tracks on an `Output`. They all extend the abstract `VideoSource` class. - -### `VideoSampleSource` - -This source takes [video samples](./packets-and-samples#videosample), encodes them, and passes the encoded data to the output. - -```ts -import { VideoSampleSource } from 'mediabunny'; - -const sampleSource = new VideoSampleSource({ - codec: 'avc', - bitrate: 1e6, -}); - -await sampleSource.add(videoSample); -videoSample.close(); // If it's not needed anymore - -// You may optionally force samples to be encoded as key frames: -await sampleSource.add(videoSample, { keyFrame: true }); -``` - -### `CanvasSource` - -This source simplifies a common pattern: A single canvas is repeatedly updated in a render loop and each frame is added to the output file. - -```ts -import { CanvasSource, QUALITY_MEDIUM } from 'mediabunny'; - -const canvasSource = new CanvasSource(canvasElement, { - codec: 'av1', - bitrate: QUALITY_MEDIUM, -}); - -await canvasSource.add(0.0, 0.1); // Timestamp, duration (in seconds) -await canvasSource.add(0.1, 0.1); -await canvasSource.add(0.2, 0.1); - -// You may optionally force frames to be encoded as key frames: -await canvasSource.add(0.3, 0.1, { keyFrame: true }); -``` - -### `MediaStreamVideoTrackSource` - -This is a source for use with the [Media Capture and Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API). Use this source if you want to pipe a real-time video source (such as a webcam or screen recording) to an output file. - -```ts -import { MediaStreamVideoTrackSource } from 'mediabunny'; - -// Get the user's screen -const stream = await navigator.mediaDevices.getDisplayMedia({ video: true }); -const videoTrack = stream.getVideoTracks()[0]; - -const videoTrackSource = new MediaStreamVideoTrackSource(videoTrack, { - codec: 'vp9', - bitrate: 1e7, -}); - -// Make sure to allow any internal errors to properly bubble up -videoTrackSource.errorPromise.catch((error) => ...); -``` - -This source requires no additional method calls; data will automatically be captured and piped to the output file as soon as `start()` is called on the `Output`. Make sure to `stop()` on `videoTrack` after finalizing the `Output` if you don't need the user's media anymore. - -If you want to temporarily stop capturing video frames from this source, you can use the `pause()` and `resume()` methods: - -```ts -videoTrackSource.pause(); - -// Later: -videoTrackSource.resume(); -``` - -While paused, video frames emitted by the stream will be ignored. When resumed, video frames are let through again, offset in timestamp such that the result plays back continuously with no gap in playback. Note that pausing does *not* stop the underlying media stream. - -::: info -If this source is the only MediaStreamTrack source in the `Output`, then the first video sample added by it starts at timestamp 0. If there are multiple, then the earliest media sample across all tracks starts at timestamp 0, and all tracks will be perfectly synchronized with each other. -::: - -::: warning -`MediaStreamVideoTrackSource`'s internals are detached from the typical code flow but can still throw, so make sure to utilize `errorPromise` to deal with any errors and to stop the `Output`. -::: - -### `EncodedVideoPacketSource` - -The most barebones of all video sources, this source can be used to directly pipe [encoded packets](./packets-and-samples#encodedpacket) of video data to the output. This source requires that you take care of the encoding process yourself, which enables you to use the WebCodecs API manually or to plug in your own encoding stack. Alternatively, you may retrieve the encoded packets directly by reading them from another media file, allowing you to skip decoding and reencoding video data. - -```ts -import { EncodedVideoPacketSource } from 'mediabunny'; - -// You must specify the codec name: -const packetSource = new EncodedVideoPacketSource('vp9'); - -await packetSource.add(packet1); -await packetSource.add(packet2); -``` - -> \[!IMPORTANT] -> You must add the packets in decode order. - -You will need to provide additional metadata alongside your first call to `add` to give the `Output` more information about the shape and form of the video data. This metadata must be in the form of the WebCodecs API's `EncodedVideoChunkMetadata`. It might look like this: - -```ts -await packetSource.add(firstPacket, { - decoderConfig: { - codec: 'vp09.00.31.08', - codedWidth: 1280, - codedHeight: 720, - colorSpace: { - primaries: 'bt709', - transfer: 'iec61966-2-1', - matrix: 'smpte170m', - fullRange: false, - }, - description: undefined, - }, -}); -``` - -`codec`, `codedWidth`, and `codedHeight` are required for all codecs, whereas `description` is required for some codecs. Additional fields, such as `colorSpace`, are optional. The [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/) specifies the formats of `codec` and `description` for each video codec, which you must adhere to. - -#### B-frames - -Some video codecs use *B-frames*, which are frames that require both the previous and the next frame to be decoded. For example, you may have something like this: - -```md -Frame 1: 0.0s, I-frame (key frame) -Frame 2: 0.1s, B-frame -Frame 3: 0.2s, P-frame -``` - -The decode order for these frames will be: - -```md -Frame 1 -> Frame 3 -> Frame 2 -``` - -Some file formats have an explicit notion of both a "decode timestamp" and a "presentation timestamp" to model B-frames or out-of-order decoding. However, Mediabunny packets only specify their *presentation timestamp*. Decode order is determined by the order in which you add the packets, so in our example, you must add the packets like this: - -```ts -await packetSource.add(packetForFrame1); // 0.0s -await packetSource.add(packetForFrame3); // 0.2s -await packetSource.add(packetForFrame2); // 0.1s -``` - -You are allowed to provide wildly out-of-order presentation timestamp sequences, but there is a hard constraint: - -> \[!IMPORTANT] -> A packet you add must not have a smaller timestamp than the largest timestamp you added before adding the last key frame. - -This is quite a mouthful, so this example will hopefully clarify it: - -```md -# Legal: -Packet 1: 0.0s, key frame -Packet 2: 0.3s, delta frame -Packet 3: 0.2s, delta frame -Packet 4: 0.1s, delta frame -Packet 5: 0.4s, key frame -Packet 6: 0.5s, delta frame - -# Also legal: -Packet 1: 0.0s, key frame -Packet 2: 0.3s, delta frame -Packet 3: 0.2s, delta frame -Packet 4: 0.1s, delta frame -Packet 5: 0.4s, key frame -Packet 6: 0.35s, delta frame -Packet 7: 0.3s, delta frame -Packet 8: 0.5s, delta frame - -# Illegal: -Packet 1: 0.0s, key frame -Packet 2: 0.3s, delta frame -Packet 3: 0.2s, delta frame -Packet 4: 0.1s, delta frame -Packet 5: 0.4s, key frame -Packet 6: 0.25s, delta frame -``` - -## Audio sources - -Audio sources feed data to audio tracks on an `Output`. They all extend the abstract `AudioSource` class. - -### `AudioSampleSource` - -This source takes [audio samples](./packets-and-samples#audiosample), encodes them, and passes the encoded data to the output. - -```ts -import { AudioSampleSource } from 'mediabunny'; - -const sampleSource = new AudioSampleSource({ - codec: 'aac', - bitrate: 128e3, -}); - -await sampleSource.add(audioSample); -audioSample.close(); // If it's not needed anymore -``` - -### `AudioBufferSource` - -This source directly accepts instances of `AudioBuffer` as data, simplifying usage with the Web Audio API. The first AudioBuffer will be played at timestamp 0, and any subsequent AudioBuffer will be appended after all previous AudioBuffers. - -```ts -import { AudioBufferSource, QUALITY_MEDIUM } from 'mediabunny'; - -const bufferSource = new AudioBufferSource({ - codec: 'opus', - bitrate: QUALITY_MEDIUM, -}); - -await bufferSource.add(audioBuffer1); -await bufferSource.add(audioBuffer2); -await bufferSource.add(audioBuffer3); -``` - -### `MediaStreamAudioTrackSource` - -This is a source for use with the [Media Capture and Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Media_Capture_and_Streams_API). Use this source if you want to pipe a real-time audio source (such as a microphone or audio from the user's computer) to an output file. - -```ts -import { MediaStreamAudioTrackSource } from 'mediabunny'; - -// Get the user's microphone -const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); -const audioTrack = stream.getAudioTracks()[0]; - -const audioTrackSource = new MediaStreamAudioTrackSource(audioTrack, { - codec: 'opus', - bitrate: 128e3, -}); - -// Make sure to allow any internal errors to properly bubble up -audioTrackSource.errorPromise.catch((error) => ...); -``` - -This source requires no additional method calls; data will automatically be captured and piped to the output file as soon as `start()` is called on the `Output`. Make sure to `stop()` on `audioTrack` after finalizing the `Output` if you don't need the user's media anymore. - -If you want to temporarily stop capturing audio data from this source, you can use the `pause()` and `resume()` methods: - -```ts -audioTrackSource.pause(); - -// Later: -audioTrackSource.resume(); -``` - -While paused, audio data emitted by the stream will be ignored. When resumed, audio data are let through again, offset in timestamp such that the result plays back continuously with no gap in playback. Note that pausing does *not* stop the underlying media stream. - -::: info -If this source is the only MediaStreamTrack source in the `Output`, then the first audio sample added by it starts at timestamp 0. If there are multiple, then the earliest media sample across all tracks starts at timestamp 0, and all tracks will be perfectly synchronized with each other. -::: - -::: warning -`MediaStreamAudioTrackSource`'s internals are detached from the typical code flow but can still throw, so make sure to utilize `errorPromise` to deal with any errors and to stop the `Output`. -::: - -### `EncodedAudioPacketSource` - -The most barebones of all audio sources, this source can be used to directly pipe [encoded packets](./packets-and-samples#encodedpacket) of audio data to the output. This source requires that you take care of the encoding process yourself, which enables you to use the WebCodecs API manually or to plug in your own encoding stack. Alternatively, you may retrieve the encoded packets directly by reading them from another media file, allowing you to skip decoding and reencoding audio data. - -```ts -import { EncodedAudioPacketSource } from 'mediabunny'; - -// You must specify the codec name: -const packetSource = new EncodedAudioPacketSource('aac'); - -await packetSource.add(packet); -``` - -You will need to provide additional metadata alongside your first call to `add` to give the `Output` more information about the shape and form of the audio data. This metadata must be in the form of the WebCodecs API's `EncodedAudioChunkMetadata`. It might look like this: - -```ts -await packetSource.add(firstPacket, { - decoderConfig: { - codec: 'mp4a.40.2', - numberOfChannels: 2, - sampleRate: 48000, - description: new Uint8Array([17, 144]), - }, -}); -``` - -`codec`, `numberOfChannels`, and `sampleRate` are required for all codecs, whereas `description` is required for some codecs. The [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/) specifies the formats of `codec` and `description` for each audio codec, which you must adhere to. - -## Subtitle sources - -Subtitle sources feed data to subtitle tracks on an `Output`. They all extend the abstract `SubtitleSource` class. - -### `TextSubtitleSource` - -This source feeds subtitle cues to the output from a text file in which the subtitles are defined. - -```ts -import { TextSubtitleSource } from 'mediabunny'; - -const textSource = new TextSubtitleSource('webvtt'); - -const text = -`WEBVTT - -00:00:00.000 --> 00:00:02.000 -This is your last chance. - -00:00:02.500 --> 00:00:04.000 -After this, there is no turning back. - -00:00:04.500 --> 00:00:06.000 -If you take the blue pill, the story ends. - -00:00:06.500 --> 00:00:08.000 -You wake up in your bed and believe whatever you want to believe. - -00:00:08.500 --> 00:00:10.000 -If you take the red pill, you stay in Wonderland - -00:00:10.500 --> 00:00:12.000 -and I show you how deep the rabbit hole goes. -`; - -await textSource.add(text); -``` - -If you add the entire subtitle file at once, make sure to [close the source](#closing-sources) immediately after: - -```ts -textSource.close(); -``` - -You can also add cues individually in small chunks: - -```ts -import { TextSubtitleSource } from 'mediabunny'; - -const textSource = new TextSubtitleSource('webvtt'); - -await textSource.add('WEBVTT\n\n'); -await textSource.add('00:00:00.000 --> 00:00:02.000\nHello there!\n\n'); -await textSource.add('00:00:02.500 --> 00:00:04.000\nChunky chunks.\n\n'); -``` - -The chunks have certain constraints: A cue must be fully contained within a chunk and cannot be split across multiple smaller chunks (although a chunk can contain multiple cues). Also, the WebVTT preamble must be added first and all at once. - -::: info -For QuickTime to display WebVTT subtitles, it typically expects alignment information to be specified: - -``` -00:00:00.000 --> 00:00:02.000 align:center -This is your last chance. -``` - -::: - ---- - ---- -url: /llms.md ---- -# Mediabunny and LLMs - -While Mediabunny is proudly human-generated, we want to encourage any and all usage of Mediabunny, even when the vibes are high. - -Mediabunny is still new and is unlikely to be in the training data of modern LLMs, but we can still make the AI perform extremely well by just giving it a little more context. - -*** - -Give one or more of these files to your LLM: - -### [mediabunny.d.ts](/mediabunny.d.ts) - -This file contains the entire public TypeScript API of Mediabunny and is commented extremely thoroughly. - -### [llms.txt](/llms.txt) - -This file provides an index of Mediabunny's guide, which the AI can then further dive into if it wants to. - -### [llms-full.txt](/llms-full.txt) - -This is just the entire Mediabunny guide in a single file. - ---- - ---- -url: /guide/output-formats.md ---- -# Output formats - -## Introduction - -An *output format* specifies the container format of the data written by an `Output`. Mediabunny supports many commonly used container formats, each having format-specific options. - -Many formats also offer *data callbacks*, which are special callbacks that fire for specific data regions in the output file. - -### Output format properties - -All output formats have a common set of properties you can query. - -```ts -// Get the format's file extension: -format.fileExtension; // => '.mp4' - -// Get the format's base MIME type: -format.mimeType; // => 'video/mp4' - -// Check which codecs can be contained by the format: -format.getSupportedCodecs(); // => MediaCodec[] -format.getSupportedVideoCodecs(); // => VideoCodec[] -format.getSupportedAudioCodecs(); // => AudioCodec[] -format.getSupportedSubtitleCodecs(); // => SubtitleCodec[] - -// Check if the format supports video tracks with rotation metadata: -format.supportsVideoRotationMetadata; // => boolean -``` - -Refer to the [compatibility table](./supported-formats-and-codecs.md#compatibility-table) to see which codecs can be used with which output format. - -Formats also differ in the amount and types of tracks they can contain. You can retrieve this information using: - -```ts -format.getSupportedTrackCounts(); // => TrackCountLimits - -type TrackCountLimits = { - video: { min: number, max: number }, - audio: { min: number, max: number }, - subtitle: { min: number, max: number }, - total: { min: number, max: number }, -}; -``` - -### Append-only writing - -Some output format configurations write in an *append-only* fashion. This means they only ever add new data to the end, and never have to seek back to overwrite a previously-written section of the file. Or, put formally: the byte offset of any write is exactly equal to the number of bytes written before it. - -Append-only formats, in combination with [`StreamTarget`](./writing-media-files#streamtarget), have some useful properties. They enable use with [Media Source Extensions](https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API) and allow for trivial streaming across the network, such as for file uploads. - -## MP4 - -This output format creates MP4 files. - -```ts -import { Output, Mp4OutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new Mp4OutputFormat(options), - // ... -}); -``` - -The following options are available: - -```ts -type IsobmffOutputFormatOptions = { - fastStart?: false | 'in-memory' | 'reserve' | 'fragmented'; - minimumFragmentDuration?: number; - metadataFormat?: 'mdir' | 'mdta' | 'udta' | 'auto'; - - onFtyp?: (data: Uint8Array, position: number) => unknown; - onMoov?: (data: Uint8Array, position: number) => unknown; - onMdat?: (data: Uint8Array, position: number) => unknown; - onMoof?: (data: Uint8Array, position: number, timestamp: number) => unknown; -}; -``` - -* `fastStart`\ - Controls the placement of metadata in the file. Placing metadata at the start of the file is known as "Fast Start" and provides certain benefits: The file becomes easier to stream over the web without range requests, and sites like YouTube can start processing the video while it's uploading. However, placing metadata at the start of the file can require more processing and memory in the writing step. This library provides full control over the placement of metadata by setting `fastStart` to one of these options: - * `false`\ - Disables Fast Start, placing the metadata at the end of the file. Fastest and uses the least memory. - * `'in-memory'`\ - Produces a file with Fast Start by keeping all media chunks in memory until the file is finalized. This produces a high-quality and compact output at the cost of a more expensive finalization step and higher memory requirements. - ::: info - This option ensures [append-only writing](#append-only-writing), although all the writing happens in bulk, at the end. - ::: - * `'reserve'`\ - Produces a file with Fast Start by reserving space at the start of the file into which the metadata will be written later. This requires knowledge about the expected length of the file beforehand. When using this option, you must set the [`maximumPacketCount`](../api/BaseTrackMetadata#maximumpacketcount) field in the track metadata for all tracks. - * `'fragmented'`\ - Produces a *fragmented MP4 (fMP4)* file, evenly placing sample metadata throughout the file by grouping it into "fragments" (short sections of media), while placing general metadata at the beginning of the file. Fragmented files are ideal in streaming contexts, as each fragment can be played individually without requiring knowledge of the other fragments. Furthermore, they remain lightweight to create no matter how large the file becomes, as they don't require media to be kept in memory for very long. However, fragmented files are not as widely and wholly supported as regular MP4 files, and some players don't provide seeking functionality for them. - ::: info - This option ensures [append-only writing](#append-only-writing). - ::: - ::: warning - This option requires [packet buffering](./writing-media-files#packet-buffering). - ::: - * `undefined`\ - The default option; it behaves like `'in-memory'` when using [`BufferTarget`](./writing-media-files#buffertarget) and like `false` otherwise. -* `minimumFragmentDuration`\ - Only relevant when `fastStart` is `'fragmented'`. Sets the minimum duration in seconds a fragment must have to be finalized and written to the file. Defaults to 1 second. -* `metadataFormat`\ - The metadata format to use for writing metadata tags. - * `'auto'` (default): Behaves like `'mdir'` for MP4 and like `'udta'` for QuickTime, matching FFmpeg's default behavior. - * `'mdir'`: Write tags into `moov/udta/meta` using the 'mdir' handler format. - * `'mdta'`: Write tags into `moov/udta/meta` using the 'mdta' handler format, equivalent to FFmpeg's `use_metadata_tags` flag. This allows for custom keys of arbitrary length. - * `'udta'`: Write tags directly into `moov/udta`. -* `onFtyp`\ - Will be called once the ftyp (File Type) box of the output file has been written. -* `onMoov`\ - Will be called once the moov (Movie) box of the output file has been written. -* `onMdat`\ - Will be called for each finalized mdat (Media Data) box of the output file. Usage of this callback is not recommended when not using `fastStart: 'fragmented'`, as there will be one monolithic mdat box which might require large amounts of memory. -* `onMoof`\ - Will be called for each finalized moof (Movie Fragment) box of the output file. The fragment's start timestamp in seconds is also passed. - -## QuickTime File Format (.mov) - -This output format creates QuickTime files (.mov). - -```ts -import { Output, MovOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new MovOutputFormat(options), - // ... -}); -``` - -The available options are the same `IsobmffOutputFormatOptions` used by [MP4](#mp4). - -## WebM - -This output format creates WebM files. - -```ts -import { Output, WebMOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new WebMOutputFormat(options), - // ... -}); -``` - -The following options are available: - -```ts -type MkvOutputFormatOptions = { - appendOnly?: boolean; - minimumClusterDuration?: number; - - onEbmlHeader?: (data: Uint8Array, position: number) => void; - onSegmentHeader?: (data: Uint8Array, position: number) => unknown; - onCluster?: (data: Uint8Array, position: number, timestamp: number) => unknown; -}; -``` - -* `appendOnly`\ - Configures the output to write data in an append-only fashion. This is useful for live-streaming the output as it's being created. Note that when enabled, certain features like file duration or seeking will be disabled or impacted, so don't use this option when you want to write out a media file for later use. - ::: info - This option ensures [append-only writing](#append-only-writing). - ::: -* `minimumClusterDuration`\ - Sets the minimum duration in seconds a cluster must have to be finalized and written to the file. Defaults to 1 second. -* `onEbmlHeader`\ - Will be called once the EBML header of the output file has been written. -* `onSegmentHeader`\ - Will be called once the header part of the Matroska Segment element has been written. The header data includes the Segment element and everything inside it, up to (but excluding) the first Matroska Cluster. -* `onCluster`\ - Will be called for each finalized Matroska Cluster of the output file. The cluster's start timestamp in seconds is also passed. - -## Matroska (.mkv) - -This output format creates Matroska files (.mkv). - -```ts -import { Output, MkvOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new MkvOutputFormat(options), - // ... -}); -``` - -The available options are the same `MkvOutputFormatOptions` used by [WebM](#webm). - -## Ogg - -This output format creates Ogg files. - -```ts -import { Output, OggOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new OggOutputFormat(options), - // ... -}); -``` - -::: info -This format ensures [append-only writing](#append-only-writing). -::: - -The following options are available: - -```ts -type OggOutputFormatOptions = { - onPage?: (data: Uint8Array, position: number, source: MediaSource) => unknown; -}; -``` - -* `onPage`\ - Will be called for each finalized Ogg page of the output file. The [media source](./media-sources) backing the page's track (logical bitstream) is also passed. - -## MP3 - -This output format creates MP3 files. - -```ts -import { Output, Mp3OutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new Mp3OutputFormat(options), - // ... -}); -``` - -The following options are available: - -```ts -type Mp3OutputFormatOptions = { - xingHeader?: boolean; - onXingFrame?: (data: Uint8Array, position: number) => unknown; -}; -``` - -* `xingHeader`\ - Controls whether the Xing header, which contains additional metadata as well as an index, is written to the start of the MP3 file. Defaults to `true`. - ::: info - When set to `false`, this option ensures [append-only writing](#append-only-writing). - ::: -* `onXingFrame`\ - Will be called once the Xing metadata frame is finalized, which happens at the end of the writing process. This callback only fires if `xingHeader` isn't set to `false`. - -::: info -Most browsers don't support encoding MP3. Use the official [`@mediabunny/mp3-encoder`](./extensions/mp3-encoder) package to polyfill an encoder. -::: - -## WAVE - -This output format creates WAVE (.wav) files. - -```ts -import { Output, WavOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new WavOutputFormat(options), - // ... -}); -``` - -The following options are available: - -```ts -type WavOutputFormatOptions = { - large?: boolean; - metadataFormat?: 'info' | 'id3'; - onHeader?: (data: Uint8Array, position: number) => unknown; -}; -``` - -* `large`\ - When enabled, an RF64 file be written, allowing for file sizes to exceed 4 GiB, which is otherwise not possible for regular WAVE files. -* `metadataFormat`\ - The metadata format to use for writing metadata tags. - * `'info'` (default): Writes metadata into a RIFF INFO LIST chunk, the default way to contain metadata tags within WAVE. Only allows for a limited subset of tags to be written. - * `'id3'`: Writes metadata into an ID3 chunk. Non-default, but used by many taggers in practice. Allows for a much larger and richer set of tags to be written. -* `onHeader`\ - Will be called once the file header is written. The header consists of the RIFF header, the format chunk, and the start of the data chunk (with a placeholder size of 0). - -## ADTS - -This output format creates ADTS (.aac) files. - -```ts -import { Output, AdtsOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new AdtsOutputFormat(options), - // ... -}); -``` - -The following options are available: - -```ts -type AdtsOutputFormatOptions = { - onFrame?: (data: Uint8Array, position: number) => unknown; -}; -``` - -* `onFrame`\ - Will be called for each ADTS frame that is written. - -## FLAC - -This output format creates FLAC (.flac) files. - -```ts -import { Output, FlacOutputFormat } from 'mediabunny'; - -const output = new Output({ - format: new FlacOutputFormat(options), - // ... -}); -``` - -The following options are available: - -```ts -type FlacOutputFormatOptions = { - onFrame?: (data: Uint8Array, position: number) => unknown; -}; -``` - -* `onFrame`\ - Will be called for each FLAC frame that is written. - ---- - ---- -url: /guide/packets-and-samples.md ---- -# Packets & samples - -## Introduction - -Media data in Mediabunny is present in two different forms: - -* **Packet:** Encoded media data, the result of an encoding process -* **Sample:** Raw, uncompressed, presentable media data - -In addition to data, both packets and samples carry additional metadata, such as timestamp, duration, width, etc. - -Packets are represented with the `EncodedPacket` class, which is used for both video and audio packets. Samples are represented with the `VideoSample` and `AudioSample` classes: - -* `VideoSample`: Represents a single frame of video. -* `AudioSample`: Represents a (typically short) section of audio. - -Samples can be encoded into packets, and packets can be decoded into samples: - -```mermaid -flowchart LR - A[VideoSample] - B[AudioSample] - C[EncodedPacket] - D[VideoSample] - E[AudioSample] - - A -- encode --> C - B -- encode --> C - C -- decode --> D - C -- decode --> E -``` - -### Connection to WebCodecs - -Packets and samples in Mediabunny correspond directly with concepts of the [WebCodecs API](https://w3c.github.io/webcodecs/): - -* `EncodedPacket`\ - -> `EncodedVideoChunk` for video packets\ - -> `EncodedAudioChunk` for audio packets -* `VideoSample` - -> `VideoFrame` -* `AudioSample` - -> `AudioData` - -Since Mediabunny makes heavy use of WebCodecs API, its own classes are typically used as wrappers around the WebCodecs classes. However, this wrapping comes with a few benefits: - -1. **Independence:** This library remains functional even if the WebCodecs API isn't available. Encoders and decoders can be polyfilled using [custom coders](./supported-formats-and-codecs#custom-coders), and the library can run in non-browser contexts such as Node.js. -2. **Extensibility:** The wrappers serve as a namespace for additional operations, such as `toAudioBuffer()` on `AudioSample`, or `draw()` on `VideoSample`. -3. **Consistency:** While WebCodecs uses integer microsecond timestamps, Mediabunny uses floating-point second timestamps everywhere. With these wrappers, all timing information is always in seconds and the user doesn't need to think about unit conversions. - -Conversion is easy: - -```ts -import { EncodedPacket, VideoSample, AudioSample } from 'mediabunny'; - -// EncodedPacket to WebCodecs chunks: -encodedPacket.toEncodedVideoChunk(); // => EncodedVideoChunk -encodedPacket.toEncodedAudioChunk(); // => EncodedAudioChunk -// WebCodecs chunks to EncodedPacket: -EncodedPacket.fromEncodedChunk(videoChunk); // => EncodedPacket -EncodedPacket.fromEncodedChunk(audioChunk); // => EncodedPacket - -// VideoSample to VideoFrame: -videoSample.toVideoFrame(); // => VideoFrame -// VideoFrame to VideoSample: -new VideoSample(videoFrame); // => VideoSample - -// AudioSample to AudioData: -audioSample.toAudioData(); // => AudioData -// AudioData to AudioSample: -new AudioSample(audioData); // => AudioSample -``` - -::: info -`VideoSample`/`AudioSample` instances created from their WebCodecs API counterpart are very efficient; they simply maintain a reference to the underlying WebCodecs API instance and do not perform any unnecessary copying. -::: - -### Negative timestamps - -While packet and sample durations cannot be negative, packet and sample timestamps can. - -A negative timestamp represents a sample that starts playing before the composition does (the composition always starts at 0). Negative timestamps are typically a result of a track being trimmed at the start, either to cut off a piece of media or to synchronize it with the other tracks. Therefore, you should avoid presenting any sample with a negative timestamp. - -## `EncodedPacket` - -An encoded packet represents encoded media data of any type (video or audio). They are the result of an *encoding process*, and you can turn encoded packets into actual media data using a *decoding process*. - -### Creating packets - -To create an `EncodedPacket`, you can use its constructor: - -```ts -constructor( - data: Uint8Array, - type: 'key' | 'delta', - timestamp: number, // in seconds - duration: number, // in seconds - sequenceNumber?: number, - byteLength?: number, -); -``` - -::: info -You probably won't ever need to set `sequenceNumber` or `byteLength` in the constructor. -::: - -For example, here we're creating a packet from some encoded video data: - -```ts -import { EncodedPacket } from 'mediabunny'; - -const encodedVideoData = new Uint8Array([...]); -const encodedPacket = new EncodedPacket(encodedVideoData, 'key', 5, 1/24); -``` - -Alternatively, if you're coming from WebCodecs encoded chunks, you can create an `EncodedPacket` from them: - -```ts -import { EncodedPacket } from 'mediabunny'; - -// From EncodedVideoChunk: -const encodedPacket = EncodedPacket.fromEncodedChunk(encodedVideoChunk); - -// From EncodedAudioChunk: -const encodedPacket = EncodedPacket.fromEncodedChunk(encodedAudioChunk); -``` - -### Inspecting packets - -Encoded packets have a bunch of read-only data you can inspect. You can get the encoded data like so: - -```ts -encodedPacket.data; // => Uint8Array -``` - -You can query the type of packet: - -```ts -encodedPacket.type; // => PacketType ('key' | 'delta') -``` - -* A *key packet* can be decoded directly, independently of other packets. -* A *delta packet* can only be decoded after the packet before it has been decoded. - -For example, in a video track, it is common to have a key frame about every few seconds. When seeking, if the user seeks to a position shortly after a key frame, the decoded data can be shown quickly; if they seek far away from a key frame, the decoder must first crunch through many delta frames before it can show anything. - -#### Determining a packet's actual type - -The `type` field is derived from metadata in the containing file, which can sometimes (in rare cases) be incorrect. To determine a packet's actual type with certainty, you can do this: - -```ts -// `packet` must come from the InputTrack `track` -const type = await track.determinePacketType(packet); // => PacketType | null -``` - -This determines the packet's type by looking into its bitstream. `null` is returned when the type couldn't be determined. - -*** - -You can query the packet's timing information: - -```ts -encodedPacket.timestamp; // => Presentation timestamp in seconds -encodedPacket.duration; // => Duration in seconds - -// There also exist integer microsecond versions of these: -encodedPacket.microsecondTimestamp; -encodedPacket.microsecondDuration; -``` - -`timestamp` and `duration` are both given as floating-point numbers. - -::: warning -Timestamps can be [negative](#negative-timestamps). -::: - -*** - -A packet also has a quantity known as a *sequence number*: - -```ts -encodedPacket.sequenceNumber; // => number -``` - -When [reading packets from an input file](./media-sinks#encodedpacketsink), this number specifies the relative ordering of packets. If packet $A$ has a lower sequence number than packet $B$, then packet $A$ comes first (in [decode order](./media-sinks#decode-vs-presentation-order)). If two packets have the same sequence number, then they represent the same media sample. - -Sequence numbers have no meaning on their own and only make sense when comparing them to other sequence numbers. If a packet has sequence number $n$, it does not mean that it is the $n$th packet of the track. - -Negative sequence numbers mean the packet's ordering is undefined. When creating an `EncodedPacket`, the sequence number defaults to -1. - -### Cloning packets - -Use the `clone` method to create a new packet from an existing packet. While doing so, you can change its timestamp and duration. - -```ts -// Creates a clone identical to the original: -packet.clone(); - -// Creates a clone with the timestamp set to 10 seconds: -packet.clone({ timestamp: 10 }); -``` - -### Metadata-only packets - -[`EncodedPacketSink`](./media-sinks#encodedpacketsink) can create *metadata-only* packets: - -```ts -await sink.getFirstPacket({ metadataOnly: true }); -``` - -Metadata-only packets contain all the metadata of the full packet, but do not contain any data: - -```ts -packet.data; // => Uint8Array([]) -``` - -You can still retrieve the *size* that the data would have: - -```ts -packet.byteLength; // => number -``` - -Given a packet, you can check if it is metadata-only like so: - -```ts -packet.isMetadataOnly; // => boolean -``` - -## `VideoSample` - -A video sample represents a single frame of video. It can be created directly from an image source, or be the result of a decoding process. Its API is modeled after [VideoFrame](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame). - -### Creating video samples - -Video samples have an image source constructor and a raw constructor. - -::: info -The constructor of `VideoSample` is very similar to [`VideoFrame`'s constructor](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/VideoFrame), but uses second timestamps instead of microsecond timestamps. -::: - -#### Image source constructor - -This constructor creates a `VideoSample` from a `CanvasImageSource`: - -```ts -import { VideoSample } from 'mediabunny'; - -// Creates a sample from a canvas element -const sample = new VideoSample(canvas, { - timestamp: 3, // in seconds - duration: 1/24, // in seconds -}); - -// Creates a sample from an image element, with some added rotation -const sample = new VideoSample(imageElement, { - timestamp: 5, // in seconds - rotation: 90, // in degrees clockwise -}); - -// Creates a sample from a VideoFrame (timestamp will be copied) -const sample = new VideoSample(videoFrame); -``` - -#### Raw constructor - -This constructor creates a `VideoSample` from raw pixel data given in an `ArrayBuffer`: - -```ts -import { VideoSample } from 'mediabunny'; - -// Creates a sample from pixel data in the RGBX format -const sample = new VideoSample(buffer, { - format: 'RGBX', - codedWidth: 1280, - codedHeight: 720, - timestamp: 0, -}); - -// Creates a sample from pixel data in the YUV 4:2:0 format -const sample = new VideoSample(buffer, { - format: 'I420', - codedWidth: 1280, - codedHeight: 720, - timestamp: 0, -}); -``` - -See [`VideoPixelFormat`](https://w3c.github.io/webcodecs/#enumdef-videopixelformat) for a list of pixel formats supported by WebCodecs. - -### Inspecting video samples - -A `VideoSample` has several read-only properties: - -```ts -// The internal pixel format in which the frame is stored -videoSample.format; // => VideoPixelFormat | null - -// Raw dimensions of the sample -videoSample.codedWidth; // => number -videoSample.codedHeight; // => number - -// Transformed display dimensions of the sample (after rotation) -videoSample.displayWidth; // => number -videoSample.displayHeight; // => number - -// Rotation of the sample in degrees clockwise. The raw sample should be -// rotated by this amount when it is presented. -videoSample.rotation; // => 0 | 90 | 180 | 270 - -// Timing information -videoSample.timestamp; // => Presentation timestamp in seconds -videoSample.duration; // => Duration in seconds -videoSample.microsecondTimestamp; // => Presentation timestamp in microseconds -videoSample.microsecondDuration; // => Duration in microseconds - -// Color space of the sample -videoSample.colorSpace; // => VideoColorSpace -``` - -While all of these properties are read-only, you can use the `setTimestamp`, `setDuration` and `setRotation` methods to modify some of the metadata of the video sample. - -::: warning -Timestamps can be [negative](#negative-timestamps). -::: - -### Using video samples - -Video samples provide a couple of ways with which you can access its frame data. - -You can convert a video sample to a WebCodecs [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame) to access additional data or to pass it to a [`VideoEncoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoEncoder): - -```ts -videoSample.toVideoFrame(); // => VideoFrame -``` - -This method is virtually free if the video sample was constructed using a `VideoFrame`. - -::: warning -The `VideoFrame` returned by this method **must** be closed separately from the video sample. -::: - -*** - -It's also common to draw video samples to a `` element or an `OffscreenCanvas`. For this, you can use the following methods: - -```ts -draw( - context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, - dx: number, - dy: number, - dWidth?: number, // defaults to displayWidth - dHeight?: number, // defaults to displayHeight -): void; - -draw( - context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, - sx: number, - sy: number, - sWidth: number, - sHeight: number, - dx: number, - dy: number, - dWidth?: number, // defaults to sWidth - dHeight?: number, // defaults to sHeight -): void; -``` - -These methods behave like [drawImage](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage) and paint the video frame at the given position with the given dimensions. This method will automatically draw the frame with the correct rotation based on its `rotation` property. - -The `drawWithFit` method can be used to draw the video sample to fill an entire canvas with a specified fitting algorithm: - -```ts -drawWithFit( - context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, - options: { - fit: 'fill' | 'contain' | 'cover'; - rotation?: Rotation; // Overrides the sample's rotation - crop?: CropRectangle; - }, -): void; -``` - -If you want to draw the raw underlying image to a canvas directly (without respecting the rotation metadata), then you can use the following method: - -```ts -videoSample.toCanvasImageSource(); // => VideoFrame | OffscreenCanvas; -``` - -This method returns a valid `CanvasImageSource` you can use with [drawImage](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage). - -::: warning -If this method returns a `VideoFrame`, you should use that frame immediately. This is because any internally-created video frames will automatically be closed in the next microtask. -::: - -*** - -Sometimes you may want direct access to the underlying pixel data. To do this, `VideoSample` allows you to copy this data into an `ArrayBuffer`. - -Use `allocationSize` to determine how many bytes are needed: - -```ts -const bytesNeeded = videoSample.allocationSize(); // => number -``` - -Then, use `copyTo` to copy the pixel data into the destination buffer: - -```ts -const bytes = new Uint8Array(bytesNeeded); -videoSample.copyTo(bytes); -``` - -::: info -The data will always be in the pixel format specified in the `format` field. - -To convert the data into a different pixel format, or to extract only a section of the frame, please use the [`allocationSize`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/allocationSize) and [`copyTo`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/copyTo) methods on `VideoFrame` instead. Get a `VideoFrame` by running `videoSample.toVideoFrame()`. -::: - -*** - -You can also clone a `VideoSample`: - -```ts -const clonedSample = videoSample.clone(); // => VideoSample -``` - -The cloned sample **must** be closed separately from the original sample. - -### Closing video samples - -You must manually close a `VideoSample` after you've used it to free internally-held resources. Do this by calling the `close` method: - -```ts -videoSample.close(); -``` - -Try to close a `VideoSample` as soon as you don't need it anymore. Unclosed video samples can lead to high VRAM usage and decoder stalls. - -After a `VideoSample` has been closed, its data becomes unavailable and most of its methods will throw an error. - -## `AudioSample` - -An audio sample represents a section of audio data. It can be created directly from raw audio data, or be the result of a decoding process. Its API is modeled after [AudioData](https://developer.mozilla.org/en-US/docs/Web/API/AudioData). - -### Creating audio samples - -Audio samples can be constructed either from an `AudioData` instance, an initialization object, or an `AudioBuffer`: - -```ts -import { AudioSample } from 'mediabunny'; - -// From AudioData: -const sample = new AudioSample(audioData); - -// From raw data: -const sample = new AudioSample({ - data: new Float32Array([...]), - format: 'f32-planar', // Audio sample format - numberOfChannels: 2, - sampleRate: 44100, // in Hz - timestamp: 0, // in seconds -}); - -// From AudioBuffer: -const timestamp = 0; // in seconds -const samples = AudioSample.fromAudioBuffer(audioBuffer, timestamp); -// => Returns multiple AudioSamples if the AudioBuffer is very long -``` - -The following audio sample formats are supported: - -* `'u8'`: 8-bit unsigned integer (interleaved) -* `'u8-planar'`: 8-bit unsigned integer (planar) -* `'s16'`: 16-bit signed integer (interleaved) -* `'s16-planar'`: 16-bit signed integer (planar) -* `'s32'`: 32-bit signed integer (interleaved) -* `'s32-planar'`: 32-bit signed integer (planar) -* `'f32'`: 32-bit floating point (interleaved) -* `'f32-planar'`: 32-bit floating point (planar) - -Planar formats store each channel's data contiguously, while interleaved formats store the channels' data interleaved together: - -![Planar vs. interleaved formats](../assets/planar_interleaved.svg) - -### Inspecting audio samples - -An `AudioSample` has several read-only properties: - -```ts -type AudioSampleFormat = 'u8' | 'u8-planar' | 's16' | 's16-planar' | 's32' | 's32-planar' | 'f32' | 'f32-planar'; - -audioSample.format; // => AudioSampleFormat -audioSample.sampleRate; // => Sample rate in Hz -audioSample.numberOfFrames; // => Number of frames per channel -audioSample.numberOfChannels; // => Number of channels -audioSample.timestamp; // => Presentation timestamp in seconds -audioSample.duration; // => Duration in seconds (= numberOfFrames / sampleRate) - -// There also exist integer microsecond versions of timing info: -audioSample.microsecondTimestamp; -audioSample.microsecondDuration; -``` - -While all of these properties are read-only, you can use the `setTimestamp` method to modify the timestamp of the audio sample. - -::: warning -Timestamps can be [negative](#negative-timestamps). -::: - -### Using audio samples - -Audio samples provide a couple of ways with which you can access its audio data. - -You can convert an audio sample to a WebCodecs [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) to pass it to an [`AudioEncoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioEncoder): - -```ts -audioSample.toAudioData(); // => AudioData -``` - -This method is virtually free if the audio sample was constructed using an `AudioData`, as long as its timestamp wasn't modified using `setTimestamp`. - -::: warning -The `AudioData` returned by this method **must** be closed separately from the audio sample. -::: - -You can also easily convert the audio sample into an [`AudioBuffer`](https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer) for use with the Web Audio API: - -```ts -audioSample.toAudioBuffer(); // => AudioBuffer -``` - -*** - -You can also directly copy raw audio data from an `AudioSample` into an `ArrayBuffer`. For this, the `allocationSize` and `copyTo` methods can be used. - -The copying process is controlled by the following configuration object: - -```ts -type AudioSampleCopyToOptions = { - planeIndex: number; - format?: AudioSampleFormat; - frameOffset?: number; - frameCount?: number; -}; -``` - -* `planeIndex` *(required)*\ - The index identifying the plane to copy from. This must be 0 if using a non-planar (interleaved) output format. -* `format`\ - The output format for the destination data. Defaults to the `AudioSample`'s format. -* `frameOffset`\ - An offset into the source plane data indicating which frame to begin copying from. Defaults to 0. -* `frameCount`\ - The number of frames to copy. If not provided, the copy will include all frames in the plane beginning with `frameOffset`. - -Because the meaning of `planeIndex` depends on which format is being used for extraction, it's best to always explicitly specify a format. - -For example, here we're extracting the entire audio data as `f32`: - -```ts -const options = { planeIndex: 0, format: 'f32' }; -const bytesNeeded = audioSample.allocationSize(options); -const data = new Float32Array(bytesNeeded / 4); -audioSample.copyTo(data, options); -``` - -Here, we're iterating over each plane in the `s16` format: - -```ts -// The size of the first plane is the size of all planes -const bytesNeeded = audioSample.allocationSize({ - planeIndex: 0, - format: 's16-planar', -}); -const data = new Int16Array(bytesNeeded / 2); - -for (let i = 0; i < audioSample.numberOfChannels; i++) { - audioSample.copyTo(data, { planeIndex: i, format: 's16-planar' }); - // Do something with the data -} -``` - -::: info -The behavior of `allocationSize` and `copyTo` exactly mirrors that of the WebCodecs API. However, the WebCodecs API specification only mandates support for converting to `f32-planar`, while Mediabunny's implementation supports conversion into all formats. Therefore, Mediabunny's methods are more powerful. -::: - -### Closing audio samples - -You must manually close an `AudioSample` after you've used it to free internally-held resources. Do this by calling the `close` method: - -```ts -audioSample.close(); -``` - -Try to close an `AudioSample` as soon as you don't need it anymore. Unclosed audio samples can lead to high memory usage and decoder stalls. - -After an `AudioSample` has been closed, its data becomes unavailable and most of its methods will throw an error. - ---- - ---- -url: /guide/quick-start.md ---- -# Quick start - -This page is a collection of short code snippets that showcase the most common operations you may use this library for. - -## Read file metadata - -```ts -import { Input, ALL_FORMATS, BlobSource } from 'mediabunny'; - -const input = new Input({ - formats: ALL_FORMATS, // Supporting all file formats - source: new BlobSource(file), // Assuming a File instance -}); - -const duration = await input.computeDuration(); // in seconds -const allTracks = await input.getTracks(); // List of all tracks - -// Extract video metadata -const videoTrack = await input.getPrimaryVideoTrack(); -if (videoTrack) { - videoTrack.displayWidth; // in pixels - videoTrack.displayHeight; // in pixels - videoTrack.rotation; // in degrees clockwise - - // Estimate frame rate (FPS) - const packetStats = await videoTrack.computePacketStats(100); - const averageFrameRate = packetStats.averagePacketRate; -} - -// Extract audio metadata -const audioTrack = await input.getPrimaryAudioTrack(); -if (audioTrack) { - audioTrack.numberOfChannels; - audioTrack.sampleRate; // in Hz -} - -// Extract metadata tags -const tags = await input.getMetadataTags(); -tags.title; // Title -tags.date; // Release date -tags.images[0]; // Cover art -tags.raw['TBPM']; // Custom tags -// ... -``` - -::: info - -* Check out the Metadata extraction example for this code in action. -* You can read from more than just `File` instances - check out [Input sources](./reading-media-files#input-sources) for more. - ::: - -## Read media data - -```ts -import { - Input, - ALL_FORMATS, - BlobSource, - VideoSampleSink, - AudioSampleSink, -} from 'mediabunny'; - -const input = new Input({ - formats: ALL_FORMATS, - source: new BlobSource(file), -}); - -// Read video frames -const videoTrack = await input.getPrimaryVideoTrack(); -if (videoTrack) { - const decodable = await videoTrack.canDecode(); - if (decodable) { - const sink = new VideoSampleSink(videoTrack); - - // Get the video frame at timestamp 5s - const videoSample = await sink.getSample(5); - videoSample.timestamp; // in seconds - videoSample.duration; // in seconds - - // Draw the frame to a canvas - videoSample.draw(ctx, 0, 0); - - // Loop over all frames in the first 30s of video - for await (const sample of sink.samples(0, 30)) { - // ... - } - } -} - -// Read audio chunks -const audioTrack = await input.getPrimaryAudioTrack(); -if (audioTrack) { - const decodable = await audioTrack.canDecode(); - if (decodable) { - const sink = new AudioSampleSink(audioTrack); - - // Get audio chunk at timestamp 5s; a short chunk of audio - const audioSample = await sink.getSample(5); - audioSample.timestamp; // in seconds - audioSample.duration; // in seconds - audioSample.numberOfFrames; - - // Convert to AudioBuffer for use with the Web Audio API - const audioBuffer = audioSample.toAudioBuffer(); - - // Loop over all samples in the first 30s of audio - for await (const sample of sink.samples(0, 30)) { - // ... - } - } -} -``` - -::: info - -* Check out the Media player example for a demo built on this use case. -* See [Media sinks](./media-sinks) for all the ways to extract media data from tracks. - ::: - -## Extract video thumbnails - -```ts -import { - Input, - ALL_FORMATS, - BlobSource, - CanvasSink, -} from 'mediabunny'; - -const input = new Input({ - formats: ALL_FORMATS, - source: new BlobSource(file), -}); - -const videoTrack = await input.getPrimaryVideoTrack(); -if (videoTrack) { - const decodable = await videoTrack.canDecode(); - if (decodable) { - const sink = new CanvasSink(videoTrack, { - width: 320, // Automatically resize the thumbnails - }); - - // Get the thumbnail at timestamp 10s - const result = await sink.getCanvas(10); - result.canvas; // HTMLCanvasElement | OffscreenCanvas - result.timestamp; // in seconds - result.duration; // in seconds - - // Generate five equally-spaced thumbnails through the video - const startTimestamp = await videoTrack.getFirstTimestamp(); - const endTimestamp = await videoTrack.computeDuration(); - const timestamps = [0, 0.2, 0.4, 0.6, 0.8].map( - (t) => startTimestamp + t * (endTimestamp - startTimestamp) - ); - - // Loop over these timestamps - for await (const result of sink.canvasesAtTimestamps(timestamps)) { - // ... - } - } -} -``` - -::: info - -* Check out the Thumbnail generation example for this code in action. -* You can further configure [`CanvasSink`](./media-sinks#canvassink). - ::: - -## Extract encoded packets - -```ts -import { - Input, - ALL_FORMATS, - BlobSource, - EncodedPacketSink, -} from 'mediabunny'; - -const input = new Input({ - formats: ALL_FORMATS, - source: new BlobSource(file), -}); - -const videoTrack = await input.getPrimaryVideoTrack(); -if (videoTrack) { - const sink = new EncodedPacketSink(videoTrack); - - // Get packet for timestamp 10s - const packet = await sink.getPacket(10); - packet.data; // Uint8Array - packet.type; // 'key' | 'delta' - packet.timestamp; // in seconds - packet.duration; // in seconds - - // Get the closest key packet to timestamp 10s - const keyPacket = await sink.getKeyPacket(10); - - // Get the following packet - const nextPacket = await sink.getNextPacket(keyPacket); - - // Set up a manual decoder - const decoderConfig = await videoTrack.getDecoderConfig(); - const videoDecoder = new VideoDecoder({ - output: console.log, - error: console.error, - }); - videoDecoder.configure(decoderConfig); - - // Loop over all packets in decode order - for await (const packet of sink.packets()) { - videoDecoder.decode(packet.toEncodedVideoChunk()); - } - - await videoDecoder.flush(); -} -``` - -::: info -Check out [`EncodedPacketSink`](./media-sinks#encodedpacketsink) for the full documentation. -::: - -## Create new media files - -```ts -import { - Output, - BufferTarget, - Mp4OutputFormat, - CanvasSource, - AudioBufferSource, - QUALITY_HIGH, -} from 'mediabunny'; - -// An Output represents a new media file -const output = new Output({ - format: new Mp4OutputFormat(), // The format of the file - target: new BufferTarget(), // Where to write the file (here, to memory) -}); - -// Example: add a video track driven by a canvas -const videoSource = new CanvasSource(canvas, { - codec: 'avc', - bitrate: QUALITY_HIGH, -}); -output.addVideoTrack(videoSource); - -// Example: add an audio track driven by AudioBuffers -const audioSource = new AudioBufferSource({ - codec: 'aac', - bitrate: QUALITY_HIGH, -}); -output.addAudioTrack(audioSource); - -// Set some metadata tags -output.setMetadataTags({ - title: 'My Movie', - artist: 'Me', -}); - -await output.start(); - -// Add some video frames -for (let frame = 0; ...) { - await videoSource.add(frame / 30, 1 / 30); -} - -// Add some audio data -await audioSource.add(audioBuffer1); -await audioSource.add(audioBuffer2); - -await output.finalize(); - -const buffer = output.target.buffer; // ArrayBuffer containing the final MP4 file -``` - -::: info - -* Check out the Procedural generation example for a demo of in-browser video generation. -* You can create files of many different formats; check out [Output formats](./output-formats) for the full list. -* Media data can be added from different sources, see [Media sources](./media-sources). - ::: - -## Write directly to disk - -```ts -import { - Output, - StreamTarget, -} from 'mediabunny'; - -// File System API -const handle = await window.showSaveFilePicker(); -const writableStream = await handle.createWritable(); - -const output = new Output({ - // `chunked: true` to batch disk operations - target: new StreamTarget(writableStream, { chunked: true }), - // ... -}); - -// ... - -await output.finalize(); - -// The file has been fully written to disk -``` - -## Stream over the network - -```ts -import { - Output, - StreamTarget, - StreamTargetChunk, - Mp4OutputFormat, -} from 'mediabunny'; - -const { writable, readable } = new TransformStream({ - transform: (chunk, controller) => controller.enqueue(chunk.data), -}); - -const output = new Output({ - target: new StreamTarget(writable), - // We must use an append-only format here, such as fragmented MP4 - format: new Mp4OutputFormat({ fastStart: 'fragmented' }), -}); - -const uploadComplete = fetch('https://example.com/upload', { - method: 'POST', - body: readable, - duplex: 'half', - headers: { - 'Content-Type': output.format.mimeType, - }, -}); - -await output.start(); - -// ... - -await output.finalize(); -await uploadComplete; -``` - -::: info - -* This code automatically handles the backpressure applied by a slow network. -* Read more on [append-only formats](./output-formats#append-only-writing), a requirement for this pattern. - ::: - -## Record live media - -```ts -import { - Output, - BufferTarget, - WebMOutputFormat, - MediaStreamVideoTrackSource, - MediaStreamAudioTrackSource, - QUALITY_MEDIUM -} from 'mediabunny'; - -const userMedia = await navigator.mediaDevices.getUserMedia({ - video: true, - audio: true, -}); -const videoTrack = userMedia.getVideoTracks()[0]; -const audioTrack = userMedia.getAudioTracks()[0]; - -const output = new Output({ - format: new WebMOutputFormat(), - target: new BufferTarget(), -}); - -if (videoTrack) { - const source = new MediaStreamVideoTrackSource(videoTrack, { - codec: 'vp9', - bitrate: QUALITY_MEDIUM, - }); - output.addVideoTrack(source); -} - -if (audioTrack) { - const source = new MediaStreamAudioTrackSource(audioTrack, { - codec: 'opus', - bitrate: QUALITY_MEDIUM, - }); - output.addAudioTrack(source); -} - -await output.start(); - -// Wait... - -await output.finalize(); -``` - -::: info - -* Check out the Live recording demo for this code in action. -* This is basically [`MediaRecorder`](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder), but less sucky. - ::: - -## Creating transparent video - -```ts -import { - Output, - WebMOutputFormat, - BufferTarget, - CanvasSource, - QUALITY_MEDIUM, -} from 'mediabunny'; - -const output = new Output({ - // Use a format that supports transparency: - format: new WebMOutputFormat(), - target: new BufferTarget(), -}); - -const canvas = new OffscreenCanvas(1280, 720); -const context = canvas.getContext('2d', { alpha: true })!; - -const source = new CanvasSource(canvas, { - codec: 'vp9', - bitrate: QUALITY_MEDIUM, - alpha: 'keep', // => Also encode alpha data -}); -output.addVideoTrack(source); - -await output.start(); - -// Add data... -await source.add(0, 1 / 30); -// ... - -await output.finalize(); -``` - -## Check encoding support - -```ts -import { - MovOutputFormat, - getFirstEncodableVideoCodec, - getFirstEncodableAudioCodec, - getEncodableVideoCodecs, - getEncodableAudioCodecs, -} from 'mediabunny'; - -const outputFormat = new MovOutputFormat(); - -// Find the best supported codec for the given container format -const bestVideoCodec = await getFirstEncodableVideoCodec( - outputFormat.getSupportedVideoCodecs(), - // Optionally, constrained by these parameters: - { width: 1920, height: 1080 }, -); -const bestAudioCodec = await getFirstEncodableAudioCodec( - outputFormat.getSupportedAudioCodecs(), -); - -// Find all supported codecs -const supportedVideoCodecs = await getEncodableVideoCodecs(); -const supportedAudioCodecs = await getEncodableAudioCodecs(); -``` - -## Convert files - -```ts -import { - Input, - Output, - Conversion, - ALL_FORMATS, - BlobSource, - Mp4OutputFormat, -} from 'mediabunny'; - -// Check the above snippets for more examples of Input and Output -const input = new Input({ - formats: ALL_FORMATS, - source: new BlobSource(file), -}); -const output = new Output({ - format: new Mp4OutputFormat(), - target: new BufferTarget(), -}); - -const conversion = await Conversion.init({ input, output }); -if (!conversion.isValid) { - // The conversion isn't possible and would error upon execution. - // Check `discardedTracks` for the reasons. - return; -} - -// List of tracks that won't make it into the output: -conversion.discardedTracks; - -conversion.onProgress = (progress) => { - progress; // Number between 0 and 1, inclusive -}; - -await conversion.execute(); -// Conversion is complete - -const buffer = output.target.buffer; // ArrayBuffer containing the final MP4 file -``` - -::: info - -* This code will automatically transmux (copy media data) when possible, and transcode (re-encode media data) when necessary. -* Refer to [Converting media files](./converting-media-files) for the full documentation. - ::: - -## Extract audio - -```ts -import { - Input, - Output, - Conversion, - WavOutputFormat, -} from 'mediabunny'; - -const input = new Input(...); -const output = new Output({ - // Write to a .wav file, keeping only the audio track - format: new WavOutputFormat(), - // ... -}); - -const conversion = await Conversion.init({ - input, - output, - audio: { - sampleRate: 16000, // Resample to 16 kHz - }, -}); -await conversion.execute(); -// Conversion is complete -``` - -::: info - -* You can extract to other audio-only formats, such as .mp3, .ogg, or even .m4a. See [Output formats](./output-formats). - ::: - -## Compress media - -```ts -import { - Input, - Output, - Conversion, - QUALITY_LOW, -} from 'mediabunny'; - -const input = new Input(...); -const output = new Output(...); - -const conversion = await Conversion.init({ - input, - output, - video: { - width: 480, - bitrate: QUALITY_LOW, - }, - audio: { - numberOfChannels: 1, - bitrate: QUALITY_LOW, - }, - trim: { - // Let's keep only the first 60 seconds - start: 0, - end: 60, - }, - tags: {}, // Remove any metadata tags -}); - -await conversion.execute(); -// Conversion is complete -``` - -::: info - -* Check out the File compression example for this code in action. - ::: - -## Add a video overlay - -```ts -import { - Input, - Output, - Conversion, -} from 'mediabunny'; - -// For example, let's load a watermark image -const watermark = new Image(); -watermark.src = '/watermark.jpg'; -await new Promise(resolve => watermark.onload = resolve); - -const input = new Input(...); -const output = new Output(...); - -let ctx: CanvasRenderingContext2D | null = null; -const conversion = await Conversion.init({ - input, - output, - video: { - process: (sample) => { - if (!ctx) { - // Create a canvas for image compositing - const canvas = new OffscreenCanvas( - sample.displayWidth, - sample.displayHeight, - ); - ctx = canvas.getContext('2d')!; - } - - ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); - sample.draw(ctx, 0, 0); - ctx.drawImage(watermark, 32, 32); - - return ctx.canvas; - }, - }, -}); - -await conversion.execute(); -// Conversion is complete -``` - ---- - ---- -url: /guide/reading-media-files.md ---- -# Reading media files - -Mediabunny allows you to read media files with great control and efficiency. You can use it to extract metadata (such as duration or resolution), as well as to read actual media data from video and audio tracks with frame-accurate timing. Many commonly used [input file formats](./input-formats) are supported. Using [input sources](#input-sources), data can be read from multiple sources, such as directly from memory, from the user's disk, or even over the network. - -Files are always read partially ("lazily"), meaning only the bytes required to extract the requested information will be read, keeping performance high and memory usage low. Therefore, most methods for reading data are asynchronous and return promises. - -::: info -Not all data is extracted equally. Methods that are prefixed with `compute` instead of `get` indicate that the library might need to do more work to retrieve the requested data. -::: - -## Creating a new input - -Reading media files in Mediabunny revolves around a central class, `Input`, from which all reading operations begin. One instance of `Input` represents one media file that we want to read. - -Start by creating a new instance of `Input`. Here, we're creating it with a [File](https://developer.mozilla.org/en-US/docs/Web/API/File) instance, meaning we'll be reading data directly from the user's disk: - -```ts -import { Input, ALL_FORMATS, BlobSource } from 'mediabunny'; - -const input = new Input({ - formats: ALL_FORMATS, - source: new BlobSource(file), -}); -``` - -`source` specifies where the `Input` reads data from. See [Input sources](#input-sources) for a full list of available input sources. - -`formats` specifies the list of formats that the `Input` should support. This field is mainly used for tree shaking optimizations: Using `ALL_FORMATS` means we can load files of [any format that Mediabunny supports](./supported-formats-and-codecs#container-formats), but requires that we include the parsers for each of these formats. If we know we'll only be reading MP3 or WAVE files, then something like this will reduce the overall bundle size drastically: - -```ts -import { Input, MP3, WAVE } from 'mediabunny'; - -const input = new Input({ - formats: [MP3, WAVE], - // .... -}); -``` - -Reading operations will throw an error if the file format could not be recognized. See [Input formats](./input-formats) for the full list of available input formats. - -::: info -Simply creating an instance of `Input` will perform zero reads and is practically free. The file will only be read once data is requested. -::: - -## Reading file metadata - -With our instance of `Input` created, you can now start reading file-level metadata. - -You can query the concrete format of the file like this: - -```ts -await input.getFormat(); // => Mp4InputFormat -``` - -You can directly retrieve the full MIME type of the file, including track codecs: - -```ts -await input.getMimeType(); // => 'video/mp4; codecs="avc1.42c032, mp4a.40.2"' -``` - -Use `computeDuration` to get the full duration of the media file in seconds: - -```ts -await input.computeDuration(); // => 1905.4615 -``` - -More specifically, the duration is defined as the maximum end timestamp across all tracks. - -Mediabunny also lets you read descriptive metadata tags from media files, such as title, artist, or cover art: - -```ts -await input.getMetadataTags(); // => MetadataTags -``` - -For more info, see [`MetadataTags`](../api/MetadataTags). - -## Reading track metadata - -You can extract the list of all media tracks in the file like so: - -```ts -await input.getTracks(); // => InputTrack[] -``` - -There are additional utility methods for retrieving tracks that can be useful: - -```ts -await input.getVideoTracks(); // => InputVideoTrack[] -await input.getAudioTracks(); // => InputAudioTrack[] - -await input.getPrimaryVideoTrack(); // => InputVideoTrack | null -await input.getPrimaryAudioTrack(); // => InputAudioTrack | null -``` - -::: info -Subtitle tracks are currently not supported for reading. -::: - -### Common track metadata - -Once you have an `InputTrack`, you can start extracting metadata from it. - -```ts -// Get a unique ID for this track in the input file: -track.id; // => number - -// Check the track's type: -track.type; // => 'video' | 'audio' | 'subtitle'; - -// Alternatively, use these type predicate methods: -track.isVideoTrack(); // => boolean -track.isAudioTrack(); // => boolean - -// Retrieve the track's language as an ISO 639-2/T language code. -// Resolves to 'und' (undetermined) if the language isn't known. -track.languageCode; // => string - -// A user-defined name for this track. -track.name; // => string - -// Information about the intended usage of the track -// (default, commentary, hearing-impaired, visually-impaired, etc.) -track.disposition; // TrackDisposition -``` - -#### Codec information - -You can query metadata related to the track's codec: - -```ts -track.codec; // => MediaCodec | null -``` - -This field is `null` when the track's codec couldn't be recognized or is not supported by Mediabunny. See [Codecs](./supported-formats-and-codecs#codecs) for the full list of supported codecs. When Mediabunny doesn't recognize the format, you can still use the `internalCodecId` field to figure out the codec of the track, although its format depends on the container format used and is not homogenized by Mediabunny. - -You can also extract the full codec parameter string from the track, as specified in the [WebCodecs Codec Registry](https://www.w3.org/TR/webcodecs-codec-registry/): - -```ts -await track.getCodecParameterString(); // => 'avc1.42001f' -``` - -Just because the codec is known doesn't mean the user's browser will be able to decode it. To check decodability, use `canDecode`: - -```ts -await track.canDecode(); // => boolean -``` - -::: info -This check also takes [custom decoders](./supported-formats-and-codecs#custom-decoders) into account. -::: - -#### Track timing info - -You can compute the track's specific duration in seconds like so: - -```ts -await track.computeDuration(); // => 1902.4615 -``` - -Analogous to the `Input`'s duration, this is identical to the end timestamp of the last sample. A track's duration may be shorter than the `Input`'s total duration if the `Input` has multiple tracks which differ in length. - -You can also retrieve the track's *start timestamp* in seconds: - -```ts -await track.getFirstTimestamp(); // => 0.041666666666666664 -``` - -This is the opposite of *duration*: It's the start timestamp of the first sample. - -::: warning -A track's start timestamp does **NOT** need to be 0. It is typically close to zero, but it may be slightly positive, or even slightly negative. - -A *positive start timestamp* means the first sample is presented *after* the overall composition begins. If this is a video track, you may choose to either display a placeholder image (like a black screen), or to display the first frame as a freeze frame until the second frame starts. - -A *negative start timestamp* means the track begins *before* the composition does; this effectively means that some beginning section of the media data is "cut off". It is recommended not to display samples with negative timestamps. -::: - -Another metric related to track timing info is its *time resolution*, which is given in hertz: - -```ts -track.timeResolution; // => 24 -``` - -Intuitively, this is the maximum possible "frame rate" of the track (assuming that no two samples have the same timestamp). Mathematically, if $x$ is equal to a track's time resolution, then all timestamps and durations of that track can be expressed as: - -$$ \frac{k}{x},\quad k \in \mathbb{Z} $$ - -::: info -This field only gives an upper bound on a track's frame rate. To get a track's actual frame rate based on its samples, compute its [packet statistics](#packet-statistics). -::: - -#### Packet statistics - -You can query aggregate statistics about a track's encoded packets: - -```ts -await track.computePacketStats(); // => PacketStats - -type PacketStats = { - // The total number of packets. - packetCount: number; - // The average number of packets per second. - // For video tracks, this will equal the average frame rate (FPS). - averagePacketRate: number; - // The average number of bits per second. - averageBitrate: number; -}; -``` - -For example, running this on the video track of a 1080p version of Big Buck Bunny returns this: - -```ts -{ - packetCount: 14315, - averagePacketRate: 24, - averageBitrate: 9282573.233670976, -} -``` - -This means the video track has a total of 14315 frames, a frame rate of exactly 24 Hz, and an average bitrate of ~9.28 Mbps. - -**Note:** These statistics aren't simply read from file metadata but have to be computed, meaning this method may - depending on the file - need to perform many reads and might take several hundred milliseconds to resolve. To speed up computation, you can compute aggregate statistics for only a subset of packets by passing a parameter to the method: - -```ts -await track.computePacketStats(50); -``` - -This will only look at the first ~50 packets and then return the result. This is great for quickly getting an estimate of frame rate and bitrate, without having to scan through the entire file. For videos with a constant frame rate, this will also always return the correct frame rate. - -### Video track metadata - -In addition to the [common track metadata](#common-track-metadata), video tracks have additional metadata you can query: - -```ts -// Get the raw pixel dimensions of the track's coded samples, before rotation: -videoTrack.codedWidth; // => number -videoTrack.codedHeight; // => number - -// Get the displayed pixel dimensions of the track's samples, after rotation: -videoTrack.displayWidth; // => number -videoTrack.displayHeight; // => number - -// Get the clockwise rotation in degrees by which the -// track's frames should be rotated: -videoTrack.rotation; // => 0 | 90 | 180 | 270 -``` - -To compute a video track's average frame rate (FPS), use [`computePacketStats`](#packet-statistics): - -```ts -const stats = await videoTrack.computePacketStats(100); -const frameRate = stats.averagePacketRate; // Approximate, but often exact -``` - -You can retrieve the track's decoder configuration, which is a `VideoDecoderConfig` from the WebCodecs API for usage within `VideoDecoder`: - -```ts -await videoTrack.getDecoderConfig(); // => VideoDecoderConfig | null -``` - -This method can resolve to `null` if the track's codec isn't known. - -For example, here's the decoder configuration for a 1080p version of Big Buck Bunny: - -```ts -{ - codec: 'avc1.4d4029', - codedWidth: 1920, - codedHeight: 1080, - description: new Uint8Array([ - // Bytes of the AVCDecoderConfigurationRecord - 1, 77, 64, 41, 255, 225, 0, 22, 39, 77, 64, 41, 169, 24, 15, 0, - 68, 252, 184, 3, 80, 16, 16, 27, 108, 43, 94, 247, 192, 64, 1, 0, - 4, 40, 222, 9, 200, - ]), -} -``` - -You can directly retrieve information about the video's color space: - -```ts -await videoTrack.getColorSpace(); // => VideoColorSpaceInit -``` - -The resulting object will contain `undefined` values if color space information is not known. - -You can also directly check if a video has a *high dynamic range* (HDR): - -```ts -await videoTrack.hasHighDynamicRange(); // => boolean -``` - -This method compares with the available color space metadata. If it resolves to `true`, then the video is HDR; if it resolves to `false`, the video may or may not be HDR. - -### Audio track metadata - -In addition to the [common track metadata](#common-track-metadata), audio tracks have additional metadata you can query: - -```ts -// Get the number of audio channels: -audioTrack.numberOfChannels; // => number - -// Get the audio sample rate in hertz: -audioTrack.sampleRate; // => number -``` - -You can retrieve the track's decoder configuration, which is an `AudioDecoderConfig` from the WebCodecs API for usage within `AudioDecoder`: - -```ts -await audioTrack.getDecoderConfig(); // => AudioDecoderConfig | null -``` - -This method can resolve to `null` if the track's codec isn't known. - -For example, here's the decoder configuration for an AAC audio track: - -```ts -{ - codec: 'mp4a.40.2', - numberOfChannels: 2, - sampleRate: 44100, - description: new Uint8Array([ - // Bytes of the AudioSpecificConfig - 17, 144, - ]), -} -``` - -## Reading media data - -Mediabunny has the concept of *media sinks*, which are the way to read media data from an `InputTrack`. Media sinks differ in their API and in their level of abstraction, meaning you can pick whichever sink best fits your use case. - -See [Media sinks](./media-sinks) for a full list of sinks. - -### Examples - -Loop over all raw encoded packets of a track: - -```ts -import { EncodedPacketSink } from 'mediabunny'; - -const videoTrack = await input.getPrimaryVideoTrack(); -const sink = new EncodedPacketSink(videoTrack); - -for await (const packet of sink.packets()) { - console.log(packet.timestamp); -} -``` - -Here we iterate over all samples (frames) of a video track: - -```ts -import { VideoSampleSink } from 'mediabunny'; - -const videoTrack = await input.getPrimaryVideoTrack(); -const sink = new VideoSampleSink(videoTrack); - -for await (const sample of sink.samples()) { - // For example, let's draw the sample to a canvas: - sample.draw(ctx, 0, 0); -} -``` - -We can also use this sink in more concrete ways: - -```ts -// Loop over all frames between the timestamps of 300s and 305s -for await (const sample of sink.samples(300, 305)) { - // ... -} - -// Get the frame that's displayed at timestamp 42s -await sink.getSample(42); -``` - -We may want to extract downscaled thumbnails from a video track: - -```ts -import { CanvasSink } from 'mediabunny'; - -const videoTrack = await input.getPrimaryVideoTrack(); -const sink = new CanvasSink(videoTrack, { - width: 320, - height: 180, -}); - -const startTimestamp = await videoTrack.getFirstTimestamp(); -const endTimestamp = await videoTrack.computeDuration(); - -// Let's generate five equally-spaced thumbnails: -const thumbnailTimestamps = [0, 0.2, 0.4, 0.6, 0.8].map( - (t) => startTimestamp + t * (endTimestamp - startTimestamp), -); - -for await (const result of sink.canvasesAtTimestamps(thumbnailTimestamps)) { - // Add MrBeast's face to the thumbnail -} -``` - -We may loop over a section of an audio track and play it using the Web Audio API: - -```ts -import { AudioBufferSink } from 'mediabunny'; - -const audioTrack = await input.getPrimaryAudioTrack(); -const sink = new AudioBufferSink(audioTrack); - -for await (const { buffer, timestamp } of sink.buffers(5, 10)) { - const node = audioContext.createBufferSource(); - node.buffer = buffer; - node.connect(audioContext.destination); - node.start(timestamp); -} -``` - -Or we may take the decoding process into our own hands: - -```ts -import { EncodedPacketSink } from 'mediabunny'; - -const videoTrack = await input.getPrimaryVideoTrack(); -const sink = new EncodedPacketSink(videoTrack); - -const decoder = new VideoDecoder({ - output: console.log, - error: console.error, -}); -decoder.configure(await videoTrack.getDecoderConfig()); - -// Let's crank through all packets from timestamp 37s to 50s: -let currentPacket = await sink.getKeyPacket(37); -while (currentPacket && currentPacket.timestamp < 50) { - decoder.decode(currentPacket.toEncodedVideoChunk()); - currentPacket = await sink.getNextPacket(currentPacket); -} - -await decoder.flush(); -``` - -As you can see, media sinks are incredibly versatile and allow for efficient, sparse reading of media data within the input file. - -## Disposing inputs - -When you're not using them anymore, `Input` instances will automatically get cleaned up by garbage collection. However, sometimes you may want to prematurely dispose of an `Input` and all its connected resources, or cancel any ongoing operation. You can do it like so: - -```ts -input.dispose(); -``` - -When an `Input` is disposed, ongoing read operations will be canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink operations will be canceled. Disallowed and canceled operations will throw an `InputDisposedError`. - -You are expected not to use an `Input` after disposing it. While some operations may still work, it is not specified and may change in any future update. - -`Input` also implements `Disposable`, meaning you can use it with JavaScript Explicit Resource Management features such as the [`using` keyword](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/using): - -```ts -{ - using input = new Input(...); - - // `input` will automatically be disposed -} -``` - -Using `using` is recommended over `const` if you only need the `Input` momentarily within a single scope. - -## Input sources - -The *input source* determines where the `Input` reads data from. - -All sources have an `onread` callback property you can set to inspect which areas of the file are being read: - -```ts -source.onread = (start, end) => { - console.log(`Reading byte range [${start}, ${end})`); -}; -``` - -*** - -This library offers a couple of sources: - -### `BufferSource` - -This source uses an in-memory `ArrayBuffer` as the underlying source of data. - -```ts -import { BufferSource } from 'mediabunny'; - -// You can construct a BufferSource directly from ArrayBuffer: -const source = new BufferSource(arrayBuffer); - -// Or also from a Uint8Array: -const source = new BufferSource(uint8Array); -``` - -This source is the fastest but requires the entire input file to be held in memory. - -### `BlobSource` - -This source is backed by an underlying [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) object. Since [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) extends `Blob`, this source is perfect for reading data directly from disk (in the browser). - -```ts -import { BlobSource } from 'mediabunny'; - -fileInput.addEventListener('change', (event) => { - const file = event.target.files[0]; - const source = new BlobSource(file); -}); -``` - -`BlobSource` accepts additional options as a second parameter: - -```ts -type BlobSourceOptions = { - // The maximum number of bytes the cache is allowed to hold - // in memory. Defaults to 8 MiB. - maxCacheSize?: number; -}; -``` - -### `UrlSource` - -This source fetches data from a remote URL, useful for reading files over the network. - -```ts -import { UrlSource } from 'mediabunny'; - -const source = new UrlSource('https://example.com/bigbuckbunny.mp4'); -``` - -`UrlSource` will do some pretty crazy stuff to prefetch data intelligently based on observed access patterns to minimize request count and latency. - -::: warning -If you're using this source in the browser and the URL is on a different origin, make sure [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS) is properly configured. -::: - -`UrlSource` accepts a few options as its second parameter: - -```ts -type UrlSourceOptions = { - requestInit?: RequestInit; - getRetryDelay?: (previousAttempts: number, error: unknown, url: string | URL | Request) => number | null; - - // The maximum number of bytes the cache is allowed to hold - // in memory. Defaults to 8 MiB. - maxCacheSize?: number; - - // Used to provide a custom fetch function - fetchFn?: typeof fetch; -}; -``` - -You can use `requestInit` just like you would in the Fetch API to further customize the request: - -```ts -const source = new UrlSource('https://example.com/bigbuckbunny.mp4', { - requestInit: { - headers: { - 'X-Custom-Header': 'my-value', - }, - }, -}); -``` - -`getRetryDelay` can be used to control the retry logic used should a request fail. When a request fails, `getRetryDelay` should return the time to wait in seconds before the request will be retried. Returning `null` prevents further retries. - -```ts -// UrlSource using retry logic with exponential backoff: -const source = new UrlSource('https://example.com/bigbuckbunny.mp4', { - getRetryDelay: (previousAttempts) => Math.min(2 ** previousAttempts, 16), -}); -``` - -Not setting `getRetryDelay` will lead to the default being used: - -* Infinite exponential backoff pattern, capped at 16 seconds. -* If a CORS error is suspected (`fetch()` did reject even though `navigator.onLine` is true and origin is different), no further retries will be made. - -*** - -Use `fetchFn` to provide a custom fetch function, usually for polyfill reasons. For example, React Native's `fetch` does not support streamable response bodies, a feature that `UrlSource` requires. In this case, you could use [Expo's `fetch` function](https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api) instead: - -```ts -import { UrlSource } from 'mediabunny'; -import { fetch } from 'expo/fetch'; - -const source = new UrlSource('https://example.com/bigbuckbunny.mp4', { - fetchFn: (input, init) => { - if (typeof input !== 'string') { - // Expo requires string URLs - throw new Error('Expected a string URL.'); - } - - return fetch(input, init); - }, -}); -``` - -### `FilePathSource` - -This input source can be used to load data directly from a file, given a file path. It requires a server-side environment such as Node, Bun, or Deno. - -```ts -import { FilePathSource } from 'mediabunny'; - -const source = new FilePathSource('/home/david/Downloads/bigbuckbunny.mp4'); -``` - -`FilePathSource` accepts additional options as a second parameter: - -```ts -type FilePathSourceOptions = { - // The maximum number of bytes the cache is allowed to hold - // in memory. Defaults to 8 MiB. - maxCacheSize?: number; -}; -``` - -::: warning -When using this source, make sure to manually [dispose of the Input](#disposing-inputs) when you are done with it to properly close the internal file handle held by this source. -::: - -### `StreamSource` - -This is a general-purpose input source you can use to read data from anywhere. - -For example, here we're reading a file from disk using the Node.js file system (although you should use [`FilePathSource`](#filepathsource) for that): - -```ts -import { StreamSource } from 'mediabunny'; -import { open } from 'node:fs/promises'; - -const fileHandle = await open('bigbuckbunny.mp4', 'r'); - -const source = new StreamSource({ - read: async (start, end) => { - const buffer = Buffer.alloc(end - start); - await fileHandle.read(buffer, 0, end - start, start); - return buffer; - }, - getSize: async () => { - const { size } = await fileHandle.stat(); - return size; - }, -}); -``` - -The options of `StreamSource` have the following type: - -```ts -type StreamSourceOptions = { - getSize: () => MaybePromise; - read: (start: number, end: number) => MaybePromise>; - dispose?: () => unknown; - maxCacheSize?: number; - prefetchProfile?: 'none' | 'fileSystem' | 'network'; -}; - -type MaybePromise = T | Promise; -``` - -* `getSize`\ - Called when the size of the entire file is requested. Must return or resolve to the size in bytes. This function is guaranteed to be called before `read`. -* `read`\ - Called when data is requested. Must return or resolve to the bytes from the specified byte range, or a stream that yields these bytes. -* `dispose`\ - Called when the `Input` driven by this source is disposed. -* `maxCacheSize`\ - The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. -* `prefetchProfile`\ - Specifies the prefetch profile that the reader should use with this source. A prefetch propfile specifies the pattern with which bytes outside of the requested range are preloaded to reduce latency for future reads. - * `'none'` (default): No prefetching; only the data needed in the moment is requested. - * `'fileSystem'`: File system-optimized prefetching: a small amount of data is prefetched bidirectionally, aligned with page boundaries. - * `'network'`: Network-optimized prefetching, or more generally, prefetching optimized for any high-latency environment: tries to minimize the amount of read calls and aggressively prefetches data when sequential access patterns are detected. - -### `ReadableStreamSource` - -This is a source backed by a `ReadableStream` of `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally streaming in input files that are still being constructed and whose size we don't yet know. You could also use it to stream in existing files, but other sources (such as [`BlobSource`](#blobsource) or [`FilePathSource`](#filepathsource)) are recommended instead because they offer random access. - -```ts -import { ReadableStreamSource } from 'mediabunny'; - -const { writable, readable } = new TransformStream(); -const source = new ReadableStreamSource(readable); - -// Append chunks of data -const writer = writable.getWriter(); -writer.write(chunk1); -writer.write(chunk2); -writer.close(); -``` - -This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the lack of random file access. You should only use this source with sequential access patterns, such as reading all packets from start to end or doing conversions. This source does not work well with random access patterns unless you increase its max cache size. - -```ts -type ReadableStreamSourceOptions = { - // The maximum number of bytes the cache is allowed to hold - // in memory. Defaults to 16 MiB. - maxCacheSize?: number; -}; -``` - -#### Use with [`MediaRecorder`](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder) - -You can combine `MediaRecorder` with `ReadableStreamSource` to stream recorded data into Mediabunny while the recording is taking place. Here's an example where we pipe `MediaRecorder`'s output into Mediabunny's Conversion API to create a WAVE file: - -```ts -import { - Input, - Output, - Conversion, - ReadableStreamSource, - ALL_FORMATS, - WavOutputFormat, - BufferTarget, -} from 'mediabunny'; - -// Set up a TransformStream to convert MediaRecorder's Blobs into Uint8Arrays -const { writable, readable } = new TransformStream({ - async transform(chunk, controller) { - const arrayBuffer = await chunk.arrayBuffer(); - controller.enqueue(new Uint8Array(arrayBuffer)); - }, -}); - -const input = new Input({ - source: new ReadableStreamSource(readable), - formats: ALL_FORMATS, -}); -const output = new Output({ - format: new WavOutputFormat(), - target: new BufferTarget(), -}); - -const conversionPromise = Conversion.init({ input, output }) - .then(conversion => conversion.execute()); - -const micStream = await navigator.mediaDevices.getUserMedia({ audio: true }); -const recorder = new MediaRecorder(micStream); -const writer = writable.getWriter(); - -recorder.ondataavailable = e => writer.write(e.data); -recorder.onstop = async () => { - await writer.close(); - await conversionPromise; - - // Get the final .wav file - const wavFile = output.target.buffer!; // => ArrayBuffer -}; - -recorder.start(1000); -setTimeout(() => recorder.stop(), 10_000); // Stop recording after 10s -``` - ---- - ---- -url: /guide/supported-formats-and-codecs.md ---- -# Supported formats & codecs - -## Container formats - -Mediabunny supports many commonly used media container formats, all of which are supported bidirectionally (reading & writing): - -* ISOBMFF-based formats (.mp4, .m4v, .m4a, ...) -* QuickTime File Format (.mov) -* Matroska (.mkv) -* WebM (.webm) -* Ogg (.ogg) -* MP3 (.mp3) -* WAVE (.wav) -* ADTS (.aac) -* FLAC (.flac) - -## Codecs - -Mediabunny supports a wide range of video, audio, and subtitle codecs. More specifically, it supports all codecs specified by the WebCodecs API and a few additional PCM codecs out of the box. - -The availability of the codecs provided by the WebCodecs API depends on the browser and thus cannot be guaranteed by this library. Mediabunny provides [special utility functions](#querying-codec-encodability) to check which codecs are able to be encoded. You can also specify [custom coders](#custom-coders) to provide your own encoder/decoder implementation if the browser doesn't support the codec natively. - -::: info -Mediabunny ships with built-in decoders and encoders for all audio PCM codecs, meaning they are always supported. -::: - -### Video codecs - -* `'avc'` - Advanced Video Coding (AVC) / H.264 -* `'hevc'` - High Efficiency Video Coding (HEVC) / H.265 -* `'vp8'` - VP8 -* `'vp9'` - VP9 -* `'av1'` - AOMedia Video 1 (AV1) - -### Audio codecs - -* `'aac'` - Advanced Audio Coding (AAC) -* `'opus'` - Opus -* `'mp3'` - MP3 -* `'vorbis'` - Vorbis -* `'flac'` - Free Lossless Audio Codec (FLAC) -* `'pcm-u8'` - 8-bit unsigned PCM -* `'pcm-s8'` - 8-bit signed PCM -* `'pcm-s16'` - 16-bit little-endian signed PCM -* `'pcm-s16be'` - 16-bit big-endian signed PCM -* `'pcm-s24'` - 24-bit little-endian signed PCM -* `'pcm-s24be'` - 24-bit big-endian signed PCM -* `'pcm-s32'` - 32-bit little-endian signed PCM -* `'pcm-s32be'` - 32-bit big-endian signed PCM -* `'pcm-f32'` - 32-bit little-endian float PCM -* `'pcm-f32be'` - 32-bit big-endian float PCM -* `'pcm-f64'` - 64-bit little-endian float PCM -* `'pcm-f64be'` - 64-bit big-endian float PCM -* `'ulaw'` - μ-law PCM -* `'alaw'` - A-law PCM - -### Subtitle codecs - -* `'webvtt'` - WebVTT - -## Compatibility table - -Not all codecs can be used with all containers. The following table specifies the supported codec-container combinations: - -| | .mp4 | .mov | .mkv | .webm\[^1] | .ogg | .mp3 | .wav | .aac | .flac | -|:--------------:|:--------:|:-----:|:-----:|:---------:|:-----:|:-----:|:-----:|:-----:|:-----:| -| `'avc'` | ✓ | ✓ | ✓ | | | | | | | -| `'hevc'` | ✓ | ✓ | ✓ | | | | | | | -| `'vp8'` | ✓ | ✓ | ✓ | ✓ | | | | | | -| `'vp9'` | ✓ | ✓ | ✓ | ✓ | | | | | | -| `'av1'` | ✓ | ✓ | ✓ | ✓ | | | | | | -| `'aac'` | ✓ | ✓ | ✓ | | | | | ✓ | | -| `'opus'` | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | -| `'mp3'` | ✓ | ✓ | ✓ | | | ✓ | | | | -| `'vorbis'` | ✓ | ✓ | ✓ | ✓ | ✓ | | | | | -| `'flac'` | ✓ | ✓ | ✓ | | | | | | ✓ | -| `'pcm-u8'` | | ✓ | ✓ | | | | ✓ | | | -| `'pcm-s8'` | | ✓ | | | | | | | | -| `'pcm-s16'` | ✓ | ✓ | ✓ | | | | ✓ | | | -| `'pcm-s16be'` | ✓ | ✓ | ✓ | | | | | | | -| `'pcm-s24'` | ✓ | ✓ | ✓ | | | | ✓ | | | -| `'pcm-s24be'` | ✓ | ✓ | ✓ | | | | | | | -| `'pcm-s32'` | ✓ | ✓ | ✓ | | | | ✓ | | | -| `'pcm-s32be'` | ✓ | ✓ | ✓ | | | | | | | -| `'pcm-f32'` | ✓ | ✓ | ✓ | | | | ✓ | | | -| `'pcm-f32be'` | ✓ | ✓ | | | | | | | | -| `'pcm-f64'` | ✓ | ✓ | ✓ | | | | | | | -| `'pcm-f64be'` | ✓ | ✓ | | | | | | | | -| `'ulaw'` | | ✓ | | | | | ✓ | | | -| `'alaw'` | | ✓ | | | | | ✓ | | | -| `'webvtt'`\[^2] | (✓) | | (✓) | (✓) | | | | | | - -\[^1]: WebM only supports a small subset of the codecs supported by Matroska. However, this library can technically read all codecs from a WebM that are supported by Matroska. -\[^2]: WebVTT can only be written, not read. - -## Querying codec encodability - -Mediabunny provides utility functions that you can use to check if the browser can encode a given codec. Additionally, you -can check if a codec is encodable with a specific *configuration*. - -`canEncode` tests whether a codec can be encoded using typical settings: - -```ts -import { canEncode } from 'mediabunny'; - -canEncode('avc'); // => Promise -canEncode('opus'); // => Promise -``` - -Video codecs are checked using 1280x720 @1Mbps, while audio codecs are checked using 2 channels, 48 kHz @128kbps. - -You can also check encodability using specific configurations: - -```ts -import { canEncodeVideo, canEncodeAudio } from 'mediabunny'; - -canEncodeVideo('hevc', { - width: 1920, height: 1080, bitrate: 1e7 -}); // => Promise - -canEncodeAudio('aac', { - numberOfChannels: 1, sampleRate: 44100, bitrate: 192e3 -}); // => Promise -``` - -Additionally, most properties of [`VideoEncodingConfig`](./media-sources#video-encoding-config) and [`AudioEncodingConfig`](./media-sources#audio-encoding-config) can be used here as well. - -*** - -In addition, you can use the following functions to check encodability for multiple codecs at once, getting back a list of supported codecs: - -```ts -import { - getEncodableCodecs, - getEncodableVideoCodecs, - getEncodableAudioCodecs, - getEncodableSubtitleCodecs, -} from 'mediabunny'; - -getEncodableCodecs(); // => Promise -getEncodableVideoCodecs(); // => Promise -getEncodableAudioCodecs(); // => Promise -getEncodableSubtitleCodecs(); // => Promise - -// These functions also accept optional configuration options. -// Here, we check which of AVC, HEVC and VP8 can be encoded at 1920x1080 @10Mbps: -getEncodableVideoCodecs( - ['avc', 'hevc', 'vp8'], - { width: 1920, height: 1080, bitrate: 1e7 }, -); // => Promise -``` - -*** - -If you simply want to find the best codec that the browser can encode, you can use these functions, which return the first codec supported by the browser: - -```ts -import { - getFirstEncodableVideoCodec, - getFirstEncodableAudioCodec, - getFirstEncodableSubtitleCodec, -} from 'mediabunny'; - -getFirstEncodableVideoCodec(['avc', 'vp9', 'av1']); // => Promise -getFirstEncodableAudioCodec(['opus', 'aac']); // => Promise - -getFirstEncodableVideoCodec( - ['avc', 'hevc', 'vp8'], - { width: 1920, height: 1080, bitrate: 1e7 }, -); // => Promise -``` - -If none of the listed codecs is supported, `null` is returned. - -These functions are especially useful in conjunction with an [output format](./output-formats) to retrieve the best codec that is supported both by the encoder as well as the container format: - -```ts -import { - Mp4OutputFormat, - getFirstEncodableVideoCodec, -} from 'mediabunny'; - -const outputFormat = new Mp4OutputFormat(); -const containableVideoCodecs = outputFormat.getSupportedVideoCodecs(); -const bestVideoCodec = await getFirstEncodableVideoCodec(containableVideoCodecs); -``` - -::: info -Codec encodability checks take [custom encoders](#custom-encoders) into account. -::: - -## Querying codec decodability - -Whether a codec can be decoded depends on the specific codec configuration of an `InputTrack`; you can use its [`canDecode`](./reading-media-files#codec-information) method to check. - -## Custom coders - -Mediabunny allows you to register your own custom encoders and decoders - useful if you want to polyfill a codec that's not supported in all browsers, or want to use Mediabunny outside of an environment with WebCodecs (such as Node.js). - -Encoders and decoders can be registered for [all video and audio codecs](#codecs) supported by the library. It is not possible to add new codecs. - -::: warning -Mediabunny requires customs encoders and decoders to follow very specific implementation rules. Pay special attention to the parts labeled with "**must**" to ensure compatibility. -::: - -### Custom encoders - -To create a custom video or audio encoder, you'll need to create a class which extends `CustomVideoEncoder` or `CustomAudioEncoder`. Then, you **must** register this class using `registerEncoder`: - -```ts -import { CustomAudioEncoder, registerEncoder } from 'mediabunny'; - -class MyAwesomeMp3Encoder extends CustomAudioEncoder { - // ... -} -registerEncoder(MyAwesomeMp3Encoder); -``` - -The following properties are available on each encoder instance and are set by the library: - -```ts -class { - // For video encoders: - codec: VideoCodec; - config: VideoEncoderConfig; - onPacket: (packet: EncodedPacket, meta?: EncodedVideoChunkMetadata) => unknown; - - // For audio encoders: - codec: AudioCodec; - config: AudioEncoderConfig; - onPacket: (packet: EncodedPacket, meta?: EncodedAudioChunkMetadata) => unknown; -} -``` - -`codec` and `config` specify the concrete codec configuration to use, and `onPacket` is a method that your code **must** call for each encoded packet it creates. - -You **must** implement the following methods in your custom encoder class: - -```ts -class { - // For video encoders: - static supports(codec: VideoCodec, config: VideoEncoderConfig): boolean; - // For audio encoders: - static supports(codec: AudioCodec, config: AudioEncoderConfig): boolean; - - init(): Promise | void; - encode(sample: VideoSample, options: VideoEncoderEncodeOptions): Promise | void; // For video - encode(sample: AudioSample): Promise | void; // For audio - flush(): Promise | void; - close(): Promise | void; -} -``` - -* `supports`\ - This is a *static* method that **must** return `true` if the encoder is able to encode the specified codec, and `false` if not. If it returns `true`, a new instance of your encoder class will be created by the library and will be used for encoding, taking precedence over the default encoders. -* `init`\ - Called by the library after your class is instantiated. Place any initialization logic here. -* `encode`\ - Called for each sample that is to be encoded. The resulting encoded packet **must** then be passed to the `onPacket` method. -* `flush`\ - Called when the encoder is expected to finish the encoding process for all remaining samples that haven't finished encoding yet. This method **must** return/resolve only once all samples passed to `encode` have been fully encoded. It **must** then reset its own internal state to be ready for the next encoding batch. -* `close`\ - Called when the encoder is no longer needed and can release its internal resources. - -::: info -All instance methods of the class can return promises. In this case, the library will make sure to *serialize* all method calls such that no two methods ever run concurrently. -::: - -::: warning -The packets passed to `onPacket` **must** be in [decode order](./media-sinks.md#decode-vs-presentation-order). -::: - -### Custom decoders - -To create a custom video or audio decoder, you'll need to create a class which extends `CustomVideoDecoder` or `CustomAudioDecoder`. Then, you **must** register this class using `registerDecoder`: - -```ts -import { CustomAudioDecoder, registerDecoder } from 'mediabunny'; - -class MyAwesomeMp3Decoder extends CustomAudioDecoder { - // ... -} -registerDecoder(MyAwesomeMp3Decoder); -``` - -The following properties are available on each decoder instance and are set by the library: - -```ts -class { - // For video decoders: - codec: VideoCodec; - config: VideoDecoderConfig; - onSample: (sample: VideoSample) => unknown; - - // For audio decoders: - codec: AudioCodec; - config: AudioDecoderConfig; - onSample: (sample: AudioSample) => unknown; -} -``` - -`codec` and `config` specify the concrete codec configuration to use, and `onSample` is a method that your code **must** call for each video/audio sample it creates. - -You **must** implement the following methods in your custom decoder class: - -```ts -class { - // For video decoders: - static supports(codec: VideoCodec, config: VideoDecoderConfig): boolean; - // For audio decoders: - static supports(codec: AudioCodec, config: AudioDecoderConfig): boolean; - - init(): Promise | void; - decode(packet: EncodedPacket): Promise | void; - flush(): Promise | void; - close(): Promise | void; -} -``` - -* `supports`\ - This is a *static* method that **must** return `true` if the decoder is able to decode the specified codec, and `false` if not. If it returns `true`, a new instance of your decoder class will be created by the library and will be used for decoding, taking precedence over the default decoders. -* `init`\ - Called by the library after your class is instantiated. Place any initialization logic here. -* `decode`\ - Called for each `EncodedPacket` that is to be decoded. The resulting video or audio sample **must** then be passed to the `onSample` method. -* `flush`\ - Called when the decoder is expected to finish the decoding process for all remaining packets that haven't finished decoding yet. This method **must** return/resolve only once all packets passed to `decode` have been fully decoded. It **must** then reset its own internal state to be ready for the next decoding batch. -* `close`\ - Called when the decoder is no longer needed and can release its internal resources. - -::: info -All instance methods of the class can return promises. In this case, the library will make sure to *serialize* all method calls such that no two methods ever run concurrently. -::: - -::: warning -The samples passed to `onSample` **must** be sorted by increasing timestamp. This especially means if the decoder is decoding a video stream that makes use of [B-frames](./media-sources.md#b-frames), the decoder **must** internally hold on to these frames so it can emit them sorted by presentation timestamp. This strict sorting requirement is reset each time `flush` is called. -::: - ---- - ---- -url: /guide/writing-media-files.md ---- -# Writing media files - -Mediabunny enables you to create media files with very fine levels of control. You can add an arbitrary number of video, audio and subtitle tracks to a media file, and precisely control the timing of media data. This library supports [many output file formats](./output-formats). Using [output targets](#output-targets), you can decide if you want to build up the entire file in memory or stream it out in chunks as it's being created - allowing you to create very large files. - -Mediabunny provides many ways to supply media data for output tracks, nicely integrating with the WebCodecs API, but also allowing you to use your own encoding stack if you wish. These [media sources](./media-sources) come in multiple levels of abstraction, enabling easy use for common use cases while still giving you fine-grained control if you need it. - -## Creating an output - -Media file creation in Mediabunny revolves around a central class, `Output`. One instance of `Output` represents one media file you want to create. - -Start by creating a new instance of `Output` using the desired configuration of the file you want to create: - -```ts -import { Output, Mp4OutputFormat, BufferTarget } from 'mediabunny'; - -// In this example, we'll be creating an MP4 file in memory: -const output = new Output({ - format: new Mp4OutputFormat(), - target: new BufferTarget(), -}); -``` - -See [Output formats](./output-formats) for a full list of available output formats.\ -See [Output targets](#output-targets) for a full list of available output targets. - -You can always access `format` and `target` on the output: - -```ts -output.format; // => Mp4OutputFormat -output.target; // => BufferTarget -``` - -## Adding tracks - -There are a couple of methods on an `Output` that you can use to add tracks to it: - -```ts -output.addVideoTrack(videoSource); -output.addAudioTrack(audioSource); -output.addSubtitleTrack(subtitleSource); -``` - -For each track you want to add, you'll need to create a unique [media source](./media-sources) for it. You'll be able to add media data to the output via these media sources. A media source can only ever be used for one output track. - -Optionally, you can specify additional track metadata when adding tracks: - -```ts -// This specifies that the video track should be rotated by 90 degrees -// clockwise before being displayed by video players, and that a frame rate -// of 30 FPS is expected. -output.addVideoTrack(videoSource, { - // Clockwise rotation in degrees - rotation: 90, - // Expected frame rate in hertz - frameRate: 30, -}); - -// This adds two audio tracks; one in English and one in German. -output.addAudioTrack(audioSourceEng, { - language: 'eng', // ISO 639-2/T language code - name: 'Developer Commentary', // Sets a user-defined track name - disposition: { commentary: true }, // Sets additional flags in the file -}); -output.addAudioTrack(audioSourceGer, { - language: 'ger', -}); - -// This adds multiple subtitle tracks, all for different languages. -output.addSubtitleTrack(subtitleSourceEng, { language: 'eng' }); -output.addSubtitleTrack(subtitleSourceGer, { language: 'ger' }); -output.addSubtitleTrack(subtitleSourceSpa, { language: 'spa' }); -output.addSubtitleTrack(subtitleSourceFre, { language: 'fre' }); -output.addSubtitleTrack(subtitleSourceIta, { language: 'ita' }); -``` - -::: info -The optional `frameRate` video track metadata option specifies the expected frame rate of the video. All timestamps and durations of frames that will be added to this track will be snapped to the specified frame rate. You should avoid adding frames more often than the rate permits, as this will lead to multiple frames having the same timestamp. - -To precisely achieve common fractional frame rates, make sure to use their exact fractional forms: -$23.976 \rightarrow 24000/1001$\ -$29.97 \rightarrow 30000/1001$\ -$59.94 \rightarrow 60000/1001$ -::: - -As an example, let's add two tracks to our output: - -* A video track driven by the contents of a `` element, encoded using AVC -* An audio track driven by the user's microphone input, encoded using AAC - -```ts -import { CanvasSource, MediaStreamAudioTrackSource } from 'mediabunny'; - -// Assuming `canvasElement` exists -const videoSource = new CanvasSource(canvasElement, { - codec: 'avc', - bitrate: 1e6, // 1 Mbps -}); - -const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); -const audioStreamTrack = stream.getAudioTracks()[0]; -const audioSource = new MediaStreamAudioTrackSource(audioStreamTrack, { - codec: 'aac', - bitrate: 128e3, // 128 kbps -}); - -output.addVideoTrack(videoSource, { frameRate: 30 }); -output.addAudioTrack(audioSource); -``` - -::: warning -Adding tracks to an `Output` will throw if the track is not compatible with the output format. Be sure to respect the [properties](./output-formats#format-properties) of the output format when adding tracks. -::: - -## Setting metadata tags - -Mediabunny lets you write additional descriptive metadata tags to an output file, such as title, artist, or cover art: - -```ts -output.setMetadataTags({ - title: 'Big Buck Bunny', - artist: 'Blender Foundation', - date: new Date('2008-05-20'), - images: [{ - data: new Uint8Array([...]), - mimeType: 'image/jpeg', - kind: 'coverFront', - }], -}); -``` - -If you add metadata tags, you must call this method *before* starting the `Output`. - -For more info on which tags you can write, see [`MetadataTags`](../api/MetadataTags). - -## Starting an output - -After all tracks have been added to the `Output`, you need to *start* it. Starting an output spins up the writing process, allowing you to now start sending media data to the output file. It also prevents you from adding any new tracks to it. - -```ts -await output.start(); // Resolves once the output is ready to receive media data -``` - -## Adding media data - -After starting an `Output`, you can use the media sources you used to add tracks to pipe media data to the output file. The API for this is different for each [media source](./media-sources), but it typically looks something like this: - -```ts -mediaSource.add(...); -``` - -In our example, as soon as we called `start`, the user's microphone input will be piped to the output file. However, we still need to add the data from our canvas. We might do something like this: - -```ts -let framesAdded = 0; -const intervalId = setInterval(() => { - const timestampInSeconds = framesAdded / 30; - const durationInSeconds = 1 / 30; - - // Captures the canvas state at the time of calling `add`: - videoSource.add(timestampInSeconds, durationInSeconds); - framesAdded++; -}, 1000 / 30); -``` - -And then we'll let this run for as long as we want to capture media data. - -## Finalizing an output - -Once all media data has been added, the `Output` needs to be *finalized*. Finalization finishes all remaining encoding -work and writes the remaining data to create the final, playable media file. - -```ts -await output.finalize(); // Resolves once the output is finalized -``` - -::: warning -After calling `finalize`, adding more media data to the output results in an error. -::: - -In our example, we'll need to do this: - -```ts -clearInterval(intervalId); // Stops the canvas loop -audioStreamTrack.stop(); // Stops capturing the user's microphone - -await output.finalize(); - -const file = output.target.buffer; // => Uint8Array -``` - -## Canceling an output - -Sometimes, you may want to cancel the ongoing creation of an output file. For this, use the `cancel` method: - -```ts -await output.cancel(); // Resolves once the output is canceled -``` - -This automatically frees up all resources used by the output process, such as closing all encoders or releasing the -writer. - -::: warning -After calling `cancel`, adding more media data to the output results in an error. -::: - -In our example, we would do this: - -```ts -clearInterval(intervalId); // Stops the canvas loop -audioStreamTrack.stop(); // Stops capturing the user's microphone - -await output.cancel(); - -// The output is canceled -``` - -## Checking output state - -You can always check the current state the output is in using its `state` property: - -```ts -output.state; // => 'pending' | 'started' | 'canceled' | 'finalizing' | 'finalized' -``` - -* `'pending'` - The output hasn't been started or canceled yet; new tracks can be added. -* `'started'` - The output has been started and is ready to receive media data; tracks can no longer be added. -* `'finalizing'` - `finalize` has been called but hasn't resolved yet; no more media data can be added. -* `'finalized'` - The output has been finalized and is done writing the file. -* `'canceled'` - The output has been canceled. - -## Output targets - -The *output target* determines where the data created by the `Output` will be written. This library offers a couple of targets. - -*** - -All targets have an optional `onwrite` callback you can set to monitor which byte regions are being written to: - -```ts -target.onwrite = (start, end) => { - // ... -}; -``` - -You can use this to track the size of the output file as it grows. But be warned, this function is chatty and gets called *extremely* frequently. - -### `BufferTarget` - -This target writes all data to a single, contiguous, in-memory `ArrayBuffer`. This buffer will automatically grow as the file becomes larger. Usage is straightforward: - -```ts -import { Output, BufferTarget } from 'mediabunny'; - -const output = new Output({ - target: new BufferTarget(), - // ... -}); - -// ... - -output.target.buffer; // => null -await output.finalize(); -output.target.buffer; // => ArrayBuffer -``` - -This target is a great choice for small-ish files (< 100 MB), but since all data will be kept in memory, using it for large files is suboptimal. If the output gets very large, the page might crash due to memory exhaustion. For these cases, using `StreamTarget` is recommended. - -### `StreamTarget` - -This target passes you the data written by the `Output` in small chunks, requiring you to pipe that data elsewhere to manually assemble the final file. Example use cases include writing the file directly to disk, or uploading it to a server over the network. - -`StreamTarget` makes use of the Streams API, meaning you'll need to pass it an instance of `WritableStream`: - -```ts -import { Output, StreamTarget, StreamTargetChunk } from 'mediabunny'; - -const writable = new WritableStream({ - write(chunk: StreamTargetChunk) { - chunk.data; // => Uint8Array - chunk.position; // => number - - // Do something with the data... - } -}); - -const output = new Output({ - target: new StreamTarget(writable), - // ... -}); -``` - -Each chunk written to the `WritableStream` represents a contiguous chunk of bytes of the output file, `data`, that is expected to be written at the given byte offset, `position`. The `WritableStream` will automatically be closed when `finalize` or `cancel` are called on the `Output`. - -::: warning -Note that some byte regions in the output file may be written to multiple times. It is therefore **incorrect** to construct the final file by simply concatenating all `Uint8Array`s together - you **must** write each chunk of data at the specified byte offset position *in the order* in which the chunks arrived. If you don't do this, your output file will likely be invalid or corrupted. - -Some [output formats](./output-formats) have *append-only* writing modes in which the byte offset of a written chunk will always be equal to the total number of bytes in all previously written chunks. In other words, when writing is append-only, simply concatening all `Uint8Array`s yields the correct result. Some APIs (like `appendBuffer` of Media Source Extensions) require this, so make sure to configure your output format accordingly for those cases. -::: - -#### Chunked mode - -By default, data will be emitted by the `StreamTarget` as soon as it is available. In some formats, these may lead to hundreds of write events per second. If you want to reduce the frequency of writes, `StreamTarget` offers an alternative "chunked mode" in which data will first be accumulated into large chunks of a given size in memory, and then only be emitted once a chunk is completely full. - -```ts -new StreamTarget(writable, { - chunked: true, - chunkSize: 2 ** 20, // Optional; defaults to 16 MiB -}); -``` - -#### Applying backpressure - -Sometimes, the `Output` may produce new data faster than you are able to write it. In this case, you want to communicate to the `Output` that it should "chill out" and slow down to match the pace that the `WritableStream` is able to handle. When using `StreamTarget`, the `Output` will automatically respect the backpressure applied by the `WritableStream`. For this, it is useful to understand the [Stream API concepts](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Concepts) of how to apply backpressure. - -For example, the writable may apply backpressure by returning a promise in `write`: - -```ts -const writable = new WritableStream({ - write(chunk: StreamTargetChunk) { - // Pretend writing out data takes 10 milliseconds: - return new Promise(resolve => setTimeout(resolve, 10)); - } -}); -``` - -::: info -In order for the writable's backpressure to ripple through the entire pipeline, you must make sure to correctly respect the [backpressure applied by media sources](./media-sources#backpressure). -::: - -#### Usage with the File System API - -`StreamTargetChunk` is designed such that it is compatible with the File System API's `FileSystemWritableFileStream`. This means, if you want to write data directly to disk, you can simply do something like this: - -```ts -const handle = await window.showSaveFilePicker(); -const writableStream = await handle.createWritable(); - -const output = new Output({ - target: new StreamTarget(writableStream), - // ... -}); - -// ... - -await output.finalize(); // Will automatically close the writable stream -``` - -### `FilePathTarget` - -This target writes to a file at the specified path. It is intended for server-side usage in Node, Bun, or Deno, and offers a simpler API than `StreamTarget` when you just want to write directly to a file path. - -```ts -import { Output, FilePathTarget } from 'mediabunny'; - -const output = new Output({ - target: new FilePathTarget('/path/to/output.mp4'), - // ... -}); - -// ... - -await output.finalize(); // Will automatically close the file handle -``` - -The internally held file handle will be closed when `finalize` or `cancel` are called on the `Output`. - -Writing is chunked by default, for performance. Like `StreamTarget`, you can configure chunked mode options: - -```ts -new FilePathTarget('/path/to/output.mp4', { - chunked: false, // Disable chunking (slower) - chunkSize: 2 ** 20, // Optional; defaults to 16 MiB -}); -``` - -### `NullTarget` - -This target simply discards all data that is passed into it. It is useful for when you need an `Output` but extract data from it differently, for example through output format-specific callbacks or encoder events. - -As an example, here we create a fragmented MP4 file and directly handle the individual fragments: - -```ts -import { Output, NullTarget, Mp4OutputFormat } from 'mediabunny'; - -let ftyp: Uint8Array; -let lastMoof: Uint8Array; - -const output = new Output({ - target: new NullTarget(), - format: new Mp4OutputFormat({ - fastStart: 'fragmented', - onFtyp: (data) => { - ftyp = data; - }, - onMoov: (data) => { - const header = new Uint8Array(ftyp.length + data.length); - header.set(ftyp, 0); - header.set(data, ftyp.length); - - // Do something with the header... - }, - onMoof: (data) => { - lastMoof = data; - }, - onMdat: (data) => { - const segment = new Uint8Array(lastMoof.length + data.length); - segment.set(lastMoof, 0); - segment.set(data, lastMoof.length); - - // Do something with the segment... - }, - }), -}); -``` - -## Packet buffering - -Some [output formats](./output-formats) require *packet buffering* for multi-track outputs. Packet buffering occurs because the `Output` must wait for data from all tracks for a given timestamp to continue writing data. For example, should you first encode all your video frames and then encode the audio afterward, the `Output` will have to hold all of the video frames in memory until the audio packets start coming in. This might lead to memory exhaustion should your video be very long. When there is only one media track, this issue does not arise. - -Check the [Output formats](./output-formats) page to see which format configurations require packet buffering. - -*** - -If your output format configuration requires packet buffering, make sure to add media data in a somewhat interleaved way to keep memory usage low. For example, if you're creating a 5-minute file, add your data in chunks - 10 seconds of video, then 10 seconds of audio, then repeat - instead of first adding all 300 seconds of video followed by all 300 seconds of audio. - -::: info -If this kind of chunking isn't possible for your use case, try adding the media with the overall smaller data footprint first: First add the 300 seconds of audio, then add the 300 seconds of video. -::: - -## Output MIME type - -Sometimes you may want to retrieve the MIME type of the file created by an `Output`. For example, when working with Media Source Extensions, [`addSourceBuffer`](https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/addSourceBuffer) requires the file's full MIME type, including codec strings. - -For this, use the following method: - -```ts -output.getMimeType(); // => Promise -``` - -This may resolve to a string like this: - -``` -video/mp4; codecs="avc1.42c032, mp4a.40.2" -``` - -::: warning -The promise returned by `getMimeType` only resolves once the precise codec strings for all tracks of the `Output` are known - meaning it potentially needs to wait for all encoders to be fully initialized. Therefore, make sure not to get yourself into a deadlock: Awaiting this method before adding media data to tracks will result in the promise never resolving. -::: - -If you don't care about specific track codecs, you can instead use the simpler [`mimeType`](./output-formats#output-format-properties) property on the `Output`'s format: - -```ts -output.format.mimeType; // => string -``` diff --git a/packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts b/packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts deleted file mode 100644 index 04f458e8b..000000000 --- a/packages/artplayer-proxy-mediabunny/mediabunny/mediabunny.d.ts +++ /dev/null @@ -1,3174 +0,0 @@ -/// -/// - -/** - * ADTS input format singleton. - * @group Input formats - * @public - */ -export declare const ADTS: AdtsInputFormat; - -/** - * ADTS file format. - * - * Do not instantiate this class; use the {@link ADTS} singleton instead. - * - * @group Input formats - * @public - */ -export declare class AdtsInputFormat extends InputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * ADTS file format. - * @group Output formats - * @public - */ -export declare class AdtsOutputFormat extends OutputFormat { - /** Creates a new {@link AdtsOutputFormat} configured with the specified `options`. */ - constructor(options?: AdtsOutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * ADTS-specific output options. - * @group Output formats - * @public - */ -export declare type AdtsOutputFormatOptions = { - /** - * Will be called for each ADTS frame that is written. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onFrame?: (data: Uint8Array, position: number) => unknown; -}; - -/** - * List of all input format singletons. If you don't need to support all input formats, you should specify the - * formats individually for better tree shaking. - * @group Input formats - * @public - */ -export declare const ALL_FORMATS: InputFormat[]; - -/** - * List of all track types. - * @group Miscellaneous - * @public - */ -export declare const ALL_TRACK_TYPES: readonly ["video", "audio", "subtitle"]; - -/** - * Sync or async iterable. - * @group Miscellaneous - * @public - */ -export declare type AnyIterable = Iterable | AsyncIterable; - -/** - * A file attached to a media file. - * - * @group Metadata tags - * @public - */ -export declare class AttachedFile { - /** The raw file data. */ - data: Uint8Array; - /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */ - mimeType?: string | undefined; - /** The name of the file. */ - name?: string | undefined; - /** A description of the file. */ - description?: string | undefined; - /** Creates a new {@link AttachedFile}. */ - constructor( - /** The raw file data. */ - data: Uint8Array, - /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, font/ttf, etc.) */ - mimeType?: string | undefined, - /** The name of the file. */ - name?: string | undefined, - /** A description of the file. */ - description?: string | undefined); -} - -/** - * An embedded image such as cover art, booklet scan, artwork or preview frame. - * - * @group Metadata tags - * @public - */ -export declare type AttachedImage = { - /** The raw image data. */ - data: Uint8Array; - /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ - mimeType: string; - /** The kind or purpose of the image. */ - kind: 'coverFront' | 'coverBack' | 'unknown'; - /** The name of the image file. */ - name?: string; - /** A description of the image. */ - description?: string; -}; - -/** - * List of known audio codecs, ordered by encoding preference. - * @group Codecs - * @public - */ -export declare const AUDIO_CODECS: readonly ["aac", "opus", "mp3", "vorbis", "flac", "pcm-s16", "pcm-s16be", "pcm-s24", "pcm-s24be", "pcm-s32", "pcm-s32be", "pcm-f32", "pcm-f32be", "pcm-f64", "pcm-f64be", "pcm-u8", "pcm-s8", "ulaw", "alaw"]; - -/** - * A sink that retrieves decoded audio samples from an audio track and converts them to `AudioBuffer` instances. This is - * often more useful than directly retrieving audio samples, as audio buffers can be directly used with the - * Web Audio API. - * @group Media sinks - * @public - */ -export declare class AudioBufferSink { - /** Creates a new {@link AudioBufferSink} for the given {@link InputAudioTrack}. */ - constructor(audioTrack: InputAudioTrack); - /** - * Retrieves the audio buffer corresponding to the given timestamp, in seconds. More specifically, returns - * the last audio buffer (in presentation order) with a start timestamp less than or equal to the given timestamp. - * Returns null if the timestamp is before the track's first timestamp. - * - * @param timestamp - The timestamp used for retrieval, in seconds. - */ - getBuffer(timestamp: number): Promise; - /** - * Creates an async iterator that yields audio buffers of this track in presentation order. This method - * will intelligently pre-decode a few buffers ahead to enable fast iteration. - * - * @param startTimestamp - The timestamp in seconds at which to start yielding buffers (inclusive). - * @param endTimestamp - The timestamp in seconds at which to stop yielding buffers (exclusive). - */ - buffers(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; - /** - * Creates an async iterator that yields an audio buffer for each timestamp in the argument. This method - * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most - * once, and is therefore more efficient than manually getting the buffer for every timestamp. The iterator may - * yield null if no buffer is available for a given timestamp. - * - * @param timestamps - An iterable or async iterable of timestamps in seconds. - */ - buffersAtTimestamps(timestamps: AnyIterable): AsyncGenerator; -} - -/** - * This source can be used to add audio data from an AudioBuffer to the output track. This is useful when working with - * the Web Audio API. - * @group Media sources - * @public - */ -export declare class AudioBufferSource extends AudioSource { - /** - * Creates a new {@link AudioBufferSource} whose `AudioBuffer` instances are encoded according to the specified - * {@link AudioEncodingConfig}. - */ - constructor(encodingConfig: AudioEncodingConfig); - /** - * Converts an AudioBuffer to audio samples, encodes them and adds them to the output. The first AudioBuffer will - * be played at timestamp 0, and any subsequent AudioBuffer will have a timestamp equal to the total duration of - * all previous AudioBuffers. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(audioBuffer: AudioBuffer): Promise; -} - -/** - * Union type of known audio codecs. - * @group Codecs - * @public - */ -export declare type AudioCodec = typeof AUDIO_CODECS[number]; - -/** - * Additional options that control audio encoding. - * @group Encoding - * @public - */ -export declare type AudioEncodingAdditionalOptions = { - /** Configures the bitrate mode. */ - bitrateMode?: 'constant' | 'variable'; - /** - * The full codec string as specified in the WebCodecs Codec Registry. This string must match the codec - * specified in `codec`. When not set, a fitting codec string will be constructed automatically by the library. - */ - fullCodecString?: string; -}; - -/** - * Configuration object that controls audio encoding. Can be used to set codec, quality, and more. - * @group Encoding - * @public - */ -export declare type AudioEncodingConfig = { - /** The audio codec that should be used for encoding the audio samples. */ - codec: AudioCodec; - /** - * The target bitrate for the encoded audio, in bits per second. Alternatively, a subjective {@link Quality} can - * be provided. Required for compressed audio codecs, unused for PCM codecs. - */ - bitrate?: number | Quality; - /** Called for each successfully encoded packet. Both the packet and the encoding metadata are passed. */ - onEncodedPacket?: (packet: EncodedPacket, meta: EncodedAudioChunkMetadata | undefined) => unknown; - /** - * Called when the internal [encoder config](https://www.w3.org/TR/webcodecs/#audio-encoder-config), as used by the - * WebCodecs API, is created. - */ - onEncoderConfig?: (config: AudioEncoderConfig) => unknown; -} & AudioEncodingAdditionalOptions; - -/** - * Represents a raw, unencoded audio sample. Mainly used as an expressive wrapper around WebCodecs API's - * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData), but can also be used standalone. - * @group Samples - * @public - */ -export declare class AudioSample implements Disposable { - /** - * The audio sample format. - * [See sample formats](https://developer.mozilla.org/en-US/docs/Web/API/AudioData/format) - */ - readonly format: AudioSampleFormat; - /** The audio sample rate in hertz. */ - readonly sampleRate: number; - /** - * The number of audio frames in the sample, per channel. In other words, the length of this audio sample in frames. - */ - readonly numberOfFrames: number; - /** The number of audio channels. */ - readonly numberOfChannels: number; - /** The duration of the sample in seconds. */ - readonly duration: number; - /** - * The presentation timestamp of the sample in seconds. May be negative. Samples with negative end timestamps should - * not be presented. - */ - readonly timestamp: number; - /** The presentation timestamp of the sample in microseconds. */ - get microsecondTimestamp(): number; - /** The duration of the sample in microseconds. */ - get microsecondDuration(): number; - /** - * Creates a new {@link AudioSample}, either from an existing - * [`AudioData`](https://developer.mozilla.org/en-US/docs/Web/API/AudioData) or from raw bytes specified in - * {@link AudioSampleInit}. - */ - constructor(init: AudioData | AudioSampleInit); - /** Returns the number of bytes required to hold the audio sample's data as specified by the given options. */ - allocationSize(options: AudioSampleCopyToOptions): number; - /** Copies the audio sample's data to an ArrayBuffer or ArrayBufferView as specified by the given options. */ - copyTo(destination: AllowSharedBufferSource, options: AudioSampleCopyToOptions): void; - /** Clones this audio sample. */ - clone(): AudioSample; - /** - * Closes this audio sample, releasing held resources. Audio samples should be closed as soon as they are not - * needed anymore. - */ - close(): void; - /** - * Converts this audio sample to an AudioData for use with the WebCodecs API. The AudioData returned by this - * method *must* be closed separately from this audio sample. - */ - toAudioData(): AudioData; - /** Convert this audio sample to an AudioBuffer for use with the Web Audio API. */ - toAudioBuffer(): AudioBuffer; - /** Sets the presentation timestamp of this audio sample, in seconds. */ - setTimestamp(newTimestamp: number): void; - /** Calls `.close()`. */ - [Symbol.dispose](): void; - /** - * Creates AudioSamples from an AudioBuffer, starting at the given timestamp in seconds. Typically creates exactly - * one sample, but may create multiple if the AudioBuffer is exceedingly large. - */ - static fromAudioBuffer(audioBuffer: AudioBuffer, timestamp: number): AudioSample[]; -} - -/** - * Options used for copying audio sample data. - * @group Samples - * @public - */ -export declare type AudioSampleCopyToOptions = { - /** - * The index identifying the plane to copy from. This must be 0 if using a non-planar (interleaved) output format. - */ - planeIndex: number; - /** - * The output format for the destination data. Defaults to the AudioSample's format. - * [See sample formats](https://developer.mozilla.org/en-US/docs/Web/API/AudioData/format) - */ - format?: AudioSampleFormat; - /** An offset into the source plane data indicating which frame to begin copying from. Defaults to 0. */ - frameOffset?: number; - /** - * The number of frames to copy. If not provided, the copy will include all frames in the plane beginning - * with frameOffset. - */ - frameCount?: number; -}; - -/** - * Metadata used for AudioSample initialization. - * @group Samples - * @public - */ -export declare type AudioSampleInit = { - /** The audio data for this sample. */ - data: AllowSharedBufferSource; - /** - * The audio sample format. [See sample formats](https://developer.mozilla.org/en-US/docs/Web/API/AudioData/format) - */ - format: AudioSampleFormat; - /** The number of audio channels. */ - numberOfChannels: number; - /** The audio sample rate in hertz. */ - sampleRate: number; - /** The presentation timestamp of the sample in seconds. */ - timestamp: number; -}; - -/** - * Sink for retrieving decoded audio samples from an audio track. - * @group Media sinks - * @public - */ -export declare class AudioSampleSink extends BaseMediaSampleSink { - /** Creates a new {@link AudioSampleSink} for the given {@link InputAudioTrack}. */ - constructor(audioTrack: InputAudioTrack); - /** - * Retrieves the audio sample corresponding to the given timestamp, in seconds. More specifically, returns - * the last audio sample (in presentation order) with a start timestamp less than or equal to the given timestamp. - * Returns null if the timestamp is before the track's first timestamp. - * - * @param timestamp - The timestamp used for retrieval, in seconds. - */ - getSample(timestamp: number): Promise; - /** - * Creates an async iterator that yields the audio samples of this track in presentation order. This method - * will intelligently pre-decode a few samples ahead to enable fast iteration. - * - * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive). - * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive). - */ - samples(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; - /** - * Creates an async iterator that yields an audio sample for each timestamp in the argument. This method - * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most - * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may - * yield null if no sample is available for a given timestamp. - * - * @param timestamps - An iterable or async iterable of timestamps in seconds. - */ - samplesAtTimestamps(timestamps: AnyIterable): AsyncGenerator; -} - -/** - * This source can be used to add raw, unencoded audio samples to an output audio track. These samples will - * automatically be encoded and then piped into the output. - * @group Media sources - * @public - */ -export declare class AudioSampleSource extends AudioSource { - /** - * Creates a new {@link AudioSampleSource} whose samples are encoded according to the specified - * {@link AudioEncodingConfig}. - */ - constructor(encodingConfig: AudioEncodingConfig); - /** - * Encodes an audio sample and then adds it to the output. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(audioSample: AudioSample): Promise; -} - -/** - * Base class for audio sources - sources for audio tracks. - * @group Media sources - * @public - */ -export declare abstract class AudioSource extends MediaSource_2 { - /** Internal constructor. */ - constructor(codec: AudioCodec); -} - -/** - * Additional metadata for audio tracks. - * @group Output files - * @public - */ -export declare type AudioTrackMetadata = BaseTrackMetadata & {}; - -/** - * Base class for decoded media sample sinks. - * @group Media sinks - * @public - */ -export declare abstract class BaseMediaSampleSink { -} - -/** - * Base track metadata, applicable to all tracks. - * @group Output files - * @public - */ -export declare type BaseTrackMetadata = { - /** The three-letter, ISO 639-2/T language code specifying the language of this track. */ - languageCode?: string; - /** A user-defined name for this track, like "English" or "Director Commentary". */ - name?: string; - /** The track's disposition, i.e. information about its intended usage. */ - disposition?: Partial; - /** - * The maximum amount of encoded packets that will be added to this track. Setting this field provides the muxer - * with an additional signal that it can use to preallocate space in the file. - * - * When this field is set, it is an error to provide more packets than whatever this field specifies. - * - * Predicting the maximum packet count requires considering both the maximum duration as well as the codec. - * - For video codecs, you can assume one packet per frame. - * - For audio codecs, there is one packet for each "audio chunk", the duration of which depends on the codec. For - * simplicity, you can assume each packet is roughly 10 ms or 512 samples long, whichever is shorter. - * - For subtitles, assume each cue and each gap in the subtitles adds a packet. - * - * If you're not fully sure, make sure to add a buffer of around 33% to make sure you stay below the maximum. - */ - maximumPacketCount?: number; -}; - -/** - * A source backed by a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). Since a - * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File) is also a `Blob`, this is the source to use when - * reading files off the disk. - * @group Input sources - * @public - */ -export declare class BlobSource extends Source { - /** - * Creates a new {@link BlobSource} backed by the specified - * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob). - */ - constructor(blob: Blob, options?: BlobSourceOptions); -} - -/** - * Options for {@link BlobSource}. - * @group Input sources - * @public - */ -export declare type BlobSourceOptions = { - /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. */ - maxCacheSize?: number; -}; - -/** - * A source backed by an ArrayBuffer or ArrayBufferView, with the entire file held in memory. - * @group Input sources - * @public - */ -declare class BufferSource_2 extends Source { - /** - * Creates a new {@link BufferSource} backed by the specified `ArrayBuffer`, `SharedArrayBuffer`, - * or `ArrayBufferView`. - */ - constructor(buffer: AllowSharedBufferSource); -} -export { BufferSource_2 as BufferSource } - -/** - * A target that writes data directly into an ArrayBuffer in memory. Great for performance, but not suitable for very - * large files. The buffer will be available once the output has been finalized. - * @group Output targets - * @public - */ -export declare class BufferTarget extends Target { - /** Stores the final output buffer. Until the output is finalized, this will be `null`. */ - buffer: ArrayBuffer | null; -} - -/** - * Checks if the browser is able to encode the given codec. - * @group Encoding - * @public - */ -export declare const canEncode: (codec: MediaCodec) => Promise; - -/** - * Checks if the browser is able to encode the given audio codec with the given parameters. - * @group Encoding - * @public - */ -export declare const canEncodeAudio: (codec: AudioCodec, options?: { - numberOfChannels?: number; - sampleRate?: number; - bitrate?: number | Quality; -} & AudioEncodingAdditionalOptions) => Promise; - -/** - * Checks if the browser is able to encode the given subtitle codec. - * @group Encoding - * @public - */ -export declare const canEncodeSubtitles: (codec: SubtitleCodec) => Promise; - -/** - * Checks if the browser is able to encode the given video codec with the given parameters. - * @group Encoding - * @public - */ -export declare const canEncodeVideo: (codec: VideoCodec, options?: { - width?: number; - height?: number; - bitrate?: number | Quality; -} & VideoEncodingAdditionalOptions) => Promise; - -/** - * A sink that renders video samples (frames) of the given video track to canvases. This is often more useful than - * directly retrieving frames, as it comes with common preprocessing steps such as resizing or applying rotation - * metadata. - * - * This sink will yield `HTMLCanvasElement`s when in a DOM context, and `OffscreenCanvas`es otherwise. - * - * @group Media sinks - * @public - */ -export declare class CanvasSink { - /** Creates a new {@link CanvasSink} for the given {@link InputVideoTrack}. */ - constructor(videoTrack: InputVideoTrack, options?: CanvasSinkOptions); - /** - * Retrieves a canvas with the video frame corresponding to the given timestamp, in seconds. More specifically, - * returns the last video frame (in presentation order) with a start timestamp less than or equal to the given - * timestamp. Returns null if the timestamp is before the track's first timestamp. - * - * @param timestamp - The timestamp used for retrieval, in seconds. - */ - getCanvas(timestamp: number): Promise; - /** - * Creates an async iterator that yields canvases with the video frames of this track in presentation order. This - * method will intelligently pre-decode a few frames ahead to enable fast iteration. - * - * @param startTimestamp - The timestamp in seconds at which to start yielding canvases (inclusive). - * @param endTimestamp - The timestamp in seconds at which to stop yielding canvases (exclusive). - */ - canvases(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; - /** - * Creates an async iterator that yields a canvas for each timestamp in the argument. This method uses an optimized - * decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most once, and is - * therefore more efficient than manually getting the canvas for every timestamp. The iterator may yield null if - * no frame is available for a given timestamp. - * - * @param timestamps - An iterable or async iterable of timestamps in seconds. - */ - canvasesAtTimestamps(timestamps: AnyIterable): AsyncGenerator; -} - -/** - * Options for constructing a CanvasSink. - * @group Media sinks - * @public - */ -export declare type CanvasSinkOptions = { - /** - * Whether the output canvases should have transparency instead of a black background. Defaults to `false`. Set - * this to `true` when using this sink to read transparent videos. - */ - alpha?: boolean; - /** - * The width of the output canvas in pixels, defaulting to the display width of the video track. If height is not - * set, it will be deduced automatically based on aspect ratio. - */ - width?: number; - /** - * The height of the output canvas in pixels, defaulting to the display height of the video track. If width is not - * set, it will be deduced automatically based on aspect ratio. - */ - height?: number; - /** - * The fitting algorithm in case both width and height are set. - * - * - `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. - * - `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to - * letterboxing. - * - `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. - */ - fit?: 'fill' | 'contain' | 'cover'; - /** - * The clockwise rotation by which to rotate the raw video frame. Defaults to the rotation set in the file metadata. - * Rotation is applied before resizing. - */ - rotation?: Rotation; - /** - * Specifies the rectangular region of the input video to crop to. The crop region will automatically be clamped to - * the dimensions of the input video track. Cropping is performed after rotation but before resizing. - */ - crop?: CropRectangle; - /** - * When set, specifies the number of canvases in the pool. These canvases will be reused in a ring buffer / - * round-robin type fashion. This keeps the amount of allocated VRAM constant and relieves the browser from - * constantly allocating/deallocating canvases. A pool size of 0 or `undefined` disables the pool and means a new - * canvas is created each time. - */ - poolSize?: number; -}; - -/** - * This source can be used to add video frames to the output track from a fixed canvas element. Since canvases are often - * used for rendering, this source provides a convenient wrapper around {@link VideoSampleSource}. - * @group Media sources - * @public - */ -export declare class CanvasSource extends VideoSource { - /** - * Creates a new {@link CanvasSource} from a canvas element or `OffscreenCanvas` whose samples are encoded - * according to the specified {@link VideoEncodingConfig}. - */ - constructor(canvas: HTMLCanvasElement | OffscreenCanvas, encodingConfig: VideoEncodingConfig); - /** - * Captures the current canvas state as a video sample (frame), encodes it and adds it to the output. - * - * @param timestamp - The timestamp of the sample, in seconds. - * @param duration - The duration of the sample, in seconds. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(timestamp: number, duration?: number, encodeOptions?: VideoEncoderEncodeOptions): Promise; -} - -/** - * Represents a media file conversion process, used to convert one media file into another. In addition to conversion, - * this class can be used to resize and rotate video, resample audio, drop tracks, or trim to a specific time range. - * @group Conversion - * @public - */ -export declare class Conversion { - /** The input file. */ - readonly input: Input; - /** The output file. */ - readonly output: Output; - /** - * A callback that is fired whenever the conversion progresses. Returns a number between 0 and 1, indicating the - * completion of the conversion. Note that a progress of 1 doesn't necessarily mean the conversion is complete; - * the conversion is complete once `execute()` resolves. - * - * In order for progress to be computed, this property must be set before `execute` is called. - */ - onProgress?: (progress: number) => unknown; - /** - * Whether this conversion, as it has been configured, is valid and can be executed. If this field is `false`, check - * the `discardedTracks` field for reasons. - */ - isValid: boolean; - /** The list of tracks that are included in the output file. */ - readonly utilizedTracks: InputTrack[]; - /** The list of tracks from the input file that have been discarded, alongside the discard reason. */ - readonly discardedTracks: DiscardedTrack[]; - /** Initializes a new conversion process without starting the conversion. */ - static init(options: ConversionOptions): Promise; - /** Creates a new Conversion instance (duh). */ - private constructor(); - /** - * Executes the conversion process. Resolves once conversion is complete. - * - * Will throw if `isValid` is `false`. - */ - execute(): Promise; - /** Cancels the conversion process. Does nothing if the conversion is already complete. */ - cancel(): Promise; -} - -/** - * Audio-specific options. - * @group Conversion - * @public - */ -export declare type ConversionAudioOptions = { - /** If `true`, all audio tracks will be discarded and will not be present in the output. */ - discard?: boolean; - /** The desired channel count of the output audio. */ - numberOfChannels?: number; - /** The desired sample rate of the output audio, in hertz. */ - sampleRate?: number; - /** The desired output audio codec. */ - codec?: AudioCodec; - /** The desired bitrate of the output audio. */ - bitrate?: number | Quality; - /** When `true`, audio will always be re-encoded instead of directly copying over the encoded samples. */ - forceTranscode?: boolean; - /** - * Allows for custom user-defined processing of audio samples, e.g. for applying audio effects, transformations, or - * timestamp modifications. Will be called for each input audio sample after remixing and resampling. - * - * Must return an {@link AudioSample}, an array of them, or `null` for dropping the sample. - * - * This function can also be used to manually perform remixing or resampling. When doing so, you should signal the - * post-process parameters using the `processedNumberOfChannels` and `processedSampleRate` fields, which enables the - * encoder to better know what to expect. If these fields aren't set, Mediabunny will assume you won't perform - * remixing or resampling. - */ - process?: (sample: AudioSample) => MaybePromise; - /** - * An optional hint specifying the channel count of audio samples returned by the `process` function, for better - * encoder configuration. - */ - processedNumberOfChannels?: number; - /** - * An optional hint specifying the sample rate of audio samples returned by the `process` function, for better - * encoder configuration. - */ - processedSampleRate?: number; -}; - -/** - * The options for media file conversion. - * @group Conversion - * @public - */ -export declare type ConversionOptions = { - /** The input file. */ - input: Input; - /** The output file. */ - output: Output; - /** - * Video-specific options. When passing an object, the same options are applied to all video tracks. When passing a - * function, it will be invoked for each video track and is expected to return or resolve to the options - * for that specific track. The function is passed an instance of {@link InputVideoTrack} as well as a number `n`, - * which is the 1-based index of the track in the list of all video tracks. - */ - video?: ConversionVideoOptions | ((track: InputVideoTrack, n: number) => MaybePromise); - /** - * Audio-specific options. When passing an object, the same options are applied to all audio tracks. When passing a - * function, it will be invoked for each audio track and is expected to return or resolve to the options - * for that specific track. The function is passed an instance of {@link InputAudioTrack} as well as a number `n`, - * which is the 1-based index of the track in the list of all audio tracks. - */ - audio?: ConversionAudioOptions | ((track: InputAudioTrack, n: number) => MaybePromise); - /** Options to trim the input file. */ - trim?: { - /** - * The time in the input file in seconds at which the output file should start. Must be less than `end`. - * Defaults to 0 when omitted. - */ - start?: number; - /** - * The time in the input file in seconds at which the output file should end. Must be greater than `start`. - * Defaults to the duration of the input when omitted. - */ - end?: number; - }; - /** - * An object or a callback that returns or resolves to an object containing the descriptive metadata tags that - * should be written to the output file. If a function is passed, it will be passed the tags of the input file as - * its first argument, allowing you to modify, augment or extend them. - * - * If no function is set, the input's metadata tags will be copied to the output. - */ - tags?: MetadataTags | ((inputTags: MetadataTags) => MaybePromise); - /** - * Whether to show potential console warnings about discarded tracks after calling `Conversion.init()`, defaults to - * `true`. Set this to `false` if you're properly handling the `discardedTracks` and `isValid` fields already and - * want to keep the console output clean. - */ - showWarnings?: boolean; -}; - -/** - * Video-specific options. - * @group Conversion - * @public - */ -export declare type ConversionVideoOptions = { - /** If `true`, all video tracks will be discarded and will not be present in the output. */ - discard?: boolean; - /** - * The desired width of the output video in pixels, defaulting to the video's natural display width. If height - * is not set, it will be deduced automatically based on aspect ratio. - */ - width?: number; - /** - * The desired height of the output video in pixels, defaulting to the video's natural display height. If width - * is not set, it will be deduced automatically based on aspect ratio. - */ - height?: number; - /** - * The fitting algorithm in case both width and height are set, or if the input video changes its size over time. - * - * - `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. - * - `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to - * letterboxing. - * - `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. - */ - fit?: 'fill' | 'contain' | 'cover'; - /** - * The angle in degrees to rotate the input video by, clockwise. Rotation is applied before cropping and resizing. - * This rotation is _in addition to_ the natural rotation of the input video as specified in input file's metadata. - */ - rotate?: Rotation; - /** - * Defaults to `true`. When enabaled, Mediabunny will use the rotation metadata in the output file to perform video - * rotation whenever possible. Set this field to `false` if you want to ensure the output file does not make use of - * rotation metadata and that any rotation is baked into the video frames directly. - */ - allowRotationMetadata?: boolean; - /** - * Specifies the rectangular region of the input video to crop to. The crop region will automatically be clamped to - * the dimensions of the input video track. Cropping is performed after rotation but before resizing. - */ - crop?: { - /** The distance in pixels from the left edge of the source frame to the left edge of the crop rectangle. */ - left: number; - /** The distance in pixels from the top edge of the source frame to the top edge of the crop rectangle. */ - top: number; - /** The width in pixels of the crop rectangle. */ - width: number; - /** The height in pixels of the crop rectangle. */ - height: number; - }; - /** - * The desired frame rate of the output video, in hertz. If not specified, the original input frame rate will - * be used (which may be variable). - */ - frameRate?: number; - /** The desired output video codec. */ - codec?: VideoCodec; - /** The desired bitrate of the output video. */ - bitrate?: number | Quality; - /** - * Whether to discard or keep the transparency information of the input video. The default is `'discard'`. Note that - * for `'keep'` to produce a transparent video, you must use an output config that supports it, such as WebM with - * VP9. - */ - alpha?: 'discard' | 'keep'; - /** - * The interval, in seconds, of how often frames are encoded as a key frame. The default is 5 seconds. Frequent key - * frames improve seeking behavior but increase file size. When using multiple video tracks, you should give them - * all the same key frame interval. - * - * Setting this fields forces a transcode. - */ - keyFrameInterval?: number; - /** When `true`, video will always be re-encoded instead of directly copying over the encoded samples. */ - forceTranscode?: boolean; - /** - * Allows for custom user-defined processing of video frames, e.g. for applying overlays, color transformations, or - * timestamp modifications. Will be called for each input video sample after transformations and frame rate - * corrections. - * - * Must return a {@link VideoSample} or a `CanvasImageSource`, an array of them, or `null` for dropping the frame. - * When non-timestamped data is returned, the timestamp and duration from the source sample will be used. Rotation - * metadata of the returned sample will be ignored. - * - * This function can also be used to manually resize frames. When doing so, you should signal the post-process - * dimensions using the `processedWidth` and `processedHeight` fields, which enables the encoder to better know what - * to expect. If these fields aren't set, Mediabunny will assume you won't perform any resizing. - */ - process?: (sample: VideoSample) => MaybePromise; - /** - * An optional hint specifying the width of video samples returned by the `process` function, for better - * encoder configuration. - */ - processedWidth?: number; - /** - * An optional hint specifying the height of video samples returned by the `process` function, for better - * encoder configuration. - */ - processedHeight?: number; -}; - -/** - * Specifies the rectangular cropping region. - * @group Miscellaneous - * @public - */ -export declare type CropRectangle = { - /** The distance in pixels from the left edge of the source frame to the left edge of the crop rectangle. */ - left: number; - /** The distance in pixels from the top edge of the source frame to the top edge of the crop rectangle. */ - top: number; - /** The width in pixels of the crop rectangle. */ - width: number; - /** The height in pixels of the crop rectangle. */ - height: number; -}; - -/** - * Base class for custom audio decoders. To add your own custom audio decoder, extend this class, implement the - * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}. - * @group Custom coders - * @public - */ -export declare abstract class CustomAudioDecoder { - /** The input audio's codec. */ - readonly codec: AudioCodec; - /** The input audio's decoder config. */ - readonly config: AudioDecoderConfig; - /** The callback to call when a decoded AudioSample is available. */ - readonly onSample: (sample: AudioSample) => unknown; - /** Returns true if and only if the decoder can decode the given codec configuration. */ - static supports(codec: AudioCodec, config: AudioDecoderConfig): boolean; - /** Called after decoder creation; can be used for custom initialization logic. */ - abstract init(): MaybePromise; - /** Decodes the provided encoded packet. */ - abstract decode(packet: EncodedPacket): MaybePromise; - /** Decodes all remaining packets and then resolves. */ - abstract flush(): MaybePromise; - /** Called when the decoder is no longer needed and its resources can be freed. */ - abstract close(): MaybePromise; -} - -/** - * Base class for custom audio encoders. To add your own custom audio encoder, extend this class, implement the - * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}. - * @group Custom coders - * @public - */ -export declare abstract class CustomAudioEncoder { - /** The codec with which to encode the audio. */ - readonly codec: AudioCodec; - /** Config for the encoder. */ - readonly config: AudioEncoderConfig; - /** The callback to call when an EncodedPacket is available. */ - readonly onPacket: (packet: EncodedPacket, meta?: EncodedAudioChunkMetadata) => unknown; - /** Returns true if and only if the encoder can encode the given codec configuration. */ - static supports(codec: AudioCodec, config: AudioEncoderConfig): boolean; - /** Called after encoder creation; can be used for custom initialization logic. */ - abstract init(): MaybePromise; - /** Encodes the provided audio sample. */ - abstract encode(audioSample: AudioSample): MaybePromise; - /** Encodes all remaining audio samples and then resolves. */ - abstract flush(): MaybePromise; - /** Called when the encoder is no longer needed and its resources can be freed. */ - abstract close(): MaybePromise; -} - -/** - * Base class for custom video decoders. To add your own custom video decoder, extend this class, implement the - * abstract methods and static `supports` method, and register the decoder using {@link registerDecoder}. - * @group Custom coders - * @public - */ -export declare abstract class CustomVideoDecoder { - /** The input video's codec. */ - readonly codec: VideoCodec; - /** The input video's decoder config. */ - readonly config: VideoDecoderConfig; - /** The callback to call when a decoded VideoSample is available. */ - readonly onSample: (sample: VideoSample) => unknown; - /** Returns true if and only if the decoder can decode the given codec configuration. */ - static supports(codec: VideoCodec, config: VideoDecoderConfig): boolean; - /** Called after decoder creation; can be used for custom initialization logic. */ - abstract init(): MaybePromise; - /** Decodes the provided encoded packet. */ - abstract decode(packet: EncodedPacket): MaybePromise; - /** Decodes all remaining packets and then resolves. */ - abstract flush(): MaybePromise; - /** Called when the decoder is no longer needed and its resources can be freed. */ - abstract close(): MaybePromise; -} - -/** - * Base class for custom video encoders. To add your own custom video encoder, extend this class, implement the - * abstract methods and static `supports` method, and register the encoder using {@link registerEncoder}. - * @group Custom coders - * @public - */ -export declare abstract class CustomVideoEncoder { - /** The codec with which to encode the video. */ - readonly codec: VideoCodec; - /** Config for the encoder. */ - readonly config: VideoEncoderConfig; - /** The callback to call when an EncodedPacket is available. */ - readonly onPacket: (packet: EncodedPacket, meta?: EncodedVideoChunkMetadata) => unknown; - /** Returns true if and only if the encoder can encode the given codec configuration. */ - static supports(codec: VideoCodec, config: VideoEncoderConfig): boolean; - /** Called after encoder creation; can be used for custom initialization logic. */ - abstract init(): MaybePromise; - /** Encodes the provided video sample. */ - abstract encode(videoSample: VideoSample, options: VideoEncoderEncodeOptions): MaybePromise; - /** Encodes all remaining video samples and then resolves. */ - abstract flush(): MaybePromise; - /** Called when the encoder is no longer needed and its resources can be freed. */ - abstract close(): MaybePromise; -} - -/** - * An input track that was discarded (excluded) from a {@link Conversion} alongside the discard reason. - * @group Conversion - * @public - */ -export declare type DiscardedTrack = { - /** The track that was discarded. */ - track: InputTrack; - /** - * The reason for discarding the track. - * - * - `'discarded_by_user'`: You discarded this track by setting `discard: true`. - * - `'max_track_count_reached'`: The output had no more room for another track. - * - `'max_track_count_of_type_reached'`: The output had no more room for another track of this type, or the output - * doesn't support this track type at all. - * - `'unknown_source_codec'`: We don't know the codec of the input track and therefore don't know what to do - * with it. - * - `'undecodable_source_codec'`: The input track's codec is known, but we are unable to decode it. - * - `'no_encodable_target_codec'`: We can't find a codec that we are able to encode and that can be contained - * within the output format. This reason can be hit if the environment doesn't support the necessary encoders, or if - * you requested a codec that cannot be contained within the output format. - */ - reason: 'discarded_by_user' | 'max_track_count_reached' | 'max_track_count_of_type_reached' | 'unknown_source_codec' | 'undecodable_source_codec' | 'no_encodable_target_codec'; -}; - -/** - * The most basic audio source; can be used to directly pipe encoded packets into the output file. - * @group Media sources - * @public - */ -export declare class EncodedAudioPacketSource extends AudioSource { - /** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */ - constructor(codec: AudioCodec); - /** - * Adds an encoded packet to the output audio track. Packets must be added in *decode order*. - * - * @param meta - Additional metadata from the encoder. You should pass this for the first call, including a valid - * decoder config. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(packet: EncodedPacket, meta?: EncodedAudioChunkMetadata): Promise; -} - -/** - * Represents an encoded chunk of media. Mainly used as an expressive wrapper around WebCodecs API's - * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) and - * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk), but can also be used - * standalone. - * @group Packets - * @public - */ -export declare class EncodedPacket { - /** The encoded data of this packet. */ - readonly data: Uint8Array; - /** The type of this packet. */ - readonly type: PacketType; - /** - * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps - * should not be presented. - */ - readonly timestamp: number; - /** The duration of this packet in seconds. */ - readonly duration: number; - /** - * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A - * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet. - * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative - * ordering. Negative sequence numbers mean the sequence number is undefined. - */ - readonly sequenceNumber: number; - /** - * The actual byte length of the data in this packet. This field is useful for metadata-only packets where the - * `data` field contains no bytes. - */ - readonly byteLength: number; - /** Additional data carried with this packet. */ - readonly sideData: EncodedPacketSideData; - /** Creates a new {@link EncodedPacket} from raw bytes and timing information. */ - constructor( - /** The encoded data of this packet. */ - data: Uint8Array, - /** The type of this packet. */ - type: PacketType, - /** - * The presentation timestamp of this packet in seconds. May be negative. Samples with negative end timestamps - * should not be presented. - */ - timestamp: number, - /** The duration of this packet in seconds. */ - duration: number, - /** - * The sequence number indicates the decode order of the packets. Packet A must be decoded before packet B if A - * has a lower sequence number than B. If two packets have the same sequence number, they are the same packet. - * Otherwise, sequence numbers are arbitrary and are not guaranteed to have any meaning besides their relative - * ordering. Negative sequence numbers mean the sequence number is undefined. - */ - sequenceNumber?: number, byteLength?: number, sideData?: EncodedPacketSideData); - /** - * If this packet is a metadata-only packet. Metadata-only packets don't contain their packet data. They are the - * result of retrieving packets with {@link PacketRetrievalOptions.metadataOnly} set to `true`. - */ - get isMetadataOnly(): boolean; - /** The timestamp of this packet in microseconds. */ - get microsecondTimestamp(): number; - /** The duration of this packet in microseconds. */ - get microsecondDuration(): number; - /** Converts this packet to an - * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the - * WebCodecs API. */ - toEncodedVideoChunk(): EncodedVideoChunk; - /** - * Converts this packet to an - * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) for use with the - * WebCodecs API, using the alpha side data instead of the color data. Throws if no alpha side data is defined. - */ - alphaToEncodedVideoChunk(type?: PacketType): EncodedVideoChunk; - /** Converts this packet to an - * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk) for use with the - * WebCodecs API. */ - toEncodedAudioChunk(): EncodedAudioChunk; - /** - * Creates an {@link EncodedPacket} from an - * [`EncodedVideoChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedVideoChunk) or - * [`EncodedAudioChunk`](https://developer.mozilla.org/en-US/docs/Web/API/EncodedAudioChunk). This method is useful - * for converting chunks from the WebCodecs API to `EncodedPacket` instances. - */ - static fromEncodedChunk(chunk: EncodedVideoChunk | EncodedAudioChunk, sideData?: EncodedPacketSideData): EncodedPacket; - /** Clones this packet while optionally updating timing information. */ - clone(options?: { - /** The timestamp of the cloned packet in seconds. */ - timestamp?: number; - /** The duration of the cloned packet in seconds. */ - duration?: number; - }): EncodedPacket; -} - -/** - * Holds additional data accompanying an {@link EncodedPacket}. - * @group Packets - * @public - */ -export declare type EncodedPacketSideData = { - /** - * An encoded alpha frame, encoded with the same codec as the packet. Typically used for transparent videos, where - * the alpha information is stored separately from the color information. - */ - alpha?: Uint8Array; - /** - * The actual byte length of the alpha data. This field is useful for metadata-only packets where the - * `alpha` field contains no bytes. - */ - alphaByteLength?: number; -}; - -/** - * Sink for retrieving encoded packets from an input track. - * @group Media sinks - * @public - */ -export declare class EncodedPacketSink { - /** Creates a new {@link EncodedPacketSink} for the given {@link InputTrack}. */ - constructor(track: InputTrack); - /** - * Retrieves the track's first packet (in decode order), or null if it has no packets. The first packet is very - * likely to be a key packet. - */ - getFirstPacket(options?: PacketRetrievalOptions): Promise; - /** - * Retrieves the packet corresponding to the given timestamp, in seconds. More specifically, returns the last packet - * (in presentation order) with a start timestamp less than or equal to the given timestamp. This method can be - * used to retrieve a track's last packet using `getPacket(Infinity)`. The method returns null if the timestamp - * is before the first packet in the track. - * - * @param timestamp - The timestamp used for retrieval, in seconds. - */ - getPacket(timestamp: number, options?: PacketRetrievalOptions): Promise; - /** - * Retrieves the packet following the given packet (in decode order), or null if the given packet is the - * last packet. - */ - getNextPacket(packet: EncodedPacket, options?: PacketRetrievalOptions): Promise; - /** - * Retrieves the key packet corresponding to the given timestamp, in seconds. More specifically, returns the last - * key packet (in presentation order) with a start timestamp less than or equal to the given timestamp. A key packet - * is a packet that doesn't require previous packets to be decoded. This method can be used to retrieve a track's - * last key packet using `getKeyPacket(Infinity)`. The method returns null if the timestamp is before the first - * key packet in the track. - * - * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`. - * - * @param timestamp - The timestamp used for retrieval, in seconds. - */ - getKeyPacket(timestamp: number, options?: PacketRetrievalOptions): Promise; - /** - * Retrieves the key packet following the given packet (in decode order), or null if the given packet is the last - * key packet. - * - * To ensure that the returned packet is guaranteed to be a real key frame, enable `options.verifyKeyPackets`. - */ - getNextKeyPacket(packet: EncodedPacket, options?: PacketRetrievalOptions): Promise; - /** - * Creates an async iterator that yields the packets in this track in decode order. To enable fast iteration, this - * method will intelligently preload packets based on the speed of the consumer. - * - * @param startPacket - (optional) The packet from which iteration should begin. This packet will also be yielded. - * @param endTimestamp - (optional) The timestamp at which iteration should end. This packet will _not_ be yielded. - */ - packets(startPacket?: EncodedPacket, endPacket?: EncodedPacket, options?: PacketRetrievalOptions): AsyncGenerator; -} - -/** - * The most basic video source; can be used to directly pipe encoded packets into the output file. - * @group Media sources - * @public - */ -export declare class EncodedVideoPacketSource extends VideoSource { - /** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */ - constructor(codec: VideoCodec); - /** - * Adds an encoded packet to the output video track. Packets must be added in *decode order*, while a packet's - * timestamp must be its *presentation timestamp*. B-frames are handled automatically. - * - * @param meta - Additional metadata from the encoder. You should pass this for the first call, including a valid - * decoder config. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(packet: EncodedPacket, meta?: EncodedVideoChunkMetadata): Promise; -} - -/** - * A source backed by a path to a file. Intended for server-side usage in Node, Bun, or Deno. - * - * Make sure to call `.dispose()` on the corresponding {@link Input} when done to explicitly free the internal file - * handle acquired by this source. - * @group Input sources - * @public - */ -export declare class FilePathSource extends Source { - /** Creates a new {@link FilePathSource} backed by the file at the specified file path. */ - constructor(filePath: string, options?: FilePathSourceOptions); -} - -/** - * Options for {@link FilePathSource}. - * @group Input sources - * @public - */ -export declare type FilePathSourceOptions = { - /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. */ - maxCacheSize?: number; -}; - -/** - * A target that writes to a file at the specified path. Intended for server-side usage in Node, Bun, or Deno. - * - * Writing is chunked by default. The internally held file handle will be closed when `.finalize()` or `.cancel()` are - * called on the corresponding {@link Output}. - * @group Output targets - * @public - */ -export declare class FilePathTarget extends Target { - /** Creates a new {@link FilePathTarget} that writes to the file at the specified file path. */ - constructor(filePath: string, options?: FilePathTargetOptions); -} - -/** - * Options for {@link FilePathTarget}. - * @group Output targets - * @public - */ -export declare type FilePathTargetOptions = StreamTargetOptions; - -/** - * FLAC input format singleton. - * @group Input formats - * @public - */ -export declare const FLAC: FlacInputFormat; - -/** - * FLAC file format. - * - * Do not instantiate this class; use the {@link FLAC} singleton instead. - * - * @group Input formats - * @public - */ -export declare class FlacInputFormat extends InputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * FLAC file format. - * @group Output formats - * @public - */ -export declare class FlacOutputFormat extends OutputFormat { - /** Creates a new {@link FlacOutputFormat} configured with the specified `options`. */ - constructor(options?: FlacOutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * FLAC-specific output options. - * @group Output formats - * @public - */ -export declare type FlacOutputFormatOptions = { - /** - * Will be called for each FLAC frame that is written. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onFrame?: (data: Uint8Array, position: number) => unknown; -}; - -/** - * Returns the list of all audio codecs that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getEncodableAudioCodecs: (checkedCodecs?: AudioCodec[], options?: { - numberOfChannels?: number; - sampleRate?: number; - bitrate?: number | Quality; -}) => Promise; - -/** - * Returns the list of all media codecs that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getEncodableCodecs: () => Promise; - -/** - * Returns the list of all subtitle codecs that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getEncodableSubtitleCodecs: (checkedCodecs?: SubtitleCodec[]) => Promise; - -/** - * Returns the list of all video codecs that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getEncodableVideoCodecs: (checkedCodecs?: VideoCodec[], options?: { - width?: number; - height?: number; - bitrate?: number | Quality; -}) => Promise; - -/** - * Returns the first audio codec from the given list that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getFirstEncodableAudioCodec: (checkedCodecs: AudioCodec[], options?: { - numberOfChannels?: number; - sampleRate?: number; - bitrate?: number | Quality; -}) => Promise; - -/** - * Returns the first subtitle codec from the given list that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getFirstEncodableSubtitleCodec: (checkedCodecs: SubtitleCodec[]) => Promise; - -/** - * Returns the first video codec from the given list that can be encoded by the browser. - * @group Encoding - * @public - */ -export declare const getFirstEncodableVideoCodec: (checkedCodecs: VideoCodec[], options?: { - width?: number; - height?: number; - bitrate?: number | Quality; -}) => Promise; - -/** - * Specifies an inclusive range of integers. - * @group Miscellaneous - * @public - */ -export declare type InclusiveIntegerRange = { - /** The integer cannot be less than this. */ - min: number; - /** The integer cannot be greater than this. */ - max: number; -}; - -/** - * Represents an input media file. This is the root object from which all media read operations start. - * @group Input files & tracks - * @public - */ -export declare class Input implements Disposable { - /** True if the input has been disposed. */ - get disposed(): boolean; - /** - * Creates a new input file from the specified options. No reading operations will be performed until methods are - * called on this instance. - */ - constructor(options: InputOptions); - /** - * Returns the source from which this input file reads its data. This is the same source that was passed to the - * constructor. - */ - get source(): S; - /** - * Returns the format of the input file. You can compare this result directly to the {@link InputFormat} singletons - * or use `instanceof` checks for subset-aware logic (for example, `format instanceof MatroskaInputFormat` is true - * for both MKV and WebM). - */ - getFormat(): Promise; - /** - * Computes the duration of the input file, in seconds. More precisely, returns the largest end timestamp among - * all tracks. - */ - computeDuration(): Promise; - /** Returns the list of all tracks of this input file. */ - getTracks(): Promise; - /** Returns the list of all video tracks of this input file. */ - getVideoTracks(): Promise; - /** Returns the list of all audio tracks of this input file. */ - getAudioTracks(): Promise; - /** Returns the primary video track of this input file, or null if there are no video tracks. */ - getPrimaryVideoTrack(): Promise; - /** Returns the primary audio track of this input file, or null if there are no audio tracks. */ - getPrimaryAudioTrack(): Promise; - /** Returns the full MIME type of this input file, including track codecs. */ - getMimeType(): Promise; - /** - * Returns descriptive metadata tags about the media file, such as title, author, date, cover art, or other - * attached files. - */ - getMetadataTags(): Promise; - /** - * Disposes this input and frees connected resources. When an input is disposed, ongoing read operations will be - * canceled, all future read operations will fail, any open decoders will be closed, and all ongoing media sink - * operations will be canceled. Disallowed and canceled operations will throw an {@link InputDisposedError}. - * - * You are expected not to use an input after disposing it. While some operations may still work, it is not - * specified and may change in any future update. - */ - dispose(): void; - /** - * Calls `.dispose()` on the input, implementing the `Disposable` interface for use with - * JavaScript Explicit Resource Management features. - */ - [Symbol.dispose](): void; -} - -/** - * Represents an audio track in an input file. - * @group Input files & tracks - * @public - */ -export declare class InputAudioTrack extends InputTrack { - get type(): TrackType; - get codec(): AudioCodec | null; - /** The number of audio channels in the track. */ - get numberOfChannels(): number; - /** The track's audio sample rate in hertz. */ - get sampleRate(): number; - /** - * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#audio-decoder-config) for decoding the - * track's packets using an [`AudioDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/AudioDecoder). Returns - * null if the track's codec is unknown. - */ - getDecoderConfig(): Promise; - getCodecParameterString(): Promise; - canDecode(): Promise; - determinePacketType(packet: EncodedPacket): Promise; -} - -/** - * Thrown when an operation was prevented because the corresponding {@link Input} has been disposed. - * @group Input files & tracks - * @public - */ -export declare class InputDisposedError extends Error { - /** Creates a new {@link InputDisposedError}. */ - constructor(message?: string); -} - -/** - * Base class representing an input media file format. - * @group Input formats - * @public - */ -export declare abstract class InputFormat { - /** Returns the name of the input format. */ - abstract get name(): string; - /** Returns the typical base MIME type of the input format. */ - abstract get mimeType(): string; -} - -/** - * The options for creating an Input object. - * @group Input files & tracks - * @public - */ -export declare type InputOptions = { - /** A list of supported formats. If the source file is not of one of these formats, then it cannot be read. */ - formats: InputFormat[]; - /** The source from which data will be read. */ - source: S; -}; - -/** - * Represents a media track in an input file. - * @group Input files & tracks - * @public - */ -export declare abstract class InputTrack { - /** The input file this track belongs to. */ - readonly input: Input; - /** The type of the track. */ - abstract get type(): TrackType; - /** The codec of the track's packets. */ - abstract get codec(): MediaCodec | null; - /** Returns the full codec parameter string for this track. */ - abstract getCodecParameterString(): Promise; - /** Checks if this track's packets can be decoded by the browser. */ - abstract canDecode(): Promise; - /** - * For a given packet of this track, this method determines the actual type of this packet (key/delta) by looking - * into its bitstream. Returns null if the type couldn't be determined. - */ - abstract determinePacketType(packet: EncodedPacket): Promise; - /** Returns true if and only if this track is a video track. */ - isVideoTrack(): this is InputVideoTrack; - /** Returns true if and only if this track is an audio track. */ - isAudioTrack(): this is InputAudioTrack; - /** The unique ID of this track in the input file. */ - get id(): number; - /** - * The identifier of the codec used internally by the container. It is not homogenized by Mediabunny - * and depends entirely on the container format. - * - * This field can be used to determine the codec of a track in case Mediabunny doesn't know that codec. - * - * - For ISOBMFF files, this field returns the name of the Sample Description Box (e.g. `'avc1'`). - * - For Matroska files, this field returns the value of the `CodecID` element. - * - For WAVE files, this field returns the value of the format tag in the `'fmt '` chunk. - * - For ADTS files, this field contains the `MPEG-4 Audio Object Type`. - * - In all other cases, this field is `null`. - */ - get internalCodecId(): string | number | Uint8Array | null; - /** - * The ISO 639-2/T language code for this track. If the language is unknown, this field is `'und'` (undetermined). - */ - get languageCode(): string; - /** A user-defined name for this track. */ - get name(): string | null; - /** - * A positive number x such that all timestamps and durations of all packets of this track are - * integer multiples of 1/x. - */ - get timeResolution(): number; - /** The track's disposition, i.e. information about its intended usage. */ - get disposition(): TrackDisposition; - /** - * Returns the start timestamp of the first packet of this track, in seconds. While often near zero, this value - * may be positive or even negative. A negative starting timestamp means the track's timing has been offset. Samples - * with a negative timestamp should not be presented. - */ - getFirstTimestamp(): Promise; - /** Returns the end timestamp of the last packet of this track, in seconds. */ - computeDuration(): Promise; - /** - * Computes aggregate packet statistics for this track, such as average packet rate or bitrate. - * - * @param targetPacketCount - This optional parameter sets a target for how many packets this method must have - * looked at before it can return early; this means, you can use it to aggregate only a subset (prefix) of all - * packets. This is very useful for getting a great estimate of video frame rate without having to scan through the - * entire file. - */ - computePacketStats(targetPacketCount?: number): Promise; -} - -/** - * Represents a video track in an input file. - * @group Input files & tracks - * @public - */ -export declare class InputVideoTrack extends InputTrack { - get type(): TrackType; - get codec(): VideoCodec | null; - /** The width in pixels of the track's coded samples, before any transformations or rotations. */ - get codedWidth(): number; - /** The height in pixels of the track's coded samples, before any transformations or rotations. */ - get codedHeight(): number; - /** The angle in degrees by which the track's frames should be rotated (clockwise). */ - get rotation(): Rotation; - /** The width in pixels of the track's frames after rotation. */ - get displayWidth(): number; - /** The height in pixels of the track's frames after rotation. */ - get displayHeight(): number; - /** Returns the color space of the track's samples. */ - getColorSpace(): Promise; - /** If this method returns true, the track's samples use a high dynamic range (HDR). */ - hasHighDynamicRange(): Promise; - /** Checks if this track may contain transparent samples with alpha data. */ - canBeTransparent(): Promise; - /** - * Returns the [decoder configuration](https://www.w3.org/TR/webcodecs/#video-decoder-config) for decoding the - * track's packets using a [`VideoDecoder`](https://developer.mozilla.org/en-US/docs/Web/API/VideoDecoder). Returns - * null if the track's codec is unknown. - */ - getDecoderConfig(): Promise; - getCodecParameterString(): Promise; - canDecode(): Promise; - determinePacketType(packet: EncodedPacket): Promise; -} - -/** - * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files. - * @group Input formats - * @public - */ -export declare abstract class IsobmffInputFormat extends InputFormat { -} - -/** - * Format representing files compatible with the ISO base media file format (ISOBMFF), like MP4 or MOV files. - * @group Output formats - * @public - */ -export declare abstract class IsobmffOutputFormat extends OutputFormat { - /** Internal constructor. */ - constructor(options?: IsobmffOutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * ISOBMFF-specific output options. - * @group Output formats - * @public - */ -export declare type IsobmffOutputFormatOptions = { - /** - * Controls the placement of metadata in the file. Placing metadata at the start of the file is known as "Fast - * Start", which results in better playback at the cost of more required processing or memory. - * - * Use `false` to disable Fast Start, placing the metadata at the end of the file. Fastest and uses the least - * memory. - * - * Use `'in-memory'` to produce a file with Fast Start by keeping all media chunks in memory until the file is - * finalized. This produces a high-quality and compact output at the cost of a more expensive finalization step and - * higher memory requirements. Data will be written monotonically (in order) when this option is set. - * - * Use `'reserve'` to reserve space at the start of the file into which the metadata will be written later. This - * produces a file with Fast Start but requires knowledge about the expected length of the file beforehand. When - * using this option, you must set the {@link BaseTrackMetadata.maximumPacketCount} field in the track metadata - * for all tracks. - * - * Use `'fragmented'` to place metadata at the start of the file by creating a fragmented file (fMP4). In a - * fragmented file, chunks of media and their metadata are written to the file in "fragments", eliminating the need - * to put all metadata in one place. Fragmented files are useful for streaming contexts, as each fragment can be - * played individually without requiring knowledge of the other fragments. Furthermore, they remain lightweight to - * create even for very large files, as they don't require all media to be kept in memory. However, fragmented files - * are not as widely and wholly supported as regular MP4/MOV files. Data will be written monotonically (in order) - * when this option is set. - * - * When this field is not defined, either `false` or `'in-memory'` will be used, automatically determined based on - * the type of output target used. - */ - fastStart?: false | 'in-memory' | 'reserve' | 'fragmented'; - /** - * When using `fastStart: 'fragmented'`, this field controls the minimum duration of each fragment, in seconds. - * New fragments will only be created when the current fragment is longer than this value. Defaults to 1 second. - */ - minimumFragmentDuration?: number; - /** - * The metadata format to use for writing metadata tags. - * - * - `'auto'` (default): Behaves like `'mdir'` for MP4 and like `'udta'` for QuickTime, matching FFmpeg's default - * behavior. - * - `'mdir'`: Write tags into `moov/udta/meta` using the 'mdir' handler format. - * - `'mdta'`: Write tags into `moov/udta/meta` using the 'mdta' handler format, equivalent to FFmpeg's - * `use_metadata_tags` flag. This allows for custom keys of arbitrary length. - * - `'udta'`: Write tags directly into `moov/udta`. - */ - metadataFormat?: 'auto' | 'mdir' | 'mdta' | 'udta'; - /** - * Will be called once the ftyp (File Type) box of the output file has been written. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onFtyp?: (data: Uint8Array, position: number) => unknown; - /** - * Will be called once the moov (Movie) box of the output file has been written. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onMoov?: (data: Uint8Array, position: number) => unknown; - /** - * Will be called for each finalized mdat (Media Data) box of the output file. Usage of this callback is not - * recommended when not using `fastStart: 'fragmented'`, as there will be one monolithic mdat box which might - * require large amounts of memory. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onMdat?: (data: Uint8Array, position: number) => unknown; - /** - * Will be called for each finalized moof (Movie Fragment) box of the output file. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - * @param timestamp - The start timestamp of the fragment in seconds. - */ - onMoof?: (data: Uint8Array, position: number, timestamp: number) => unknown; -}; - -/** - * Matroska input format singleton. - * @group Input formats - * @public - */ -export declare const MATROSKA: MatroskaInputFormat; - -/** - * Matroska file format. - * - * Do not instantiate this class; use the {@link MATROSKA} singleton instead. - * - * @group Input formats - * @public - */ -export declare class MatroskaInputFormat extends InputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * T or a promise that resolves to T. - * @group Miscellaneous - * @public - */ -export declare type MaybePromise = T | Promise; - -/** - * Union type of known media codecs. - * @group Codecs - * @public - */ -export declare type MediaCodec = VideoCodec | AudioCodec | SubtitleCodec; - -/** - * Base class for media sources. Media sources are used to add media samples to an output file. - * @group Media sources - * @public - */ -declare abstract class MediaSource_2 { - /** - * Closes this source. This prevents future samples from being added and signals to the output file that no further - * samples will come in for this track. Calling `.close()` is optional but recommended after adding the - * last sample - for improved performance and reduced memory usage. - */ - close(): void; -} -export { MediaSource_2 as MediaSource } - -/** - * Audio source that encodes the data of a - * [`MediaStreamAudioTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack) and pipes it into the - * output. This is useful for capturing live or real-time audio such as microphones or audio from other media elements. - * Audio will automatically start being captured once the connected {@link Output} is started, and will keep being - * captured until the {@link Output} is finalized or this source is closed. - * @group Media sources - * @public - */ -export declare class MediaStreamAudioTrackSource extends AudioSource { - /** A promise that rejects upon any error within this source. This promise never resolves. */ - get errorPromise(): Promise; - /** Whether this source is currently paused as a result of calling `.pause()`. */ - get paused(): boolean; - /** - * Creates a new {@link MediaStreamAudioTrackSource} from a `MediaStreamAudioTrack`, which will pull audio samples - * from the stream in real time and encode them according to {@link AudioEncodingConfig}. - */ - constructor(track: MediaStreamAudioTrack, encodingConfig: AudioEncodingConfig); - /** - * Pauses the capture of audio data - any audio data emitted by the underlying media stream will be ignored - * while paused. This does *not* close the underlying `MediaStreamAudioTrack`, it just ignores its output. - */ - pause(): void; - /** Resumes the capture of audio data after being paused. */ - resume(): void; -} - -/** - * Video source that encodes the frames of a - * [`MediaStreamVideoTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack) and pipes them into the - * output. This is useful for capturing live or real-time data such as webcams or screen captures. Frames will - * automatically start being captured once the connected {@link Output} is started, and will keep being captured until - * the {@link Output} is finalized or this source is closed. - * @group Media sources - * @public - */ -export declare class MediaStreamVideoTrackSource extends VideoSource { - /** A promise that rejects upon any error within this source. This promise never resolves. */ - get errorPromise(): Promise; - /** Whether this source is currently paused as a result of calling `.pause()`. */ - get paused(): boolean; - /** - * Creates a new {@link MediaStreamVideoTrackSource} from a - * [`MediaStreamVideoTrack`](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack), which will pull - * video samples from the stream in real time and encode them according to {@link VideoEncodingConfig}. - */ - constructor(track: MediaStreamVideoTrack, encodingConfig: VideoEncodingConfig); - /** - * Pauses the capture of video frames - any video frames emitted by the underlying media stream will be ignored - * while paused. This does *not* close the underlying `MediaStreamVideoTrack`, it just ignores its output. - */ - pause(): void; - /** Resumes the capture of video frames after being paused. */ - resume(): void; -} - -/** - * Represents descriptive (non-technical) metadata about a media file, such as title, author, date, cover art, or other - * attached files. Common tags are normalized by Mediabunny into a uniform format, while the `raw` field can be used to - * directly read or write the underlying metadata tags (which differ by format). - * - * - For MP4/QuickTime files, the metadata refers to the data in `'moov'`-level `'udta'` and `'meta'` atoms. - * - For WebM/Matroska files, the metadata refers to the Tags and Attachments elements whose target is 50 (MOVIE). - * - For MP3 files, the metadata refers to the ID3v2 or ID3v1 tags. - * - For Ogg files, there is no global metadata so instead, the metadata refers to the combined metadata of all tracks, - * in Vorbis-style comment headers. - * - For WAVE files, the metadata refers to the chunks within the RIFF INFO chunk. - * - For ADTS files, there is no metadata. - * - For FLAC files, the metadata lives in Vorbis style in the Vorbis comment block. - * - * @group Metadata tags - * @public - */ -export declare type MetadataTags = { - /** Title of the media (e.g. Gangnam Style, Titanic, etc.) */ - title?: string; - /** Short description or subtitle of the media. */ - description?: string; - /** Primary artist(s) or creator(s) of the work. */ - artist?: string; - /** Album, collection, or compilation the media belongs to. */ - album?: string; - /** Main credited artist for the album/collection as a whole. */ - albumArtist?: string; - /** Position of this track within its album or collection (1-based). */ - trackNumber?: number; - /** Total number of tracks in the album or collection. */ - tracksTotal?: number; - /** Disc index if the release spans multiple discs (1-based). */ - discNumber?: number; - /** Total number of discs in the release. */ - discsTotal?: number; - /** Genre or category describing the media's style or content (e.g. Metal, Horror, etc.) */ - genre?: string; - /** Release, recording or creation date of the media. */ - date?: Date; - /** Full text lyrics or transcript associated with the media. */ - lyrics?: string; - /** Freeform notes, remarks or commentary about the media. */ - comment?: string; - /** Embedded images such as cover art, booklet scans, artwork or preview frames. */ - images?: AttachedImage[]; - /** - * The raw, underlying metadata tags. - * - * This field can be used for both reading and writing. When reading, it represents the original tags that were used - * to derive the normalized fields, and any additional metadata that Mediabunny doesn't understand. When writing, it - * can be used to set arbitrary metadata tags in the output file. - * - * The format of these tags differs per format: - * - MP4/QuickTime: By default, the keys refer to the names of the individual atoms in the `'ilst'` atom inside the - * `'meta'` atom, and the values are derived from the content of the `'data'` atom inside them. When a `'keys'` atom - * is also used, then the keys reflect the keys specified there (such as `'com.apple.quicktime.version'`). - * Additionally, any atoms within the `'udta'` atom are dumped into here, however with unknown internal format - * (`Uint8Array`). - * - WebM/Matroska: `SimpleTag` elements whose target is 50 (MOVIE), either containing string or `Uint8Array` - * values. Additionally, all attached files (such as font files) are included here, where the key corresponds to - * the FileUID and the value is an {@link AttachedFile}. - * - MP3: The ID3v2 tags, or a single `'TAG'` key with the contents of the ID3v1 tag. - * - Ogg: The key-value string pairs from the Vorbis-style comment header (see RFC 7845, Section 5.2). - * Additionally, the `'vendor'` key refers to the vendor string within this header. - * - WAVE: The individual metadata chunks within the RIFF INFO chunk. Values are always ISO 8859-1 strings. - * - FLAC: The key-value string pairs from the vorbis metadata block (see RFC 9639, Section D.2.3). - * Additionally, the `'vendor'` key refers to the vendor string within this header. - */ - raw?: Record; -}; - -/** - * Matroska file format. - * - * Supports writing transparent video. For a video track to be marked as transparent, the first packet added must - * contain alpha side data. - * - * @group Output formats - * @public - */ -export declare class MkvOutputFormat extends OutputFormat { - /** Creates a new {@link MkvOutputFormat} configured with the specified `options`. */ - constructor(options?: MkvOutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * Matroska-specific output options. - * @group Output formats - * @public - */ -export declare type MkvOutputFormatOptions = { - /** - * Configures the output to only append new data at the end, useful for live-streaming the file as it's being - * created. When enabled, some features such as storing duration and seeking will be disabled or impacted, so don't - * use this option when you want to write out a clean file for later use. - */ - appendOnly?: boolean; - /** - * This field controls the minimum duration of each Matroska cluster, in seconds. New clusters will only be created - * when the current cluster is longer than this value. Defaults to 1 second. - */ - minimumClusterDuration?: number; - /** - * Will be called once the EBML header of the output file has been written. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onEbmlHeader?: (data: Uint8Array, position: number) => void; - /** - * Will be called once the header part of the Matroska Segment element has been written. The header data includes - * the Segment element and everything inside it, up to (but excluding) the first Matroska Cluster. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onSegmentHeader?: (data: Uint8Array, position: number) => unknown; - /** - * Will be called for each finalized Matroska Cluster of the output file. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - * @param timestamp - The start timestamp of the cluster in seconds. - */ - onCluster?: (data: Uint8Array, position: number, timestamp: number) => unknown; -}; - -/** - * QuickTime File Format (QTFF), often called MOV. Supports all video and audio codecs, but not subtitle codecs. - * @group Output formats - * @public - */ -export declare class MovOutputFormat extends IsobmffOutputFormat { - /** Creates a new {@link MovOutputFormat} configured with the specified `options`. */ - constructor(options?: IsobmffOutputFormatOptions); - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; -} - -/** - * MP3 input format singleton. - * @group Input formats - * @public - */ -export declare const MP3: Mp3InputFormat; - -/** - * MP3 file format. - * - * Do not instantiate this class; use the {@link MP3} singleton instead. - * - * @group Input formats - * @public - */ -export declare class Mp3InputFormat extends InputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * MP3 file format. - * @group Output formats - * @public - */ -export declare class Mp3OutputFormat extends OutputFormat { - /** Creates a new {@link Mp3OutputFormat} configured with the specified `options`. */ - constructor(options?: Mp3OutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * MP3-specific output options. - * @group Output formats - * @public - */ -export declare type Mp3OutputFormatOptions = { - /** - * Controls whether the Xing header, which contains additional metadata as well as an index, is written to the start - * of the MP3 file. When disabled, the writing process becomes append-only. Defaults to `true`. - */ - xingHeader?: boolean; - /** - * Will be called once the Xing metadata frame is finalized. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - */ - onXingFrame?: (data: Uint8Array, position: number) => unknown; -}; - -/** - * MP4 input format singleton. - * @group Input formats - * @public - */ -export declare const MP4: Mp4InputFormat; - -/** - * MPEG-4 Part 14 (MP4) file format. - * - * Do not instantiate this class; use the {@link MP4} singleton instead. - * - * @group Input formats - * @public - */ -export declare class Mp4InputFormat extends IsobmffInputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * MPEG-4 Part 14 (MP4) file format. Supports most codecs. - * @group Output formats - * @public - */ -export declare class Mp4OutputFormat extends IsobmffOutputFormat { - /** Creates a new {@link Mp4OutputFormat} configured with the specified `options`. */ - constructor(options?: IsobmffOutputFormatOptions); - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; -} - -/** - * List of known compressed audio codecs, ordered by encoding preference. - * @group Codecs - * @public - */ -export declare const NON_PCM_AUDIO_CODECS: readonly ["aac", "opus", "mp3", "vorbis", "flac"]; - -/** - * This target just discards all incoming data. It is useful for when you need an {@link Output} but extract data from - * it differently, for example through format-specific callbacks (`onMoof`, `onMdat`, ...) or encoder events. - * @group Output targets - * @public - */ -export declare class NullTarget extends Target { -} - -/** - * Ogg input format singleton. - * @group Input formats - * @public - */ -export declare const OGG: OggInputFormat; - -/** - * Ogg file format. - * - * Do not instantiate this class; use the {@link OGG} singleton instead. - * - * @group Input formats - * @public - */ -export declare class OggInputFormat extends InputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * Ogg file format. - * @group Output formats - * @public - */ -export declare class OggOutputFormat extends OutputFormat { - /** Creates a new {@link OggOutputFormat} configured with the specified `options`. */ - constructor(options?: OggOutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * Ogg-specific output options. - * @group Output formats - * @public - */ -export declare type OggOutputFormatOptions = { - /** - * Will be called for each Ogg page that is written. - * - * @param data - The raw bytes. - * @param position - The byte offset of the data in the file. - * @param source - The {@link MediaSource} backing the page's logical bitstream (track). - */ - onPage?: (data: Uint8Array, position: number, source: MediaSource_2) => unknown; -}; - -/** - * Main class orchestrating the creation of a new media file. - * @group Output files - * @public - */ -export declare class Output { - /** The format of the output file. */ - format: F; - /** The target to which the file will be written. */ - target: T; - /** The current state of the output. */ - state: 'pending' | 'started' | 'canceled' | 'finalizing' | 'finalized'; - /** - * Creates a new instance of {@link Output} which can then be used to create a new media file according to the - * specified {@link OutputOptions}. - */ - constructor(options: OutputOptions); - /** Adds a video track to the output with the given source. Can only be called before the output is started. */ - addVideoTrack(source: VideoSource, metadata?: VideoTrackMetadata): void; - /** Adds an audio track to the output with the given source. Can only be called before the output is started. */ - addAudioTrack(source: AudioSource, metadata?: AudioTrackMetadata): void; - /** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */ - addSubtitleTrack(source: SubtitleSource, metadata?: SubtitleTrackMetadata): void; - /** - * Sets descriptive metadata tags about the media file, such as title, author, date, or cover art. When called - * multiple times, only the metadata from the last call will be used. - * - * Can only be called before the output is started. - */ - setMetadataTags(tags: MetadataTags): void; - /** - * Starts the creation of the output file. This method should be called after all tracks have been added. Only after - * the output has started can media samples be added to the tracks. - * - * @returns A promise that resolves when the output has successfully started and is ready to receive media samples. - */ - start(): Promise; - /** - * Resolves with the full MIME type of the output file, including track codecs. - * - * The returned promise will resolve only once the precise codec strings of all tracks are known. - */ - getMimeType(): Promise; - /** - * Cancels the creation of the output file, releasing internal resources like encoders and preventing further - * samples from being added. - * - * @returns A promise that resolves once all internal resources have been released. - */ - cancel(): Promise; - /** - * Finalizes the output file. This method must be called after all media samples across all tracks have been added. - * Once the Promise returned by this method completes, the output file is ready. - */ - finalize(): Promise; -} - -/** - * Base class representing an output media file format. - * @group Output formats - * @public - */ -export declare abstract class OutputFormat { - /** The file extension used by this output format, beginning with a dot. */ - abstract get fileExtension(): string; - /** The base MIME type of the output format. */ - abstract get mimeType(): string; - /** Returns a list of media codecs that this output format can contain. */ - abstract getSupportedCodecs(): MediaCodec[]; - /** Returns the number of tracks that this output format supports. */ - abstract getSupportedTrackCounts(): TrackCountLimits; - /** Whether this output format supports video rotation metadata. */ - abstract get supportsVideoRotationMetadata(): boolean; - /** Returns a list of video codecs that this output format can contain. */ - getSupportedVideoCodecs(): VideoCodec[]; - /** Returns a list of audio codecs that this output format can contain. */ - getSupportedAudioCodecs(): AudioCodec[]; - /** Returns a list of subtitle codecs that this output format can contain. */ - getSupportedSubtitleCodecs(): SubtitleCodec[]; -} - -/** - * The options for creating an Output object. - * @group Output files - * @public - */ -export declare type OutputOptions = { - /** The format of the output file. */ - format: F; - /** The target to which the file will be written. */ - target: T; -}; - -/** - * Additional options for controlling packet retrieval. - * @group Media sinks - * @public - */ -export declare type PacketRetrievalOptions = { - /** - * When set to `true`, only packet metadata (like timestamp) will be retrieved - the actual packet data will not - * be loaded. - */ - metadataOnly?: boolean; - /** - * When set to true, key packets will be verified upon retrieval by looking into the packet's bitstream. - * If not enabled, the packet types will be determined solely by what's stored in the containing file and may be - * incorrect, potentially leading to decoder errors. Since determining a packet's actual type requires looking into - * its data, this option cannot be enabled together with `metadataOnly`. - */ - verifyKeyPackets?: boolean; -}; - -/** - * Contains aggregate statistics about the encoded packets of a track. - * @group Input files & tracks - * @public - */ -export declare type PacketStats = { - /** The total number of packets. */ - packetCount: number; - /** The average number of packets per second. For video tracks, this will equal the average frame rate (FPS). */ - averagePacketRate: number; - /** The average number of bits per second. */ - averageBitrate: number; -}; - -/** - * The type of a packet. Key packets can be decoded without previous packets, while delta packets depend on previous - * packets. - * @group Packets - * @public - */ -export declare type PacketType = 'key' | 'delta'; - -/** - * List of known PCM (uncompressed) audio codecs, ordered by encoding preference. - * @group Codecs - * @public - */ -export declare const PCM_AUDIO_CODECS: readonly ["pcm-s16", "pcm-s16be", "pcm-s24", "pcm-s24be", "pcm-s32", "pcm-s32be", "pcm-f32", "pcm-f32be", "pcm-f64", "pcm-f64be", "pcm-u8", "pcm-s8", "ulaw", "alaw"]; - -/** - * QuickTime File Format input format singleton. - * @group Input formats - * @public - */ -export declare const QTFF: QuickTimeInputFormat; - -/** - * Represents a subjective media quality level. - * @group Encoding - * @public - */ -export declare class Quality { -} - -/** - * Represents a high media quality. - * @group Encoding - * @public - */ -export declare const QUALITY_HIGH: Quality; - -/** - * Represents a low media quality. - * @group Encoding - * @public - */ -export declare const QUALITY_LOW: Quality; - -/** - * Represents a medium media quality. - * @group Encoding - * @public - */ -export declare const QUALITY_MEDIUM: Quality; - -/** - * Represents a very high media quality. - * @group Encoding - * @public - */ -export declare const QUALITY_VERY_HIGH: Quality; - -/** - * Represents a very low media quality. - * @group Encoding - * @public - */ -export declare const QUALITY_VERY_LOW: Quality; - -/** - * QuickTime File Format (QTFF), often called MOV. - * - * Do not instantiate this class; use the {@link QTFF} singleton instead. - * - * @group Input formats - * @public - */ -export declare class QuickTimeInputFormat extends IsobmffInputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * A source backed by a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) of - * `Uint8Array`, representing an append-only byte stream of unknown length. This is the source to use for incrementally - * streaming in input files that are still being constructed and whose size we don't yet know, like for example the - * output chunks of [MediaRecorder](https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder). - * - * This source is *unsized*, meaning calls to `.getSize()` will throw and readers are more limited due to the - * lack of random file access. You should only use this source with sequential access patterns, such as reading all - * packets from start to end. This source does not work well with random access patterns unless you increase its - * max cache size. - * - * @group Input sources - * @public - */ -export declare class ReadableStreamSource extends Source { - /** Creates a new {@link ReadableStreamSource} backed by the specified `ReadableStream`. */ - constructor(stream: ReadableStream, options?: ReadableStreamSourceOptions); -} - -/** - * Options for {@link ReadableStreamSource}. - * @group Input sources - * @public - */ -export declare type ReadableStreamSourceOptions = { - /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 16 MiB. */ - maxCacheSize?: number; -}; - -/** - * Registers a custom video or audio decoder. Registered decoders will automatically be used for decoding whenever - * possible. - * @group Custom coders - * @public - */ -export declare const registerDecoder: (decoder: typeof CustomVideoDecoder | typeof CustomAudioDecoder) => void; - -/** - * Registers a custom video or audio encoder. Registered encoders will automatically be used for encoding whenever - * possible. - * @group Custom coders - * @public - */ -export declare const registerEncoder: (encoder: typeof CustomVideoEncoder | typeof CustomAudioEncoder) => void; - -/** - * Image data with additional metadata. - * - * @group Metadata tags - * @public - */ -export declare class RichImageData { - /** The raw image data. */ - data: Uint8Array; - /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ - mimeType: string; - /** Creates a new {@link RichImageData}. */ - constructor( - /** The raw image data. */ - data: Uint8Array, - /** An RFC 6838 MIME type (e.g. image/jpeg, image/png, etc.) */ - mimeType: string); -} - -/** - * Represents a clockwise rotation in degrees. - * @group Miscellaneous - * @public - */ -export declare type Rotation = 0 | 90 | 180 | 270; - -/** - * Sets all keys K of T to be required. - * @group Miscellaneous - * @public - */ -export declare type SetRequired = T & Required>; - -/** - * The source base class, representing a resource from which bytes can be read. - * @group Input sources - * @public - */ -export declare abstract class Source { - /** - * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call - * will retrieve the size. - * - * Returns null if the source is unsized. - */ - getSizeOrNull(): Promise; - /** - * Resolves with the total size of the file in bytes. This function is memoized, meaning only the first call - * will retrieve the size. - * - * Throws an error if the source is unsized. - */ - getSize(): Promise; - /** Called each time data is retrieved from the source. Will be called with the retrieved range (end exclusive). */ - onread: ((start: number, end: number) => unknown) | null; -} - -/** - * A general-purpose, callback-driven source that can get its data from anywhere. - * @group Input sources - * @public - */ -export declare class StreamSource extends Source { - /** Creates a new {@link StreamSource} whose behavior is specified by `options`. */ - constructor(options: StreamSourceOptions); -} - -/** - * Options for defining a {@link StreamSource}. - * @group Input sources - * @public - */ -export declare type StreamSourceOptions = { - /** - * Called when the size of the entire file is requested. Must return or resolve to the size in bytes. This function - * is guaranteed to be called before `read`. - */ - getSize: () => MaybePromise; - /** - * Called when data is requested. Must return or resolve to the bytes from the specified byte range, or a stream - * that yields these bytes. - */ - read: (start: number, end: number) => MaybePromise>; - /** - * Called when the {@link Input} driven by this source is disposed. - */ - dispose?: () => unknown; - /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 8 MiB. */ - maxCacheSize?: number; - /** - * Specifies the prefetch profile that the reader should use with this source. A prefetch profile specifies the - * pattern with which bytes outside of the requested range are preloaded to reduce latency for future reads. - * - * - `'none'` (default): No prefetching; only the data needed in the moment is requested. - * - `'fileSystem'`: File system-optimized prefetching: a small amount of data is prefetched bidirectionally, - * aligned with page boundaries. - * - `'network'`: Network-optimized prefetching, or more generally, prefetching optimized for any high-latency - * environment: tries to minimize the amount of read calls and aggressively prefetches data when sequential access - * patterns are detected. - */ - prefetchProfile?: 'none' | 'fileSystem' | 'network'; -}; - -/** - * This target writes data to a [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream), - * making it a general-purpose target for writing data anywhere. It is also compatible with - * [`FileSystemWritableFileStream`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemWritableFileStream) for - * use with the [File System Access API](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API). The - * `WritableStream` can also apply backpressure, which will propagate to the output and throttle the encoders. - * @group Output targets - * @public - */ -export declare class StreamTarget extends Target { - /** Creates a new {@link StreamTarget} which writes to the specified `writable`. */ - constructor(writable: WritableStream, options?: StreamTargetOptions); -} - -/** - * A data chunk for {@link StreamTarget}. - * @group Output targets - * @public - */ -export declare type StreamTargetChunk = { - /** The operation type. */ - type: 'write'; - /** The data to write. */ - data: Uint8Array; - /** The byte offset in the output file at which to write the data. */ - position: number; -}; - -/** - * Options for {@link StreamTarget}. - * @group Output targets - * @public - */ -export declare type StreamTargetOptions = { - /** - * When setting this to true, data created by the output will first be accumulated and only written out - * once it has reached sufficient size, using a default chunk size of 16 MiB. This is useful for reducing the total - * amount of writes, at the cost of latency. - */ - chunked?: boolean; - /** When using `chunked: true`, this specifies the maximum size of each chunk. Defaults to 16 MiB. */ - chunkSize?: number; -}; - -/** - * List of known subtitle codecs, ordered by encoding preference. - * @group Codecs - * @public - */ -export declare const SUBTITLE_CODECS: readonly ["webvtt"]; - -/** - * Union type of known subtitle codecs. - * @group Codecs - * @public - */ -export declare type SubtitleCodec = typeof SUBTITLE_CODECS[number]; - -/** - * Base class for subtitle sources - sources for subtitle tracks. - * @group Media sources - * @public - */ -export declare abstract class SubtitleSource extends MediaSource_2 { - /** Internal constructor. */ - constructor(codec: SubtitleCodec); -} - -/** - * Additional metadata for subtitle tracks. - * @group Output files - * @public - */ -export declare type SubtitleTrackMetadata = BaseTrackMetadata & {}; - -/** - * Base class for targets, specifying where output files are written. - * @group Output targets - * @public - */ -export declare abstract class Target { - /** - * Called each time data is written to the target. Will be called with the byte range into which data was written. - * - * Use this callback to track the size of the output file as it grows. But be warned, this function is chatty and - * gets called *extremely* often. - */ - onwrite: ((start: number, end: number) => unknown) | null; -} - -/** - * This source can be used to add subtitles from a subtitle text file. - * @group Media sources - * @public - */ -export declare class TextSubtitleSource extends SubtitleSource { - /** Creates a new {@link TextSubtitleSource} where added text chunks are in the specified `codec`. */ - constructor(codec: SubtitleCodec); - /** - * Parses the subtitle text according to the specified codec and adds it to the output track. You don't have to - * add the entire subtitle file at once here; you can provide it in chunks. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(text: string): Promise; -} - -/** - * Specifies the number of tracks (for each track type and in total) that an output format supports. - * @group Output formats - * @public - */ -export declare type TrackCountLimits = { - [K in TrackType]: InclusiveIntegerRange; -} & { - /** Specifies the overall allowed range of track counts for the output format. */ - total: InclusiveIntegerRange; -}; - -/** - * Specifies a track's disposition, i.e. information about its intended usage. - * @public - * @group Miscellaneous - */ -export declare type TrackDisposition = { - /** - * Indicates that this track is eligible for automatic selection by a player; that it is the main track among other, - * non-default tracks of the same type. - */ - default: boolean; - /** - * Indicates that players should always display this track by default, even if it goes against the user's default - * preferences. For example, a subtitle track only containing translations of foreign-language audio. - */ - forced: boolean; - /** Indicates that this track is in the content's original language. */ - original: boolean; - /** Indicates that this track contains commentary. */ - commentary: boolean; - /** Indicates that this track is intended for hearing-impaired users. */ - hearingImpaired: boolean; - /** Indicates that this track is intended for visually-impaired users. */ - visuallyImpaired: boolean; -}; - -/** - * Union type of all track types. - * @group Miscellaneous - * @public - */ -export declare type TrackType = typeof ALL_TRACK_TYPES[number]; - -/** - * A source backed by a URL. This is useful for reading data from the network. Requests will be made using an optimized - * reading and prefetching pattern to minimize request count and latency. - * @group Input sources - * @public - */ -export declare class UrlSource extends Source { - /** Creates a new {@link UrlSource} backed by the resource at the specified URL. */ - constructor(url: string | URL | Request, options?: UrlSourceOptions); -} - -/** - * Options for {@link UrlSource}. - * @group Input sources - * @public - */ -export declare type UrlSourceOptions = { - /** - * The [`RequestInit`](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit) used by the Fetch API. Can be - * used to further control the requests, such as setting custom headers. - */ - requestInit?: RequestInit; - /** - * A function that returns the delay (in seconds) before retrying a failed request. The function is called - * with the number of previous, unsuccessful attempts, as well as with the error with which the previous request - * failed. If the function returns `null`, no more retries will be made. - * - * By default, it uses an exponential backoff algorithm that never gives up unless - * a CORS error is suspected (`fetch()` did reject, `navigator.onLine` is true and origin is different) - */ - getRetryDelay?: (previousAttempts: number, error: unknown, url: string | URL | Request) => number | null; - /** The maximum number of bytes the cache is allowed to hold in memory. Defaults to 64 MiB. */ - maxCacheSize?: number; - /** - * A WHATWG-compatible fetch function. You can use this field to polyfill the `fetch` function, add missing - * features, or use a custom implementation. - */ - fetchFn?: typeof fetch; -}; - -/** - * List of known video codecs, ordered by encoding preference. - * @group Codecs - * @public - */ -export declare const VIDEO_CODECS: readonly ["avc", "hevc", "vp9", "av1", "vp8"]; - -/** - * Union type of known video codecs. - * @group Codecs - * @public - */ -export declare type VideoCodec = typeof VIDEO_CODECS[number]; - -/** - * Additional options that control audio encoding. - * @group Encoding - * @public - */ -export declare type VideoEncodingAdditionalOptions = { - /** - * What to do with alpha data contained in the video samples. - * - * - `'discard'` (default): Only the samples' color data is kept; the video is opaque. - * - `'keep'`: The samples' alpha data is also encoded as side data. Make sure to pair this mode with a container - * format that supports transparency (such as WebM or Matroska). - */ - alpha?: 'discard' | 'keep'; - /** Configures the bitrate mode; defaults to `'variable'`. */ - bitrateMode?: 'constant' | 'variable'; - /** - * The latency mode used by the encoder; controls the performance-quality tradeoff. - * - * - `'quality'` (default): The encoder prioritizes quality over latency, and no frames can be dropped. - * - `'realtime'`: The encoder prioritizes low latency over quality, and may drop frames if the encoder becomes - * overloaded to keep up with real-time requirements. - */ - latencyMode?: 'quality' | 'realtime'; - /** - * The full codec string as specified in the WebCodecs Codec Registry. This string must match the codec - * specified in `codec`. When not set, a fitting codec string will be constructed automatically by the library. - */ - fullCodecString?: string; - /** - * A hint that configures the hardware acceleration method of this codec. This is best left on `'no-preference'`, - * the default. - */ - hardwareAcceleration?: 'no-preference' | 'prefer-hardware' | 'prefer-software'; - /** - * An encoding scalability mode identifier as defined by - * [WebRTC-SVC](https://w3c.github.io/webrtc-svc/#scalabilitymodes*). - */ - scalabilityMode?: string; - /** - * An encoding video content hint as defined by - * [mst-content-hint](https://w3c.github.io/mst-content-hint/#video-content-hints). - */ - contentHint?: string; -}; - -/** - * Configuration object that controls video encoding. Can be used to set codec, quality, and more. - * @group Encoding - * @public - */ -export declare type VideoEncodingConfig = { - /** The video codec that should be used for encoding the video samples (frames). */ - codec: VideoCodec; - /** - * The target bitrate for the encoded video, in bits per second. Alternatively, a subjective {@link Quality} can - * be provided. - */ - bitrate: number | Quality; - /** - * The interval, in seconds, of how often frames are encoded as a key frame. The default is 5 seconds. Frequent key - * frames improve seeking behavior but increase file size. When using multiple video tracks, you should give them - * all the same key frame interval. - */ - keyFrameInterval?: number; - /** - * Video frames may change size over time. This field controls the behavior in case this happens. - * - * - `'deny'` (default) will throw an error, requiring all frames to have the exact same dimensions. - * - `'passThrough'` will allow the change and directly pass the frame to the encoder. - * - `'fill'` will stretch the image to fill the entire original box, potentially altering aspect ratio. - * - `'contain'` will contain the entire image within the original box while preserving aspect ratio. This may lead - * to letterboxing. - * - `'cover'` will scale the image until the entire original box is filled, while preserving aspect ratio. - * - * The "original box" refers to the dimensions of the first encoded frame. - */ - sizeChangeBehavior?: 'deny' | 'passThrough' | 'fill' | 'contain' | 'cover'; - /** Called for each successfully encoded packet. Both the packet and the encoding metadata are passed. */ - onEncodedPacket?: (packet: EncodedPacket, meta: EncodedVideoChunkMetadata | undefined) => unknown; - /** - * Called when the internal [encoder config](https://www.w3.org/TR/webcodecs/#video-encoder-config), as used by the - * WebCodecs API, is created. - */ - onEncoderConfig?: (config: VideoEncoderConfig) => unknown; -} & VideoEncodingAdditionalOptions; - -/** - * Represents a raw, unencoded video sample (frame). Mainly used as an expressive wrapper around WebCodecs API's - * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame), but can also be used standalone. - * @group Samples - * @public - */ -export declare class VideoSample implements Disposable { - /** - * The internal pixel format in which the frame is stored. - * [See pixel formats](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/format) - */ - readonly format: VideoPixelFormat | null; - /** The width of the frame in pixels. */ - readonly codedWidth: number; - /** The height of the frame in pixels. */ - readonly codedHeight: number; - /** The rotation of the frame in degrees, clockwise. */ - readonly rotation: Rotation; - /** - * The presentation timestamp of the frame in seconds. May be negative. Frames with negative end timestamps should - * not be presented. - */ - readonly timestamp: number; - /** The duration of the frame in seconds. */ - readonly duration: number; - /** The color space of the frame. */ - readonly colorSpace: VideoColorSpace; - /** The width of the frame in pixels after rotation. */ - get displayWidth(): number; - /** The height of the frame in pixels after rotation. */ - get displayHeight(): number; - /** The presentation timestamp of the frame in microseconds. */ - get microsecondTimestamp(): number; - /** The duration of the frame in microseconds. */ - get microsecondDuration(): number; - /** - * Whether this sample uses a pixel format that can hold transparency data. Note that this doesn't necessarily mean - * that the sample is transparent. - */ - get hasAlpha(): boolean | null; - /** - * Creates a new {@link VideoSample} from a - * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame). This is essentially a near zero-cost - * wrapper around `VideoFrame`. The sample's metadata is optionally refined using the data specified in `init`. - */ - constructor(data: VideoFrame, init?: VideoSampleInit); - /** - * Creates a new {@link VideoSample} from a - * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource), similar to the - * [`VideoFrame`](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame) constructor. When `VideoFrame` is - * available, this is simply a wrapper around its constructor. If not, it will copy the source's image data to an - * internal canvas for later use. - */ - constructor(data: CanvasImageSource, init: SetRequired); - /** - * Creates a new {@link VideoSample} from raw pixel data specified in `data`. Additional metadata must be provided - * in `init`. - */ - constructor(data: AllowSharedBufferSource, init: SetRequired); - /** Clones this video sample. */ - clone(): VideoSample; - /** - * Closes this video sample, releasing held resources. Video samples should be closed as soon as they are not - * needed anymore. - */ - close(): void; - /** Returns the number of bytes required to hold this video sample's pixel data. */ - allocationSize(): number; - /** Copies this video sample's pixel data to an ArrayBuffer or ArrayBufferView. */ - copyTo(destination: AllowSharedBufferSource): Promise; - /** - * Converts this video sample to a VideoFrame for use with the WebCodecs API. The VideoFrame returned by this - * method *must* be closed separately from this video sample. - */ - toVideoFrame(): VideoFrame; - /** - * Draws the video sample to a 2D canvas context. Rotation metadata will be taken into account. - * - * @param dx - The x-coordinate in the destination canvas at which to place the top-left corner of the source image. - * @param dy - The y-coordinate in the destination canvas at which to place the top-left corner of the source image. - * @param dWidth - The width in pixels with which to draw the image in the destination canvas. - * @param dHeight - The height in pixels with which to draw the image in the destination canvas. - */ - draw(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, dx: number, dy: number, dWidth?: number, dHeight?: number): void; - /** - * Draws the video sample to a 2D canvas context. Rotation metadata will be taken into account. - * - * @param sx - The x-coordinate of the top left corner of the sub-rectangle of the source image to draw into the - * destination context. - * @param sy - The y-coordinate of the top left corner of the sub-rectangle of the source image to draw into the - * destination context. - * @param sWidth - The width of the sub-rectangle of the source image to draw into the destination context. - * @param sHeight - The height of the sub-rectangle of the source image to draw into the destination context. - * @param dx - The x-coordinate in the destination canvas at which to place the top-left corner of the source image. - * @param dy - The y-coordinate in the destination canvas at which to place the top-left corner of the source image. - * @param dWidth - The width in pixels with which to draw the image in the destination canvas. - * @param dHeight - The height in pixels with which to draw the image in the destination canvas. - */ - draw(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, sx: number, sy: number, sWidth: number, sHeight: number, dx: number, dy: number, dWidth?: number, dHeight?: number): void; - /** - * Draws the sample in the middle of the canvas corresponding to the context with the specified fit behavior. - */ - drawWithFit(context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, options: { - /** - * Controls the fitting algorithm. - * - * - `'fill'` will stretch the image to fill the entire box, potentially altering aspect ratio. - * - `'contain'` will contain the entire image within the box while preserving aspect ratio. This may lead to - * letterboxing. - * - `'cover'` will scale the image until the entire box is filled, while preserving aspect ratio. - */ - fit: 'fill' | 'contain' | 'cover'; - /** A way to override rotation. Defaults to the rotation of the sample. */ - rotation?: Rotation; - /** - * Specifies the rectangular region of the video sample to crop to. The crop region will automatically be - * clamped to the dimensions of the video sample. Cropping is performed after rotation but before resizing. - */ - crop?: CropRectangle; - }): void; - /** - * Converts this video sample to a - * [`CanvasImageSource`](https://udn.realityripple.com/docs/Web/API/CanvasImageSource) for drawing to a canvas. - * - * You must use the value returned by this method immediately, as any VideoFrame created internally will - * automatically be closed in the next microtask. - */ - toCanvasImageSource(): VideoFrame | OffscreenCanvas; - /** Sets the rotation metadata of this video sample. */ - setRotation(newRotation: Rotation): void; - /** Sets the presentation timestamp of this video sample, in seconds. */ - setTimestamp(newTimestamp: number): void; - /** Sets the duration of this video sample, in seconds. */ - setDuration(newDuration: number): void; - /** Calls `.close()`. */ - [Symbol.dispose](): void; -} - -/** - * Metadata used for VideoSample initialization. - * @group Samples - * @public - */ -export declare type VideoSampleInit = { - /** - * The internal pixel format in which the frame is stored. - * [See pixel formats](https://developer.mozilla.org/en-US/docs/Web/API/VideoFrame/format) - */ - format?: VideoPixelFormat; - /** The width of the frame in pixels. */ - codedWidth?: number; - /** The height of the frame in pixels. */ - codedHeight?: number; - /** The rotation of the frame in degrees, clockwise. */ - rotation?: Rotation; - /** The presentation timestamp of the frame in seconds. */ - timestamp?: number; - /** The duration of the frame in seconds. */ - duration?: number; - /** The color space of the frame. */ - colorSpace?: VideoColorSpaceInit; -}; - -/** - * A sink that retrieves decoded video samples (video frames) from a video track. - * @group Media sinks - * @public - */ -export declare class VideoSampleSink extends BaseMediaSampleSink { - /** Creates a new {@link VideoSampleSink} for the given {@link InputVideoTrack}. */ - constructor(videoTrack: InputVideoTrack); - /** - * Retrieves the video sample (frame) corresponding to the given timestamp, in seconds. More specifically, returns - * the last video sample (in presentation order) with a start timestamp less than or equal to the given timestamp. - * Returns null if the timestamp is before the track's first timestamp. - * - * @param timestamp - The timestamp used for retrieval, in seconds. - */ - getSample(timestamp: number): Promise; - /** - * Creates an async iterator that yields the video samples (frames) of this track in presentation order. This method - * will intelligently pre-decode a few frames ahead to enable fast iteration. - * - * @param startTimestamp - The timestamp in seconds at which to start yielding samples (inclusive). - * @param endTimestamp - The timestamp in seconds at which to stop yielding samples (exclusive). - */ - samples(startTimestamp?: number, endTimestamp?: number): AsyncGenerator; - /** - * Creates an async iterator that yields a video sample (frame) for each timestamp in the argument. This method - * uses an optimized decoding pipeline if these timestamps are monotonically sorted, decoding each packet at most - * once, and is therefore more efficient than manually getting the sample for every timestamp. The iterator may - * yield null if no frame is available for a given timestamp. - * - * @param timestamps - An iterable or async iterable of timestamps in seconds. - */ - samplesAtTimestamps(timestamps: AnyIterable): AsyncGenerator; -} - -/** - * This source can be used to add raw, unencoded video samples (frames) to an output video track. These frames will - * automatically be encoded and then piped into the output. - * @group Media sources - * @public - */ -export declare class VideoSampleSource extends VideoSource { - /** - * Creates a new {@link VideoSampleSource} whose samples are encoded according to the specified - * {@link VideoEncodingConfig}. - */ - constructor(encodingConfig: VideoEncodingConfig); - /** - * Encodes a video sample (frame) and then adds it to the output. - * - * @returns A Promise that resolves once the output is ready to receive more samples. You should await this Promise - * to respect writer and encoder backpressure. - */ - add(videoSample: VideoSample, encodeOptions?: VideoEncoderEncodeOptions): Promise; -} - -/** - * Base class for video sources - sources for video tracks. - * @group Media sources - * @public - */ -export declare abstract class VideoSource extends MediaSource_2 { - /** Internal constructor. */ - constructor(codec: VideoCodec); -} - -/** - * Additional metadata for video tracks. - * @group Output files - * @public - */ -export declare type VideoTrackMetadata = BaseTrackMetadata & { - /** The angle in degrees by which the track's frames should be rotated (clockwise). */ - rotation?: Rotation; - /** - * The expected video frame rate in hertz. If set, all timestamps and durations of this track will be snapped to - * this frame rate. You should avoid adding more frames than the rate allows, as this will lead to multiple frames - * with the same timestamp. - */ - frameRate?: number; -}; - -/** - * WAVE input format singleton. - * @group Input formats - * @public - */ -export declare const WAVE: WaveInputFormat; - -/** - * WAVE file format, based on RIFF. - * - * Do not instantiate this class; use the {@link WAVE} singleton instead. - * - * @group Input formats - * @public - */ -export declare class WaveInputFormat extends InputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * WAVE file format, based on RIFF. - * @group Output formats - * @public - */ -export declare class WavOutputFormat extends OutputFormat { - /** Creates a new {@link WavOutputFormat} configured with the specified `options`. */ - constructor(options?: WavOutputFormatOptions); - getSupportedTrackCounts(): TrackCountLimits; - get fileExtension(): string; - get mimeType(): string; - getSupportedCodecs(): MediaCodec[]; - get supportsVideoRotationMetadata(): boolean; -} - -/** - * WAVE-specific output options. - * @group Output formats - * @public - */ -export declare type WavOutputFormatOptions = { - /** - * When enabled, an RF64 file will be written, allowing for file sizes to exceed 4 GiB, which is otherwise not - * possible for regular WAVE files. - */ - large?: boolean; - /** - * The metadata format to use for writing metadata tags. - * - * - `'info'` (default): Writes metadata into a RIFF INFO LIST chunk, the default way to contain metadata tags - * within WAVE. Only allows for a limited subset of tags to be written. - * - `'id3'`: Writes metadata into an ID3 chunk. Non-default, but used by many taggers in practice. Allows for a - * much larger and richer set of tags to be written. - */ - metadataFormat?: 'info' | 'id3'; - /** - * Will be called once the file header is written. The header consists of the RIFF header, the format chunk, - * metadata chunks, and the start of the data chunk (with a placeholder size of 0). - */ - onHeader?: (data: Uint8Array, position: number) => unknown; -}; - -/** - * WebM input format singleton. - * @group Input formats - * @public - */ -export declare const WEBM: WebMInputFormat; - -/** - * WebM file format, based on Matroska. - * - * Do not instantiate this class; use the {@link WEBM} singleton instead. - * - * @group Input formats - * @public - */ -export declare class WebMInputFormat extends MatroskaInputFormat { - get name(): string; - get mimeType(): string; -} - -/** - * WebM file format, based on Matroska. - * - * Supports writing transparent video. For a video track to be marked as transparent, the first packet added must - * contain alpha side data. - * - * @group Output formats - * @public - */ -export declare class WebMOutputFormat extends MkvOutputFormat { - /** Creates a new {@link WebMOutputFormat} configured with the specified `options`. */ - constructor(options?: MkvOutputFormatOptions); - getSupportedCodecs(): MediaCodec[]; - get fileExtension(): string; - get mimeType(): string; -} - -/** - * WebM-specific output options. - * @group Output formats - * @public - */ -export declare type WebMOutputFormatOptions = MkvOutputFormatOptions; - -/** - * An AudioBuffer with additional timing information (timestamp & duration). - * @group Media sinks - * @public - */ -export declare type WrappedAudioBuffer = { - /** An AudioBuffer. */ - buffer: AudioBuffer; - /** The timestamp of the corresponding audio sample, in seconds. */ - timestamp: number; - /** The duration of the corresponding audio sample, in seconds. */ - duration: number; -}; - -/** - * A canvas with additional timing information (timestamp & duration). - * @group Media sinks - * @public - */ -export declare type WrappedCanvas = { - /** A canvas element or offscreen canvas. */ - canvas: HTMLCanvasElement | OffscreenCanvas; - /** The timestamp of the corresponding video sample, in seconds. */ - timestamp: number; - /** The duration of the corresponding video sample, in seconds. */ - duration: number; -}; - -export { } -export as namespace Mediabunny; diff --git a/packages/artplayer-proxy-mediabunny/src/AudioEngine.js b/packages/artplayer-proxy-mediabunny/src/AudioEngine.js new file mode 100644 index 000000000..468235864 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/AudioEngine.js @@ -0,0 +1,287 @@ +/** + * Audio Engine for MediaBunny + * Handles audio playback using Web Audio API + */ +import { + ALL_FORMATS, + AudioBufferSink, + BlobSource, + Input, + ReadableStreamSource, + UrlSource, +} from 'mediabunny' + +export default class AudioEngine { + constructor(events) { + this.events = events + + // MediaBunny instances + this.input = null + this.audioSink = null + this.audioIterator = null + + // Web Audio API + this.audioContext = null + this.gainNode = null + + // Playback state + this.audioContextStartTime = 0 + this.playbackTimeAtStart = 0 + this.latestScheduledEndTime = 0 + this.duration = Number.NaN + this.paused = true + + // Audio settings + this.volume = 0.7 + this.muted = false + this.playbackRate = 1 + + // Async control + this.asyncId = 0 + this.queuedNodes = new Set() + } + + get currentTime() { + if (this.paused) return this.playbackTimeAtStart + + return ( + (this.audioContext.currentTime - this.audioContextStartTime) * this.playbackRate + + this.playbackTimeAtStart + ) + } + + normalizeSource(src) { + if (typeof src === 'string') return new UrlSource(src) + if (src instanceof Blob) return new BlobSource(src) + if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) { + return new ReadableStreamSource(src) + } + return src + } + + ensureAudioContext(sampleRate) { + if (this.audioContext) return + + const AudioContext = window.AudioContext || window.webkitAudioContext + + try { + this.audioContext = new AudioContext({ sampleRate }) + } catch { + this.audioContext = new AudioContext() + } + + this.gainNode = this.audioContext.createGain() + this.gainNode.connect(this.audioContext.destination) + this.updateGain() + } + + updateGain() { + if (!this.gainNode) return + const v = this.muted ? 0 : this.volume + this.gainNode.gain.value = v * v + } + + stopQueuedNodes() { + this.queuedNodes.forEach(node => node.stop()) + this.queuedNodes.clear() + } + + async stopIterator() { + await this.audioIterator?.return() + this.audioIterator = null + } + + async load(src, onMetadata) { + const id = ++this.asyncId + + await this.stopIterator() + this.stopQueuedNodes() + + this.paused = true + this.playbackTimeAtStart = 0 + this.audioContextStartTime = 0 + + const source = this.normalizeSource(src) + if (!source) return + + this.input = new Input({ + source, + formats: ALL_FORMATS, + }) + + this.duration = await this.input.computeDuration() + if (id !== this.asyncId) return + + const audioTrack = await this.input.getPrimaryAudioTrack() + if (!audioTrack) { + this.audioSink = null + this.ensureAudioContext() + onMetadata?.() + return + } + + if (audioTrack.codec === null || !(await audioTrack.canDecode())) { + this.audioSink = null + this.ensureAudioContext() + onMetadata?.() + return + } + + this.ensureAudioContext(audioTrack.sampleRate) + this.audioSink = new AudioBufferSink(audioTrack) + + onMetadata?.() + } + + async runIterator(localId) { + if (!this.audioSink) return + + await this.stopIterator() + this.audioIterator = this.audioSink.buffers(this.currentTime) + + while (true) { + if (localId !== this.asyncId || this.paused) return + + const nextPromise = this.audioIterator.next() + + // Monitor for buffer starvation + const checkStarvation = setInterval(() => { + if (localId !== this.asyncId || this.paused) { + clearInterval(checkStarvation) + return + } + + if ( + this.audioContext.state === 'running' && + this.audioContext.currentTime >= this.latestScheduledEndTime - 0.2 + ) { + this.audioContext.suspend() + this.events.emit('waiting') + } + }, 50) + + let result + try { + result = await nextPromise + } catch (e) { + console.error('Audio iterator error:', e) + break + } finally { + clearInterval(checkStarvation) + } + + if (localId !== this.asyncId || this.paused) return + + // Resume if was suspended + if (this.audioContext.state === 'suspended') { + await this.audioContext.resume() + this.events.emit('canplay') + this.events.emit('playing') + } + + if (result.done) break + + const { buffer, timestamp } = result.value + + // Schedule audio buffer + const node = this.audioContext.createBufferSource() + node.buffer = buffer + node.connect(this.gainNode) + node.playbackRate.value = this.playbackRate + + const startAt = + this.audioContextStartTime + + (timestamp - this.playbackTimeAtStart) / this.playbackRate + + const duration = buffer.duration + const endAt = startAt + duration / this.playbackRate + + if (endAt > this.latestScheduledEndTime) { + this.latestScheduledEndTime = endAt + } + + if (startAt >= this.audioContext.currentTime) { + node.start(startAt) + } else { + node.start( + this.audioContext.currentTime, + (this.audioContext.currentTime - startAt) * this.playbackRate + ) + } + + this.queuedNodes.add(node) + node.onended = () => this.queuedNodes.delete(node) + } + } + + async play() { + if (!this.paused) return + + if (!this.audioContext) { + this.ensureAudioContext() + } + + if (this.audioContext.state === 'suspended') { + await this.audioContext.resume() + } + + this.audioContextStartTime = this.audioContext.currentTime + this.latestScheduledEndTime = this.audioContextStartTime + this.paused = false + + const id = ++this.asyncId + this.runIterator(id) + } + + pause() { + if (this.paused) return + + this.playbackTimeAtStart = this.currentTime + this.paused = true + + this.stopIterator() + this.stopQueuedNodes() + } + + async seek(time) { + this.playbackTimeAtStart = Math.max(0, time) + this.audioContextStartTime = this.audioContext.currentTime + this.latestScheduledEndTime = this.audioContextStartTime + + const id = ++this.asyncId + if (!this.paused) { + this.runIterator(id) + } + } + + setVolume(volume, muted) { + this.volume = volume + this.muted = muted + this.updateGain() + } + + setPlaybackRate(rate) { + if (rate === this.playbackRate) return + + if (!this.paused) { + this.playbackTimeAtStart = this.currentTime + this.audioContextStartTime = this.audioContext.currentTime + } + + this.playbackRate = rate + + if (!this.paused) { + const id = ++this.asyncId + this.runIterator(id) + } + } + + destroy() { + this.asyncId++ + this.pause() + this.audioContext?.close() + this.audioContext = null + this.input = null + this.audioSink = null + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/EventTarget.js b/packages/artplayer-proxy-mediabunny/src/EventTarget.js new file mode 100644 index 000000000..f10d5d104 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/EventTarget.js @@ -0,0 +1,36 @@ +/** + * Event Target Implementation + * Simple event system for video events + */ +export default class EventTarget { + constructor() { + this.listeners = new Map() + } + + addEventListener(type, fn) { + if (!this.listeners.has(type)) { + this.listeners.set(type, []) + } + this.listeners.get(type).push(fn) + } + + removeEventListener(type, fn) { + const list = this.listeners.get(type) + if (!list) return + + const index = list.indexOf(fn) + if (index >= 0) { + list.splice(index, 1) + } + } + + emit(type, detail) { + const evt = new Event(type) + evt.detail = detail + + const list = this.listeners.get(type) + if (list) { + list.forEach(fn => fn(evt)) + } + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/MediaBunnyEngine.js b/packages/artplayer-proxy-mediabunny/src/MediaBunnyEngine.js new file mode 100644 index 000000000..147255b86 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/MediaBunnyEngine.js @@ -0,0 +1,205 @@ +/** + * Main MediaBunny Engine + * Coordinates audio and video playback + */ +import AudioEngine from './AudioEngine.js' +import VideoEngine from './VideoEngine.js' + +export default class MediaBunnyEngine { + constructor({ canvas, ctx, events, option = {} }) { + this.events = events + this.option = option + + // Create audio and video engines + this.audio = new AudioEngine(events) + this.video = new VideoEngine({ + canvas, + ctx, + events, + timeupdateInterval: option.timeupdateInterval ?? 250, + avSyncTolerance: option.avSyncTolerance ?? 0.12, + dropLateFrames: option.dropLateFrames ?? false, + poster: option.poster ?? '', + preflightRange: option.preflightRange ?? false, + }) + + // Playback state + this.paused = true + this.ended = false + this.readyState = 0 + this.networkState = 0 + this.error = null + this.seeking = false + this.loadSeq = 0 + + // Listen to ended event + events.addEventListener?.('ended', () => { + this.ended = true + this.paused = true + }) + } + + async load(src) { + const id = ++this.loadSeq + + this.pause() + this.ended = false + this.error = null + this.networkState = 2 // NETWORK_LOADING + this.readyState = 0 // HAVE_NOTHING + + setTimeout(() => this.events.emit('waiting'), 0) + setTimeout(() => this.events.emit('loadstart'), 0) + + const loadTimeout = Number.isFinite(this.option.loadTimeout) + ? this.option.loadTimeout + : 12000 + + try { + await Promise.race([ + this.performLoad(src, id), + loadTimeout > 0 ? this.createTimeout(loadTimeout) : Promise.resolve(), + ]) + } catch (err) { + if (id !== this.loadSeq) return + + this.loadSeq++ + this.error = { code: 4, message: err.message } + this.networkState = 3 // NETWORK_NO_SOURCE + this.events.emit('error') + } + } + + async performLoad(src, id) { + let videoMetadataLoaded = false + let audioMetadataLoaded = false + + const checkMetadata = () => { + if (videoMetadataLoaded && audioMetadataLoaded) { + this.readyState = 1 // HAVE_METADATA + this.events.emit('loadedmetadata') + this.events.emit('durationchange') + } + } + + try { + await Promise.all([ + this.video.load(src, () => { + if (id !== this.loadSeq) return + videoMetadataLoaded = true + checkMetadata() + }), + this.audio.load(src, () => { + if (id !== this.loadSeq) return + audioMetadataLoaded = true + checkMetadata() + }), + ]) + + if (id !== this.loadSeq) return + + this.readyState = 4 // HAVE_ENOUGH_DATA + this.networkState = 1 // NETWORK_IDLE + this.events.emit('loadeddata') + this.events.emit('canplay') + this.events.emit('canplaythrough') + } catch (err) { + if (id !== this.loadSeq) return + + this.error = { code: 4, message: err.message } + this.networkState = 3 + this.events.emit('error') + console.error('MediaBunny load error:', err) + } + } + + createTimeout(ms) { + return new Promise((_, reject) => { + setTimeout(() => reject(new Error('Load timeout')), ms) + }) + } + + async play() { + if (!this.paused) return + + if (this.ended) { + this.ended = false + await this.seek(0) + } + + this.paused = false + + await this.audio.play() + this.video.start(this.audio) + + this.events.emit('play') + this.events.emit('playing') + } + + pause() { + if (this.paused) return + + this.paused = true + + this.audio.pause() + this.video.stop() + + this.events.emit('pause') + } + + async seek(time) { + const shouldResume = !this.paused + + this.ended = false + this.seeking = true + + this.events.emit('seeking') + this.events.emit('waiting') + + this.pause() + + await Promise.all([ + this.audio.seek(time), + this.video.seek(time), + ]) + + this.seeking = false + this.events.emit('seeked') + + if (shouldResume && !this.ended) { + await this.play() + } + } + + setVolume(volume, muted) { + this.audio.setVolume(volume, muted) + } + + setPlaybackRate(rate) { + this.audio.setPlaybackRate(rate) + this.video.setPlaybackRate(rate) + } + + destroy() { + this.pause() + this.audio.destroy() + this.video.destroy() + } + + // Getters + get currentTime() { + return this.audio.currentTime + } + + get duration() { + return this.audio.duration || this.video.duration + } + + get videoWidth() { + return this.video.width + } + + get videoHeight() { + return this.video.height + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/VideoEngine.js b/packages/artplayer-proxy-mediabunny/src/VideoEngine.js new file mode 100644 index 000000000..6119f49c5 --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/VideoEngine.js @@ -0,0 +1,297 @@ +/** + * Video Engine for MediaBunny + * Handles video frame rendering and synchronization + */ +import { + ALL_FORMATS, + BlobSource, + CanvasSink, + Input, + ReadableStreamSource, + UrlSource, +} from 'mediabunny' + +export default class VideoEngine { + constructor({ + canvas, + ctx, + events, + timeupdateInterval = 250, + avSyncTolerance = 0.12, + dropLateFrames = false, + poster = '', + preflightRange = false, + }) { + this.canvas = canvas + this.ctx = ctx + this.events = events + this.timeupdateInterval = timeupdateInterval + this.avSyncTolerance = avSyncTolerance + this.dropLateFrames = dropLateFrames + this.poster = poster + this.preflightRange = preflightRange + + // MediaBunny instances + this.input = null + this.videoSink = null + this.videoIterator = null + + // Frame rendering + this.nextFrame = null + this.rafId = 0 + this.asyncId = 0 + + // Video properties + this.width = 0 + this.height = 0 + this.duration = Number.NaN + + // Playback state + this.audioClock = null + this.lastTimeUpdate = 0 + this.stalled = false + this.playbackRate = 1 + this.posterDrawn = false + } + + normalizeSource(src) { + if (typeof src === 'string') return new UrlSource(src) + if (src instanceof Blob) return new BlobSource(src) + if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) { + return new ReadableStreamSource(src) + } + return src + } + + async preflight(url) { + if (!this.preflightRange || typeof url !== 'string') return true + + try { + const res = await fetch(url, { method: 'HEAD' }) + const acceptRanges = res.headers.get('accept-ranges') + if (!acceptRanges || acceptRanges === 'none') { + this.events.emit('error', new Event('RangeNotSupported')) + return false + } + return true + } catch (e) { + console.warn('Preflight check failed:', e) + return true + } + } + + drawPoster() { + if (!this.poster || this.posterDrawn) return + + const img = new Image() + img.onload = () => { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + this.canvas.width = img.naturalWidth || this.canvas.width + this.canvas.height = img.naturalHeight || this.canvas.height + this.ctx.drawImage(img, 0, 0, this.canvas.width, this.canvas.height) + this.posterDrawn = true + } + img.src = this.poster + } + + async stopIterator() { + await this.videoIterator?.return() + this.videoIterator = null + } + + clear() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + } + + async load(src, onMetadata) { + const id = ++this.asyncId + + await this.stopIterator() + this.clear() + this.posterDrawn = false + + if (!(await this.preflight(src))) return + + const source = this.normalizeSource(src) + if (!source) { + this.drawPoster() + return + } + + this.input = new Input({ + source, + formats: ALL_FORMATS, + }) + + this.duration = await this.input.computeDuration() + if (id !== this.asyncId) return + + const videoTrack = await this.input.getPrimaryVideoTrack() + if (!videoTrack) { + this.handleNoVideoTrack() + onMetadata?.() + return + } + + if (videoTrack.codec === null || !(await videoTrack.canDecode())) { + this.handleNoVideoTrack() + onMetadata?.() + return + } + + const transparent = await videoTrack.canBeTransparent() + this.videoSink = new CanvasSink(videoTrack, { + poolSize: 2, + fit: 'contain', + alpha: transparent, + }) + + this.width = videoTrack.displayWidth + this.height = videoTrack.displayHeight + + this.canvas.width = this.width + this.canvas.height = this.height + + onMetadata?.() + + await this.resetIterator(0) + } + + handleNoVideoTrack() { + this.videoSink = null + this.width = 0 + this.height = 0 + this.canvas.width = 0 + this.canvas.height = 0 + this.clear() + this.drawPoster() + } + + async resetIterator(time) { + await this.stopIterator() + + if (!this.videoSink) return + + this.videoIterator = this.videoSink.canvases(time) + + const first = (await this.videoIterator.next()).value ?? null + const second = (await this.videoIterator.next()).value ?? null + + this.nextFrame = second + + if (first) { + this.ctx.drawImage(first.canvas, 0, 0) + this.events.emit('loadeddata') + } else { + this.drawPoster() + } + } + + async updateNextFrame(localId) { + if (!this.videoIterator) return + + while (true) { + const frame = (await this.videoIterator.next()).value ?? null + if (!frame || localId !== this.asyncId) return + + const t = this.audioClock.currentTime + const tolerance = this.dropLateFrames + ? Math.max(0.06, this.avSyncTolerance / Math.max(1, this.playbackRate)) + : 0 + + if (this.dropLateFrames && frame.timestamp < t - tolerance) { + // Skip late frame + continue + } + + if (frame.timestamp <= t + tolerance) { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + this.ctx.drawImage(frame.canvas, 0, 0) + + if (!this.dropLateFrames && frame.timestamp > t) { + this.nextFrame = null + return + } + } else { + this.nextFrame = frame + return + } + } + } + + render() { + if (!this.audioClock) return + + const t = this.audioClock.currentTime + const now = Date.now() + + // Emit timeupdate event + if (now - this.lastTimeUpdate >= this.timeupdateInterval) { + this.events.emit('timeupdate') + this.lastTimeUpdate = now + } + + // Check if reached end + if (Number.isFinite(this.duration) && t >= this.duration) { + this.stop() + this.stalled = false + this.events.emit('ended') + this.events.emit('pause') + this.events.emit('canplay') + return + } + + // Render next frame if ready + if (this.nextFrame && this.nextFrame.timestamp <= t) { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height) + this.ctx.drawImage(this.nextFrame.canvas, 0, 0) + this.nextFrame = null + this.updateNextFrame(this.asyncId) + + if (this.stalled) { + this.events.emit('canplay') + this.events.emit('playing') + this.stalled = false + } + } else if (!this.nextFrame) { + this.updateNextFrame(this.asyncId) + + if (!this.nextFrame && Number.isFinite(this.duration) && t < this.duration && !this.stalled) { + this.stalled = true + this.events.emit('waiting') + } + } + + this.rafId = requestAnimationFrame(() => this.render()) + } + + start(audioEngine) { + this.audioClock = audioEngine + this.asyncId++ + this.stalled = false + this.updateNextFrame(this.asyncId) + this.rafId = requestAnimationFrame(() => this.render()) + } + + stop() { + cancelAnimationFrame(this.rafId) + } + + async seek(time) { + this.asyncId++ + await this.resetIterator(time) + } + + setPlaybackRate(rate) { + this.playbackRate = Math.max(0.1, Number(rate) || 1) + } + + destroy() { + this.asyncId++ + this.stop() + this.stopIterator() + this.posterDrawn = false + this.input = null + this.videoSink = null + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/VideoShim.js b/packages/artplayer-proxy-mediabunny/src/VideoShim.js new file mode 100644 index 000000000..d6e46f59e --- /dev/null +++ b/packages/artplayer-proxy-mediabunny/src/VideoShim.js @@ -0,0 +1,307 @@ +/** + * Video Element Shim + * Simulates HTMLVideoElement interface for MediaBunny + */ +import MediaBunnyEngine from './MediaBunnyEngine.js' +import EventTarget from './EventTarget.js' + +function clamp(v, min, max) { + return Math.max(min, Math.min(max, Number(v) || 0)) +} + +export default class VideoShim { + constructor({ art, canvas, ctx, option }) { + this.art = art + this.canvas = canvas + this.option = option + + // Event system + this.events = new EventTarget() + + // MediaBunny engine + this.engine = new MediaBunnyEngine({ canvas, ctx, events: this.events, option }) + + // Internal state + this._src = null + this._volume = option.volume ?? 0.7 + this._muted = !!option.muted + this._playbackRate = 1 + + // Apply initial volume + this.engine.setVolume(this._volume, this._muted) + + // Forward events to ArtPlayer + this.setupEventForwarding() + + // Auto-load source + if (option.source) { + this.src = option.source + } else if (art.option?.url) { + this.src = art.option.url + } + } + + setupEventForwarding() { + const { events: artEvents } = this.art.constructor.config + artEvents.forEach((name) => { + this.events.addEventListener(name, (e) => { + this.art.emit(`video:${e.type}`, e) + }) + }) + } + + // Event methods + addEventListener(type, fn) { + this.events.addEventListener(type, fn) + } + + removeEventListener(type, fn) { + this.events.removeEventListener(type, fn) + } + + // Source + get src() { + return this._src + } + + set src(v) { + this._src = v + if (v) this.engine.load(v) + } + + get currentSrc() { + return this._src + } + + // Time + get currentTime() { + return this.engine.currentTime + } + + set currentTime(t) { + this.engine.seek(Number(t) || 0) + } + + get duration() { + return this.engine.duration + } + + // Buffered/Played/Seekable + get buffered() { + return this.createTimeRanges(0, this.engine.duration) + } + + get played() { + return this.createTimeRanges(0, this.engine.currentTime) + } + + get seekable() { + return this.createTimeRanges(0, this.engine.duration) + } + + createTimeRanges(start, end) { + const duration = this.engine.duration + if (!duration || Number.isNaN(duration) || end <= 0) { + return { length: 0, start: () => 0, end: () => 0 } + } + return { + length: 1, + start: () => start, + end: () => end, + } + } + + // Playback state + get paused() { + return this.engine.paused + } + + get playing() { + return !this.engine.paused && !this.engine.ended + } + + get ended() { + return this.engine.ended + } + + get seeking() { + return this.engine.seeking + } + + // Ready state + get readyState() { + return this.engine.readyState + } + + get networkState() { + return this.engine.networkState + } + + get error() { + return this.engine.error + } + + // Playback rate + get playbackRate() { + return this._playbackRate + } + + set playbackRate(v) { + const rate = Number(v) + if (Number.isNaN(rate) || rate <= 0) return + + this._playbackRate = rate + this.engine.setPlaybackRate(rate) + this.events.emit('ratechange') + } + + // Volume + get volume() { + return this._volume + } + + set volume(v) { + this._volume = clamp(v, 0, 1) + this._muted = false + this.engine.setVolume(this._volume, this._muted) + this.events.emit('volumechange') + } + + get muted() { + return this._muted + } + + set muted(v) { + this._muted = !!v + this.engine.setVolume(this._volume, this._muted) + this.events.emit('volumechange') + } + + // Playback methods + play() { + return this.engine.play() + } + + pause() { + this.engine.pause() + } + + load() { + if (this._src) this.engine.load(this._src) + } + + // Video dimensions + get videoWidth() { + return this.engine.videoWidth + } + + get videoHeight() { + return this.engine.videoHeight + } + + // Other properties + get poster() { + return this.option.poster || '' + } + + set poster(v) { + this.option.poster = v + } + + get autoplay() { + return this.option.autoplay || false + } + + set autoplay(v) {} + + get loop() { + return this.option.loop || false + } + + set loop(v) {} + + get controls() { + return false + } + + set controls(v) {} + + get playsInline() { + return true + } + + set playsInline(v) {} + + get crossOrigin() { + return this.option.crossOrigin || '' + } + + set crossOrigin(v) {} + + get preload() { + return 'auto' + } + + set preload(v) {} + + get defaultMuted() { + return false + } + + set defaultMuted(v) {} + + get defaultPlaybackRate() { + return 1 + } + + set defaultPlaybackRate(v) {} + + // Methods + canPlayType(_type) { + return 'maybe' + } + + getBoundingClientRect() { + return this.canvas.getBoundingClientRect() + } + + requestVideoFrameCallback(callback) { + const id = requestAnimationFrame((time) => { + callback(time, { + presentationTime: this.engine.currentTime, + expectedDisplayTime: time + 16.6, + width: this.engine.videoWidth, + height: this.engine.videoHeight, + mediaTime: this.engine.currentTime, + presentedFrames: 0, + processingDuration: 0, + captureTime: time, + receiveTime: time, + rtpTimestamp: 0, + }) + }) + return id + } + + cancelVideoFrameCallback(id) { + cancelAnimationFrame(id) + } + + setAttribute(name, value) { + if (name === 'src') { + this.src = value + } else if (name === 'autoplay') { + this.autoplay = value + } else if (name === 'loop') { + this.loop = value + } else if (name === 'muted') { + this.muted = true + } else { + this.canvas.setAttribute(name, value) + } + } + + destroy() { + this.engine.destroy() + } +} diff --git a/packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js b/packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js deleted file mode 100644 index 5bd5a2624..000000000 --- a/packages/artplayer-proxy-mediabunny/src/engine/audioEngine.js +++ /dev/null @@ -1,316 +0,0 @@ -import { - ALL_FORMATS, - AudioBufferSink, - BlobSource, - Input, - ReadableStreamSource, - UrlSource, -} from 'mediabunny' - -export default function createAudioEngine(events) { - let input = null - let audioSink = null - - let audioContext = null - let gainNode = null - - let audioIterator = null - let audioContextStartTime = 0 - let playbackTimeAtStart = 0 - let latestScheduledEndTime = 0 - - let _duration = Number.NaN - let _paused = true - - let _volume = 0.7 - let _muted = false - let _playbackRate = 1 - - let asyncId = 0 - const queuedNodes = new Set() - - function getCurrentTime() { - if (_paused) - return playbackTimeAtStart - return ( - (audioContext.currentTime - audioContextStartTime) * _playbackRate - + playbackTimeAtStart - ) - } - - function updateGain() { - if (!gainNode) - return - const v = _muted ? 0 : _volume - gainNode.gain.value = v * v - } - - function ensureAudioContext(sampleRate) { - if (audioContext) - return - - const AudioContext - = window.AudioContext || window.webkitAudioContext - - try { - audioContext = new AudioContext({ sampleRate }) - } - catch { - audioContext = new AudioContext() - } - - gainNode = audioContext.createGain() - gainNode.connect(audioContext.destination) - updateGain() - } - - function stopQueuedNodes() { - for (const node of queuedNodes) { - node.stop() - } - queuedNodes.clear() - } - - async function stopIterator() { - await audioIterator?.return() - audioIterator = null - } - - function normalizeSource(src) { - if (typeof src === 'string') - return new UrlSource(src) - if (src instanceof Blob) - return new BlobSource(src) - if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) - return new ReadableStreamSource(src) - return src - } - - async function load(src, onMetadata) { - asyncId++ - const id = asyncId - - await stopIterator() - stopQueuedNodes() - - _paused = true - playbackTimeAtStart = 0 - audioContextStartTime = 0 - - const source = normalizeSource(src) - if (!source) - return - - input = new Input({ - source, - formats: ALL_FORMATS, - }) - - _duration = await input.computeDuration() - if (id !== asyncId) - return - - const audioTrack = await input.getPrimaryAudioTrack() - if (!audioTrack) { - audioSink = null - ensureAudioContext() - if (onMetadata) - onMetadata() - return - } - - if (audioTrack.codec === null || !(await audioTrack.canDecode())) { - audioSink = null - ensureAudioContext() - if (onMetadata) - onMetadata() - return - } - - ensureAudioContext(audioTrack.sampleRate) - audioSink = new AudioBufferSink(audioTrack) - - if (onMetadata) - onMetadata() - } - - async function runIterator(localId) { - if (!audioSink) - return - - await stopIterator() - audioIterator = audioSink.buffers(getCurrentTime()) - - while (true) { - if (localId !== asyncId) - return - if (_paused) - return - - const nextPromise = audioIterator.next() - - const checkStarvation = setInterval(() => { - if (localId !== asyncId || _paused) { - clearInterval(checkStarvation) - return - } - if (audioContext.state === 'running' - && audioContext.currentTime >= latestScheduledEndTime - 0.2) { - audioContext.suspend() - events.emit('waiting') - } - }, 50) - - let result - try { - result = await nextPromise - } - catch (e) { - console.error(e) - break - } - finally { - clearInterval(checkStarvation) - } - - if (localId !== asyncId) - return - if (_paused) - return - - if (audioContext.state === 'suspended') { - await audioContext.resume() - events.emit('canplay') - events.emit('playing') - } - - if (result.done) - break - - const { buffer, timestamp } = result.value - - const node = audioContext.createBufferSource() - node.buffer = buffer - node.connect(gainNode) - node.playbackRate.value = _playbackRate - - const startAt - = audioContextStartTime - + (timestamp - playbackTimeAtStart) / _playbackRate - - const duration = buffer.duration - const endAt = startAt + duration / _playbackRate - - if (endAt > latestScheduledEndTime) { - latestScheduledEndTime = endAt - } - - if (startAt >= audioContext.currentTime) { - node.start(startAt) - } - else { - node.start( - audioContext.currentTime, - (audioContext.currentTime - startAt) * _playbackRate, - ) - } - - queuedNodes.add(node) - node.onended = () => queuedNodes.delete(node) - } - } - - async function play() { - if (!_paused) - return - - if (!audioContext) { - ensureAudioContext() - } - - if (audioContext.state === 'suspended') { - await audioContext.resume() - } - - audioContextStartTime = audioContext.currentTime - latestScheduledEndTime = audioContextStartTime - _paused = false - - asyncId++ - runIterator(asyncId) - } - - function pause() { - if (_paused) - return - - playbackTimeAtStart = getCurrentTime() - _paused = true - - stopIterator() - stopQueuedNodes() - } - - async function seek(time) { - playbackTimeAtStart = Math.max(0, time) - audioContextStartTime = audioContext.currentTime - latestScheduledEndTime = audioContextStartTime - - asyncId++ - if (!_paused) { - runIterator(asyncId) - } - } - - function destroy() { - asyncId++ - pause() - audioContext?.close() - audioContext = null - input = null - audioSink = null - } - - return { - load, - play, - pause, - seek, - destroy, - - setVolume(v, muted) { - _volume = v - _muted = muted - updateGain() - }, - - setPlaybackRate(rate) { - if (rate === _playbackRate) - return - - if (!_paused) { - playbackTimeAtStart = getCurrentTime() - audioContextStartTime = audioContext.currentTime - } - - _playbackRate = rate - - if (!_paused) { - asyncId++ - runIterator(asyncId) - } - }, - - get currentTime() { - return getCurrentTime() - }, - - get duration() { - return _duration - }, - - get paused() { - return _paused - }, - } -} diff --git a/packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js b/packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js deleted file mode 100644 index 9490979ed..000000000 --- a/packages/artplayer-proxy-mediabunny/src/engine/mediabunnyEngine.js +++ /dev/null @@ -1,223 +0,0 @@ -import createAudioEngine from './audioEngine.js' -import createVideoEngine from './videoEngine.js' - -export default function createMediabunnyEngine({ - canvas, - ctx, - events, - option = {}, -}) { - const defaults = { - timeupdateInterval: 250, - avSyncTolerance: 0.12, - loadTimeout: 12000, - dropLateFrames: false, - poster: '', - } - - const audio = createAudioEngine(events) - const video = createVideoEngine({ - canvas, - ctx, - events, - timeupdateInterval: option.timeupdateInterval ?? defaults.timeupdateInterval, - avSyncTolerance: option.avSyncTolerance ?? defaults.avSyncTolerance, - dropLateFrames: option.dropLateFrames ?? defaults.dropLateFrames, - poster: option.poster ?? defaults.poster, - preflightRange: option.preflightRange ?? false, - }) - - let _paused = true - let _ended = false - let _readyState = 0 - let _networkState = 0 - let _error = null - let _seeking = false - let loadSeq = 0 - - events.addEventListener?.('ended', () => { - _ended = true - _paused = true - }) - - async function load(src) { - const id = ++loadSeq - pause() - _ended = false - _error = null - _networkState = 2 - _readyState = 0 - setTimeout(() => events.emit('waiting'), 0) - setTimeout(() => events.emit('loadstart'), 0) - - const loadTimeout = Number.isFinite(option.loadTimeout) - ? option.loadTimeout - : defaults.loadTimeout - - let timer = null - const timeoutPromise - = loadTimeout > 0 - ? new Promise((_, reject) => { - timer = setTimeout(() => reject(new Error('Load timeout')), loadTimeout) - }) - : null - - const loadTask = (async () => { - try { - let videoMetadataLoaded = false - let audioMetadataLoaded = false - - const checkMetadata = () => { - if (videoMetadataLoaded && audioMetadataLoaded) { - _readyState = 1 - events.emit('loadedmetadata') - events.emit('durationchange') - } - } - - const p1 = video.load(src, () => { - if (id !== loadSeq) - return - videoMetadataLoaded = true - checkMetadata() - }) - - const p2 = audio.load(src, () => { - if (id !== loadSeq) - return - audioMetadataLoaded = true - checkMetadata() - }) - - await Promise.all([p1, p2]) - if (id !== loadSeq) - return - - _readyState = 4 - _networkState = 1 - events.emit('loadeddata') - events.emit('canplay') - events.emit('canplaythrough') - } - catch (err) { - if (id !== loadSeq) - return - _error = { code: 4, message: err.message } - _networkState = 3 - events.emit('error') - console.error(err) - } - finally { - if (timer) - clearTimeout(timer) - } - })() - - if (timeoutPromise) { - try { - await Promise.race([loadTask, timeoutPromise]) - } - catch (err) { - if (id !== loadSeq) - return - loadSeq++ - _error = { code: 4, message: err.message } - _networkState = 3 - events.emit('error') - } - } - else { - await loadTask - } - } - - async function play() { - if (!_paused) - return - if (_ended) { - _ended = false - await seek(0) - } - _paused = false - await audio.play() - video.start(audio) - events.emit('play') - events.emit('playing') - } - - function pause() { - if (_paused) - return - _paused = true - audio.pause() - video.stop() - events.emit('pause') - } - - async function seek(time) { - const shouldResume = !_paused - _ended = false - _seeking = true - events.emit('seeking') - events.emit('waiting') - pause() - await audio.seek(time) - await video.seek(time) - _seeking = false - events.emit('seeked') - if (shouldResume && !_ended) { - await play() - } - } - - function destroy() { - pause() - audio.destroy() - video.destroy() - } - - return { - load, - play, - pause, - seek, - destroy, - - setVolume: audio.setVolume, - setPlaybackRate(rate) { - audio.setPlaybackRate(rate) - video.setPlaybackRate(rate) - }, - - get currentTime() { - return audio.currentTime - }, - get duration() { - return audio.duration || video.duration - }, - get paused() { - return _paused - }, - get seeking() { - return _seeking - }, - get ended() { - return _ended - }, - get readyState() { - return _readyState - }, - get networkState() { - return _networkState - }, - get error() { - return _error - }, - get videoWidth() { - return video.width - }, - get videoHeight() { - return video.height - }, - } -} diff --git a/packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js b/packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js deleted file mode 100644 index 74d50494a..000000000 --- a/packages/artplayer-proxy-mediabunny/src/engine/videoEngine.js +++ /dev/null @@ -1,311 +0,0 @@ -import { - ALL_FORMATS, - BlobSource, - CanvasSink, - Input, - ReadableStreamSource, - UrlSource, -} from 'mediabunny' - -export default function createVideoEngine({ - canvas, - ctx, - events, - timeupdateInterval = 250, - avSyncTolerance = 0.12, - dropLateFrames = false, - poster = '', - preflightRange = false, -}) { - let input = null - let videoSink = null - let videoIterator = null - - let nextFrame = null - let rafId = 0 - let asyncId = 0 - - let _width = 0 - let _height = 0 - let _duration = Number.NaN - - let audioClock = null - let lastTimeUpdate = 0 - let stalled = false - let playbackRate = 1 - let posterDrawn = false - - function normalizeSource(src) { - if (typeof src === 'string') - return new UrlSource(src) - if (src instanceof Blob) - return new BlobSource(src) - if (typeof ReadableStream !== 'undefined' && src instanceof ReadableStream) - return new ReadableStreamSource(src) - return src - } - - async function preflight(url) { - if (!preflightRange || typeof url !== 'string') - return true - try { - const res = await fetch(url, { method: 'HEAD' }) - const acceptRanges = res.headers.get('accept-ranges') - if (!acceptRanges || acceptRanges === 'none') { - events.emit('error', new Event('RangeNotSupported')) - return false - } - return true - } - catch (e) { - console.warn('preflight failed', e) - return true - } - } - - function drawPoster() { - if (!poster || posterDrawn) - return - const img = new Image() - img.onload = () => { - ctx.clearRect(0, 0, canvas.width, canvas.height) - canvas.width = img.naturalWidth || canvas.width - canvas.height = img.naturalHeight || canvas.height - ctx.drawImage(img, 0, 0, canvas.width, canvas.height) - posterDrawn = true - } - img.src = poster - } - - async function stopIterator() { - await videoIterator?.return() - videoIterator = null - } - - function clear() { - ctx.clearRect(0, 0, canvas.width, canvas.height) - } - - async function load(src, onMetadata) { - asyncId++ - const id = asyncId - - await stopIterator() - clear() - posterDrawn = false - - if (!(await preflight(src))) - return - - const source = normalizeSource(src) - if (!source) { - drawPoster() - return - } - - input = new Input({ - source, - formats: ALL_FORMATS, - }) - - _duration = await input.computeDuration() - if (id !== asyncId) - return - - const videoTrack = await input.getPrimaryVideoTrack() - if (!videoTrack) { - videoSink = null - _width = 0 - _height = 0 - canvas.width = 0 - canvas.height = 0 - drawPoster() - if (onMetadata) - onMetadata() - return - } - - if (videoTrack.codec === null || !(await videoTrack.canDecode())) { - videoSink = null - _width = 0 - _height = 0 - canvas.width = 0 - canvas.height = 0 - clear() - drawPoster() - if (onMetadata) - onMetadata() - return - } - - const transparent = await videoTrack.canBeTransparent() - videoSink = new CanvasSink(videoTrack, { - poolSize: 2, - fit: 'contain', - alpha: transparent, - }) - - _width = videoTrack.displayWidth - _height = videoTrack.displayHeight - - canvas.width = _width - canvas.height = _height - - if (onMetadata) - onMetadata() - - await resetIterator(0) - } - - async function resetIterator(time) { - await stopIterator() - - if (!videoSink) - return - - videoIterator = videoSink.canvases(time) - - const first = (await videoIterator.next()).value ?? null - const second = (await videoIterator.next()).value ?? null - - nextFrame = second - - if (first) { - ctx.drawImage(first.canvas, 0, 0) - events.emit('loadeddata') - } - else { - drawPoster() - } - } - - async function updateNextFrame(localId) { - if (!videoIterator) - return - - while (true) { - const frame = (await videoIterator.next()).value ?? null - if (!frame) - return - if (localId !== asyncId) - return - - const t = audioClock.currentTime - if (dropLateFrames) { - const tolerance = Math.max(0.06, avSyncTolerance / Math.max(1, playbackRate)) - if (frame.timestamp < t - tolerance) { - continue - } - if (frame.timestamp <= t + tolerance) { - ctx.clearRect(0, 0, canvas.width, canvas.height) - ctx.drawImage(frame.canvas, 0, 0) - } - else { - nextFrame = frame - return - } - } - else { - if (frame.timestamp <= t) { - ctx.clearRect(0, 0, canvas.width, canvas.height) - ctx.drawImage(frame.canvas, 0, 0) - } - else { - nextFrame = frame - return - } - } - } - } - - function render() { - if (!audioClock) - return - - const t = audioClock.currentTime - const now = Date.now() - if (now - lastTimeUpdate >= timeupdateInterval) { - events.emit('timeupdate') - lastTimeUpdate = now - } - - if (Number.isFinite(_duration) && t >= _duration) { - stop() - stalled = false - events.emit('ended') - events.emit('pause') - events.emit('canplay') - return - } - - if (nextFrame && nextFrame.timestamp <= t) { - ctx.clearRect(0, 0, canvas.width, canvas.height) - ctx.drawImage(nextFrame.canvas, 0, 0) - nextFrame = null - updateNextFrame(asyncId) - if (stalled) { - events.emit('canplay') - events.emit('playing') - stalled = false - } - } - else if (!nextFrame) { - updateNextFrame(asyncId) - if (!nextFrame && Number.isFinite(_duration) && t < _duration && !stalled) { - stalled = true - events.emit('waiting') - } - } - - rafId = requestAnimationFrame(render) - } - - function start(audioEngine) { - audioClock = audioEngine - asyncId++ - stalled = false - updateNextFrame(asyncId) - rafId = requestAnimationFrame(render) - } - - function stop() { - cancelAnimationFrame(rafId) - } - - async function seek(time) { - asyncId++ - await resetIterator(time) - } - - function setPlaybackRate(rate) { - playbackRate = Math.max(0.1, Number(rate) || 1) - } - - function destroy() { - asyncId++ - stop() - stopIterator() - posterDrawn = false - input = null - videoSink = null - } - - return { - load, - start, - stop, - seek, - setPlaybackRate, - destroy, - - get width() { - return _width - }, - get height() { - return _height - }, - get duration() { - return _duration - }, - } -} diff --git a/packages/artplayer-proxy-mediabunny/src/index.js b/packages/artplayer-proxy-mediabunny/src/index.js index b4f9936f2..d8697440d 100644 --- a/packages/artplayer-proxy-mediabunny/src/index.js +++ b/packages/artplayer-proxy-mediabunny/src/index.js @@ -1,8 +1,84 @@ -import createCanvasProxy from './proxy/canvasProxy.js' +/** + * ArtPlayer MediaBunny Proxy + * Main entry point + */ +import VideoShim from './VideoShim.js' export default function artplayerProxyMediabunny(option = {}) { return (art) => { - return createCanvasProxy(art, option) + const { constructor } = art + const { createElement } = constructor.utils + + // Create canvas element + const canvas = createElement('canvas') + const ctx = canvas.getContext('2d') + + // Create video shim + const shim = new VideoShim({ + art, + canvas, + ctx, + option, + }) + + // Proxy canvas methods to shim + const originalCanvasMethods = {} + for (const prop in canvas) { + if (typeof canvas[prop] === 'function') { + originalCanvasMethods[prop] = canvas[prop].bind(canvas) + } + } + + // Get all properties from shim instance and prototype + const propertyNames = new Set([ + ...Object.getOwnPropertyNames(shim), + ...Object.getOwnPropertyNames(Object.getPrototypeOf(shim)), + ]) + + // Add shim properties to canvas + for (const prop of propertyNames) { + if (prop === 'constructor') continue + if (!(prop in canvas)) { + Object.defineProperty(canvas, prop, { + get() { + const value = shim[prop] + return typeof value === 'function' ? value.bind(shim) : value + }, + set(v) { + shim[prop] = v + }, + configurable: true, + enumerable: true, + }) + } + } + + // Restore original canvas methods + for (const prop in originalCanvasMethods) { + canvas[prop] = (...args) => originalCanvasMethods[prop](...args) + } + + // Handle resize + function resize() { + const player = art.template?.$player + if (!player || art.option.autoSize) return + + Object.assign(canvas.style, { + width: '100%', + height: '100%', + objectFit: 'contain', + }) + } + + art.on('resize', resize) + art.on('video:loadedmetadata', resize) + + // Cleanup on destroy + art.on('destroy', () => { + shim.destroy() + }) + + return canvas } } diff --git a/packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js b/packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js deleted file mode 100644 index 2ac7e9a92..000000000 --- a/packages/artplayer-proxy-mediabunny/src/proxy/canvasProxy.js +++ /dev/null @@ -1,64 +0,0 @@ -import createMediabunnyVideoShim from '../shim/mediabunnyVideoShim.js' - -export default function createCanvasProxy(art, option) { - const { constructor } = art - const { createElement } = constructor.utils - - const canvas = createElement('canvas') - const ctx = canvas.getContext('2d') - - const shim = createMediabunnyVideoShim({ - art, - canvas, - ctx, - option, - }) - - const originalCanvasMethods = {} - for (const prop in canvas) { - if (typeof canvas[prop] === 'function') { - originalCanvasMethods[prop] = canvas[prop].bind(canvas) - } - } - - for (const prop in shim) { - if (!(prop in canvas)) { - Object.defineProperty(canvas, prop, { - get() { - const value = shim[prop] - return typeof value === 'function' ? value.bind(shim) : value - }, - set(v) { - shim[prop] = v - }, - configurable: true, - enumerable: true, - }) - } - } - - for (const prop in originalCanvasMethods) { - canvas[prop] = (...args) => originalCanvasMethods[prop](...args) - } - - art.on('destroy', () => { - shim.destroy() - }) - - function resize() { - const player = art.template?.$player - if (!player || art.option.autoSize) - return - - Object.assign(canvas.style, { - width: '100%', - height: '100%', - objectFit: 'contain', - }) - } - - art.on('resize', resize) - art.on('video:loadedmetadata', resize) - - return canvas -} diff --git a/packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js b/packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js deleted file mode 100644 index c15da711d..000000000 --- a/packages/artplayer-proxy-mediabunny/src/shim/mediabunnyVideoShim.js +++ /dev/null @@ -1,278 +0,0 @@ -import createMediabunnyEngine from '../engine/mediabunnyEngine.js' -import clamp from '../utils/clamp.js' -import { createVideoEventTarget } from './videoEvents.js' - -export default function createMediabunnyVideoShim({ art, canvas, ctx, option }) { - const events = createVideoEventTarget() - const engine = createMediabunnyEngine({ canvas, ctx, events, option }) - - let _src = null - let _volume = option.volume ?? 0.7 - let _muted = !!option.muted - let _playbackRate = 1 - - engine.setVolume(_volume, _muted) - - const { events: artEvents } = art.constructor.config - artEvents.forEach((name) => { - events.addEventListener(name, (e) => { - art.emit(`video:${e.type}`, e) - }) - }) - - const shim = { - addEventListener: events.addEventListener, - removeEventListener: events.removeEventListener, - - get src() { - return _src - }, - set src(v) { - _src = v - if (v) - engine.load(v) - }, - - get currentTime() { - return engine.currentTime - }, - set currentTime(t) { - engine.seek(Number(t) || 0) - }, - - get duration() { - return engine.duration - }, - - get buffered() { - const duration = engine.duration - if (!duration || Number.isNaN(duration)) { - return { - length: 0, - start: () => 0, - end: () => 0, - } - } - return { - length: 1, - start: () => 0, - end: () => duration, - } - }, - - get played() { - const duration = engine.duration - const currentTime = engine.currentTime - if (!duration || Number.isNaN(duration) || currentTime <= 0) { - return { - length: 0, - start: () => 0, - end: () => 0, - } - } - return { - length: 1, - start: () => 0, - end: () => currentTime, - } - }, - - get paused() { - return engine.paused - }, - get playing() { - return !engine.paused && !engine.ended - }, - get ended() { - return engine.ended - }, - - get readyState() { - return engine.readyState - }, - - get networkState() { - return engine.networkState - }, - - get error() { - return engine.error - }, - - get seeking() { - return engine.seeking - }, - - get seekable() { - const duration = engine.duration - if (!duration || Number.isNaN(duration)) { - return { - length: 0, - start: () => 0, - end: () => 0, - } - } - return { - length: 1, - start: () => 0, - end: () => duration, - } - }, - - get playbackRate() { - return _playbackRate - }, - set playbackRate(v) { - const rate = Number(v) - if (Number.isNaN(rate) || rate <= 0) - return - _playbackRate = rate - engine.setPlaybackRate(rate) - events.emit('ratechange') - }, - - get volume() { - return _volume - }, - set volume(v) { - _volume = clamp(v, 0, 1) - _muted = false - engine.setVolume(_volume, _muted) - events.emit('volumechange') - }, - - get muted() { - return _muted - }, - set muted(v) { - _muted = !!v - engine.setVolume(_volume, _muted) - events.emit('volumechange') - }, - - play() { - return engine.play() - }, - pause() { - engine.pause() - }, - load() { - if (_src) - engine.load(_src) - }, - - destroy() { - engine.destroy() - }, - - get videoWidth() { - return engine.videoWidth - }, - get videoHeight() { - return engine.videoHeight - }, - - get playsInline() { - return true - }, - set playsInline(v) {}, - - get autoplay() { - return option.autoplay || false - }, - set autoplay(v) {}, - - get loop() { - return option.loop || false - }, - set loop(v) {}, - - get controls() { - return false - }, - set controls(v) {}, - - get crossOrigin() { - return option.crossOrigin || '' - }, - set crossOrigin(v) {}, - - get currentSrc() { - return _src - }, - - get poster() { - return option.poster || '' - }, - set poster(v) { - option.poster = v - }, - - get preload() { - return 'auto' - }, - set preload(v) {}, - - get defaultMuted() { - return false - }, - set defaultMuted(v) {}, - - get defaultPlaybackRate() { - return 1 - }, - set defaultPlaybackRate(v) {}, - - canPlayType(_type) { - return 'maybe' - }, - - getBoundingClientRect() { - return canvas.getBoundingClientRect() - }, - - requestVideoFrameCallback(callback) { - const id = requestAnimationFrame((time) => { - callback(time, { - presentationTime: engine.currentTime, - expectedDisplayTime: time + 16.6, - width: engine.videoWidth, - height: engine.videoHeight, - mediaTime: engine.currentTime, - presentedFrames: 0, - processingDuration: 0, - captureTime: time, - receiveTime: time, - rtpTimestamp: 0, - }) - }) - return id - }, - - cancelVideoFrameCallback(id) { - cancelAnimationFrame(id) - }, - - setAttribute(name, value) { - if (name === 'src') - this.src = value - else if (name === 'autoplay') - this.autoplay = value - else if (name === 'loop') - this.loop = value - else if (name === 'muted') - this.muted = true - else - canvas.setAttribute(name, value) - }, - } - - if (option.source) { - shim.src = option.source - } - else if (art.option?.url) { - shim.src = art.option.url - } - - return shim -} diff --git a/packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js b/packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js deleted file mode 100644 index 07f094020..000000000 --- a/packages/artplayer-proxy-mediabunny/src/shim/videoEvents.js +++ /dev/null @@ -1,28 +0,0 @@ -export function createVideoEventTarget() { - const listeners = new Map() - - function addEventListener(type, fn) { - if (!listeners.has(type)) - listeners.set(type, []) - listeners.get(type).push(fn) - } - - function removeEventListener(type, fn) { - const list = listeners.get(type) - if (!list) - return - const i = list.indexOf(fn) - if (i >= 0) - list.splice(i, 1) - } - - function emit(type, detail) { - const evt = new Event(type) - evt.detail = detail - const list = listeners.get(type) - if (list) - list.forEach(fn => fn(evt)) - } - - return { addEventListener, removeEventListener, emit } -} diff --git a/packages/artplayer-proxy-mediabunny/src/utils/clamp.js b/packages/artplayer-proxy-mediabunny/src/utils/clamp.js deleted file mode 100644 index 77a79f7e2..000000000 --- a/packages/artplayer-proxy-mediabunny/src/utils/clamp.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function clamp(v, min, max) { - return Math.max(min, Math.min(max, Number(v) || 0)) -} diff --git a/packages/artplayer-proxy-mediabunny/src/utils/sleep.js b/packages/artplayer-proxy-mediabunny/src/utils/sleep.js deleted file mode 100644 index b8344ab8f..000000000 --- a/packages/artplayer-proxy-mediabunny/src/utils/sleep.js +++ /dev/null @@ -1,5 +0,0 @@ -export default function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms) - }) -} diff --git a/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts b/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts index ed8db020d..c610d2ea0 100644 --- a/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts +++ b/packages/artplayer-proxy-mediabunny/types/artplayer-proxy-mediabunny.d.ts @@ -1,14 +1,74 @@ import type Artplayer from 'artplayer' interface Option { - eventDelay?: number + /** + * Timeout for loading media in milliseconds + * @default 12000 + */ loadTimeout?: number + + /** + * Interval for timeupdate events in milliseconds + * @default 250 + */ timeupdateInterval?: number + + /** + * Audio-video synchronization tolerance in seconds + * @default 0.12 + */ avSyncTolerance?: number + + /** + * Whether to drop late video frames + * @default false + */ dropLateFrames?: boolean + + /** + * Poster image URL + */ poster?: string + + /** + * Media source (URL, Blob, or ReadableStream) + */ source?: string | Blob | ReadableStream + + /** + * Check if server supports range requests before loading + * @default false + */ preflightRange?: boolean + + /** + * Initial volume (0-1) + * @default 0.7 + */ + volume?: number + + /** + * Initial muted state + * @default false + */ + muted?: boolean + + /** + * Autoplay + * @default false + */ + autoplay?: boolean + + /** + * Loop playback + * @default false + */ + loop?: boolean + + /** + * Cross-origin setting + */ + crossOrigin?: string } type Result = HTMLCanvasElement