diff --git a/dist/metamuxer.d.ts b/dist/metamuxer.d.ts index c0572f7..d5ddb93 100644 --- a/dist/metamuxer.d.ts +++ b/dist/metamuxer.d.ts @@ -325,6 +325,13 @@ export declare class TextSubtitleSource extends SubtitleSource { /** @public */ export declare type TransformationMatrix = [number, number, number, number, number, number, number, number, number]; +/** @public */ +export declare class UrlSource extends Source { + constructor(url: string, options?: { + withCredentials?: boolean; + }); +} + /** @public */ export declare const VIDEO_CODECS: readonly ["avc", "hevc", "vp8", "vp9", "av1"]; diff --git a/dist/metamuxer.js b/dist/metamuxer.js index a0e9d1f..b20f093 100644 --- a/dist/metamuxer.js +++ b/dist/metamuxer.js @@ -64,6 +64,7 @@ var Metamuxer = (() => { SubtitleSource: () => SubtitleSource, Target: () => Target, TextSubtitleSource: () => TextSubtitleSource, + UrlSource: () => UrlSource, VIDEO_CODECS: () => VIDEO_CODECS, VideoFrameDrain: () => VideoFrameDrain, VideoFrameSource: () => VideoFrameSource, @@ -4120,6 +4121,97 @@ ${cue.notes ?? ""}`; return this._blob.size; } }; + var UrlSource = class extends Source { + constructor(url2, options = {}) { + if (typeof url2 !== "string") { + throw new TypeError("url must be a string."); + } + if (!options || typeof options !== "object") { + throw new TypeError("options must be an object."); + } + if (options.withCredentials !== void 0 && typeof options.withCredentials !== "boolean") { + throw new TypeError("options.withCredentials, when specified, must be a boolean."); + } + super(); + /** @internal */ + this._fullData = null; + this._url = url2; + this._withCredentials = options.withCredentials ?? false; + } + /** @internal */ + _makeRequest(range) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.open("GET", this._url, true); + xhr.responseType = "arraybuffer"; + xhr.withCredentials = this._withCredentials; + if (range) { + xhr.setRequestHeader("Range", `bytes=${range.start}-${range.end - 1}`); + } + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + const buffer = xhr.response; + if (!range) { + this._fullData = buffer; + } + resolve({ + response: buffer, + statusCode: xhr.status + }); + } else { + reject(new Error(`Error fetching ${this._url}: ${xhr.status} ${xhr.statusText}`)); + } + }; + xhr.onerror = () => { + reject(new Error("Network error occurred.")); + }; + xhr.ontimeout = () => { + reject(new Error("Request timed out.")); + }; + xhr.send(); + }); + } + /** @internal */ + async _read(start, end) { + if (this._fullData) { + return new Uint8Array(this._fullData, start, end - start); + } + const { response, statusCode } = await this._makeRequest({ start, end }); + if (statusCode === 200) { + const fullData = new Uint8Array(response); + return fullData.subarray(start, end); + } + return new Uint8Array(response); + } + /** @internal */ + async _retrieveSize() { + if (this._fullData) { + return this._fullData.byteLength; + } + const xhr = new XMLHttpRequest(); + xhr.open("HEAD", this._url, true); + xhr.withCredentials = this._withCredentials; + await new Promise((resolve, reject) => { + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(); + } else { + reject(new Error(`Error fetching ${this._url} (HEAD): ${xhr.status} ${xhr.statusText}`)); + } + }; + xhr.onerror = () => { + resolve(); + }; + xhr.send(); + }); + const contentLength = xhr.getResponseHeader("Content-Length"); + if (!contentLength) { + const { response } = await this._makeRequest(); + return response.byteLength; + } + return parseInt(contentLength, 10); + } + }; // src/demuxer.ts var Demuxer = class { @@ -6000,9 +6092,10 @@ ${cue.notes ?? ""}`; let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers(); let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let ended = false; + let outOfBandError = null; const timestamps = []; const maxQueueSize = () => Math.max(2, timestamps.length); - void (async () => { + (async () => { let chunk = startChunk ?? await this.getFirstChunk(); while (chunk && !ended) { if (chunk.timestamp / 1e6 >= endTimestamp) { @@ -6020,10 +6113,17 @@ ${cue.notes ?? ""}`; } ended = true; onQueueNotEmpty(); - })(); + })().catch((error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (chunkQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (chunkQueue.length > 0) { yield chunkQueue.shift(); const now = performance.now(); timestamps.push(now); @@ -6052,18 +6152,20 @@ ${cue.notes ?? ""}`; validateAnyIterable(timestamps); const timestampIterator = toAsyncIterator(timestamps); const timestampsOfInterest = []; + const MAX_QUEUE_SIZE = 8; const frameQueue = []; let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers(); let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let decoderIsFlushed = false; let ended = false; - const MAX_QUEUE_SIZE = 8; + let outOfBandError = null; let lastUsedFrame = null; const pushToQueue = (frame) => { frameQueue.push(frame); onQueueNotEmpty(); ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers()); }; + const decoderError = new Error(); const decoder = await this._createDecoder((frame) => { onQueueDequeue(); if (ended) { @@ -6082,8 +6184,14 @@ ${cue.notes ?? ""}`; } else { frame.close(); } + }, (error) => { + if (!outOfBandError) { + error.stack = decoderError.stack; + outOfBandError = error; + onQueueNotEmpty(); + } }); - void (async () => { + (async () => { const chunkDrain = this._createChunkDrain(); let lastKeyChunk = null; let lastChunk = null; @@ -6134,10 +6242,17 @@ ${cue.notes ?? ""}`; decoder.close(); decoderIsFlushed = true; onQueueNotEmpty(); - })(); + })().catch((error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (frameQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (frameQueue.length > 0) { const nextFrame = frameQueue.shift(); assert(nextFrame !== void 0); yield nextFrame; @@ -6160,6 +6275,7 @@ ${cue.notes ?? ""}`; async *mediaFramesInRange(startTimestamp = 0, endTimestamp = Infinity) { validateTimestamp(startTimestamp); validateTimestamp(endTimestamp); + const MAX_QUEUE_SIZE = 8; const frameQueue = []; let firstFrameQueued = false; let lastFrame = null; @@ -6167,7 +6283,8 @@ ${cue.notes ?? ""}`; let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let decoderIsFlushed = false; let ended = false; - const MAX_QUEUE_SIZE = 8; + let outOfBandError = null; + const decoderError = new Error(); const decoder = await this._createDecoder((frame) => { onQueueDequeue(); const frameTimestamp = frame.timestamp / 1e6; @@ -6195,13 +6312,19 @@ ${cue.notes ?? ""}`; onQueueNotEmpty(); ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers()); } + }, (error) => { + if (!outOfBandError) { + error.stack = decoderError.stack; + outOfBandError = error; + onQueueNotEmpty(); + } }); const chunkDrain = this._createChunkDrain(); const keyChunk = await chunkDrain.getKeyChunk(startTimestamp) ?? await chunkDrain.getFirstChunk(); if (!keyChunk) { return; } - void (async () => { + (async () => { let currentChunk = keyChunk; let chunksEndTimestamp = Infinity; if (endTimestamp < Infinity) { @@ -6234,10 +6357,17 @@ ${cue.notes ?? ""}`; } decoderIsFlushed = true; onQueueNotEmpty(); - })(); + })().catch((error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (frameQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (frameQueue.length > 0) { yield frameQueue.shift(); onQueueDequeue(); } else if (!decoderIsFlushed) { @@ -6303,12 +6433,9 @@ ${cue.notes ?? ""}`; this._videoTrack = videoTrack; } /** @internal */ - async _createDecoder(onFrame) { + async _createDecoder(onFrame, onError) { this._decoderConfig ??= await this._videoTrack.getDecoderConfig(); - const decoder = new VideoDecoder({ - output: onFrame, - error: (error) => console.error(error) - }); + const decoder = new VideoDecoder({ output: onFrame, error: onError }); decoder.configure(this._decoderConfig); return decoder; } @@ -6435,12 +6562,9 @@ ${cue.notes ?? ""}`; this._audioTrack = audioTrack; } /** @internal */ - async _createDecoder(onData) { + async _createDecoder(onData, onError) { this._decoderConfig ??= await this._audioTrack.getDecoderConfig(); - const decoder = new AudioDecoder({ - output: onData, - error: (error) => console.error(error) - }); + const decoder = new AudioDecoder({ output: onData, error: onError }); decoder.configure(this._decoderConfig); return decoder; } diff --git a/dist/metamuxer.min.js b/dist/metamuxer.min.js index c3df571..e04cbe1 100644 --- a/dist/metamuxer.min.js +++ b/dist/metamuxer.min.js @@ -1,10 +1,10 @@ -"use strict";var Metamuxer=(()=>{var xt=Object.defineProperty;var Sr=Object.getOwnPropertyDescriptor;var vr=Object.getOwnPropertyNames;var Ir=Object.prototype.hasOwnProperty;var _r=(i,t)=>{for(var e in t)xt(i,e,{get:t[e],enumerable:!0})},Ar=(i,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of vr(t))!Ir.call(i,a)&&a!==e&&xt(i,a,{get:()=>t[a],enumerable:!(r=Sr(t,a))||r.enumerable});return i};var Rr=i=>Ar(xt({},"__esModule",{value:!0}),i);var Ni={};_r(Ni,{ALL_FORMATS:()=>wr,AUDIO_CODECS:()=>se,ArrayBufferTarget:()=>he,AudioBufferDrain:()=>gt,AudioBufferSource:()=>st,AudioDataDrain:()=>Pe,AudioDataSource:()=>nt,AudioSource:()=>Q,BaseChunkDrain:()=>ge,BaseMediaFrameDrain:()=>Te,BlobSource:()=>mt,BufferSource:()=>dt,CanvasDrain:()=>kt,CanvasSource:()=>rt,EncodedAudioChunkDrain:()=>De,EncodedAudioChunkSource:()=>at,EncodedVideoChunkDrain:()=>Ve,EncodedVideoChunkSource:()=>et,ISOBMFF:()=>Fe,Input:()=>bt,InputAudioTrack:()=>U,InputFormat:()=>Z,InputTrack:()=>be,InputVideoTrack:()=>z,IsobmffInputFormat:()=>Oe,MATROSKA:()=>pt,MKV:()=>Dt,MOV:()=>xr,MP4:()=>Tr,MatroskaInputFormat:()=>Ee,MediaSource:()=>ce,MediaStreamAudioTrackSource:()=>ot,MediaStreamVideoTrackSource:()=>it,MkvOutputFormat:()=>_e,Mp4OutputFormat:()=>Je,Output:()=>ut,OutputFormat:()=>G,SUBTITLE_CODECS:()=>Se,Source:()=>Y,StreamTarget:()=>$e,SubtitleSource:()=>ue,Target:()=>X,TextSubtitleSource:()=>ct,VIDEO_CODECS:()=>ne,VideoFrameDrain:()=>Me,VideoFrameSource:()=>tt,VideoSource:()=>L,WEBM:()=>Cr,WebMOutputFormat:()=>oe});function m(i){if(!i)throw new Error("Assertion failed.")}var R=i=>i&&i[i.length-1],J=i=>i>=0&&i<2**32,O=(i,t,e)=>{let r=0;for(let a=t;a>o;r<<=1,r|=c}return r},Pt=(i,t,e,r)=>{for(let a=t;a>e-a-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),D=new TextEncoder,Ct=i=>Object.fromEntries(Object.entries(i).map(([t,e])=>[e,t])),te={bt709:1,bt470bg:5,smpte170m:6},zt=Ct(te),re={bt709:1,smpte170m:6,"iec61966-2-1":13},Ut=Ct(re),ie={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Bt=Ct(ie),Be=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,wt=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),$=class{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let t,e=new Promise(a=>{t=a}),r=this.currentPromise;return this.currentPromise=e,await r,t}},q=i=>{let t=i*(Math.PI/180),e=Math.cos(t),r=Math.sin(t);return[e,r,0,-r,e,0,0,0,1]},yt=q(0),Nt=i=>[...i].map(t=>t.toString(16).padStart(2,"0")).join(""),Wt=i=>(i=i>>1&1431655765|(i&1431655765)<<1,i=i>>2&858993459|(i&858993459)<<2,i=i>>4&252645135|(i&252645135)<<4,i=i>>8&16711935|(i&16711935)<<8,i=i>>16&65535|(i&65535)<<16,i>>>0),j=(i,t,e)=>{let r=0,a=i.length-1,n=-1;for(;r<=a;){let s=r+a>>1,o=e(i[s]);o===t?(n=s,a=s-1):o{let r=-1,a=0,n=i.length-1;for(;a<=n;){let s=a+(n-a+1)/2|0;e(i[s])<=t?(r=s,a=s+1):n=s-1}return r},E=()=>{let i,t;return{promise:new Promise((r,a)=>{i=r,t=a}),resolve:i,reject:t}},Ht=(i,t)=>{let e=i.indexOf(t);e!==-1&&i.splice(e,1)},Lt=(i,t)=>{for(let e=i.length-1;e>=0;e--)if(t(i[e]))return e;return-1},Qt=async function*(i){Symbol.iterator in i?yield*i[Symbol.iterator]():yield*i[Symbol.asyncIterator]()},Kt=i=>{if(!(Symbol.iterator in i)&&!(Symbol.asyncIterator in i))throw new TypeError("Argument must be an iterable or async iterable.")};var xe=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,Or=/^WEBVTT(.|\n)*?\n{2}/,me=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Ne=class{constructor(t){this.preambleText=null;this.preambleEmitted=!1;this.options=t}parse(t){t=t.replaceAll(`\r +"use strict";var Metamuxer=(()=>{var Ct=Object.defineProperty;var vr=Object.getOwnPropertyDescriptor;var _r=Object.getOwnPropertyNames;var Ar=Object.prototype.hasOwnProperty;var Ir=(i,t)=>{for(var e in t)Ct(i,e,{get:t[e],enumerable:!0})},Er=(i,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of _r(t))!Ar.call(i,s)&&s!==e&&Ct(i,s,{get:()=>t[s],enumerable:!(r=vr(t,s))||r.enumerable});return i};var Rr=i=>Er(Ct({},"__esModule",{value:!0}),i);var Wi={};Ir(Wi,{ALL_FORMATS:()=>yr,AUDIO_CODECS:()=>ae,ArrayBufferTarget:()=>he,AudioBufferDrain:()=>Tt,AudioBufferSource:()=>at,AudioDataDrain:()=>Pe,AudioDataSource:()=>st,AudioSource:()=>Q,BaseChunkDrain:()=>ge,BaseMediaFrameDrain:()=>Te,BlobSource:()=>lt,BufferSource:()=>dt,CanvasDrain:()=>gt,CanvasSource:()=>rt,EncodedAudioChunkDrain:()=>De,EncodedAudioChunkSource:()=>nt,EncodedVideoChunkDrain:()=>Ve,EncodedVideoChunkSource:()=>et,ISOBMFF:()=>Fe,Input:()=>kt,InputAudioTrack:()=>B,InputFormat:()=>Z,InputTrack:()=>be,InputVideoTrack:()=>U,IsobmffInputFormat:()=>Re,MATROSKA:()=>bt,MKV:()=>Pt,MOV:()=>Cr,MP4:()=>xr,MatroskaInputFormat:()=>Oe,MediaSource:()=>ce,MediaStreamAudioTrackSource:()=>ot,MediaStreamVideoTrackSource:()=>it,MkvOutputFormat:()=>Ae,Mp4OutputFormat:()=>Je,Output:()=>ut,OutputFormat:()=>Y,SUBTITLE_CODECS:()=>Se,Source:()=>j,StreamTarget:()=>je,SubtitleSource:()=>ue,Target:()=>G,TextSubtitleSource:()=>ct,UrlSource:()=>mt,VIDEO_CODECS:()=>se,VideoFrameDrain:()=>Me,VideoFrameSource:()=>tt,VideoSource:()=>L,WEBM:()=>wr,WebMOutputFormat:()=>oe});function l(i){if(!i)throw new Error("Assertion failed.")}var F=i=>i&&i[i.length-1],J=i=>i>=0&&i<2**32,V=(i,t,e)=>{let r=0;for(let s=t;s>o;r<<=1,r|=c}return r},zt=(i,t,e,r)=>{for(let s=t;s>e-s-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),P=new TextEncoder,wt=i=>Object.fromEntries(Object.entries(i).map(([t,e])=>[e,t])),te={bt709:1,bt470bg:5,smpte170m:6},Ut=wt(te),re={bt709:1,smpte170m:6,"iec61966-2-1":13},Bt=wt(re),ie={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Nt=wt(ie),Be=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,yt=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),q=class{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let t,e=new Promise(s=>{t=s}),r=this.currentPromise;return this.currentPromise=e,await r,t}},X=i=>{let t=i*(Math.PI/180),e=Math.cos(t),r=Math.sin(t);return[e,r,0,-r,e,0,0,0,1]},St=X(0),Wt=i=>[...i].map(t=>t.toString(16).padStart(2,"0")).join(""),Ht=i=>(i=i>>1&1431655765|(i&1431655765)<<1,i=i>>2&858993459|(i&858993459)<<2,i=i>>4&252645135|(i&252645135)<<4,i=i>>8&16711935|(i&16711935)<<8,i=i>>16&65535|(i&65535)<<16,i>>>0),K=(i,t,e)=>{let r=0,s=i.length-1,n=-1;for(;r<=s;){let a=r+s>>1,o=e(i[a]);o===t?(n=a,s=a-1):o{let r=-1,s=0,n=i.length-1;for(;s<=n;){let a=s+(n-s+1)/2|0;e(i[a])<=t?(r=a,s=a+1):n=a-1}return r},M=()=>{let i,t;return{promise:new Promise((r,s)=>{i=r,t=s}),resolve:i,reject:t}},Lt=(i,t)=>{let e=i.indexOf(t);e!==-1&&i.splice(e,1)},Qt=(i,t)=>{for(let e=i.length-1;e>=0;e--)if(t(i[e]))return e;return-1},$t=async function*(i){Symbol.iterator in i?yield*i[Symbol.iterator]():yield*i[Symbol.asyncIterator]()},Kt=i=>{if(!(Symbol.iterator in i)&&!(Symbol.asyncIterator in i))throw new TypeError("Argument must be an iterable or async iterable.")};var xe=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,Or=/^WEBVTT(.|\n)*?\n{2}/,le=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Ne=class{constructor(t){this.preambleText=null;this.preambleEmitted=!1;this.options=t}parse(t){t=t.replaceAll(`\r `,` `).replaceAll("\r",` -`),xe.lastIndex=0;let e;if(!this.preambleText){if(!Or.test(t)){let a=new Error("WebVTT preamble incorrect.");throw this.options.error(a),a}e=xe.exec(t);let r=t.slice(0,e?.index??t.length).trimEnd();if(!r){let a=new Error("No WebVTT preamble provided.");throw this.options.error(a),a}this.preambleText=r,e&&(t=t.slice(e.index),xe.lastIndex=0)}for(;e=xe.exec(t);){let r=t.slice(0,e.index),a=e[1],n=e.index+e[0].length,s=t.indexOf(` -`,n)+1,o=t.slice(n,s).trim(),c=t.indexOf(` +`),xe.lastIndex=0;let e;if(!this.preambleText){if(!Or.test(t)){let s=new Error("WebVTT preamble incorrect.");throw this.options.error(s),s}e=xe.exec(t);let r=t.slice(0,e?.index??t.length).trimEnd();if(!r){let s=new Error("No WebVTT preamble provided.");throw this.options.error(s),s}this.preambleText=r,e&&(t=t.slice(e.index),xe.lastIndex=0)}for(;e=xe.exec(t);){let r=t.slice(0,e.index),s=e[1],n=e.index+e[0].length,a=t.indexOf(` +`,n)+1,o=t.slice(n,a).trim(),c=t.indexOf(` -`,n);c===-1&&(c=t.length);let u=We(e[2]),l=We(e[3])-u,f=t.slice(s,c).trim();t=t.slice(c).trimStart(),xe.lastIndex=0;let g={timestamp:u/1e3,duration:l/1e3,text:f,identifier:a,settings:o,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(g,b)}}},Er=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,We=i=>{let t=Er.exec(i);if(!t)throw new Error("Expected match.");return 60*60*1e3*Number(t[1]||"0")+60*1e3*Number(t[2])+1e3*Number(t[3])+Number(t[4])},He=i=>{let t=Math.floor(i/36e5),e=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),a=i%1e3;return t.toString().padStart(2,"0")+":"+e.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+a.toString().padStart(3,"0")};var Ce=class{constructor(t){this.writer=t;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap}writeU32(t){this.helperView.setUint32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(t){this.helperView.setUint32(0,Math.floor(t/2**32),!1),this.helperView.setUint32(4,t,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(t){for(let e=0;e[(i%256+256)%256],C=i=>(H.setUint16(0,i,!1),[x[0],x[1]]),Fr=i=>(H.setInt16(0,i,!1),[x[0],x[1]]),$t=i=>(H.setUint32(0,i,!1),[x[1],x[2],x[3]]),p=i=>(H.setUint32(0,i,!1),[x[0],x[1],x[2],x[3]]),qt=i=>(H.setInt32(0,i,!1),[x[0],x[1],x[2],x[3]]),ae=i=>(H.setUint32(0,Math.floor(i/2**32),!1),H.setUint32(4,i,!1),[x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]]),It=i=>(H.setInt16(0,2**8*i,!1),[x[0],x[1]]),W=i=>(H.setInt32(0,2**16*i,!1),[x[0],x[1],x[2],x[3]]),St=i=>(H.setInt32(0,2**30*i,!1),[x[0],x[1],x[2],x[3]]),vt=(i,t)=>{let e=[],r=i;do{let a=r&127;r>>=7,e.length>0&&(a|=128),e.push(a),t!==void 0&&t--}while(r>0||t);return e.reverse()},V=(i,t=!1)=>{let e=Array(i.length).fill(null).map((r,a)=>i.charCodeAt(a));return t&&e.push(0),e},_t=i=>{let t=null;for(let e of i)(!t||e.timestamp>t.timestamp)&&(t=e);return t},Xt=i=>[W(i[0]),W(i[1]),St(i[2]),W(i[3]),W(i[4]),St(i[5]),W(i[6]),W(i[7]),St(i[8])],w=(i,t,e)=>({type:i,contents:t&&new Uint8Array(t.flat(10)),children:e}),S=(i,t,e,r,a)=>w(i,[I(t),$t(e),r??[]],a),Gt=i=>i.fragmented?w("ftyp",[V("iso5"),p(512),V("iso5"),V("iso6"),V("mp41")]):w("ftyp",[V("isom"),p(512),V("isom"),i.holdsAvc?V("avc1"):[],V("mp41")]),Qe=i=>({type:"mdat",largeSize:i}),Yt=i=>({type:"free",size:i}),we=(i,t,e=!1)=>w("moov",void 0,[Vr(t,i),...i.map(r=>Mr(r,t)),e?fi(i):null]),Vr=(i,t)=>{let e=P(Math.max(0,...t.filter(s=>s.samples.length>0).map(s=>{let o=_t(s.samples);return o.timestamp+o.duration})),Le),r=Math.max(0,...t.map(s=>s.track.id))+1,a=!J(i)||!J(e),n=a?ae:p;return S("mvhd",+a,0,[n(i),n(i),p(Le),n(e),W(1),It(1),Array(10).fill(0),Xt(yt),Array(24).fill(0),p(r)])},Mr=(i,t)=>w("trak",void 0,[Dr(i,t),Pr(i,t)]),Dr=(i,t)=>{let e=_t(i.samples),r=P(e?e.timestamp+e.duration:0,Le),a=!J(t)||!J(r),n=a?ae:p,s;if(i.type==="video"){let o=i.track.metadata.rotation;s=o===void 0||typeof o=="number"?q(o??0):o}else s=yt;return S("tkhd",+a,3,[n(t),n(t),p(i.track.id),p(0),n(r),Array(8).fill(0),C(0),C(i.track.id),It(i.type==="audio"?1:0),C(0),Xt(s),W(i.type==="video"?i.info.width:0),W(i.type==="video"?i.info.height:0)])},Pr=(i,t)=>w("mdia",void 0,[zr(i,t),Nr(i),Wr(i)]),zr=(i,t)=>{let e=_t(i.samples),r=P(e?e.timestamp+e.duration:0,i.timescale),a=!J(t)||!J(r),n=a?ae:p;return S("mdhd",+a,0,[n(t),n(t),p(i.timescale),n(r),C(21956),C(0)])},Ur={video:"vide",audio:"soun",subtitle:"text"},Br={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Nr=i=>S("hdlr",0,0,[V("mhlr"),V(Ur[i.type]),p(0),p(0),p(0),V(Br[i.type],!0)]),Wr=i=>w("minf",void 0,[Kr[i.type](),jr(),Xr(i)]),Hr=()=>S("vmhd",0,1,[C(0),C(0),C(0),C(0)]),Lr=()=>S("smhd",0,0,[C(0),C(0)]),Qr=()=>S("nmhd",0,0),Kr={video:Hr,audio:Lr,subtitle:Qr},jr=()=>w("dinf",void 0,[$r()]),$r=()=>S("dref",0,0,[p(1)],[qr()]),qr=()=>S("url ",0,1),Xr=i=>{let t=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(e=>e.sampleCompositionTimeOffset!==0);return w("stbl",void 0,[Gr(i),oi(i),ci(i),ui(i),di(i),mi(i),t?li(i):null])},Gr=i=>{let t;return i.type==="video"?t=Yr(wi[i.track.source._codec],i):i.type==="audio"?t=ri(Si[i.track.source._codec],i):i.type==="subtitle"&&(t=ni(Ii[i.track.source._codec],i)),m(t),S("stsd",0,0,[p(1)],[t])},Yr=(i,t)=>w(i,[Array(6).fill(0),C(1),C(0),C(0),Array(12).fill(0),C(t.info.width),C(t.info.height),p(4718592),p(4718592),p(0),C(1),Array(32).fill(0),C(24),Fr(65535)],[yi[t.track.source._codec](t),Be(t.info.decoderConfig.colorSpace)?Zr(t):null]),Zr=i=>w("colr",[V("nclx"),C(te[i.info.decoderConfig.colorSpace.primaries]),C(re[i.info.decoderConfig.colorSpace.transfer]),C(ie[i.info.decoderConfig.colorSpace.matrix]),I((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Jr=i=>i.info.decoderConfig&&w("avcC",[...ee(i.info.decoderConfig.description)]),ei=i=>i.info.decoderConfig&&w("hvcC",[...ee(i.info.decoderConfig.description)]),jt=i=>{if(!i.info.decoderConfig)return null;let t=i.info.decoderConfig;m(t.colorSpace);let e=t.codec.split("."),r=Number(e[1]),a=Number(e[2]),o=(Number(e[3])<<4)+(0<<1)+Number(t.colorSpace.fullRange);return S("vpcC",1,0,[I(r),I(a),I(o),I(2),I(2),I(2),C(0)])},ti=()=>w("av1C",[129,0,0,0]),ri=(i,t)=>w(i,[Array(6).fill(0),C(1),C(0),C(0),p(0),C(t.info.numberOfChannels),C(16),C(0),C(0),W(t.info.sampleRate)],[vi[t.track.source._codec](t)]),ii=i=>{let e=[...ee(i.info.decoderConfig.description??new ArrayBuffer(0))];return e=[...I(64),...I(21),...$t(0),...p(0),...p(0),...I(5),...vt(e.length),...e],e=[...C(1),...I(0),...I(4),...vt(e.length),...e,...I(6),...I(1),...I(2)],e=[...I(3),...vt(e.length),...e],S("esds",0,0,e)},ai=i=>{let t=3840,e=0,r=i.info.decoderConfig?.description;if(r){m(r.byteLength>=18);let a=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);t=a.getUint16(10,!0),e=a.getInt16(14,!0)}return w("dOps",[I(0),I(i.info.numberOfChannels),C(t),p(i.info.sampleRate),It(e),I(0)])},ni=(i,t)=>w(i,[Array(6).fill(0),C(1)],[_i[t.track.source._codec](t)]),si=i=>w("vttC",[...D.encode(i.info.config.description)]);var oi=i=>S("stts",0,0,[p(i.timeToSampleTable.length),i.timeToSampleTable.map(t=>[p(t.sampleCount),p(t.sampleDelta)])]),ci=i=>{if(i.samples.every(e=>e.type==="key"))return null;let t=[...i.samples.entries()].filter(([,e])=>e.type==="key");return S("stss",0,0,[p(t.length),t.map(([e])=>p(e+1))])},ui=i=>S("stsc",0,0,[p(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(t=>[p(t.firstChunk),p(t.samplesPerChunk),p(1)])]),di=i=>S("stsz",0,0,[p(0),p(i.samples.length),i.samples.map(t=>p(t.size))]),mi=i=>i.finalizedChunks.length>0&&R(i.finalizedChunks).offset>=2**32?S("co64",0,0,[p(i.finalizedChunks.length),i.finalizedChunks.map(t=>ae(t.offset))]):S("stco",0,0,[p(i.finalizedChunks.length),i.finalizedChunks.map(t=>p(t.offset))]),li=i=>S("ctts",0,0,[p(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(t=>[p(t.sampleCount),p(t.sampleCompositionTimeOffset)])]),fi=i=>w("mvex",void 0,i.map(hi)),hi=i=>S("trex",0,0,[p(i.track.id),p(1),p(0),p(0),p(0)]),At=(i,t)=>w("moof",void 0,[pi(i),...t.map(bi)]),pi=i=>S("mfhd",0,0,[p(i)]),Zt=i=>{let t=0,e=0,r=0,a=0,n=i.type==="delta";return e|=+n,n?t|=1:t|=2,t<<24|e<<16|r<<8|a},bi=i=>w("traf",void 0,[ki(i),gi(i),Ti(i)]),ki=i=>{m(i.currentChunk);let t=0;t|=8,t|=16,t|=32,t|=131072;let e=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:e.timescaleUnitsToNextSample,size:e.size,flags:Zt(e)};return S("tfhd",0,t,[p(i.track.id),p(r.duration),p(r.size),p(r.flags)])},gi=i=>(m(i.currentChunk),S("tfdt",1,0,[ae(P(i.currentChunk.startTimestamp,i.timescale))])),Ti=i=>{m(i.currentChunk);let t=i.currentChunk.samples.map(h=>h.timescaleUnitsToNextSample),e=i.currentChunk.samples.map(h=>h.size),r=i.currentChunk.samples.map(Zt),a=i.currentChunk.samples.map(h=>P(h.timestamp-h.decodeTimestamp,i.timescale)),n=new Set(t),s=new Set(e),o=new Set(r),c=new Set(a),u=o.size===2&&r[0]!==r[1],d=n.size>1,l=s.size>1,f=!u&&o.size>1,g=c.size>1||[...c].some(h=>h!==0),b=0;return b|=1,b|=4*+u,b|=256*+d,b|=512*+l,b|=1024*+f,b|=2048*+g,S("trun",1,b,[p(i.currentChunk.samples.length),p(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?p(r[0]):[],i.currentChunk.samples.map((h,k)=>[d?p(t[k]):[],l?p(e[k]):[],f?p(r[k]):[],g?qt(a[k]):[]])])},Jt=i=>w("mfra",void 0,[...i.map(xi),Ci()]),xi=(i,t)=>S("tfra",1,0,[p(i.track.id),p(63),p(i.finalizedChunks.length),i.finalizedChunks.map(r=>[ae(P(r.samples[0].timestamp,i.timescale)),ae(r.moofOffset),p(t+1),p(1),p(1)])]),Ci=()=>S("mfro",0,0,[p(0)]),er=()=>w("vtte"),tr=(i,t,e,r,a)=>w("vttc",void 0,[a!==null?w("vsid",[qt(a)]):null,e!==null?w("iden",[...D.encode(e)]):null,t!==null?w("ctim",[...D.encode(He(t))]):null,r!==null?w("sttg",[...D.encode(r)]):null,w("payl",[...D.encode(i)])]),rr=i=>w("vtta",[...D.encode(i)]),wi={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},yi={avc:Jr,hevc:ei,vp8:jt,vp9:jt,av1:ti},Si={aac:"mp4a",opus:"Opus"},vi={aac:ii,opus:ai},Ii={webvtt:"wvtt"},_i={webvtt:si};var le=class{constructor(t){this.mutex=new $;this.trackTimestampInfo=new WeakMap;this.output=t}beforeTrackAdd(t){}onTrackClose(t){}validateAndNormalizeTimestamp(t,e,r){let a=e/1e6,n=this.trackTimestampInfo.get(t);if(!n){if(!r)throw new Error("First frame must be a key frame.");if(this.timestampsMustStartAtZero&&a>0)throw new Error(`Timestamps must start at zero (got ${a}s).`);n={timestampOffset:a,maxTimestamp:t.source._offsetTimestamps?0:a,lastKeyFrameTimestamp:t.source._offsetTimestamps?0:a},this.trackTimestampInfo.set(t,n)}if(t.source._offsetTimestamps&&(a-=n.timestampOffset),a<0)throw new Error(`Timestamps must be non-negative (got ${a}s).`);if(aa.start-n.start);e.push({start:r[0].start,size:r[0].data.byteLength});for(let a=1;au.start<=r&&rRi){for(let u=0;u=e.written[s+1].start;)e.written[s].end=Math.max(e.written[s].end,e.written[s+1].end),e.written.splice(s+1,1)}createChunk(e){let a={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(a),this.chunks.sort((n,s)=>n.start-s.start),this.chunks.indexOf(a)}queueChunksForFlush(e=!1){m(this.writer);for(let r=0;r{if(i==="avc"){let n=Math.ceil(t/16)*Math.ceil(e/16),s=ir.find(l=>n<=l.maxMacroblocks&&r<=l.maxBitrate)??R(ir),o=s?s.level:0,c="64".padStart(2,"0"),u="00",d=o.toString(16).padStart(2,"0");return`avc1.${c}${u}${d}`}else if(i==="hevc"){let a="",s="6",o=t*e,c=ar.find(d=>o<=d.maxPictureSize&&r<=d.maxBitrate)??R(ar);return`hev1.${a}1.${s}.${c.tier}${c.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let a="00",n=t*e,s=nr.find(c=>n<=c.maxPictureSize&&r<=c.maxBitrate)??R(nr);return`vp09.${a}.${s.level}.08`}else if(i==="av1"){let n=t*e,s=sr.find(c=>n<=c.maxPictureSize&&r<=c.maxBitrate)??R(sr);return`av01.0.${s.level.toString().padStart(2,"0")}${s.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},cr=(i,t)=>{if(i==="avc"){if(!t||t.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${Nt(t.subarray(1,4))}`}else if(i==="hevc"){if(!t)throw new TypeError("HEVC description must be provided.");let e=new DataView(t.buffer,t.byteOffset,t.byteLength),r="hev1.",a=t[1]>>6&3,n=t[1]&31;r+=["","A","B","C"][a]+n,r+=".";let s=Wt(e.getUint32(2));r+=s.toString(16),r+=".";let o=t[1]>>5&1,c=t[12];r+=o===0?"L":"H",r+=c,r+=".";let u=[];for(let d=0;d<6;d++){let l=t[d+13];u.push(l)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(d=>d.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},ur=(i,t,e)=>{if(i==="aac")return t>=2&&e<=24e3?"mp4a.40.29":e<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},dr=(i,t)=>{if(i==="aac")return`mp4a.40.${Rt(t).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},Rt=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let t=0,e=O(i,t,t+5);t+=5,e===31&&(e=32+O(i,t,t+6),t+=6);let r=O(i,t,t+4);t+=4;let a=null;if(r===15)a=O(i,t,t+24),t+=24;else{let o=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];r=1&&n<=7&&(s={1:1,2:2,3:3,4:4,5:5,6:6,7:8}[n]),{objectType:e,frequencyIndex:r,sampleRate:a,channelConfiguration:n,numberOfChannels:s}},mr=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},lr=i=>i==="aac"?{aac:{format:"aac"}}:i==="opus"?{opus:{format:"opus"}}:{},qe=i=>{if(!i)throw new TypeError("Video chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Video chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Video chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.codedWidth)||i.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(i.decoderConfig.codedHeight)||i.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(i.decoderConfig.description!==void 0&&!wt(i.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.colorSpace!==void 0){let{colorSpace:t}=i.decoderConfig;if(typeof t!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let e=Object.keys(te);if(t.primaries!=null&&!e.includes(t.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${e.join(", ")}.`);let r=Object.keys(re);if(t.transfer!=null&&!r.includes(t.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let a=Object.keys(ie);if(t.matrix!=null&&!a.includes(t.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${a.join(", ")}.`);if(t.fullRange!=null&&typeof t.fullRange!="boolean")throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if((i.decoderConfig.codec.startsWith("avc1")||i.decoderConfig.codec.startsWith("avc3"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for AVC must include a description, which is expected to be an AVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec.startsWith("hev1")||i.decoderConfig.codec.startsWith("hvc1"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for HEVC must include a description, which is expected to be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec==="vp8"||i.decoderConfig.codec.startsWith("vp09"))&&i.decoderConfig.colorSpace===void 0)throw new TypeError("Video chunk metadata decoder configuration for VP8/VP9 must include a colorSpace.")},Xe=i=>{if(!i)throw new TypeError("Audio chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Audio chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.sampleRate)||i.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(i.decoderConfig.numberOfChannels)||i.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(i.decoderConfig.description!==void 0&&!wt(i.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.codec.startsWith("mp4a")&&!i.decoderConfig.description)throw new 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.");if(i.decoderConfig.codec==="opus"&&i.decoderConfig.description&&i.decoderConfig.description.byteLength<18)throw new TypeError("Invalid decoder description provided for Opus; must be at least 18 bytes long.")},Ge=i=>{if(!i)throw new TypeError("Subtitle metadata must be provided.");if(typeof i!="object")throw new TypeError("Subtitle metadata must be an object.");if(!i.config)throw new TypeError("Subtitle metadata must include a config object.");if(typeof i.config!="object")throw new TypeError("Subtitle metadata config must be an object.");if(typeof i.config.description!="string")throw new TypeError("Subtitle metadata config description must be a string.")};var Le=1e3,Oi=2082844800,P=(i,t,e=!0)=>{let r=i*t;return e?Math.round(r):r},Ye=class extends le{constructor(e,r){super(e);this.timestampsMustStartAtZero=!0;this.auxTarget=new he;this.auxWriter=this.auxTarget._createWriter();this.auxBoxWriter=new Ce(this.auxWriter);this.ftypSize=null;this.mdat=null;this.trackDatas=[];this.creationTime=Math.floor(Date.now()/1e3)+Oi;this.finalizedChunks=[];this.nextFragmentNumber=1;this.writer=e._writer,this.boxWriter=new Ce(this.writer);let a=this.writer instanceof fe?"in-memory":!1;this.fastStart=r._options.fastStart??a,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),r=this.output._tracks.some(a=>a.type==="video"&&a.source._codec==="avc");this.boxWriter.writeBox(Gt({holdsAvc:r,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=Qe(!1):this.fastStart==="fragmented"||(this.mdat=Qe(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,r){let a=this.trackDatas.find(s=>s.track===e);if(a)return a;qe(r),m(r),m(r.decoderConfig),m(r.decoderConfig.codedWidth!==void 0),m(r.decoderConfig.codedHeight!==void 0);let n={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(n),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),n}getAudioTrackData(e,r){let a=this.trackDatas.find(s=>s.track===e);if(a)return a;Xe(r),m(r),m(r.decoderConfig);let n={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},timescale:r.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(n),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),n}getSubtitleTrackData(e,r){let a=this.trackDatas.find(s=>s.track===e);if(a)return a;Ge(r),m(r),m(r.config);let n={track:e,type:"subtitle",info:{config:r.config},timescale:1e3,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],lastCueEndTimestamp:0,cueQueue:[],nextSourceId:0,cueToSourceId:new WeakMap};return this.trackDatas.push(n),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),this.validateAndNormalizeTimestamp(e,0,!0),n}async addEncodedVideoChunk(e,r,a){let n=await this.mutex.acquire();try{let s=this.getVideoTrackData(e,a),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=this.validateAndNormalizeTimestamp(s.track,r.timestamp,r.type==="key"),u=this.createSampleForTrack(s,o,c,(r.duration??0)/1e6,r.type);await this.registerSample(s,u)}finally{n()}}async addEncodedAudioChunk(e,r,a){let n=await this.mutex.acquire();try{let s=this.getAudioTrackData(e,a),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=this.validateAndNormalizeTimestamp(s.track,r.timestamp,c==="key"),d=this.createSampleForTrack(s,o,u,(r.duration??0)/1e6,c);await this.registerSample(s,d)}finally{n()}}async addSubtitleCue(e,r,a){let n=await this.mutex.acquire();try{let s=this.getSubtitleTrackData(e,a);this.validateAndNormalizeTimestamp(s.track,1e6*r.timestamp,!0),e.source._codec==="webvtt"&&(s.cueQueue.push(r),await this.processWebVTTCues(s,r.timestamp))}finally{n()}}async processWebVTTCues(e,r){for(;e.cueQueue.length>0;){let a=new Set([]);for(let d of e.cueQueue)m(d.timestamp<=r),m(e.lastCueEndTimestamp<=d.timestamp+d.duration),a.add(Math.max(d.timestamp,e.lastCueEndTimestamp)),a.add(d.timestamp+d.duration);let n=[...a].sort((d,l)=>d-l),s=n[0],o=n[1]??s;if(r=o)break;me.lastIndex=0;let f=me.test(l.text),g=l.timestamp+l.duration,b=e.cueToSourceId.get(l);if(b===void 0&&oa.timestamp).sort((a,n)=>a-n);for(let a=0;a{if(e===o)return r.type==="key";let c=o.sampleQueue[0];return c&&c.type==="key"});n>=1&&s&&(a=!0,await this.finalizeFragment())}else a=n>=.5}a&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:r.timestamp,samples:[],offset:null,moofOffset:null}),m(e.currentChunk),e.currentChunk.samples.push(r),e.timestampProcessingQueue.push(r)}async finalizeCurrentChunk(e){if(m(this.fastStart!=="fragmented"),!!e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),this.finalizedChunks.push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||R(e.compactlyCodedChunkTable).samplesPerChunk!==e.currentChunk.samples.length)&&e.compactlyCodedChunkTable.push({firstChunk:e.finalizedChunks.length,samplesPerChunk:e.currentChunk.samples.length}),this.fastStart==="in-memory"){e.currentChunk.offset=0;return}e.currentChunk.offset=this.writer.getPos();for(let r of e.currentChunk.samples)m(r.data),this.writer.write(r.data),r.data=null;await this.writer.flush()}}async interleaveSamples(){m(this.fastStart==="fragmented");for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(r=>r.track===e))return;e:for(;;){let e=null,r=1/0;for(let n of this.trackDatas){if(n.sampleQueue.length===0&&!n.track.source._closed)break e;n.sampleQueue.length>0&&n.sampleQueue[0].timestampu.currentChunk),n=this.writer.getPos(),s=At(r,a);this.boxWriter.writeBox(s);{let u=Qe(!1),d=0;for(let f of a)for(let g of f.currentChunk.samples)d+=g.size;let l=this.boxWriter.measureBox(u)+d;l>=2**32&&(u.largeSize=!0,l=this.boxWriter.measureBox(u)+d),u.size=l,this.boxWriter.writeBox(u)}for(let u of a){u.currentChunk.offset=this.writer.getPos(),u.currentChunk.moofOffset=n;for(let d of u.currentChunk.samples)this.writer.write(d.data),d.data=null}let o=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(s));let c=At(r,a);this.boxWriter.writeBox(c),this.writer.seek(o);for(let u of a)u.finalizedChunks.push(u.currentChunk),this.finalizedChunks.push(u.currentChunk),u.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let r=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let a=this.trackDatas.find(n=>n.track===e);a&&await this.processWebVTTCues(a,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),r()}async finalize(){let e=await this.mutex.acquire();for(let r of this.trackDatas)r.type==="subtitle"&&r.track.source._codec==="webvtt"&&await this.processWebVTTCues(r,1/0);if(this.fastStart==="fragmented"){for(let r of this.trackDatas){for(let a of r.sampleQueue)await this.addSampleToTrack(r,a);this.processTimestamps(r)}await this.finalizeFragment(!1)}else for(let r of this.trackDatas)this.processTimestamps(r),await this.finalizeCurrentChunk(r);if(this.fastStart==="in-memory"){m(this.mdat);let r;for(let n=0;n<2;n++){let s=we(this.trackDatas,this.creationTime),o=this.boxWriter.measureBox(s);r=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+o+r;for(let u of this.finalizedChunks){u.offset=c;for(let{data:d}of u.samples)m(d),c+=d.byteLength,r+=d.byteLength}if(c<2**32)break;r>=2**32&&(this.mdat.largeSize=!0)}let a=we(this.trackDatas,this.creationTime);this.boxWriter.writeBox(a),this.mdat.size=r,this.boxWriter.writeBox(this.mdat);for(let n of this.finalizedChunks)for(let s of n.samples)m(s.data),this.writer.write(s.data),s.data=null}else if(this.fastStart==="fragmented"){let r=this.writer.getPos(),a=Jt(this.trackDatas);this.boxWriter.writeBox(a);let n=this.writer.getPos()-r;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(n)}else{m(this.mdat),m(this.ftypSize!==null);let r=this.boxWriter.offsets.get(this.mdat);m(r!==void 0);let a=this.writer.getPos()-r;this.mdat.size=a,this.mdat.largeSize=a>=2**32,this.boxWriter.patchBox(this.mdat);let n=we(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(n);let s=r-this.writer.getPos();this.boxWriter.writeBox(Yt(s))}else this.boxWriter.writeBox(n)}e()}};var ve=class{constructor(t){this.value=t}},pe=class{constructor(t){this.value=t}},Ie=class{constructor(t){this.value=t}};var Ot=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,Et=i=>i>=-64&&i<64?1:i>=-8192&&i<8192?2:i>=-(1<<20)&&i<1<<20?3:i>=-(1<<27)&&i<1<<27?4:i>=-(2**34)&&i<2**34?5:6,fr=i=>{if(i<127)return 1;if(i<16383)return 2;if(i<(1<<21)-1)return 3;if(i<(1<<28)-1)return 4;if(i<2**35-1)return 5;if(i<2**42-1)return 6;throw new Error("EBML VINT size not supported "+i)};var Ft=2**15,hr="https://github.com/Vanilagy/webm-muxer",pr=6,br=5,Ei={avc:"V_MPEG4/ISO/AVC",hevc:"V_MPEGH/ISO/HEVC",vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1",aac:"A_AAC",opus:"A_OPUS",webvtt:"S_TEXT/WEBVTT"},Fi={video:1,audio:2,subtitle:17},Ze=class extends le{constructor(e,r){super(e);this.timestampsMustStartAtZero=!1;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap;this.dataOffsets=new WeakMap;this.trackDatas=[];this.segment=null;this.segmentInfo=null;this.seekHead=null;this.tracksElement=null;this.segmentDuration=null;this.cues=null;this.currentCluster=null;this.currentClusterMsTimestamp=null;this.trackDatasInCurrentCluster=new Set;this.duration=0;this.writer=e._writer,this.format=r,this.format._options.streamable&&(this.writer.ensureMonotonicity=!0)}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=Ot(e)){let a=0;switch(r){case 6:this.helperView.setUint8(a++,e/2**40|0);case 5:this.helperView.setUint8(a++,e/2**32|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 new Error("Bad UINT size "+r)}this.writer.write(this.helper.subarray(0,a))}writeSignedInt(e,r=Et(e)){e<0&&(e+=2**(r*8)),this.writeUnsignedInt(e,r)}writeEBMLVarInt(e,r=fr(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/2**32&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/2**40&3),this.helperView.setUint8(a++,e/2**32|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 new Error("Bad EBML VINT size "+r)}this.writer.write(this.helper.subarray(0,a))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(r=>r.charCodeAt(0))))}writeEBML(e){if(e!==null){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=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+a);let n=this.writer.getPos();if(this.dataOffsets.set(e,n),this.writeEBML(e.data),e.size!==-1){let s=this.writer.getPos()-n,o=this.writer.getPos();this.writer.seek(r),this.writeEBMLVarInt(s,a),this.writer.seek(o)}}else if(typeof e.data=="number"){let r=e.size??Ot(e.data);this.writeEBMLVarInt(r),this.writeUnsignedInt(e.data,r)}else if(typeof e.data=="string")this.writeEBMLVarInt(e.data.length),this.writeString(e.data);else if(e.data instanceof Uint8Array)this.writeEBMLVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof ve)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof pe)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof Ie){let r=e.size??Et(e.data.value);this.writeEBMLVarInt(r),this.writeSignedInt(e.data.value,r)}}}beforeTrackAdd(e){if(this.format instanceof oe)if(e.type==="video"){if(!["vp8","vp9","av1"].includes(e.source._codec))throw new Error("WebM only supports VP8, VP9 and AV1 as video codecs. Switching to MKV removes this restriction.")}else if(e.type==="audio"){if(!["opus","vorbis"].includes(e.source._codec))throw new Error("WebM only supports Opus and Vorbis as audio codecs. Switching to MKV removes this restriction.")}else if(e.type==="subtitle"){if(e.source._codec!=="webvtt")throw new Error("WebM only supports WebVTT as subtitle codec. Switching to MKV removes this restriction.")}else throw new Error("WebM only supports video, audio and subtitle tracks. Switching to MKV removes this restriction.")}async start(){let e=await this.mutex.acquire();this.writeEBMLHeader(),this.format._options.streamable||this.createSeekHead(),this.createSegmentInfo(),this.createCues(),await this.writer.flush(),e()}writeEBMLHeader(){let e={id:440786851,data:[{id:17030,data:1},{id:17143,data:1},{id:17138,data:4},{id:17139,data:8},{id:17026,data:this.format instanceof oe?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),r=new Uint8Array([21,73,169,102]),a=new Uint8Array([22,84,174,107]),n={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:a},{id:21420,size:5,data:0}]}]};this.seekHead=n}createSegmentInfo(){let e={id:17545,data:new pe(0)};this.segmentDuration=e;let r={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:hr},{id:22337,data:hr},this.format._options.streamable?null:e]};this.segmentInfo=r}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let r of this.trackDatas)e.data.push({id:174,data:[{id:215,data:r.track.id},{id:29637,data:r.track.id},{id:131,data:Fi[r.type]},{id:134,data:Ei[r.track.source._codec]},r.type==="video"?this.videoSpecificTrackInfo(r):null,r.type==="audio"?this.audioSpecificTrackInfo(r):null,r.type==="subtitle"?this.subtitleSpecificTrackInfo(r):null]})}videoSpecificTrackInfo(e){let r=[e.info.decoderConfig.description?{id:25506,data:ee(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],a=e.info.decoderConfig.colorSpace,n={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},Be(a)?{id:21936,data:[{id:21937,data:ie[a.matrix]},{id:21946,data:re[a.transfer]},{id:21947,data:te[a.primaries]},{id:21945,data:a.fullRange?2:1}]}:null]};return r.push(n),r}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:ee(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new ve(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:D.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:pr,data:[this.format._options.streamable?null:this.seekHead,this.segmentInfo,this.tracksElement]};this.segment=e,this.writeEBML(e)}createCues(){this.cues={id:475249515,data:[]}}get segmentDataOffset(){return m(this.segment),this.dataOffsets.get(this.segment)}getVideoTrackData(e,r){let a=this.trackDatas.find(s=>s.track===e);if(a)return a;qe(r),m(r),m(r.decoderConfig),m(r.decoderConfig.codedWidth!==void 0),m(r.decoderConfig.codedHeight!==void 0);let n={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),n}getAudioTrackData(e,r){let a=this.trackDatas.find(s=>s.track===e);if(a)return a;Xe(r),m(r),m(r.decoderConfig);let n={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),n}getSubtitleTrackData(e,r){let a=this.trackDatas.find(s=>s.track===e);if(a)return a;Ge(r),m(r),m(r.config);let n={track:e,type:"subtitle",info:{config:r.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),n}async addEncodedVideoChunk(e,r,a){let n=await this.mutex.acquire();try{let s=this.getVideoTrackData(e,a),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type==="key",u=this.validateAndNormalizeTimestamp(s.track,r.timestamp,c),d=this.createInternalChunk(o,u,(r.duration??0)/1e6,r.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(s,d),s.chunkQueue.push(d),await this.interleaveChunks()}finally{n()}}async addEncodedAudioChunk(e,r,a){let n=await this.mutex.acquire();try{let s=this.getAudioTrackData(e,a),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=c==="key",d=this.validateAndNormalizeTimestamp(s.track,r.timestamp,u),l=this.createInternalChunk(o,d,(r.duration??0)/1e6,c);s.chunkQueue.push(l),await this.interleaveChunks()}finally{n()}}async addSubtitleCue(e,r,a){let n=await this.mutex.acquire();try{let s=this.getSubtitleTrackData(e,a),o=this.validateAndNormalizeTimestamp(s.track,1e6*r.timestamp,!0),c=r.text,u=Math.floor(o*1e3);me.lastIndex=0,c=c.replace(me,g=>{let h=We(g.slice(1,-1))-u;return`<${He(h)}>`});let d=D.encode(c),l=`${r.settings??""} +`,n);c===-1&&(c=t.length);let u=We(e[2]),f=We(e[3])-u,m=t.slice(a,c).trim();t=t.slice(c).trimStart(),xe.lastIndex=0;let g={timestamp:u/1e3,duration:f/1e3,text:m,identifier:s,settings:o,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(g,b)}}},Fr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,We=i=>{let t=Fr.exec(i);if(!t)throw new Error("Expected match.");return 60*60*1e3*Number(t[1]||"0")+60*1e3*Number(t[2])+1e3*Number(t[3])+Number(t[4])},He=i=>{let t=Math.floor(i/36e5),e=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),s=i%1e3;return t.toString().padStart(2,"0")+":"+e.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var Ce=class{constructor(t){this.writer=t;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap}writeU32(t){this.helperView.setUint32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(t){this.helperView.setUint32(0,Math.floor(t/2**32),!1),this.helperView.setUint32(4,t,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(t){for(let e=0;e[(i%256+256)%256],y=i=>(H.setUint16(0,i,!1),[w[0],w[1]]),Vr=i=>(H.setInt16(0,i,!1),[w[0],w[1]]),qt=i=>(H.setUint32(0,i,!1),[w[1],w[2],w[3]]),h=i=>(H.setUint32(0,i,!1),[w[0],w[1],w[2],w[3]]),Xt=i=>(H.setInt32(0,i,!1),[w[0],w[1],w[2],w[3]]),ne=i=>(H.setUint32(0,Math.floor(i/2**32),!1),H.setUint32(4,i,!1),[w[0],w[1],w[2],w[3],w[4],w[5],w[6],w[7]]),At=i=>(H.setInt16(0,2**8*i,!1),[w[0],w[1]]),W=i=>(H.setInt32(0,2**16*i,!1),[w[0],w[1],w[2],w[3]]),vt=i=>(H.setInt32(0,2**30*i,!1),[w[0],w[1],w[2],w[3]]),_t=(i,t)=>{let e=[],r=i;do{let s=r&127;r>>=7,e.length>0&&(s|=128),e.push(s),t!==void 0&&t--}while(r>0||t);return e.reverse()},D=(i,t=!1)=>{let e=Array(i.length).fill(null).map((r,s)=>i.charCodeAt(s));return t&&e.push(0),e},It=i=>{let t=null;for(let e of i)(!t||e.timestamp>t.timestamp)&&(t=e);return t},Gt=i=>[W(i[0]),W(i[1]),vt(i[2]),W(i[3]),W(i[4]),vt(i[5]),W(i[6]),W(i[7]),vt(i[8])],S=(i,t,e)=>({type:i,contents:t&&new Uint8Array(t.flat(10)),children:e}),v=(i,t,e,r,s)=>S(i,[A(t),qt(e),r??[]],s),Yt=i=>i.fragmented?S("ftyp",[D("iso5"),h(512),D("iso5"),D("iso6"),D("mp41")]):S("ftyp",[D("isom"),h(512),D("isom"),i.holdsAvc?D("avc1"):[],D("mp41")]),Qe=i=>({type:"mdat",largeSize:i}),Zt=i=>({type:"free",size:i}),we=(i,t,e=!1)=>S("moov",void 0,[Mr(t,i),...i.map(r=>Dr(r,t)),e?hi(i):null]),Mr=(i,t)=>{let e=z(Math.max(0,...t.filter(a=>a.samples.length>0).map(a=>{let o=It(a.samples);return o.timestamp+o.duration})),Le),r=Math.max(0,...t.map(a=>a.track.id))+1,s=!J(i)||!J(e),n=s?ne:h;return v("mvhd",+s,0,[n(i),n(i),h(Le),n(e),W(1),At(1),Array(10).fill(0),Gt(St),Array(24).fill(0),h(r)])},Dr=(i,t)=>S("trak",void 0,[Pr(i,t),zr(i,t)]),Pr=(i,t)=>{let e=It(i.samples),r=z(e?e.timestamp+e.duration:0,Le),s=!J(t)||!J(r),n=s?ne:h,a;if(i.type==="video"){let o=i.track.metadata.rotation;a=o===void 0||typeof o=="number"?X(o??0):o}else a=St;return v("tkhd",+s,3,[n(t),n(t),h(i.track.id),h(0),n(r),Array(8).fill(0),y(0),y(i.track.id),At(i.type==="audio"?1:0),y(0),Gt(a),W(i.type==="video"?i.info.width:0),W(i.type==="video"?i.info.height:0)])},zr=(i,t)=>S("mdia",void 0,[Ur(i,t),Wr(i),Hr(i)]),Ur=(i,t)=>{let e=It(i.samples),r=z(e?e.timestamp+e.duration:0,i.timescale),s=!J(t)||!J(r),n=s?ne:h;return v("mdhd",+s,0,[n(t),n(t),h(i.timescale),n(r),y(21956),y(0)])},Br={video:"vide",audio:"soun",subtitle:"text"},Nr={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Wr=i=>v("hdlr",0,0,[D("mhlr"),D(Br[i.type]),h(0),h(0),h(0),D(Nr[i.type],!0)]),Hr=i=>S("minf",void 0,[Kr[i.type](),jr(),Gr(i)]),Lr=()=>v("vmhd",0,1,[y(0),y(0),y(0),y(0)]),Qr=()=>v("smhd",0,0,[y(0),y(0)]),$r=()=>v("nmhd",0,0),Kr={video:Lr,audio:Qr,subtitle:$r},jr=()=>S("dinf",void 0,[qr()]),qr=()=>v("dref",0,0,[h(1)],[Xr()]),Xr=()=>v("url ",0,1),Gr=i=>{let t=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(e=>e.sampleCompositionTimeOffset!==0);return S("stbl",void 0,[Yr(i),ci(i),ui(i),di(i),li(i),mi(i),t?fi(i):null])},Yr=i=>{let t;return i.type==="video"?t=Zr(yi[i.track.source._codec],i):i.type==="audio"?t=ii(vi[i.track.source._codec],i):i.type==="subtitle"&&(t=ai(Ai[i.track.source._codec],i)),l(t),v("stsd",0,0,[h(1)],[t])},Zr=(i,t)=>S(i,[Array(6).fill(0),y(1),y(0),y(0),Array(12).fill(0),y(t.info.width),y(t.info.height),h(4718592),h(4718592),h(0),y(1),Array(32).fill(0),y(24),Vr(65535)],[Si[t.track.source._codec](t),Be(t.info.decoderConfig.colorSpace)?Jr(t):null]),Jr=i=>S("colr",[D("nclx"),y(te[i.info.decoderConfig.colorSpace.primaries]),y(re[i.info.decoderConfig.colorSpace.transfer]),y(ie[i.info.decoderConfig.colorSpace.matrix]),A((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),ei=i=>i.info.decoderConfig&&S("avcC",[...ee(i.info.decoderConfig.description)]),ti=i=>i.info.decoderConfig&&S("hvcC",[...ee(i.info.decoderConfig.description)]),jt=i=>{if(!i.info.decoderConfig)return null;let t=i.info.decoderConfig;l(t.colorSpace);let e=t.codec.split("."),r=Number(e[1]),s=Number(e[2]),o=(Number(e[3])<<4)+(0<<1)+Number(t.colorSpace.fullRange);return v("vpcC",1,0,[A(r),A(s),A(o),A(2),A(2),A(2),y(0)])},ri=()=>S("av1C",[129,0,0,0]),ii=(i,t)=>S(i,[Array(6).fill(0),y(1),y(0),y(0),h(0),y(t.info.numberOfChannels),y(16),y(0),y(0),W(t.info.sampleRate)],[_i[t.track.source._codec](t)]),ni=i=>{let e=[...ee(i.info.decoderConfig.description??new ArrayBuffer(0))];return e=[...A(64),...A(21),...qt(0),...h(0),...h(0),...A(5),..._t(e.length),...e],e=[...y(1),...A(0),...A(4),..._t(e.length),...e,...A(6),...A(1),...A(2)],e=[...A(3),..._t(e.length),...e],v("esds",0,0,e)},si=i=>{let t=3840,e=0,r=i.info.decoderConfig?.description;if(r){l(r.byteLength>=18);let s=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);t=s.getUint16(10,!0),e=s.getInt16(14,!0)}return S("dOps",[A(0),A(i.info.numberOfChannels),y(t),h(i.info.sampleRate),At(e),A(0)])},ai=(i,t)=>S(i,[Array(6).fill(0),y(1)],[Ii[t.track.source._codec](t)]),oi=i=>S("vttC",[...P.encode(i.info.config.description)]);var ci=i=>v("stts",0,0,[h(i.timeToSampleTable.length),i.timeToSampleTable.map(t=>[h(t.sampleCount),h(t.sampleDelta)])]),ui=i=>{if(i.samples.every(e=>e.type==="key"))return null;let t=[...i.samples.entries()].filter(([,e])=>e.type==="key");return v("stss",0,0,[h(t.length),t.map(([e])=>h(e+1))])},di=i=>v("stsc",0,0,[h(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(t=>[h(t.firstChunk),h(t.samplesPerChunk),h(1)])]),li=i=>v("stsz",0,0,[h(0),h(i.samples.length),i.samples.map(t=>h(t.size))]),mi=i=>i.finalizedChunks.length>0&&F(i.finalizedChunks).offset>=2**32?v("co64",0,0,[h(i.finalizedChunks.length),i.finalizedChunks.map(t=>ne(t.offset))]):v("stco",0,0,[h(i.finalizedChunks.length),i.finalizedChunks.map(t=>h(t.offset))]),fi=i=>v("ctts",0,0,[h(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(t=>[h(t.sampleCount),h(t.sampleCompositionTimeOffset)])]),hi=i=>S("mvex",void 0,i.map(pi)),pi=i=>v("trex",0,0,[h(i.track.id),h(1),h(0),h(0),h(0)]),Et=(i,t)=>S("moof",void 0,[bi(i),...t.map(ki)]),bi=i=>v("mfhd",0,0,[h(i)]),Jt=i=>{let t=0,e=0,r=0,s=0,n=i.type==="delta";return e|=+n,n?t|=1:t|=2,t<<24|e<<16|r<<8|s},ki=i=>S("traf",void 0,[gi(i),Ti(i),xi(i)]),gi=i=>{l(i.currentChunk);let t=0;t|=8,t|=16,t|=32,t|=131072;let e=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:e.timescaleUnitsToNextSample,size:e.size,flags:Jt(e)};return v("tfhd",0,t,[h(i.track.id),h(r.duration),h(r.size),h(r.flags)])},Ti=i=>(l(i.currentChunk),v("tfdt",1,0,[ne(z(i.currentChunk.startTimestamp,i.timescale))])),xi=i=>{l(i.currentChunk);let t=i.currentChunk.samples.map(p=>p.timescaleUnitsToNextSample),e=i.currentChunk.samples.map(p=>p.size),r=i.currentChunk.samples.map(Jt),s=i.currentChunk.samples.map(p=>z(p.timestamp-p.decodeTimestamp,i.timescale)),n=new Set(t),a=new Set(e),o=new Set(r),c=new Set(s),u=o.size===2&&r[0]!==r[1],d=n.size>1,f=a.size>1,m=!u&&o.size>1,g=c.size>1||[...c].some(p=>p!==0),b=0;return b|=1,b|=4*+u,b|=256*+d,b|=512*+f,b|=1024*+m,b|=2048*+g,v("trun",1,b,[h(i.currentChunk.samples.length),h(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?h(r[0]):[],i.currentChunk.samples.map((p,k)=>[d?h(t[k]):[],f?h(e[k]):[],m?h(r[k]):[],g?Xt(s[k]):[]])])},er=i=>S("mfra",void 0,[...i.map(Ci),wi()]),Ci=(i,t)=>v("tfra",1,0,[h(i.track.id),h(63),h(i.finalizedChunks.length),i.finalizedChunks.map(r=>[ne(z(r.samples[0].timestamp,i.timescale)),ne(r.moofOffset),h(t+1),h(1),h(1)])]),wi=()=>v("mfro",0,0,[h(0)]),tr=()=>S("vtte"),rr=(i,t,e,r,s)=>S("vttc",void 0,[s!==null?S("vsid",[Xt(s)]):null,e!==null?S("iden",[...P.encode(e)]):null,t!==null?S("ctim",[...P.encode(He(t))]):null,r!==null?S("sttg",[...P.encode(r)]):null,S("payl",[...P.encode(i)])]),ir=i=>S("vtta",[...P.encode(i)]),yi={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},Si={avc:ei,hevc:ti,vp8:jt,vp9:jt,av1:ri},vi={aac:"mp4a",opus:"Opus"},_i={aac:ni,opus:si},Ai={webvtt:"wvtt"},Ii={webvtt:oi};var me=class{constructor(t){this.mutex=new q;this.trackTimestampInfo=new WeakMap;this.output=t}beforeTrackAdd(t){}onTrackClose(t){}validateAndNormalizeTimestamp(t,e,r){let s=e/1e6,n=this.trackTimestampInfo.get(t);if(!n){if(!r)throw new Error("First frame must be a key frame.");if(this.timestampsMustStartAtZero&&s>0)throw new Error(`Timestamps must start at zero (got ${s}s).`);n={timestampOffset:s,maxTimestamp:t.source._offsetTimestamps?0:s,lastKeyFrameTimestamp:t.source._offsetTimestamps?0:s},this.trackTimestampInfo.set(t,n)}if(t.source._offsetTimestamps&&(s-=n.timestampOffset),s<0)throw new Error(`Timestamps must be non-negative (got ${s}s).`);if(ss.start-n.start);e.push({start:r[0].start,size:r[0].data.byteLength});for(let s=1;su.start<=r&&rRi){for(let u=0;u=e.written[a+1].start;)e.written[a].end=Math.max(e.written[a].end,e.written[a+1].end),e.written.splice(a+1,1)}createChunk(e){let s={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(s),this.chunks.sort((n,a)=>n.start-a.start),this.chunks.indexOf(s)}queueChunksForFlush(e=!1){l(this.writer);for(let r=0;r{if(i==="avc"){let n=Math.ceil(t/16)*Math.ceil(e/16),a=nr.find(f=>n<=f.maxMacroblocks&&r<=f.maxBitrate)??F(nr),o=a?a.level:0,c="64".padStart(2,"0"),u="00",d=o.toString(16).padStart(2,"0");return`avc1.${c}${u}${d}`}else if(i==="hevc"){let s="",a="6",o=t*e,c=sr.find(d=>o<=d.maxPictureSize&&r<=d.maxBitrate)??F(sr);return`hev1.${s}1.${a}.${c.tier}${c.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let s="00",n=t*e,a=ar.find(c=>n<=c.maxPictureSize&&r<=c.maxBitrate)??F(ar);return`vp09.${s}.${a.level}.08`}else if(i==="av1"){let n=t*e,a=or.find(c=>n<=c.maxPictureSize&&r<=c.maxBitrate)??F(or);return`av01.0.${a.level.toString().padStart(2,"0")}${a.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},ur=(i,t)=>{if(i==="avc"){if(!t||t.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${Wt(t.subarray(1,4))}`}else if(i==="hevc"){if(!t)throw new TypeError("HEVC description must be provided.");let e=new DataView(t.buffer,t.byteOffset,t.byteLength),r="hev1.",s=t[1]>>6&3,n=t[1]&31;r+=["","A","B","C"][s]+n,r+=".";let a=Ht(e.getUint32(2));r+=a.toString(16),r+=".";let o=t[1]>>5&1,c=t[12];r+=o===0?"L":"H",r+=c,r+=".";let u=[];for(let d=0;d<6;d++){let f=t[d+13];u.push(f)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(d=>d.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},dr=(i,t,e)=>{if(i==="aac")return t>=2&&e<=24e3?"mp4a.40.29":e<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},lr=(i,t)=>{if(i==="aac")return`mp4a.40.${Rt(t).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},Rt=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let t=0,e=V(i,t,t+5);t+=5,e===31&&(e=32+V(i,t,t+6),t+=6);let r=V(i,t,t+4);t+=4;let s=null;if(r===15)s=V(i,t,t+24),t+=24;else{let o=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];r=1&&n<=7&&(a={1:1,2:2,3:3,4:4,5:5,6:6,7:8}[n]),{objectType:e,frequencyIndex:r,sampleRate:s,channelConfiguration:n,numberOfChannels:a}},mr=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},fr=i=>i==="aac"?{aac:{format:"aac"}}:i==="opus"?{opus:{format:"opus"}}:{},qe=i=>{if(!i)throw new TypeError("Video chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Video chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Video chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.codedWidth)||i.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(i.decoderConfig.codedHeight)||i.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(i.decoderConfig.description!==void 0&&!yt(i.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.colorSpace!==void 0){let{colorSpace:t}=i.decoderConfig;if(typeof t!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let e=Object.keys(te);if(t.primaries!=null&&!e.includes(t.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${e.join(", ")}.`);let r=Object.keys(re);if(t.transfer!=null&&!r.includes(t.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let s=Object.keys(ie);if(t.matrix!=null&&!s.includes(t.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(t.fullRange!=null&&typeof t.fullRange!="boolean")throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if((i.decoderConfig.codec.startsWith("avc1")||i.decoderConfig.codec.startsWith("avc3"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for AVC must include a description, which is expected to be an AVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec.startsWith("hev1")||i.decoderConfig.codec.startsWith("hvc1"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for HEVC must include a description, which is expected to be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec==="vp8"||i.decoderConfig.codec.startsWith("vp09"))&&i.decoderConfig.colorSpace===void 0)throw new TypeError("Video chunk metadata decoder configuration for VP8/VP9 must include a colorSpace.")},Xe=i=>{if(!i)throw new TypeError("Audio chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Audio chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.sampleRate)||i.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(i.decoderConfig.numberOfChannels)||i.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(i.decoderConfig.description!==void 0&&!yt(i.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.codec.startsWith("mp4a")&&!i.decoderConfig.description)throw new 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.");if(i.decoderConfig.codec==="opus"&&i.decoderConfig.description&&i.decoderConfig.description.byteLength<18)throw new TypeError("Invalid decoder description provided for Opus; must be at least 18 bytes long.")},Ge=i=>{if(!i)throw new TypeError("Subtitle metadata must be provided.");if(typeof i!="object")throw new TypeError("Subtitle metadata must be an object.");if(!i.config)throw new TypeError("Subtitle metadata must include a config object.");if(typeof i.config!="object")throw new TypeError("Subtitle metadata config must be an object.");if(typeof i.config.description!="string")throw new TypeError("Subtitle metadata config description must be a string.")};var Le=1e3,Oi=2082844800,z=(i,t,e=!0)=>{let r=i*t;return e?Math.round(r):r},Ye=class extends me{constructor(e,r){super(e);this.timestampsMustStartAtZero=!0;this.auxTarget=new he;this.auxWriter=this.auxTarget._createWriter();this.auxBoxWriter=new Ce(this.auxWriter);this.ftypSize=null;this.mdat=null;this.trackDatas=[];this.creationTime=Math.floor(Date.now()/1e3)+Oi;this.finalizedChunks=[];this.nextFragmentNumber=1;this.writer=e._writer,this.boxWriter=new Ce(this.writer);let s=this.writer instanceof fe?"in-memory":!1;this.fastStart=r._options.fastStart??s,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),r=this.output._tracks.some(s=>s.type==="video"&&s.source._codec==="avc");this.boxWriter.writeBox(Yt({holdsAvc:r,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=Qe(!1):this.fastStart==="fragmented"||(this.mdat=Qe(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;qe(r),l(r),l(r.decoderConfig),l(r.decoderConfig.codedWidth!==void 0),l(r.decoderConfig.codedHeight!==void 0);let n={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getAudioTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Xe(r),l(r),l(r.decoderConfig);let n={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},timescale:r.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getSubtitleTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Ge(r),l(r),l(r.config);let n={track:e,type:"subtitle",info:{config:r.config},timescale:1e3,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],lastCueEndTimestamp:0,cueQueue:[],nextSourceId:0,cueToSourceId:new WeakMap};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),this.validateAndNormalizeTimestamp(e,0,!0),n}async addEncodedVideoChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getVideoTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=this.validateAndNormalizeTimestamp(a.track,r.timestamp,r.type==="key"),u=this.createSampleForTrack(a,o,c,(r.duration??0)/1e6,r.type);await this.registerSample(a,u)}finally{n()}}async addEncodedAudioChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getAudioTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=this.validateAndNormalizeTimestamp(a.track,r.timestamp,c==="key"),d=this.createSampleForTrack(a,o,u,(r.duration??0)/1e6,c);await this.registerSample(a,d)}finally{n()}}async addSubtitleCue(e,r,s){let n=await this.mutex.acquire();try{let a=this.getSubtitleTrackData(e,s);this.validateAndNormalizeTimestamp(a.track,1e6*r.timestamp,!0),e.source._codec==="webvtt"&&(a.cueQueue.push(r),await this.processWebVTTCues(a,r.timestamp))}finally{n()}}async processWebVTTCues(e,r){for(;e.cueQueue.length>0;){let s=new Set([]);for(let d of e.cueQueue)l(d.timestamp<=r),l(e.lastCueEndTimestamp<=d.timestamp+d.duration),s.add(Math.max(d.timestamp,e.lastCueEndTimestamp)),s.add(d.timestamp+d.duration);let n=[...s].sort((d,f)=>d-f),a=n[0],o=n[1]??a;if(r=o)break;le.lastIndex=0;let m=le.test(f.text),g=f.timestamp+f.duration,b=e.cueToSourceId.get(f);if(b===void 0&&os.timestamp).sort((s,n)=>s-n);for(let s=0;s{if(e===o)return r.type==="key";let c=o.sampleQueue[0];return c&&c.type==="key"});n>=1&&a&&(s=!0,await this.finalizeFragment())}else s=n>=.5}s&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:r.timestamp,samples:[],offset:null,moofOffset:null}),l(e.currentChunk),e.currentChunk.samples.push(r),e.timestampProcessingQueue.push(r)}async finalizeCurrentChunk(e){if(l(this.fastStart!=="fragmented"),!!e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),this.finalizedChunks.push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||F(e.compactlyCodedChunkTable).samplesPerChunk!==e.currentChunk.samples.length)&&e.compactlyCodedChunkTable.push({firstChunk:e.finalizedChunks.length,samplesPerChunk:e.currentChunk.samples.length}),this.fastStart==="in-memory"){e.currentChunk.offset=0;return}e.currentChunk.offset=this.writer.getPos();for(let r of e.currentChunk.samples)l(r.data),this.writer.write(r.data),r.data=null;await this.writer.flush()}}async interleaveSamples(){l(this.fastStart==="fragmented");for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(r=>r.track===e))return;e:for(;;){let e=null,r=1/0;for(let n of this.trackDatas){if(n.sampleQueue.length===0&&!n.track.source._closed)break e;n.sampleQueue.length>0&&n.sampleQueue[0].timestampu.currentChunk),n=this.writer.getPos(),a=Et(r,s);this.boxWriter.writeBox(a);{let u=Qe(!1),d=0;for(let m of s)for(let g of m.currentChunk.samples)d+=g.size;let f=this.boxWriter.measureBox(u)+d;f>=2**32&&(u.largeSize=!0,f=this.boxWriter.measureBox(u)+d),u.size=f,this.boxWriter.writeBox(u)}for(let u of s){u.currentChunk.offset=this.writer.getPos(),u.currentChunk.moofOffset=n;for(let d of u.currentChunk.samples)this.writer.write(d.data),d.data=null}let o=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(a));let c=Et(r,s);this.boxWriter.writeBox(c),this.writer.seek(o);for(let u of s)u.finalizedChunks.push(u.currentChunk),this.finalizedChunks.push(u.currentChunk),u.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let r=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let s=this.trackDatas.find(n=>n.track===e);s&&await this.processWebVTTCues(s,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),r()}async finalize(){let e=await this.mutex.acquire();for(let r of this.trackDatas)r.type==="subtitle"&&r.track.source._codec==="webvtt"&&await this.processWebVTTCues(r,1/0);if(this.fastStart==="fragmented"){for(let r of this.trackDatas){for(let s of r.sampleQueue)await this.addSampleToTrack(r,s);this.processTimestamps(r)}await this.finalizeFragment(!1)}else for(let r of this.trackDatas)this.processTimestamps(r),await this.finalizeCurrentChunk(r);if(this.fastStart==="in-memory"){l(this.mdat);let r;for(let n=0;n<2;n++){let a=we(this.trackDatas,this.creationTime),o=this.boxWriter.measureBox(a);r=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+o+r;for(let u of this.finalizedChunks){u.offset=c;for(let{data:d}of u.samples)l(d),c+=d.byteLength,r+=d.byteLength}if(c<2**32)break;r>=2**32&&(this.mdat.largeSize=!0)}let s=we(this.trackDatas,this.creationTime);this.boxWriter.writeBox(s),this.mdat.size=r,this.boxWriter.writeBox(this.mdat);for(let n of this.finalizedChunks)for(let a of n.samples)l(a.data),this.writer.write(a.data),a.data=null}else if(this.fastStart==="fragmented"){let r=this.writer.getPos(),s=er(this.trackDatas);this.boxWriter.writeBox(s);let n=this.writer.getPos()-r;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(n)}else{l(this.mdat),l(this.ftypSize!==null);let r=this.boxWriter.offsets.get(this.mdat);l(r!==void 0);let s=this.writer.getPos()-r;this.mdat.size=s,this.mdat.largeSize=s>=2**32,this.boxWriter.patchBox(this.mdat);let n=we(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(n);let a=r-this.writer.getPos();this.boxWriter.writeBox(Zt(a))}else this.boxWriter.writeBox(n)}e()}};var ve=class{constructor(t){this.value=t}},pe=class{constructor(t){this.value=t}},_e=class{constructor(t){this.value=t}};var Ot=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,Ft=i=>i>=-64&&i<64?1:i>=-8192&&i<8192?2:i>=-(1<<20)&&i<1<<20?3:i>=-(1<<27)&&i<1<<27?4:i>=-(2**34)&&i<2**34?5:6,hr=i=>{if(i<127)return 1;if(i<16383)return 2;if(i<(1<<21)-1)return 3;if(i<(1<<28)-1)return 4;if(i<2**35-1)return 5;if(i<2**42-1)return 6;throw new Error("EBML VINT size not supported "+i)};var Vt=2**15,pr="https://github.com/Vanilagy/webm-muxer",br=6,kr=5,Fi={avc:"V_MPEG4/ISO/AVC",hevc:"V_MPEGH/ISO/HEVC",vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1",aac:"A_AAC",opus:"A_OPUS",webvtt:"S_TEXT/WEBVTT"},Vi={video:1,audio:2,subtitle:17},Ze=class extends me{constructor(e,r){super(e);this.timestampsMustStartAtZero=!1;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap;this.dataOffsets=new WeakMap;this.trackDatas=[];this.segment=null;this.segmentInfo=null;this.seekHead=null;this.tracksElement=null;this.segmentDuration=null;this.cues=null;this.currentCluster=null;this.currentClusterMsTimestamp=null;this.trackDatasInCurrentCluster=new Set;this.duration=0;this.writer=e._writer,this.format=r,this.format._options.streamable&&(this.writer.ensureMonotonicity=!0)}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=Ot(e)){let s=0;switch(r){case 6:this.helperView.setUint8(s++,e/2**40|0);case 5:this.helperView.setUint8(s++,e/2**32|0);case 4:this.helperView.setUint8(s++,e>>24);case 3:this.helperView.setUint8(s++,e>>16);case 2:this.helperView.setUint8(s++,e>>8);case 1:this.helperView.setUint8(s++,e);break;default:throw new Error("Bad UINT size "+r)}this.writer.write(this.helper.subarray(0,s))}writeSignedInt(e,r=Ft(e)){e<0&&(e+=2**(r*8)),this.writeUnsignedInt(e,r)}writeEBMLVarInt(e,r=hr(e)){let s=0;switch(r){case 1:this.helperView.setUint8(s++,128|e);break;case 2:this.helperView.setUint8(s++,64|e>>8),this.helperView.setUint8(s++,e);break;case 3:this.helperView.setUint8(s++,32|e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;case 4:this.helperView.setUint8(s++,16|e>>24),this.helperView.setUint8(s++,e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;case 5:this.helperView.setUint8(s++,8|e/2**32&7),this.helperView.setUint8(s++,e>>24),this.helperView.setUint8(s++,e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;case 6:this.helperView.setUint8(s++,4|e/2**40&3),this.helperView.setUint8(s++,e/2**32|0),this.helperView.setUint8(s++,e>>24),this.helperView.setUint8(s++,e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;default:throw new Error("Bad EBML VINT size "+r)}this.writer.write(this.helper.subarray(0,s))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(r=>r.charCodeAt(0))))}writeEBML(e){if(e!==null){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(),s=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+s);let n=this.writer.getPos();if(this.dataOffsets.set(e,n),this.writeEBML(e.data),e.size!==-1){let a=this.writer.getPos()-n,o=this.writer.getPos();this.writer.seek(r),this.writeEBMLVarInt(a,s),this.writer.seek(o)}}else if(typeof e.data=="number"){let r=e.size??Ot(e.data);this.writeEBMLVarInt(r),this.writeUnsignedInt(e.data,r)}else if(typeof e.data=="string")this.writeEBMLVarInt(e.data.length),this.writeString(e.data);else if(e.data instanceof Uint8Array)this.writeEBMLVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof ve)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof pe)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof _e){let r=e.size??Ft(e.data.value);this.writeEBMLVarInt(r),this.writeSignedInt(e.data.value,r)}}}beforeTrackAdd(e){if(this.format instanceof oe)if(e.type==="video"){if(!["vp8","vp9","av1"].includes(e.source._codec))throw new Error("WebM only supports VP8, VP9 and AV1 as video codecs. Switching to MKV removes this restriction.")}else if(e.type==="audio"){if(!["opus","vorbis"].includes(e.source._codec))throw new Error("WebM only supports Opus and Vorbis as audio codecs. Switching to MKV removes this restriction.")}else if(e.type==="subtitle"){if(e.source._codec!=="webvtt")throw new Error("WebM only supports WebVTT as subtitle codec. Switching to MKV removes this restriction.")}else throw new Error("WebM only supports video, audio and subtitle tracks. Switching to MKV removes this restriction.")}async start(){let e=await this.mutex.acquire();this.writeEBMLHeader(),this.format._options.streamable||this.createSeekHead(),this.createSegmentInfo(),this.createCues(),await this.writer.flush(),e()}writeEBMLHeader(){let e={id:440786851,data:[{id:17030,data:1},{id:17143,data:1},{id:17138,data:4},{id:17139,data:8},{id:17026,data:this.format instanceof oe?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),r=new Uint8Array([21,73,169,102]),s=new Uint8Array([22,84,174,107]),n={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:s},{id:21420,size:5,data:0}]}]};this.seekHead=n}createSegmentInfo(){let e={id:17545,data:new pe(0)};this.segmentDuration=e;let r={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:pr},{id:22337,data:pr},this.format._options.streamable?null:e]};this.segmentInfo=r}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let r of this.trackDatas)e.data.push({id:174,data:[{id:215,data:r.track.id},{id:29637,data:r.track.id},{id:131,data:Vi[r.type]},{id:134,data:Fi[r.track.source._codec]},r.type==="video"?this.videoSpecificTrackInfo(r):null,r.type==="audio"?this.audioSpecificTrackInfo(r):null,r.type==="subtitle"?this.subtitleSpecificTrackInfo(r):null]})}videoSpecificTrackInfo(e){let r=[e.info.decoderConfig.description?{id:25506,data:ee(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],s=e.info.decoderConfig.colorSpace,n={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},Be(s)?{id:21936,data:[{id:21937,data:ie[s.matrix]},{id:21946,data:re[s.transfer]},{id:21947,data:te[s.primaries]},{id:21945,data:s.fullRange?2:1}]}:null]};return r.push(n),r}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:ee(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new ve(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:P.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:br,data:[this.format._options.streamable?null:this.seekHead,this.segmentInfo,this.tracksElement]};this.segment=e,this.writeEBML(e)}createCues(){this.cues={id:475249515,data:[]}}get segmentDataOffset(){return l(this.segment),this.dataOffsets.get(this.segment)}getVideoTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;qe(r),l(r),l(r.decoderConfig),l(r.decoderConfig.codedWidth!==void 0),l(r.decoderConfig.codedHeight!==void 0);let n={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getAudioTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Xe(r),l(r),l(r.decoderConfig);let n={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getSubtitleTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Ge(r),l(r),l(r.config);let n={track:e,type:"subtitle",info:{config:r.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}async addEncodedVideoChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getVideoTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type==="key",u=this.validateAndNormalizeTimestamp(a.track,r.timestamp,c),d=this.createInternalChunk(o,u,(r.duration??0)/1e6,r.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(a,d),a.chunkQueue.push(d),await this.interleaveChunks()}finally{n()}}async addEncodedAudioChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getAudioTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=c==="key",d=this.validateAndNormalizeTimestamp(a.track,r.timestamp,u),f=this.createInternalChunk(o,d,(r.duration??0)/1e6,c);a.chunkQueue.push(f),await this.interleaveChunks()}finally{n()}}async addSubtitleCue(e,r,s){let n=await this.mutex.acquire();try{let a=this.getSubtitleTrackData(e,s),o=this.validateAndNormalizeTimestamp(a.track,1e6*r.timestamp,!0),c=r.text,u=Math.floor(o*1e3);le.lastIndex=0,c=c.replace(le,g=>{let p=We(g.slice(1,-1))-u;return`<${He(p)}>`});let d=P.encode(c),f=`${r.settings??""} ${r.identifier??""} -${r.notes??""}`,f=this.createInternalChunk(d,o,r.duration,"key",l.trim()?D.encode(l):null);s.chunkQueue.push(f),await this.interleaveChunks()}finally{n()}}async interleaveChunks(){for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(r=>r.track===e))return;e:for(;;){let e=null,r=1/0;for(let n of this.trackDatas){if(n.chunkQueue.length===0&&!n.track.source._closed)break e;n.chunkQueue.length>0&&n.chunkQueue[0].timestamp=2&&a++;let u={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Pt(r.data,a+0,a+3,u)}createInternalChunk(e,r,a,n,s=null){return{data:e,type:n,timestamp:r,duration:a,additions:s}}writeBlock(e,r){this.segment||(this.createTracks(),this.createSegment());let a=Math.floor(1e3*r.timestamp),n=this.trackDatas.every(l=>{if(l.track.source._closed)return!0;if(e===l)return r.type==="key";let f=l.chunkQueue[0];return f&&f.type==="key"});(!this.currentCluster||n&&a-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(a);let s=a-this.currentClusterMsTimestamp;if(s<0)return;if(s>=Ft)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${Ft} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${Ft} milliseconds.`);let c=new Uint8Array(4),u=new DataView(c.buffer);u.setUint8(0,128|e.track.id),u.setInt16(1,s,!1);let d=Math.floor(1e3*r.duration);if(d===0&&!r.additions){u.setUint8(3,+(r.type==="key")<<7);let l={id:163,data:[c,r.data]};this.writeEBML(l)}else{let l={id:160,data:[{id:161,data:[c,r.data]},r.type==="delta"?{id:251,data:new Ie(e.lastWrittenMsTimestamp-a)}:null,r.additions?{id:30113,data:[{id:166,data:[{id:165,data:r.additions},{id:238,data:1}]}]}:null,d>0?{id:155,data:d}:null]};this.writeEBML(l)}this.duration=Math.max(this.duration,a+d),e.lastWrittenMsTimestamp=a,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:br,data:[{id:231,data:e}]},this.writeEBML(this.currentCluster),this.currentClusterMsTimestamp=e,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){m(this.currentCluster);let e=this.writer.getPos()-this.dataOffsets.get(this.currentCluster),r=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,br),this.writer.seek(r);let a=this.offsets.get(this.currentCluster)-this.segmentDataOffset;m(this.cues),this.cues.data.push({id:187,data:[{id:179,data:this.currentClusterMsTimestamp},...[...this.trackDatasInCurrentCluster].map(n=>({id:183,data:[{id:247,data:n.track.id},{id:241,data:a}]}))]})}async onTrackClose(){let e=await this.mutex.acquire();await this.interleaveChunks(),e()}async finalize(){let e=await this.mutex.acquire();this.segment||(this.createTracks(),this.createSegment());for(let r of this.trackDatas)for(;r.chunkQueue.length>0;)this.writeBlock(r,r.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),m(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let r=this.writer.getPos(),a=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(a,pr),this.segmentDuration.data=new pe(this.duration),this.writer.seek(this.offsets.get(this.segmentDuration)),this.writeEBML(this.segmentDuration),this.seekHead.data[0].data[1].data=this.offsets.get(this.cues)-this.segmentDataOffset,this.seekHead.data[1].data[1].data=this.offsets.get(this.segmentInfo)-this.segmentDataOffset,this.seekHead.data[2].data[1].data=this.offsets.get(this.tracksElement)-this.segmentDataOffset,this.writer.seek(this.offsets.get(this.seekHead)),this.writeEBML(this.seekHead),this.writer.seek(r)}e()}};var G=class{},Je=class extends G{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(t.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=t}_createMuxer(t){return new Ye(t,this)}},_e=class extends G{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.streamable!==void 0&&typeof t.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=t}_createMuxer(t){return new Ze(t,this)}},oe=class extends _e{};var ce=class{constructor(){this._connectedTrack=null;this._closed=!1;this._offsetTimestamps=!1}_ensureValidDigest(){if(!this._connectedTrack)throw new Error("Cannot call digest without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call digest before output has been started.");if(this._connectedTrack.output._finalizing)throw new Error("Cannot call digest after output has started finalizing.");if(this._closed)throw new Error("Cannot call digest after source has been closed.")}_start(){}async _flush(){}close(){if(this._closed)throw new Error("Source already closed.");if(!this._connectedTrack)throw new Error("Cannot call close without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call close before output has been started.");this._closed=!0,!this._connectedTrack.output._finalizing&&this._connectedTrack.output._muxer.onTrackClose(this._connectedTrack)}},L=class extends ce{constructor(e){super();this._connectedTrack=null;if(!ne.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${ne.join(", ")}.`);this._codec=e}},et=class extends L{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,t,e)}},Vi=5,Mi=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!ne.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${ne.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.");if(i.latencyMode!==void 0&&!["quality","realtime"].includes(i.latencyMode))throw new TypeError("config.latencyMode, when provided, must be 'quality' or 'realtime'.")},Ae=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastMultipleOfKeyFrameInterval=-1;this.lastWidth=null;this.lastHeight=null;Mi(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(t.codedWidth!==this.lastWidth||t.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${t.codedWidth}x${t.codedHeight}.`)}else this.lastWidth=t.codedWidth,this.lastHeight=t.codedHeight;this.ensureEncoder(t),m(this.encoder);let e=Math.floor(t.timestamp/1e6/Vi);this.encoder.encode(t,{keyFrame:e!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=e,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new VideoEncoder({output:(e,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,e,r),error:e=>console.error("Video encode error:",e)}),this.encoder.configure({codec:or(this.codecConfig.codec,t.codedWidth,t.codedHeight,this.codecConfig.bitrate),width:t.codedWidth,height:t.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...mr(this.codecConfig.codec)}),m(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},tt=class extends L{constructor(t){super(t.codec),this._encoder=new Ae(this,t)}digest(t){if(!(t instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},rt=class extends L{constructor(t,e){if(!(t instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(e.codec),this._encoder=new Ae(this,e),this._canvas=t}digest(t,e=0){if(!Number.isFinite(t)||t<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(e)||e<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*t),duration:Math.round(1e6*e),alpha:"discard"}),a=this._encoder.digest(r);return r.close(),a}_flush(){return this._encoder.flush()}},it=class extends L{constructor(e,r){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");r={...r,latencyMode:"realtime"};super(r.codec);this._abortController=null;this._offsetTimestamps=!0;this._encoder=new Ae(this,r),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),r=new WritableStream({write:a=>{this._encoder.digest(a),a.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(a=>{a instanceof DOMException&&a.name==="AbortError"||console.error("Pipe error:",a)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},Q=class extends ce{constructor(e){super();this._connectedTrack=null;if(!se.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${se.join(", ")}.`);this._codec=e}},at=class extends Q{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,t,e)}},Di=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!se.includes(i.codec))throw new TypeError(`Invalid audio codec '${i.codec}'. Must be one of: ${se.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},Re=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastNumberOfChannels=null;this.lastSampleRate=null;Di(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(t.numberOfChannels!==this.lastNumberOfChannels||t.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${t.numberOfChannels} channels at ${t.sampleRate} Hz.`)}else this.lastNumberOfChannels=t.numberOfChannels,this.lastSampleRate=t.sampleRate;this.ensureEncoder(t),m(this.encoder),this.encoder.encode(t),this.encoder.encodeQueueSize>=4&&await new Promise(e=>this.encoder.addEventListener("dequeue",e,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new AudioEncoder({output:(e,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,e,r),error:e=>console.error("Audio encode error:",e)}),this.encoder.configure({codec:ur(this.codecConfig.codec,t.numberOfChannels,t.sampleRate),numberOfChannels:t.numberOfChannels,sampleRate:t.sampleRate,bitrate:this.codecConfig.bitrate,...lr(this.codecConfig.codec)}),m(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},nt=class extends Q{constructor(t){super(t.codec),this._encoder=new Re(this,t)}digest(t){if(!(t instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},st=class extends Q{constructor(e){super(e.codec);this._accumulatedFrameCount=0;this._encoder=new Re(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let r=e.numberOfChannels,a=e.sampleRate,n=e.length,s=new Float32Array(r*n);for(let u=0;u{this._encoder.digest(a),a.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(a=>{a instanceof DOMException&&a.name==="AbortError"||console.error("Pipe error:",a)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},ue=class extends ce{constructor(e){super();this._connectedTrack=null;if(!Se.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${Se.join(", ")}.`);this._codec=e}},ct=class extends ue{constructor(t){super(t),this._parser=new Ne({codec:t,output:(e,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,e,r),error:e=>console.error("Subtitle parse error:",e)})}digest(t){if(typeof t!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(t),this._connectedTrack.output._muxer.mutex.currentPromise}};var ut=class{constructor(t){this._tracks=[];this._started=!1;this._finalizing=!1;this._mutex=new $;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!(t.format instanceof G))throw new TypeError("options.format must be an OutputFormat.");if(!(t.target instanceof X))throw new TypeError("options.target must be a Target.");if(t.target._output)throw new Error("Target is already used for another output.");t.target._output=this,this._writer=t.target._createWriter(),this._muxer=t.format._createMuxer(this)}addVideoTrack(t,e={}){if(!(t instanceof L))throw new TypeError("source must be a VideoSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");if(typeof e.rotation=="number"&&![0,90,180,270].includes(e.rotation))throw new TypeError(`Invalid video rotation: ${e.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(e.rotation)&&(e.rotation.length!==9||e.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${e.rotation.join()}`);if(e.frameRate!==void 0&&(!Number.isInteger(e.frameRate)||e.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.frameRate}. Must be a positive integer.`);this._addTrack("video",t,e)}addAudioTrack(t,e={}){if(!(t instanceof Q))throw new TypeError("source must be an AudioSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",t,e)}addSubtitleTrack(t,e={}){if(!(t instanceof ue))throw new TypeError("source must be a SubtitleSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",t,e)}_addTrack(t,e,r){if(this._started)throw new Error("Cannot add track after output has started.");if(e._connectedTrack)throw new Error("Source is already used for a track.");let a={id:this._tracks.length+1,output:this,type:t,source:e,metadata:r};this._muxer.beforeTrackAdd(a),this._tracks.push(a),e._connectedTrack=a}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let t=await this._mutex.acquire();await this._muxer.start();for(let e of this._tracks)e.source._start();t()}async finalize(){if(!this._started)throw new Error("Cannot finalize before starting.");if(this._finalizing)throw new Error("Cannot call finalize twice.");this._finalizing=!0;let t=await this._mutex.acquire(),e=this._tracks.map(r=>r.source._flush());await Promise.all(e),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),t()}};var Y=class{constructor(){this._sizePromise=null}_getSize(){return this._sizePromise??=this._retrieveSize()}},dt=class extends Y{constructor(t){if(!(t instanceof ArrayBuffer)&&!(t instanceof Uint8Array))throw new TypeError("buffer must be an ArrayBuffer or Uint8Array.");super(),this._bytes=t instanceof Uint8Array?t:new Uint8Array(t)}async _read(t,e){return this._bytes.subarray(t,e)}async _retrieveSize(){return this._bytes.byteLength}},mt=class extends Y{constructor(t){if(!(t instanceof Blob))throw new TypeError("blob must be a Blob.");super(),this._blob=t}async _read(t,e){let a=await this._blob.slice(t,e).arrayBuffer();return new Uint8Array(a)}async _retrieveSize(){return this._blob.size}};var lt=class{constructor(t){this.input=t}};var be=class{constructor(t){this._backing=t}isVideoTrack(){return this instanceof z}isAudioTrack(){return this instanceof U}computeDuration(){return this._backing.computeDuration()}},z=class extends be{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getCodedWidth(){return this._backing.getCodedWidth()}getCodedHeight(){return this._backing.getCodedHeight()}getRotation(){return this._backing.getRotation()}async getDisplayWidth(){return await this._backing.getRotation()%180===0?this._backing.getCodedWidth():this._backing.getCodedHeight()}async getDisplayHeight(){return await this._backing.getRotation()%180===0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},U=class extends be{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getNumberOfChannels(){return this._backing.getNumberOfChannels()}getSampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}};var ke=class{constructor(t,e=1/0){this.source=t;this.maxStorableBytes=e;this.loadedSegments=[];this.loadingSegments=[];this.sourceSizePromise=null;this.nextAge=0;this.totalStoredBytes=0}async loadRange(t,e){e=Math.min(e,await this.source._getSize());let r=this.loadingSegments.find(c=>c.start<=t&&c.end>=e);if(r){await r.promise;return}if(this.loadedSegments.some(c=>c.start<=t&&c.end>=e))return;let n=this.source._read(t,e),s={start:t,end:e,promise:n};this.loadingSegments.push(s);let o=await n;Ht(this.loadingSegments,s),this.insertIntoLoadedSegments(t,o)}insertIntoLoadedSegments(t,e){let r={start:t,end:t+e.byteLength,bytes:e,view:new DataView(e.buffer),age:this.nextAge++},a=_(this.loadedSegments,t,n=>n.start);(a===-1||this.loadedSegments[a].start=r.end)break;r.start<=s.start&&s.end<=r.end&&(this.loadedSegments.splice(n,1),n--)}for(;this.totalStoredBytes>this.maxStorableBytes&&this.loadedSegments.length>1;){let n=null,s=-1;for(let o=0;on.start),a=null;if(r!==-1)for(let n=r;nt)break;if(e<=s.end){a=s;break}}if(!a)throw new Error(`No segment loaded for range [${t}, ${e}).`);return a.age=this.nextAge++,{view:a.view,offset:a.bytes.byteOffset+t-a.start}}forgetRange(t,e){if(e<=t)return;let r=_(this.loadedSegments,t,n=>n.start);if(r===-1)return;let a=this.loadedSegments[r];a.start!==t||a.end!==e||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=a.bytes.byteLength)}};var de=class{constructor(t){this.reader=t;this.pos=0}readRange(t,e){let{view:r,offset:a}=this.reader.getViewAndOffset(t,e);return new Uint8Array(r.buffer,a,e-t)}readU8(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,t.getUint8(e)}readU16(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,t.getUint16(e,!1)}readU24(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=t.getUint16(e,!1),a=t.getUint8(e+2);return r*256+a}readS32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getUint32(e,!1)}readI32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU64(){let t=this.readU32(),e=this.readU32();return t*4294967296+e}readF64(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,t.getFloat64(e,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(t){let{view:e,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+t);this.pos+=t;let a="";for(let n=0;na.computeDuration()));return Math.max(0,...r)}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e="video/mp4";if(this.tracks.length>0){let r=await Promise.all(this.tracks.map(n=>n.inputTrack.getCodecMimeType())),a=[...new Set(r)];e+=`; codecs="${a.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&aa.presentationTimestamp-n.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let r=this.isobmffReader.readBoxHeader();m(r.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+r.totalSize),this.isobmffReader.pos=e,this.traverseBox();let a=j(this.fragments,e,s=>s.moofOffset);m(a!==-1);let n=this.fragments[a];m(n.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+r.totalSize);for(let[s,o]of n.trackData){if(o.startTimestampIsFinal)continue;let c=this.tracks.find(f=>f.id===s);this.isobmffReader.pos=0;let u=null,d=null,l=_(c.fragments,e-1,f=>f.moofOffset);for(l!==-1&&(u=c.fragments[l],d=u,this.isobmffReader.pos=u.moofOffset+u.moofSize);this.isobmffReader.posh.moofOffset);if(b===-1){this.isobmffReader.pos=f;let h=await this.readFragment();u&&(u.nextFragment=h),u=h}else{let h=this.fragments[b];u&&(u.nextFragment=h),u=h}}this.isobmffReader.pos=f+g.totalSize}u&&u.trackData.has(s)&&(d=u)}if(d){let f=d.trackData.get(s);m(f.startTimestampIsFinal),gr(o,f.endTimestamp)}o.startTimestampIsFinal=!0}return n}readContiguousBoxes(e){let r=this.isobmffReader.pos;for(;this.isobmffReader.pos-rl.every((f,g)=>f===u[g]));d===-1?n.rotation=0:n.rotation=90*d}break;case"mdhd":{let n=this.currentTrack;m(n);let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3,s===0?(this.isobmffReader.pos+=8,n.timescale=this.isobmffReader.readU32(),n.durationInTimescale=this.isobmffReader.readU32()):s===1&&(this.isobmffReader.pos+=16,n.timescale=this.isobmffReader.readU32(),n.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let n=this.currentTrack;m(n),this.isobmffReader.pos+=8;let s=this.isobmffReader.readAscii(4);s==="vide"?n.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:s==="soun"&&(n.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let n=this.currentTrack;m(n),n.sampleTableOffset=e,this.readContiguousBoxes(r.contentSize)}break;case"stsd":{let n=this.currentTrack;if(m(n),n.info===null||n.sampleTable)break;let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=this.isobmffReader.readU32();for(let c=0;c0){if(d===1)this.isobmffReader.pos+=4*4;else if(d===2){this.isobmffReader.pos+=4,f=this.isobmffReader.readF64(),l=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let g=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),h=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}n.info.numberOfChannels=l,n.info.sampleRate=f,this.readContiguousBoxes(e+u.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let n=this.currentTrack;m(n&&n.info),n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"hvcC":{let n=this.currentTrack;m(n&&n.info),n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"colr":{let n=this.currentTrack;if(m(n&&n.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let o=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),u=this.isobmffReader.readU16(),d=!!(this.isobmffReader.readU8()&128);n.info.colorSpace={primaries:zt[o],transfer:Ut[c],matrix:Bt[u],fullRange:d}}break;case"wave":r.totalSize>8&&this.readContiguousBoxes(r.contentSize);break;case"esds":{let n=this.currentTrack;m(n&&n.info),this.isobmffReader.pos+=4;let s=this.isobmffReader.readU8();m(s===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let o=this.isobmffReader.readU8(),c=(o&128)!==0,u=(o&64)!==0,d=(o&32)!==0;if(c&&(this.isobmffReader.pos+=2),u){let h=this.isobmffReader.readU8();this.isobmffReader.pos+=h}d&&(this.isobmffReader.pos+=2);let l=this.isobmffReader.readU8();m(l===4),this.isobmffReader.readIsomVariableInteger();let f=this.isobmffReader.readU8();m(f===64),this.isobmffReader.pos+=12;let g=this.isobmffReader.readU8();m(g===5);let b=this.isobmffReader.readIsomVariableInteger();n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+b)}break;case"stts":{let n=this.currentTrack;if(m(n),!n.sampleTable)break;this.isobmffReader.pos+=4;let s=this.isobmffReader.readU32(),o=0,c=0;for(let u=0;uv.id===s);if(!o)break;o.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),u=(c&48)>>4,d=(c&12)>>2,l=c&3,f=this.isobmffReader,g=[f.readU8.bind(f),f.readU16.bind(f),f.readU24.bind(f),f.readU32.bind(f)],b=g[u],h=g[d],k=g[l],y=this.isobmffReader.readU32();for(let v=0;vs.moofOffset);this.fragments.splice(n+1,0,this.currentFragment);for(let[,s]of this.currentFragment.trackData){let o=s.samples[0],c=R(s.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,o.byteOffset),this.currentFragment.dataEnd=Math.max(this.currentFragment.dataEnd,c.byteOffset+c.byteSize)}this.currentFragment=null}break;case"traf":if(m(this.currentFragment),this.readContiguousBoxes(r.contentSize),this.currentTrack){let n=this.currentFragment.trackData.get(this.currentTrack.id);if(n){let s=_(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(s+1,0,this.currentFragment);let{currentFragmentState:o}=this.currentTrack;m(o),o.startTimestamp!==null&&(gr(n,o.startTimestamp),n.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{m(this.currentFragment),this.isobmffReader.pos+=1;let n=this.isobmffReader.readU24(),s=!!(n&1),o=!!(n&2),c=!!(n&8),u=!!(n&16),d=!!(n&32),l=!!(n&65536),f=!!(n&131072),g=this.isobmffReader.readU32(),b=this.tracks.find(k=>k.id===g);if(!b)break;let h=this.fragmentTrackDefaults.find(k=>k.trackId===g);this.currentTrack=b,b.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:h?.defaultSampleDescriptionIndex??null,defaultSampleDuration:h?.defaultSampleDuration??null,defaultSampleSize:h?.defaultSampleSize??null,defaultSampleFlags:h?.defaultSampleFlags??null,startTimestamp:null},s?b.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():f&&(b.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),o&&(b.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(b.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),u&&(b.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),d&&(b.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),l&&(b.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let n=this.currentTrack;if(!n)break;m(n.currentFragmentState);let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=s===0?this.isobmffReader.readU32():this.isobmffReader.readU64();n.currentFragmentState.startTimestamp=o}break;case"trun":{let n=this.currentTrack;if(!n)break;if(m(this.currentFragment),m(n.currentFragmentState),this.currentFragment.trackData.has(n.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let s=this.isobmffReader.readU8(),o=this.isobmffReader.readU24(),c=!!(o&1),u=!!(o&4),d=!!(o&256),l=!!(o&512),f=!!(o&1024),g=!!(o&2048),b=this.isobmffReader.readU32(),h=n.currentFragmentState.baseDataOffset;c&&(h+=this.isobmffReader.readI32());let k=null;u&&(k=this.isobmffReader.readU32());let y=h;if(b===0){this.currentFragment.implicitBaseDataOffset=y;break}let v=0,T={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(n.id,T);for(let N=0;N({presentationTimestamp:N.presentationTimestamp,sampleIndex:M})).sort((N,M)=>N.presentationTimestamp-M.presentationTimestamp);let A=T.samples[T.presentationTimestamps[0].sampleIndex],F=T.samples[R(T.presentationTimestamps).sampleIndex];T.startTimestamp=A.presentationTimestamp,T.endTimestamp=F.presentationTimestamp+F.duration,this.currentFragment.implicitBaseDataOffset=y}break}this.isobmffReader.pos=a}},ht=class{constructor(t){this.internalTrack=t;this.chunkToSampleIndex=new WeakMap;this.chunkToFragmentLocation=new WeakMap}getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let e=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return e?e/1e6:0}async getFirstChunk(t){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let e=this.internalTrack.fragments[0];return{fragmentIndex:e?0:-1,sampleIndex:e?0:-1,correctSampleFound:!!e}},0,1/0,t):this.fetchChunkForSampleIndex(0,t)}roundToMicrosecond(t){return(Math.floor(t*1e6)+.99999999)/1e6}async getChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,e);{let a=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=kr(a,r);return this.fetchChunkForSampleIndex(n,e)}}async getNextChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(t);if(a===void 0)throw new Error("Chunk was not created from this track.");let n=a.fragment.trackData.get(this.internalTrack.id),s=n.samples[a.sampleIndex],o=j(this.internalTrack.fragments,a.fragment.moofOffset,c=>c.moofOffset);return m(o!==-1),this.performFragmentedLookup(()=>{if(a.sampleIndex+1l.moofOffset);return m(d!==-1),{fragmentIndex:d,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:o,sampleIndex:-1,correctSampleFound:!1}}},s.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,e)}async getKeyChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,e);let a=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=kr(a,r),s=n===-1?-1:Ui(a,n);return this.fetchChunkForSampleIndex(s,e)}async getNextKeyChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(t);if(s===void 0)throw new Error("Chunk was not created from this track.");let o=s.fragment.trackData.get(this.internalTrack.id),c=o.samples[s.sampleIndex],u=j(this.internalTrack.fragments,s.fragment.moofOffset,d=>d.moofOffset);return m(u!==-1),this.performFragmentedLookup(()=>{let d=o.samples.findIndex((l,f)=>l.isKeyFrame&&f>s.sampleIndex);if(d!==-1)return{fragmentIndex:u,sampleIndex:d,correctSampleFound:!0};{let l=s.fragment;for(;l.nextFragment;){l=l.nextFragment;let f=l.trackData.get(this.internalTrack.id);if(f){let g=j(this.internalTrack.fragments,l.moofOffset,h=>h.moofOffset);m(g!==-1);let b=f.samples.findIndex(h=>h.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:g,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},c.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");let a=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Bi(a,r);return this.fetchChunkForSampleIndex(n,e)}async fetchChunkForSampleIndex(t,e){if(t===-1)return null;let r=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a=zi(r,t);if(!a)return null;let n;e.metadataOnly?n=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(a.chunkOffset,a.chunkOffset+a.chunkSize),n=this.internalTrack.demuxer.chunkReader.readRange(a.sampleOffset,a.sampleOffset+a.sampleSize));let s=1e6*a.presentationTimestamp/this.internalTrack.timescale,o=1e6*a.duration/this.internalTrack.timescale,c=this.createChunk(n,s,o,a.isKeyFrame);return this.chunkToSampleIndex.set(c,t),c}async fetchChunkInFragment(t,e,r){if(e===-1)return null;let n=t.trackData.get(this.internalTrack.id).samples[e];m(n);let s;r.metadataOnly?s=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(t.dataStart,t.dataEnd),s=this.internalTrack.demuxer.chunkReader.readRange(n.byteOffset,n.byteOffset+n.byteSize));let o=1e6*n.presentationTimestamp/this.internalTrack.timescale,c=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(s,o,c,n.isKeyFrame);return this.chunkToFragmentLocation.set(u,{fragment:t,sampleIndex:e}),u}findSampleInFragmentsForTimestamp(t){let e=_(this.internalTrack.fragments,t,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,a=!1;if(e!==-1){let s=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=_(s.presentationTimestamps,t,c=>c.presentationTimestamp);m(o!==-1),r=s.presentationTimestamps[o].sampleIndex,a=tn.trackData.get(this.internalTrack.id).startTimestamp),r=-1,a=!1;if(e!==-1){let s=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=Lt(s.presentationTimestamps,u=>s.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=t);if(o===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=s.presentationTimestamps[o].sampleIndex,a=ty.timestamp);k!==-1&&(h=this.internalTrack.fragmentLookupTable[k])}if(o===-1)d.pos=h?.moofOffset??0;else{let k=this.internalTrack.fragments[o];!h||k.moofOffset>=k.moofOffset?(d.pos=k.moofOffset+k.moofSize,f=k):d.pos=h.moofOffset}for(;d.posr)break;if(f.nextFragment){d.pos=f.nextFragment.moofOffset+f.nextFragment.moofSize,f=f.nextFragment;continue}}await d.reader.loadRange(d.pos,d.pos+16);let k=d.pos,y=d.readBoxHeader();if(y.name==="moof"){let v=j(n.fragments,k,T=>T.moofOffset);if(v===-1){d.pos=k;let T=await n.readFragment();f&&(f.nextFragment=T),f=T;let{fragmentIndex:A,sampleIndex:F,correctSampleFound:N}=t();if(N){let M=this.internalTrack.fragments[A];return this.fetchChunkInFragment(M,F,a)}A!==-1&&(g=A,b=F)}else{let T=n.fragments[v];f&&(f.nextFragment=T),f=T}}d.pos=k+y.totalSize}if(g!==-1){let k=this.internalTrack.fragments[g];return this.fetchChunkInFragment(k,b,a)}return null}finally{s()}}},Vt=class extends ht{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getCodedWidth(){return this.internalTrack.info.width}async getCodedHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:cr(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}}createChunk(t,e,r,a){return new EncodedVideoChunk({data:t,timestamp:e,duration:r,type:a?"key":"delta"})}},Mt=class extends ht{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}async getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return{codec:dr(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}}createChunk(t,e,r,a){return new EncodedAudioChunk({data:t,timestamp:e,duration:r,type:a?"key":"delta"})}},kr=(i,t)=>{let e=_(i.presentationTimestamps,t,r=>r.presentationTimestamp);return e===-1?-1:i.presentationTimestamps[e].sampleIndex},zi=(i,t)=>{let e=_(i.sampleTimingEntries,t,h=>h.startIndex),r=i.sampleTimingEntries[e];if(!r||r.startIndex+r.count<=t)return null;let n=r.startDecodeTimestamp+(t-r.startIndex)*r.delta,s=_(i.sampleCompositionTimeOffsets,t,h=>h.startIndex),o=i.sampleCompositionTimeOffsets[s];o&&(n+=o.offset);let c=i.sampleSizes[Math.min(t,i.sampleSizes.length-1)],u=_(i.sampleToChunk,t,h=>h.startSampleIndex),d=i.sampleToChunk[u];m(d);let l=d.startChunkIndex+Math.floor((t-d.startSampleIndex)/d.samplesPerChunk),f=i.chunkOffsets[l],g=0,b=f;if(i.sampleSizes.length===1)b+=c*(t-d.startSampleIndex),g+=c*d.samplesPerChunk;else{let h=d.startSampleIndex+(l-d.startChunkIndex)*d.samplesPerChunk;for(let k=h;kh)!==-1:!0}},Ui=(i,t)=>{if(!i.keySampleIndices)return t;let e=_(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e]??-1},Bi=(i,t)=>{if(!i.keySampleIndices)return t+1;let e=_(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e+1]??-1},gr=(i,t)=>{i.startTimestamp+=t,i.endTimestamp+=t;for(let e of i.samples)e.presentationTimestamp+=t;for(let e of i.presentationTimestamps)e.presentationTimestamp+=t};var Z=class{},Oe=class extends Z{async _canReadInput(t){if(await t._mainReader.source._getSize()<8)return!1;let r=new de(t._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(t){return new ft(t)}},Ee=class extends Z{async _canReadInput(){return!1}_createDemuxer(){throw new Error("Not implemented")}},Fe=new Oe,Tr=Fe,xr=Fe,pt=new Ee,Dt=pt,Cr=pt,wr=[Fe,Dt];var bt=class{constructor(t){this._demuxerPromise=null;this._format=null;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!Array.isArray(t.formats)||t.formats.some(e=>!(e instanceof Z)))throw new TypeError("options.formats must be an array of InputFormat.");if(!(t.source instanceof Y))throw new TypeError("options.source must be a Source.");this._formats=t.formats,this._source=t.source,this._mainReader=new ke(t.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let t of this._formats)if(await t._canReadInput(this))return this._format=t,t._createDemuxer(this);throw new Error("Input has an unrecognizable format.")})()}async getFormat(){return await this._getDemuxer(),m(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 getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var K=i=>{if(!i||typeof i!="object")throw new TypeError("options must be an object.");if(i.metadataOnly!==void 0&&typeof i.metadataOnly!="boolean")throw new TypeError("options.metadataOnly, when defined, must be a boolean.")},B=i=>{if(typeof i!="number"||Number.isNaN(i))throw new TypeError("timestamp must be a number.")},ge=class{async*chunks(t,e=1/0){let r=[],{promise:a,resolve:n}=E(),{promise:s,resolve:o}=E(),c=!1,u=[],d=()=>Math.max(2,u.length);(async()=>{let l=t??await this.getFirstChunk();for(;l&&!c&&!(l.timestamp/1e6>=e);){if(r.length>d()){({promise:s,resolve:o}=E()),await s;continue}r.push(l),n(),{promise:a,resolve:n}=E(),l=await this.getNextChunk(l)}c=!0,n()})();try{for(;;)if(r.length>0){yield r.shift();let l=performance.now();for(u.push(l);u.length>0&&l-u[0]>=1e3;)u.shift();o()}else if(!c)await a;else break}finally{c=!0,o()}}},Te=class{_duplicateFrame(t){return structuredClone(t)}async*mediaFramesAtTimestamps(t){Kt(t);let e=Qt(t),r=[],a=[],{promise:n,resolve:s}=E(),{promise:o,resolve:c}=E(),u=!1,d=!1,l=8,f=null,g=h=>{a.push(h),s(),{promise:n,resolve:s}=E()},b=await this._createDecoder(h=>{if(c(),d){h.close();return}let k=!1;for(;r.length>0&&r[0]===h.timestamp;)g(this._duplicateFrame(h)),r.shift(),k=!0;k?(f?.close(),f=h):h.close()});(async()=>{let h=this._createChunkDrain(),k=null,y=null;for await(let v of e){for(B(v);a.length+b.decodeQueueSize>l;)({promise:o,resolve:c}=E()),await o;if(d)break;let T=await h.getChunk(v);if(!T){g(null);continue}let A=await h.getKeyChunk(v);if(!A){g(null);continue}for(r.push(T.timestamp),k&&A.timestamp===k.timestamp&&T.timestamp>=y.timestamp?(m(y),T.timestamp===y.timestamp&&r.length===1&&(f&&g(this._duplicateFrame(f)),r.shift())):(k=A,y=A,b.decode(A));y.timestamp!==T.timestamp;){let F=await h.getNextChunk(y);m(F),y=F,b.decode(F)}b.decodeQueueSize>=10&&await new Promise(F=>b.addEventListener("dequeue",F,{once:!0}))}await b.flush(),b.close(),u=!0,s()})();try{for(;;)if(a.length>0){let h=a.shift();m(h!==void 0),yield h,c()}else if(!u)await n;else break}finally{d=!0,c();for(let h of a)h?.close();f?.close()}}async*mediaFramesInRange(t=0,e=1/0){B(t),B(e);let r=[],a=!1,n=null,{promise:s,resolve:o}=E(),{promise:c,resolve:u}=E(),d=!1,l=!1,f=8,g=await this._createDecoder(k=>{u();let y=k.timestamp/1e6;if(y>=e&&(l=!0),l){k.close();return}n&&(y>t?(r.push(n),a=!0):n.close()),y>=t&&(r.push(k),a=!0),n=a?null:k,r.length>0&&(o(),{promise:s,resolve:o}=E())}),b=this._createChunkDrain(),h=await b.getKeyChunk(t)??await b.getFirstChunk();if(h){(async()=>{let k=h,y=1/0;if(e<1/0){let T=await b.getChunk(e),A=T?T.type==="key"&&T.timestamp/1e6===e?T:await b.getNextKeyChunk(T):null;A&&(y=A.timestamp/1e6)}let v=b.chunks(h,y);for(await v.next();k&&!l;){if(r.length+g.decodeQueueSize>f){({promise:c,resolve:u}=E()),await c;continue}g.decode(k);let T=await v.next();if(T.done)break;k=T.value}await v.return(),await g.flush(),g.close(),!a&&n&&r.push(n),d=!0,o()})();try{for(;;)if(r.length>0)yield r.shift(),u();else if(!d)await s;else break}finally{l=!0,u();for(let k of r)k.close()}}}},Ve=class extends ge{constructor(t){if(!(t instanceof z))throw new TypeError("videoTrack must be an InputVideoTrack.");super(),this._videoTrack=t}getFirstChunk(t={}){return K(t),this._videoTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return B(t),K(e),this._videoTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return K(e),this._videoTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return B(t),K(e),this._videoTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return K(e),this._videoTrack._backing.getNextKeyChunk(t,e)}},Me=class extends Te{constructor(e){if(!(e instanceof z))throw new TypeError("videoTrack must be an InputVideoTrack.");super();this._decoderConfig=null;this._videoTrack=e}async _createDecoder(e){this._decoderConfig??=await this._videoTrack.getDecoderConfig();let r=new VideoDecoder({output:e,error:a=>console.error(a)});return r.configure(this._decoderConfig),r}_createChunkDrain(){return new Ve(this._videoTrack)}async getFrame(e){B(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}frames(e=0,r=1/0){return this.mediaFramesInRange(e,r)}framesAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},kt=class{constructor(t,e){if(!(t instanceof z))throw new TypeError("videoTrack must be an InputVideoTrack.");if(e&&typeof e!="object")throw new TypeError("dimensions, when defined, must be an object.");if(e&&(!Number.isInteger(e.width)||e.width<=0))throw new TypeError("dimensions.width must be a positive integer.");if(e&&(!Number.isInteger(e.height)||e.height<=0))throw new TypeError("dimensions.height must be a positive integer.");this._videoTrack=t,this._dimensions=e,this._videoFrameDrain=new Me(t)}async _videoFrameToWrappedCanvas(t){let e=this._dimensions?.width??await this._videoTrack.getDisplayWidth(),r=this._dimensions?.height??await this._videoTrack.getDisplayHeight(),a=await this._videoTrack.getRotation(),n=document.createElement("canvas");n.width=e,n.height=r;let s=n.getContext("2d",{alpha:!1});m(s),s.translate(e/2,r/2),s.rotate(a*Math.PI/180),s.translate(-e/2,-r/2);let[o,c]=a%180===0?[e,r]:[r,e];s.drawImage(t,(e-o)/2,(r-c)/2,o,c);let u={canvas:n,timestamp:t.timestamp/1e6,duration:(t.duration??0)/1e6};return t.close(),u}async getCanvas(t){B(t);let e=await this._videoFrameDrain.getFrame(t);return e&&this._videoFrameToWrappedCanvas(e)}async*canvases(t=0,e=1/0){for await(let r of this._videoFrameDrain.frames(t,e))yield this._videoFrameToWrappedCanvas(r)}async*canvasesAtTimestamps(t){for await(let e of this._videoFrameDrain.framesAtTimestamps(t))yield e&&this._videoFrameToWrappedCanvas(e)}},De=class extends ge{constructor(t){if(!(t instanceof U))throw new TypeError("audioTrack must be an InputAudioTrack.");super(),this._audioTrack=t}getFirstChunk(t={}){return K(t),this._audioTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return B(t),K(e),this._audioTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return K(e),this._audioTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return B(t),K(e),this._audioTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return K(e),this._audioTrack._backing.getNextKeyChunk(t,e)}},Pe=class extends Te{constructor(e){if(!(e instanceof U))throw new TypeError("audioTrack must be an InputAudioTrack.");super();this._decoderConfig=null;this._audioTrack=e}async _createDecoder(e){this._decoderConfig??=await this._audioTrack.getDecoderConfig();let r=new AudioDecoder({output:e,error:a=>console.error(a)});return r.configure(this._decoderConfig),r}_createChunkDrain(){return new De(this._audioTrack)}async getData(e){B(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}data(e=0,r=1/0){return this.mediaFramesInRange(e,r)}dataAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},gt=class{constructor(t){if(!(t instanceof U))throw new TypeError("audioTrack must be an InputAudioTrack.");this._audioDataDrain=new Pe(t)}_audioDataToWrappedArrayBuffer(t){let e=new AudioBuffer({numberOfChannels:t.numberOfChannels,length:t.numberOfFrames,sampleRate:t.sampleRate}),r=new Float32Array(t.allocationSize({planeIndex:0,format:"f32-planar"})/4);for(let s=0;sr.track===e))return;e:for(;;){let e=null,r=1/0;for(let n of this.trackDatas){if(n.chunkQueue.length===0&&!n.track.source._closed)break e;n.chunkQueue.length>0&&n.chunkQueue[0].timestamp=2&&s++;let u={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];zt(r.data,s+0,s+3,u)}createInternalChunk(e,r,s,n,a=null){return{data:e,type:n,timestamp:r,duration:s,additions:a}}writeBlock(e,r){this.segment||(this.createTracks(),this.createSegment());let s=Math.floor(1e3*r.timestamp),n=this.trackDatas.every(f=>{if(f.track.source._closed)return!0;if(e===f)return r.type==="key";let m=f.chunkQueue[0];return m&&m.type==="key"});(!this.currentCluster||n&&s-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(s);let a=s-this.currentClusterMsTimestamp;if(a<0)return;if(a>=Vt)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${Vt} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${Vt} milliseconds.`);let c=new Uint8Array(4),u=new DataView(c.buffer);u.setUint8(0,128|e.track.id),u.setInt16(1,a,!1);let d=Math.floor(1e3*r.duration);if(d===0&&!r.additions){u.setUint8(3,+(r.type==="key")<<7);let f={id:163,data:[c,r.data]};this.writeEBML(f)}else{let f={id:160,data:[{id:161,data:[c,r.data]},r.type==="delta"?{id:251,data:new _e(e.lastWrittenMsTimestamp-s)}:null,r.additions?{id:30113,data:[{id:166,data:[{id:165,data:r.additions},{id:238,data:1}]}]}:null,d>0?{id:155,data:d}:null]};this.writeEBML(f)}this.duration=Math.max(this.duration,s+d),e.lastWrittenMsTimestamp=s,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:kr,data:[{id:231,data:e}]},this.writeEBML(this.currentCluster),this.currentClusterMsTimestamp=e,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){l(this.currentCluster);let e=this.writer.getPos()-this.dataOffsets.get(this.currentCluster),r=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,kr),this.writer.seek(r);let s=this.offsets.get(this.currentCluster)-this.segmentDataOffset;l(this.cues),this.cues.data.push({id:187,data:[{id:179,data:this.currentClusterMsTimestamp},...[...this.trackDatasInCurrentCluster].map(n=>({id:183,data:[{id:247,data:n.track.id},{id:241,data:s}]}))]})}async onTrackClose(){let e=await this.mutex.acquire();await this.interleaveChunks(),e()}async finalize(){let e=await this.mutex.acquire();this.segment||(this.createTracks(),this.createSegment());for(let r of this.trackDatas)for(;r.chunkQueue.length>0;)this.writeBlock(r,r.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),l(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let r=this.writer.getPos(),s=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(s,br),this.segmentDuration.data=new pe(this.duration),this.writer.seek(this.offsets.get(this.segmentDuration)),this.writeEBML(this.segmentDuration),this.seekHead.data[0].data[1].data=this.offsets.get(this.cues)-this.segmentDataOffset,this.seekHead.data[1].data[1].data=this.offsets.get(this.segmentInfo)-this.segmentDataOffset,this.seekHead.data[2].data[1].data=this.offsets.get(this.tracksElement)-this.segmentDataOffset,this.writer.seek(this.offsets.get(this.seekHead)),this.writeEBML(this.seekHead),this.writer.seek(r)}e()}};var Y=class{},Je=class extends Y{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(t.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=t}_createMuxer(t){return new Ye(t,this)}},Ae=class extends Y{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.streamable!==void 0&&typeof t.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=t}_createMuxer(t){return new Ze(t,this)}},oe=class extends Ae{};var ce=class{constructor(){this._connectedTrack=null;this._closed=!1;this._offsetTimestamps=!1}_ensureValidDigest(){if(!this._connectedTrack)throw new Error("Cannot call digest without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call digest before output has been started.");if(this._connectedTrack.output._finalizing)throw new Error("Cannot call digest after output has started finalizing.");if(this._closed)throw new Error("Cannot call digest after source has been closed.")}_start(){}async _flush(){}close(){if(this._closed)throw new Error("Source already closed.");if(!this._connectedTrack)throw new Error("Cannot call close without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call close before output has been started.");this._closed=!0,!this._connectedTrack.output._finalizing&&this._connectedTrack.output._muxer.onTrackClose(this._connectedTrack)}},L=class extends ce{constructor(e){super();this._connectedTrack=null;if(!se.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${se.join(", ")}.`);this._codec=e}},et=class extends L{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,t,e)}},Mi=5,Di=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!se.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${se.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.");if(i.latencyMode!==void 0&&!["quality","realtime"].includes(i.latencyMode))throw new TypeError("config.latencyMode, when provided, must be 'quality' or 'realtime'.")},Ie=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastMultipleOfKeyFrameInterval=-1;this.lastWidth=null;this.lastHeight=null;Di(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(t.codedWidth!==this.lastWidth||t.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${t.codedWidth}x${t.codedHeight}.`)}else this.lastWidth=t.codedWidth,this.lastHeight=t.codedHeight;this.ensureEncoder(t),l(this.encoder);let e=Math.floor(t.timestamp/1e6/Mi);this.encoder.encode(t,{keyFrame:e!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=e,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new VideoEncoder({output:(e,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,e,r),error:e=>console.error("Video encode error:",e)}),this.encoder.configure({codec:cr(this.codecConfig.codec,t.codedWidth,t.codedHeight,this.codecConfig.bitrate),width:t.codedWidth,height:t.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...mr(this.codecConfig.codec)}),l(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},tt=class extends L{constructor(t){super(t.codec),this._encoder=new Ie(this,t)}digest(t){if(!(t instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},rt=class extends L{constructor(t,e){if(!(t instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(e.codec),this._encoder=new Ie(this,e),this._canvas=t}digest(t,e=0){if(!Number.isFinite(t)||t<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(e)||e<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*t),duration:Math.round(1e6*e),alpha:"discard"}),s=this._encoder.digest(r);return r.close(),s}_flush(){return this._encoder.flush()}},it=class extends L{constructor(e,r){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");r={...r,latencyMode:"realtime"};super(r.codec);this._abortController=null;this._offsetTimestamps=!0;this._encoder=new Ie(this,r),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),r=new WritableStream({write:s=>{this._encoder.digest(s),s.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(s=>{s instanceof DOMException&&s.name==="AbortError"||console.error("Pipe error:",s)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},Q=class extends ce{constructor(e){super();this._connectedTrack=null;if(!ae.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${ae.join(", ")}.`);this._codec=e}},nt=class extends Q{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,t,e)}},Pi=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!ae.includes(i.codec))throw new TypeError(`Invalid audio codec '${i.codec}'. Must be one of: ${ae.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},Ee=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastNumberOfChannels=null;this.lastSampleRate=null;Pi(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(t.numberOfChannels!==this.lastNumberOfChannels||t.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${t.numberOfChannels} channels at ${t.sampleRate} Hz.`)}else this.lastNumberOfChannels=t.numberOfChannels,this.lastSampleRate=t.sampleRate;this.ensureEncoder(t),l(this.encoder),this.encoder.encode(t),this.encoder.encodeQueueSize>=4&&await new Promise(e=>this.encoder.addEventListener("dequeue",e,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new AudioEncoder({output:(e,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,e,r),error:e=>console.error("Audio encode error:",e)}),this.encoder.configure({codec:dr(this.codecConfig.codec,t.numberOfChannels,t.sampleRate),numberOfChannels:t.numberOfChannels,sampleRate:t.sampleRate,bitrate:this.codecConfig.bitrate,...fr(this.codecConfig.codec)}),l(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},st=class extends Q{constructor(t){super(t.codec),this._encoder=new Ee(this,t)}digest(t){if(!(t instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},at=class extends Q{constructor(e){super(e.codec);this._accumulatedFrameCount=0;this._encoder=new Ee(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let r=e.numberOfChannels,s=e.sampleRate,n=e.length,a=new Float32Array(r*n);for(let u=0;u{this._encoder.digest(s),s.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(s=>{s instanceof DOMException&&s.name==="AbortError"||console.error("Pipe error:",s)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},ue=class extends ce{constructor(e){super();this._connectedTrack=null;if(!Se.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${Se.join(", ")}.`);this._codec=e}},ct=class extends ue{constructor(t){super(t),this._parser=new Ne({codec:t,output:(e,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,e,r),error:e=>console.error("Subtitle parse error:",e)})}digest(t){if(typeof t!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(t),this._connectedTrack.output._muxer.mutex.currentPromise}};var ut=class{constructor(t){this._tracks=[];this._started=!1;this._finalizing=!1;this._mutex=new q;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!(t.format instanceof Y))throw new TypeError("options.format must be an OutputFormat.");if(!(t.target instanceof G))throw new TypeError("options.target must be a Target.");if(t.target._output)throw new Error("Target is already used for another output.");t.target._output=this,this._writer=t.target._createWriter(),this._muxer=t.format._createMuxer(this)}addVideoTrack(t,e={}){if(!(t instanceof L))throw new TypeError("source must be a VideoSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");if(typeof e.rotation=="number"&&![0,90,180,270].includes(e.rotation))throw new TypeError(`Invalid video rotation: ${e.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(e.rotation)&&(e.rotation.length!==9||e.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${e.rotation.join()}`);if(e.frameRate!==void 0&&(!Number.isInteger(e.frameRate)||e.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.frameRate}. Must be a positive integer.`);this._addTrack("video",t,e)}addAudioTrack(t,e={}){if(!(t instanceof Q))throw new TypeError("source must be an AudioSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",t,e)}addSubtitleTrack(t,e={}){if(!(t instanceof ue))throw new TypeError("source must be a SubtitleSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",t,e)}_addTrack(t,e,r){if(this._started)throw new Error("Cannot add track after output has started.");if(e._connectedTrack)throw new Error("Source is already used for a track.");let s={id:this._tracks.length+1,output:this,type:t,source:e,metadata:r};this._muxer.beforeTrackAdd(s),this._tracks.push(s),e._connectedTrack=s}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let t=await this._mutex.acquire();await this._muxer.start();for(let e of this._tracks)e.source._start();t()}async finalize(){if(!this._started)throw new Error("Cannot finalize before starting.");if(this._finalizing)throw new Error("Cannot call finalize twice.");this._finalizing=!0;let t=await this._mutex.acquire(),e=this._tracks.map(r=>r.source._flush());await Promise.all(e),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),t()}};var j=class{constructor(){this._sizePromise=null}_getSize(){return this._sizePromise??=this._retrieveSize()}},dt=class extends j{constructor(t){if(!(t instanceof ArrayBuffer)&&!(t instanceof Uint8Array))throw new TypeError("buffer must be an ArrayBuffer or Uint8Array.");super(),this._bytes=t instanceof Uint8Array?t:new Uint8Array(t)}async _read(t,e){return this._bytes.subarray(t,e)}async _retrieveSize(){return this._bytes.byteLength}},lt=class extends j{constructor(t){if(!(t instanceof Blob))throw new TypeError("blob must be a Blob.");super(),this._blob=t}async _read(t,e){let s=await this._blob.slice(t,e).arrayBuffer();return new Uint8Array(s)}async _retrieveSize(){return this._blob.size}},mt=class extends j{constructor(e,r={}){if(typeof e!="string")throw new TypeError("url must be a string.");if(!r||typeof r!="object")throw new TypeError("options must be an object.");if(r.withCredentials!==void 0&&typeof r.withCredentials!="boolean")throw new TypeError("options.withCredentials, when specified, must be a boolean.");super();this._fullData=null;this._url=e,this._withCredentials=r.withCredentials??!1}_makeRequest(e){return new Promise((r,s)=>{let n=new XMLHttpRequest;n.open("GET",this._url,!0),n.responseType="arraybuffer",n.withCredentials=this._withCredentials,e&&n.setRequestHeader("Range",`bytes=${e.start}-${e.end-1}`),n.onload=()=>{if(n.status>=200&&n.status<300){let a=n.response;e||(this._fullData=a),r({response:a,statusCode:n.status})}else s(new Error(`Error fetching ${this._url}: ${n.status} ${n.statusText}`))},n.onerror=()=>{s(new Error("Network error occurred."))},n.ontimeout=()=>{s(new Error("Request timed out."))},n.send()})}async _read(e,r){if(this._fullData)return new Uint8Array(this._fullData,e,r-e);let{response:s,statusCode:n}=await this._makeRequest({start:e,end:r});return n===200?new Uint8Array(s).subarray(e,r):new Uint8Array(s)}async _retrieveSize(){if(this._fullData)return this._fullData.byteLength;let e=new XMLHttpRequest;e.open("HEAD",this._url,!0),e.withCredentials=this._withCredentials,await new Promise((s,n)=>{e.onload=()=>{e.status>=200&&e.status<300?s():n(new Error(`Error fetching ${this._url} (HEAD): ${e.status} ${e.statusText}`))},e.onerror=()=>{s()},e.send()});let r=e.getResponseHeader("Content-Length");if(!r){let{response:s}=await this._makeRequest();return s.byteLength}return parseInt(r,10)}};var ft=class{constructor(t){this.input=t}};var be=class{constructor(t){this._backing=t}isVideoTrack(){return this instanceof U}isAudioTrack(){return this instanceof B}computeDuration(){return this._backing.computeDuration()}},U=class extends be{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getCodedWidth(){return this._backing.getCodedWidth()}getCodedHeight(){return this._backing.getCodedHeight()}getRotation(){return this._backing.getRotation()}async getDisplayWidth(){return await this._backing.getRotation()%180===0?this._backing.getCodedWidth():this._backing.getCodedHeight()}async getDisplayHeight(){return await this._backing.getRotation()%180===0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},B=class extends be{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getNumberOfChannels(){return this._backing.getNumberOfChannels()}getSampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}};var ke=class{constructor(t,e=1/0){this.source=t;this.maxStorableBytes=e;this.loadedSegments=[];this.loadingSegments=[];this.sourceSizePromise=null;this.nextAge=0;this.totalStoredBytes=0}async loadRange(t,e){e=Math.min(e,await this.source._getSize());let r=this.loadingSegments.find(c=>c.start<=t&&c.end>=e);if(r){await r.promise;return}if(this.loadedSegments.some(c=>c.start<=t&&c.end>=e))return;let n=this.source._read(t,e),a={start:t,end:e,promise:n};this.loadingSegments.push(a);let o=await n;Lt(this.loadingSegments,a),this.insertIntoLoadedSegments(t,o)}insertIntoLoadedSegments(t,e){let r={start:t,end:t+e.byteLength,bytes:e,view:new DataView(e.buffer),age:this.nextAge++},s=E(this.loadedSegments,t,n=>n.start);(s===-1||this.loadedSegments[s].start=r.end)break;r.start<=a.start&&a.end<=r.end&&(this.loadedSegments.splice(n,1),n--)}for(;this.totalStoredBytes>this.maxStorableBytes&&this.loadedSegments.length>1;){let n=null,a=-1;for(let o=0;on.start),s=null;if(r!==-1)for(let n=r;nt)break;if(e<=a.end){s=a;break}}if(!s)throw new Error(`No segment loaded for range [${t}, ${e}).`);return s.age=this.nextAge++,{view:s.view,offset:s.bytes.byteOffset+t-s.start}}forgetRange(t,e){if(e<=t)return;let r=E(this.loadedSegments,t,n=>n.start);if(r===-1)return;let s=this.loadedSegments[r];s.start!==t||s.end!==e||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=s.bytes.byteLength)}};var de=class{constructor(t){this.reader=t;this.pos=0}readRange(t,e){let{view:r,offset:s}=this.reader.getViewAndOffset(t,e);return new Uint8Array(r.buffer,s,e-t)}readU8(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,t.getUint8(e)}readU16(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,t.getUint16(e,!1)}readU24(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=t.getUint16(e,!1),s=t.getUint8(e+2);return r*256+s}readS32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getUint32(e,!1)}readI32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU64(){let t=this.readU32(),e=this.readU32();return t*4294967296+e}readF64(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,t.getFloat64(e,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(t){let{view:e,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+t);this.pos+=t;let s="";for(let n=0;ns.computeDuration()));return Math.max(0,...r)}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e="video/mp4";if(this.tracks.length>0){let r=await Promise.all(this.tracks.map(n=>n.inputTrack.getCodecMimeType())),s=[...new Set(r)];e+=`; codecs="${s.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&ss.presentationTimestamp-n.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let r=this.isobmffReader.readBoxHeader();l(r.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+r.totalSize),this.isobmffReader.pos=e,this.traverseBox();let s=K(this.fragments,e,a=>a.moofOffset);l(s!==-1);let n=this.fragments[s];l(n.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+r.totalSize);for(let[a,o]of n.trackData){if(o.startTimestampIsFinal)continue;let c=this.tracks.find(m=>m.id===a);this.isobmffReader.pos=0;let u=null,d=null,f=E(c.fragments,e-1,m=>m.moofOffset);for(f!==-1&&(u=c.fragments[f],d=u,this.isobmffReader.pos=u.moofOffset+u.moofSize);this.isobmffReader.posp.moofOffset);if(b===-1){this.isobmffReader.pos=m;let p=await this.readFragment();u&&(u.nextFragment=p),u=p}else{let p=this.fragments[b];u&&(u.nextFragment=p),u=p}}this.isobmffReader.pos=m+g.totalSize}u&&u.trackData.has(a)&&(d=u)}if(d){let m=d.trackData.get(a);l(m.startTimestampIsFinal),Tr(o,m.endTimestamp)}o.startTimestampIsFinal=!0}return n}readContiguousBoxes(e){let r=this.isobmffReader.pos;for(;this.isobmffReader.pos-rf.every((m,g)=>m===u[g]));d===-1?n.rotation=0:n.rotation=90*d}break;case"mdhd":{let n=this.currentTrack;l(n);let a=this.isobmffReader.readU8();this.isobmffReader.pos+=3,a===0?(this.isobmffReader.pos+=8,n.timescale=this.isobmffReader.readU32(),n.durationInTimescale=this.isobmffReader.readU32()):a===1&&(this.isobmffReader.pos+=16,n.timescale=this.isobmffReader.readU32(),n.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let n=this.currentTrack;l(n),this.isobmffReader.pos+=8;let a=this.isobmffReader.readAscii(4);a==="vide"?n.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:a==="soun"&&(n.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let n=this.currentTrack;l(n),n.sampleTableOffset=e,this.readContiguousBoxes(r.contentSize)}break;case"stsd":{let n=this.currentTrack;if(l(n),n.info===null||n.sampleTable)break;let a=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=this.isobmffReader.readU32();for(let c=0;c0){if(d===1)this.isobmffReader.pos+=4*4;else if(d===2){this.isobmffReader.pos+=4,m=this.isobmffReader.readF64(),f=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let g=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),p=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}n.info.numberOfChannels=f,n.info.sampleRate=m,this.readContiguousBoxes(e+u.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let n=this.currentTrack;l(n&&n.info),n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"hvcC":{let n=this.currentTrack;l(n&&n.info),n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"colr":{let n=this.currentTrack;if(l(n&&n.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let o=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),u=this.isobmffReader.readU16(),d=!!(this.isobmffReader.readU8()&128);n.info.colorSpace={primaries:Ut[o],transfer:Bt[c],matrix:Nt[u],fullRange:d}}break;case"wave":r.totalSize>8&&this.readContiguousBoxes(r.contentSize);break;case"esds":{let n=this.currentTrack;l(n&&n.info),this.isobmffReader.pos+=4;let a=this.isobmffReader.readU8();l(a===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let o=this.isobmffReader.readU8(),c=(o&128)!==0,u=(o&64)!==0,d=(o&32)!==0;if(c&&(this.isobmffReader.pos+=2),u){let p=this.isobmffReader.readU8();this.isobmffReader.pos+=p}d&&(this.isobmffReader.pos+=2);let f=this.isobmffReader.readU8();l(f===4),this.isobmffReader.readIsomVariableInteger();let m=this.isobmffReader.readU8();l(m===64),this.isobmffReader.pos+=12;let g=this.isobmffReader.readU8();l(g===5);let b=this.isobmffReader.readIsomVariableInteger();n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+b)}break;case"stts":{let n=this.currentTrack;if(l(n),!n.sampleTable)break;this.isobmffReader.pos+=4;let a=this.isobmffReader.readU32(),o=0,c=0;for(let u=0;ux.id===a);if(!o)break;o.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),u=(c&48)>>4,d=(c&12)>>2,f=c&3,m=this.isobmffReader,g=[m.readU8.bind(m),m.readU16.bind(m),m.readU24.bind(m),m.readU32.bind(m)],b=g[u],p=g[d],k=g[f],T=this.isobmffReader.readU32();for(let x=0;xa.moofOffset);this.fragments.splice(n+1,0,this.currentFragment);for(let[,a]of this.currentFragment.trackData){let o=a.samples[0],c=F(a.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,o.byteOffset),this.currentFragment.dataEnd=Math.max(this.currentFragment.dataEnd,c.byteOffset+c.byteSize)}this.currentFragment=null}break;case"traf":if(l(this.currentFragment),this.readContiguousBoxes(r.contentSize),this.currentTrack){let n=this.currentFragment.trackData.get(this.currentTrack.id);if(n){let a=E(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(a+1,0,this.currentFragment);let{currentFragmentState:o}=this.currentTrack;l(o),o.startTimestamp!==null&&(Tr(n,o.startTimestamp),n.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{l(this.currentFragment),this.isobmffReader.pos+=1;let n=this.isobmffReader.readU24(),a=!!(n&1),o=!!(n&2),c=!!(n&8),u=!!(n&16),d=!!(n&32),f=!!(n&65536),m=!!(n&131072),g=this.isobmffReader.readU32(),b=this.tracks.find(k=>k.id===g);if(!b)break;let p=this.fragmentTrackDefaults.find(k=>k.trackId===g);this.currentTrack=b,b.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:p?.defaultSampleDescriptionIndex??null,defaultSampleDuration:p?.defaultSampleDuration??null,defaultSampleSize:p?.defaultSampleSize??null,defaultSampleFlags:p?.defaultSampleFlags??null,startTimestamp:null},a?b.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():m&&(b.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),o&&(b.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(b.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),u&&(b.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),d&&(b.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),f&&(b.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let n=this.currentTrack;if(!n)break;l(n.currentFragmentState);let a=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=a===0?this.isobmffReader.readU32():this.isobmffReader.readU64();n.currentFragmentState.startTimestamp=o}break;case"trun":{let n=this.currentTrack;if(!n)break;if(l(this.currentFragment),l(n.currentFragmentState),this.currentFragment.trackData.has(n.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let a=this.isobmffReader.readU8(),o=this.isobmffReader.readU24(),c=!!(o&1),u=!!(o&4),d=!!(o&256),f=!!(o&512),m=!!(o&1024),g=!!(o&2048),b=this.isobmffReader.readU32(),p=n.currentFragmentState.baseDataOffset;c&&(p+=this.isobmffReader.readI32());let k=null;u&&(k=this.isobmffReader.readU32());let T=p;if(b===0){this.currentFragment.implicitBaseDataOffset=T;break}let x=0,C={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(n.id,C);for(let I=0;I({presentationTimestamp:I.presentationTimestamp,sampleIndex:R})).sort((I,R)=>I.presentationTimestamp-R.presentationTimestamp);let O=C.samples[C.presentationTimestamps[0].sampleIndex],_=C.samples[F(C.presentationTimestamps).sampleIndex];C.startTimestamp=O.presentationTimestamp,C.endTimestamp=_.presentationTimestamp+_.duration,this.currentFragment.implicitBaseDataOffset=T}break}this.isobmffReader.pos=s}},pt=class{constructor(t){this.internalTrack=t;this.chunkToSampleIndex=new WeakMap;this.chunkToFragmentLocation=new WeakMap}getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let e=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return e?e/1e6:0}async getFirstChunk(t){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let e=this.internalTrack.fragments[0];return{fragmentIndex:e?0:-1,sampleIndex:e?0:-1,correctSampleFound:!!e}},0,1/0,t):this.fetchChunkForSampleIndex(0,t)}roundToMicrosecond(t){return(Math.floor(t*1e6)+.99999999)/1e6}async getChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,e);{let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=gr(s,r);return this.fetchChunkForSampleIndex(n,e)}}async getNextChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(t);if(s===void 0)throw new Error("Chunk was not created from this track.");let n=s.fragment.trackData.get(this.internalTrack.id),a=n.samples[s.sampleIndex],o=K(this.internalTrack.fragments,s.fragment.moofOffset,c=>c.moofOffset);return l(o!==-1),this.performFragmentedLookup(()=>{if(s.sampleIndex+1f.moofOffset);return l(d!==-1),{fragmentIndex:d,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:o,sampleIndex:-1,correctSampleFound:!1}}},a.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,e)}async getKeyChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,e);let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=gr(s,r),a=n===-1?-1:Bi(s,n);return this.fetchChunkForSampleIndex(a,e)}async getNextKeyChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(t);if(a===void 0)throw new Error("Chunk was not created from this track.");let o=a.fragment.trackData.get(this.internalTrack.id),c=o.samples[a.sampleIndex],u=K(this.internalTrack.fragments,a.fragment.moofOffset,d=>d.moofOffset);return l(u!==-1),this.performFragmentedLookup(()=>{let d=o.samples.findIndex((f,m)=>f.isKeyFrame&&m>a.sampleIndex);if(d!==-1)return{fragmentIndex:u,sampleIndex:d,correctSampleFound:!0};{let f=a.fragment;for(;f.nextFragment;){f=f.nextFragment;let m=f.trackData.get(this.internalTrack.id);if(m){let g=K(this.internalTrack.fragments,f.moofOffset,p=>p.moofOffset);l(g!==-1);let b=m.samples.findIndex(p=>p.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:g,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},c.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Ni(s,r);return this.fetchChunkForSampleIndex(n,e)}async fetchChunkForSampleIndex(t,e){if(t===-1)return null;let r=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=Ui(r,t);if(!s)return null;let n;e.metadataOnly?n=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(s.chunkOffset,s.chunkOffset+s.chunkSize),n=this.internalTrack.demuxer.chunkReader.readRange(s.sampleOffset,s.sampleOffset+s.sampleSize));let a=1e6*s.presentationTimestamp/this.internalTrack.timescale,o=1e6*s.duration/this.internalTrack.timescale,c=this.createChunk(n,a,o,s.isKeyFrame);return this.chunkToSampleIndex.set(c,t),c}async fetchChunkInFragment(t,e,r){if(e===-1)return null;let n=t.trackData.get(this.internalTrack.id).samples[e];l(n);let a;r.metadataOnly?a=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(t.dataStart,t.dataEnd),a=this.internalTrack.demuxer.chunkReader.readRange(n.byteOffset,n.byteOffset+n.byteSize));let o=1e6*n.presentationTimestamp/this.internalTrack.timescale,c=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(a,o,c,n.isKeyFrame);return this.chunkToFragmentLocation.set(u,{fragment:t,sampleIndex:e}),u}findSampleInFragmentsForTimestamp(t){let e=E(this.internalTrack.fragments,t,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(e!==-1){let a=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=E(a.presentationTimestamps,t,c=>c.presentationTimestamp);l(o!==-1),r=a.presentationTimestamps[o].sampleIndex,s=tn.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(e!==-1){let a=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=Qt(a.presentationTimestamps,u=>a.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=t);if(o===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=a.presentationTimestamps[o].sampleIndex,s=tT.timestamp);k!==-1&&(p=this.internalTrack.fragmentLookupTable[k])}if(o===-1)d.pos=p?.moofOffset??0;else{let k=this.internalTrack.fragments[o];!p||k.moofOffset>=k.moofOffset?(d.pos=k.moofOffset+k.moofSize,m=k):d.pos=p.moofOffset}for(;d.posr)break;if(m.nextFragment){d.pos=m.nextFragment.moofOffset+m.nextFragment.moofSize,m=m.nextFragment;continue}}await d.reader.loadRange(d.pos,d.pos+16);let k=d.pos,T=d.readBoxHeader();if(T.name==="moof"){let x=K(n.fragments,k,C=>C.moofOffset);if(x===-1){d.pos=k;let C=await n.readFragment();m&&(m.nextFragment=C),m=C;let{fragmentIndex:O,sampleIndex:_,correctSampleFound:I}=t();if(I){let R=this.internalTrack.fragments[O];return this.fetchChunkInFragment(R,_,s)}O!==-1&&(g=O,b=_)}else{let C=n.fragments[x];m&&(m.nextFragment=C),m=C}}d.pos=k+T.totalSize}if(g!==-1){let k=this.internalTrack.fragments[g];return this.fetchChunkInFragment(k,b,s)}return null}finally{a()}}},Mt=class extends pt{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getCodedWidth(){return this.internalTrack.info.width}async getCodedHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:ur(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}}createChunk(t,e,r,s){return new EncodedVideoChunk({data:t,timestamp:e,duration:r,type:s?"key":"delta"})}},Dt=class extends pt{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}async getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return{codec:lr(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}}createChunk(t,e,r,s){return new EncodedAudioChunk({data:t,timestamp:e,duration:r,type:s?"key":"delta"})}},gr=(i,t)=>{let e=E(i.presentationTimestamps,t,r=>r.presentationTimestamp);return e===-1?-1:i.presentationTimestamps[e].sampleIndex},Ui=(i,t)=>{let e=E(i.sampleTimingEntries,t,p=>p.startIndex),r=i.sampleTimingEntries[e];if(!r||r.startIndex+r.count<=t)return null;let n=r.startDecodeTimestamp+(t-r.startIndex)*r.delta,a=E(i.sampleCompositionTimeOffsets,t,p=>p.startIndex),o=i.sampleCompositionTimeOffsets[a];o&&(n+=o.offset);let c=i.sampleSizes[Math.min(t,i.sampleSizes.length-1)],u=E(i.sampleToChunk,t,p=>p.startSampleIndex),d=i.sampleToChunk[u];l(d);let f=d.startChunkIndex+Math.floor((t-d.startSampleIndex)/d.samplesPerChunk),m=i.chunkOffsets[f],g=0,b=m;if(i.sampleSizes.length===1)b+=c*(t-d.startSampleIndex),g+=c*d.samplesPerChunk;else{let p=d.startSampleIndex+(f-d.startChunkIndex)*d.samplesPerChunk;for(let k=p;kp)!==-1:!0}},Bi=(i,t)=>{if(!i.keySampleIndices)return t;let e=E(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e]??-1},Ni=(i,t)=>{if(!i.keySampleIndices)return t+1;let e=E(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e+1]??-1},Tr=(i,t)=>{i.startTimestamp+=t,i.endTimestamp+=t;for(let e of i.samples)e.presentationTimestamp+=t;for(let e of i.presentationTimestamps)e.presentationTimestamp+=t};var Z=class{},Re=class extends Z{async _canReadInput(t){if(await t._mainReader.source._getSize()<8)return!1;let r=new de(t._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(t){return new ht(t)}},Oe=class extends Z{async _canReadInput(){return!1}_createDemuxer(){throw new Error("Not implemented")}},Fe=new Re,xr=Fe,Cr=Fe,bt=new Oe,Pt=bt,wr=bt,yr=[Fe,Pt];var kt=class{constructor(t){this._demuxerPromise=null;this._format=null;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!Array.isArray(t.formats)||t.formats.some(e=>!(e instanceof Z)))throw new TypeError("options.formats must be an array of InputFormat.");if(!(t.source instanceof j))throw new TypeError("options.source must be a Source.");this._formats=t.formats,this._source=t.source,this._mainReader=new ke(t.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let t of this._formats)if(await t._canReadInput(this))return this._format=t,t._createDemuxer(this);throw new Error("Input has an unrecognizable format.")})()}async getFormat(){return await this._getDemuxer(),l(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 getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var $=i=>{if(!i||typeof i!="object")throw new TypeError("options must be an object.");if(i.metadataOnly!==void 0&&typeof i.metadataOnly!="boolean")throw new TypeError("options.metadataOnly, when defined, must be a boolean.")},N=i=>{if(typeof i!="number"||Number.isNaN(i))throw new TypeError("timestamp must be a number.")},ge=class{async*chunks(t,e=1/0){let r=[],{promise:s,resolve:n}=M(),{promise:a,resolve:o}=M(),c=!1,u=null,d=[],f=()=>Math.max(2,d.length);(async()=>{let m=t??await this.getFirstChunk();for(;m&&!c&&!(m.timestamp/1e6>=e);){if(r.length>f()){({promise:a,resolve:o}=M()),await a;continue}r.push(m),n(),{promise:s,resolve:n}=M(),m=await this.getNextChunk(m)}c=!0,n()})().catch(m=>{u||(u=m,n())});try{for(;;){if(u)throw u;if(r.length>0){yield r.shift();let m=performance.now();for(d.push(m);d.length>0&&m-d[0]>=1e3;)d.shift();o()}else if(!c)await s;else break}}finally{c=!0,o()}}},Te=class{_duplicateFrame(t){return structuredClone(t)}async*mediaFramesAtTimestamps(t){Kt(t);let e=$t(t),r=[],s=8,n=[],{promise:a,resolve:o}=M(),{promise:c,resolve:u}=M(),d=!1,f=!1,m=null,g=null,b=T=>{n.push(T),o(),{promise:a,resolve:o}=M()},p=new Error,k=await this._createDecoder(T=>{if(u(),f){T.close();return}let x=!1;for(;r.length>0&&r[0]===T.timestamp;)b(this._duplicateFrame(T)),r.shift(),x=!0;x?(g?.close(),g=T):T.close()},T=>{m||(T.stack=p.stack,m=T,o())});(async()=>{let T=this._createChunkDrain(),x=null,C=null;for await(let O of e){for(N(O);n.length+k.decodeQueueSize>s;)({promise:c,resolve:u}=M()),await c;if(f)break;let _=await T.getChunk(O);if(!_){b(null);continue}let I=await T.getKeyChunk(O);if(!I){b(null);continue}for(r.push(_.timestamp),x&&I.timestamp===x.timestamp&&_.timestamp>=C.timestamp?(l(C),_.timestamp===C.timestamp&&r.length===1&&(g&&b(this._duplicateFrame(g)),r.shift())):(x=I,C=I,k.decode(I));C.timestamp!==_.timestamp;){let R=await T.getNextChunk(C);l(R),C=R,k.decode(R)}k.decodeQueueSize>=10&&await new Promise(R=>k.addEventListener("dequeue",R,{once:!0}))}await k.flush(),k.close(),d=!0,o()})().catch(T=>{m||(m=T,o())});try{for(;;){if(m)throw m;if(n.length>0){let T=n.shift();l(T!==void 0),yield T,u()}else if(!d)await a;else break}}finally{f=!0,u();for(let T of n)T?.close();g?.close()}}async*mediaFramesInRange(t=0,e=1/0){N(t),N(e);let r=8,s=[],n=!1,a=null,{promise:o,resolve:c}=M(),{promise:u,resolve:d}=M(),f=!1,m=!1,g=null,b=new Error,p=await this._createDecoder(x=>{d();let C=x.timestamp/1e6;if(C>=e&&(m=!0),m){x.close();return}a&&(C>t?(s.push(a),n=!0):a.close()),C>=t&&(s.push(x),n=!0),a=n?null:x,s.length>0&&(c(),{promise:o,resolve:c}=M())},x=>{g||(x.stack=b.stack,g=x,c())}),k=this._createChunkDrain(),T=await k.getKeyChunk(t)??await k.getFirstChunk();if(T){(async()=>{let x=T,C=1/0;if(e<1/0){let _=await k.getChunk(e),I=_?_.type==="key"&&_.timestamp/1e6===e?_:await k.getNextKeyChunk(_):null;I&&(C=I.timestamp/1e6)}let O=k.chunks(T,C);for(await O.next();x&&!m;){if(s.length+p.decodeQueueSize>r){({promise:u,resolve:d}=M()),await u;continue}p.decode(x);let _=await O.next();if(_.done)break;x=_.value}await O.return(),await p.flush(),p.close(),!n&&a&&s.push(a),f=!0,c()})().catch(x=>{g||(g=x,c())});try{for(;;){if(g)throw g;if(s.length>0)yield s.shift(),d();else if(!f)await o;else break}}finally{m=!0,d();for(let x of s)x.close()}}}},Ve=class extends ge{constructor(t){if(!(t instanceof U))throw new TypeError("videoTrack must be an InputVideoTrack.");super(),this._videoTrack=t}getFirstChunk(t={}){return $(t),this._videoTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return N(t),$(e),this._videoTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return $(e),this._videoTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return N(t),$(e),this._videoTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return $(e),this._videoTrack._backing.getNextKeyChunk(t,e)}},Me=class extends Te{constructor(e){if(!(e instanceof U))throw new TypeError("videoTrack must be an InputVideoTrack.");super();this._decoderConfig=null;this._videoTrack=e}async _createDecoder(e,r){this._decoderConfig??=await this._videoTrack.getDecoderConfig();let s=new VideoDecoder({output:e,error:r});return s.configure(this._decoderConfig),s}_createChunkDrain(){return new Ve(this._videoTrack)}async getFrame(e){N(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}frames(e=0,r=1/0){return this.mediaFramesInRange(e,r)}framesAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},gt=class{constructor(t,e){if(!(t instanceof U))throw new TypeError("videoTrack must be an InputVideoTrack.");if(e&&typeof e!="object")throw new TypeError("dimensions, when defined, must be an object.");if(e&&(!Number.isInteger(e.width)||e.width<=0))throw new TypeError("dimensions.width must be a positive integer.");if(e&&(!Number.isInteger(e.height)||e.height<=0))throw new TypeError("dimensions.height must be a positive integer.");this._videoTrack=t,this._dimensions=e,this._videoFrameDrain=new Me(t)}async _videoFrameToWrappedCanvas(t){let e=this._dimensions?.width??await this._videoTrack.getDisplayWidth(),r=this._dimensions?.height??await this._videoTrack.getDisplayHeight(),s=await this._videoTrack.getRotation(),n=document.createElement("canvas");n.width=e,n.height=r;let a=n.getContext("2d",{alpha:!1});l(a),a.translate(e/2,r/2),a.rotate(s*Math.PI/180),a.translate(-e/2,-r/2);let[o,c]=s%180===0?[e,r]:[r,e];a.drawImage(t,(e-o)/2,(r-c)/2,o,c);let u={canvas:n,timestamp:t.timestamp/1e6,duration:(t.duration??0)/1e6};return t.close(),u}async getCanvas(t){N(t);let e=await this._videoFrameDrain.getFrame(t);return e&&this._videoFrameToWrappedCanvas(e)}async*canvases(t=0,e=1/0){for await(let r of this._videoFrameDrain.frames(t,e))yield this._videoFrameToWrappedCanvas(r)}async*canvasesAtTimestamps(t){for await(let e of this._videoFrameDrain.framesAtTimestamps(t))yield e&&this._videoFrameToWrappedCanvas(e)}},De=class extends ge{constructor(t){if(!(t instanceof B))throw new TypeError("audioTrack must be an InputAudioTrack.");super(),this._audioTrack=t}getFirstChunk(t={}){return $(t),this._audioTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return N(t),$(e),this._audioTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return $(e),this._audioTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return N(t),$(e),this._audioTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return $(e),this._audioTrack._backing.getNextKeyChunk(t,e)}},Pe=class extends Te{constructor(e){if(!(e instanceof B))throw new TypeError("audioTrack must be an InputAudioTrack.");super();this._decoderConfig=null;this._audioTrack=e}async _createDecoder(e,r){this._decoderConfig??=await this._audioTrack.getDecoderConfig();let s=new AudioDecoder({output:e,error:r});return s.configure(this._decoderConfig),s}_createChunkDrain(){return new De(this._audioTrack)}async getData(e){N(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}data(e=0,r=1/0){return this.mediaFramesInRange(e,r)}dataAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},Tt=class{constructor(t){if(!(t instanceof B))throw new TypeError("audioTrack must be an InputAudioTrack.");this._audioDataDrain=new Pe(t)}_audioDataToWrappedArrayBuffer(t){let e=new AudioBuffer({numberOfChannels:t.numberOfChannels,length:t.numberOfFrames,sampleRate:t.sampleRate}),r=new Float32Array(t.allocationSize({planeIndex:0,format:"f32-planar"})/4);for(let a=0;ai&&i[i.length-1],X=i=>i>=0&&i<2**32,O=(i,t,e)=>{let r=0;for(let n=t;n>o;r<<=1,r|=c}return r},Mt=(i,t,e,r)=>{for(let n=t;n>e-n-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),D=new TextEncoder,rt=i=>Object.fromEntries(Object.entries(i).map(([t,e])=>[e,t])),Y={bt709:1,bt470bg:5,smpte170m:6},Dt=rt(Y),Z={bt709:1,smpte170m:6,"iec61966-2-1":13},Pt=rt(Z),J={rgb:0,bt709:1,bt470bg:5,smpte170m:6},zt=rt(J),Oe=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,it=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),$=class{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let t,e=new Promise(n=>{t=n}),r=this.currentPromise;return this.currentPromise=e,await r,t}},q=i=>{let t=i*(Math.PI/180),e=Math.cos(t),r=Math.sin(t);return[e,r,0,-r,e,0,0,0,1]},at=q(0),Ut=i=>[...i].map(t=>t.toString(16).padStart(2,"0")).join(""),Bt=i=>(i=i>>1&1431655765|(i&1431655765)<<1,i=i>>2&858993459|(i&858993459)<<2,i=i>>4&252645135|(i&252645135)<<4,i=i>>8&16711935|(i&16711935)<<8,i=i>>16&65535|(i&65535)<<16,i>>>0),Q=(i,t,e)=>{let r=0,n=i.length-1,a=-1;for(;r<=n;){let s=r+n>>1,o=e(i[s]);o===t?(a=s,n=s-1):o{let r=-1,n=0,a=i.length-1;for(;n<=a;){let s=n+(a-n+1)/2|0;e(i[s])<=t?(r=s,n=s+1):a=s-1}return r},E=()=>{let i,t;return{promise:new Promise((r,n)=>{i=r,t=n}),resolve:i,reject:t}},Nt=(i,t)=>{let e=i.indexOf(t);e!==-1&&i.splice(e,1)},Wt=(i,t)=>{for(let e=i.length-1;e>=0;e--)if(t(i[e]))return e;return-1},Ht=async function*(i){Symbol.iterator in i?yield*i[Symbol.iterator]():yield*i[Symbol.asyncIterator]()},Lt=i=>{if(!(Symbol.iterator in i)&&!(Symbol.asyncIterator in i))throw new TypeError("Argument must be an iterable or async iterable.")};var be=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,Tr=/^WEBVTT(.|\n)*?\n{2}/,se=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Ee=class{constructor(t){this.preambleText=null;this.preambleEmitted=!1;this.options=t}parse(t){t=t.replaceAll(`\r +function l(i){if(!i)throw new Error("Assertion failed.")}var F=i=>i&&i[i.length-1],G=i=>i>=0&&i<2**32,V=(i,t,e)=>{let r=0;for(let s=t;s>o;r<<=1,r|=c}return r},Dt=(i,t,e,r)=>{for(let s=t;s>e-s-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),P=new TextEncoder,rt=i=>Object.fromEntries(Object.entries(i).map(([t,e])=>[e,t])),Z={bt709:1,bt470bg:5,smpte170m:6},Pt=rt(Z),J={bt709:1,smpte170m:6,"iec61966-2-1":13},zt=rt(J),ee={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Ut=rt(ee),Re=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,it=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),j=class{constructor(){this.currentPromise=Promise.resolve()}async acquire(){let t,e=new Promise(s=>{t=s}),r=this.currentPromise;return this.currentPromise=e,await r,t}},q=i=>{let t=i*(Math.PI/180),e=Math.cos(t),r=Math.sin(t);return[e,r,0,-r,e,0,0,0,1]},nt=q(0),Bt=i=>[...i].map(t=>t.toString(16).padStart(2,"0")).join(""),Nt=i=>(i=i>>1&1431655765|(i&1431655765)<<1,i=i>>2&858993459|(i&858993459)<<2,i=i>>4&252645135|(i&252645135)<<4,i=i>>8&16711935|(i&16711935)<<8,i=i>>16&65535|(i&65535)<<16,i>>>0),Q=(i,t,e)=>{let r=0,s=i.length-1,n=-1;for(;r<=s;){let a=r+s>>1,o=e(i[a]);o===t?(n=a,s=a-1):o{let r=-1,s=0,n=i.length-1;for(;s<=n;){let a=s+(n-s+1)/2|0;e(i[a])<=t?(r=a,s=a+1):n=a-1}return r},M=()=>{let i,t;return{promise:new Promise((r,s)=>{i=r,t=s}),resolve:i,reject:t}},Wt=(i,t)=>{let e=i.indexOf(t);e!==-1&&i.splice(e,1)},Ht=(i,t)=>{for(let e=i.length-1;e>=0;e--)if(t(i[e]))return e;return-1},Lt=async function*(i){Symbol.iterator in i?yield*i[Symbol.iterator]():yield*i[Symbol.asyncIterator]()},Qt=i=>{if(!(Symbol.iterator in i)&&!(Symbol.asyncIterator in i))throw new TypeError("Argument must be an iterable or async iterable.")};var be=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,xr=/^WEBVTT(.|\n)*?\n{2}/,ae=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Oe=class{constructor(t){this.preambleText=null;this.preambleEmitted=!1;this.options=t}parse(t){t=t.replaceAll(`\r `,` `).replaceAll("\r",` -`),be.lastIndex=0;let e;if(!this.preambleText){if(!Tr.test(t)){let n=new Error("WebVTT preamble incorrect.");throw this.options.error(n),n}e=be.exec(t);let r=t.slice(0,e?.index??t.length).trimEnd();if(!r){let n=new Error("No WebVTT preamble provided.");throw this.options.error(n),n}this.preambleText=r,e&&(t=t.slice(e.index),be.lastIndex=0)}for(;e=be.exec(t);){let r=t.slice(0,e.index),n=e[1],a=e.index+e[0].length,s=t.indexOf(` -`,a)+1,o=t.slice(a,s).trim(),c=t.indexOf(` +`),be.lastIndex=0;let e;if(!this.preambleText){if(!xr.test(t)){let s=new Error("WebVTT preamble incorrect.");throw this.options.error(s),s}e=be.exec(t);let r=t.slice(0,e?.index??t.length).trimEnd();if(!r){let s=new Error("No WebVTT preamble provided.");throw this.options.error(s),s}this.preambleText=r,e&&(t=t.slice(e.index),be.lastIndex=0)}for(;e=be.exec(t);){let r=t.slice(0,e.index),s=e[1],n=e.index+e[0].length,a=t.indexOf(` +`,n)+1,o=t.slice(n,a).trim(),c=t.indexOf(` -`,a);c===-1&&(c=t.length);let u=Fe(e[2]),l=Fe(e[3])-u,f=t.slice(s,c).trim();t=t.slice(c).trimStart(),be.lastIndex=0;let g={timestamp:u/1e3,duration:l/1e3,text:f,identifier:n,settings:o,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(g,b)}}},xr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,Fe=i=>{let t=xr.exec(i);if(!t)throw new Error("Expected match.");return 60*60*1e3*Number(t[1]||"0")+60*1e3*Number(t[2])+1e3*Number(t[3])+Number(t[4])},Ve=i=>{let t=Math.floor(i/36e5),e=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),n=i%1e3;return t.toString().padStart(2,"0")+":"+e.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+n.toString().padStart(3,"0")};var ke=class{constructor(t){this.writer=t;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap}writeU32(t){this.helperView.setUint32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(t){this.helperView.setUint32(0,Math.floor(t/2**32),!1),this.helperView.setUint32(4,t,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(t){for(let e=0;e[(i%256+256)%256],C=i=>(N.setUint16(0,i,!1),[x[0],x[1]]),Cr=i=>(N.setInt16(0,i,!1),[x[0],x[1]]),Kt=i=>(N.setUint32(0,i,!1),[x[1],x[2],x[3]]),p=i=>(N.setUint32(0,i,!1),[x[0],x[1],x[2],x[3]]),jt=i=>(N.setInt32(0,i,!1),[x[0],x[1],x[2],x[3]]),ee=i=>(N.setUint32(0,Math.floor(i/2**32),!1),N.setUint32(4,i,!1),[x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]]),ot=i=>(N.setInt16(0,2**8*i,!1),[x[0],x[1]]),B=i=>(N.setInt32(0,2**16*i,!1),[x[0],x[1],x[2],x[3]]),nt=i=>(N.setInt32(0,2**30*i,!1),[x[0],x[1],x[2],x[3]]),st=(i,t)=>{let e=[],r=i;do{let n=r&127;r>>=7,e.length>0&&(n|=128),e.push(n),t!==void 0&&t--}while(r>0||t);return e.reverse()},V=(i,t=!1)=>{let e=Array(i.length).fill(null).map((r,n)=>i.charCodeAt(n));return t&&e.push(0),e},ct=i=>{let t=null;for(let e of i)(!t||e.timestamp>t.timestamp)&&(t=e);return t},$t=i=>[B(i[0]),B(i[1]),nt(i[2]),B(i[3]),B(i[4]),nt(i[5]),B(i[6]),B(i[7]),nt(i[8])],w=(i,t,e)=>({type:i,contents:t&&new Uint8Array(t.flat(10)),children:e}),S=(i,t,e,r,n)=>w(i,[I(t),Kt(e),r??[]],n),qt=i=>i.fragmented?w("ftyp",[V("iso5"),p(512),V("iso5"),V("iso6"),V("mp41")]):w("ftyp",[V("isom"),p(512),V("isom"),i.holdsAvc?V("avc1"):[],V("mp41")]),De=i=>({type:"mdat",largeSize:i}),Xt=i=>({type:"free",size:i}),ge=(i,t,e=!1)=>w("moov",void 0,[wr(t,i),...i.map(r=>yr(r,t)),e?ri(i):null]),wr=(i,t)=>{let e=P(Math.max(0,...t.filter(s=>s.samples.length>0).map(s=>{let o=ct(s.samples);return o.timestamp+o.duration})),Me),r=Math.max(0,...t.map(s=>s.track.id))+1,n=!X(i)||!X(e),a=n?ee:p;return S("mvhd",+n,0,[a(i),a(i),p(Me),a(e),B(1),ot(1),Array(10).fill(0),$t(at),Array(24).fill(0),p(r)])},yr=(i,t)=>w("trak",void 0,[Sr(i,t),vr(i,t)]),Sr=(i,t)=>{let e=ct(i.samples),r=P(e?e.timestamp+e.duration:0,Me),n=!X(t)||!X(r),a=n?ee:p,s;if(i.type==="video"){let o=i.track.metadata.rotation;s=o===void 0||typeof o=="number"?q(o??0):o}else s=at;return S("tkhd",+n,3,[a(t),a(t),p(i.track.id),p(0),a(r),Array(8).fill(0),C(0),C(i.track.id),ot(i.type==="audio"?1:0),C(0),$t(s),B(i.type==="video"?i.info.width:0),B(i.type==="video"?i.info.height:0)])},vr=(i,t)=>w("mdia",void 0,[Ir(i,t),Rr(i),Or(i)]),Ir=(i,t)=>{let e=ct(i.samples),r=P(e?e.timestamp+e.duration:0,i.timescale),n=!X(t)||!X(r),a=n?ee:p;return S("mdhd",+n,0,[a(t),a(t),p(i.timescale),a(r),C(21956),C(0)])},_r={video:"vide",audio:"soun",subtitle:"text"},Ar={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Rr=i=>S("hdlr",0,0,[V("mhlr"),V(_r[i.type]),p(0),p(0),p(0),V(Ar[i.type],!0)]),Or=i=>w("minf",void 0,[Mr[i.type](),Dr(),Ur(i)]),Er=()=>S("vmhd",0,1,[C(0),C(0),C(0),C(0)]),Fr=()=>S("smhd",0,0,[C(0),C(0)]),Vr=()=>S("nmhd",0,0),Mr={video:Er,audio:Fr,subtitle:Vr},Dr=()=>w("dinf",void 0,[Pr()]),Pr=()=>S("dref",0,0,[p(1)],[zr()]),zr=()=>S("url ",0,1),Ur=i=>{let t=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(e=>e.sampleCompositionTimeOffset!==0);return w("stbl",void 0,[Br(i),Gr(i),Yr(i),Zr(i),Jr(i),ei(i),t?ti(i):null])},Br=i=>{let t;return i.type==="video"?t=Nr(mi[i.track.source._codec],i):i.type==="audio"?t=Kr(fi[i.track.source._codec],i):i.type==="subtitle"&&(t=qr(pi[i.track.source._codec],i)),m(t),S("stsd",0,0,[p(1)],[t])},Nr=(i,t)=>w(i,[Array(6).fill(0),C(1),C(0),C(0),Array(12).fill(0),C(t.info.width),C(t.info.height),p(4718592),p(4718592),p(0),C(1),Array(32).fill(0),C(24),Cr(65535)],[li[t.track.source._codec](t),Oe(t.info.decoderConfig.colorSpace)?Wr(t):null]),Wr=i=>w("colr",[V("nclx"),C(Y[i.info.decoderConfig.colorSpace.primaries]),C(Z[i.info.decoderConfig.colorSpace.transfer]),C(J[i.info.decoderConfig.colorSpace.matrix]),I((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Hr=i=>i.info.decoderConfig&&w("avcC",[...G(i.info.decoderConfig.description)]),Lr=i=>i.info.decoderConfig&&w("hvcC",[...G(i.info.decoderConfig.description)]),Qt=i=>{if(!i.info.decoderConfig)return null;let t=i.info.decoderConfig;m(t.colorSpace);let e=t.codec.split("."),r=Number(e[1]),n=Number(e[2]),o=(Number(e[3])<<4)+(0<<1)+Number(t.colorSpace.fullRange);return S("vpcC",1,0,[I(r),I(n),I(o),I(2),I(2),I(2),C(0)])},Qr=()=>w("av1C",[129,0,0,0]),Kr=(i,t)=>w(i,[Array(6).fill(0),C(1),C(0),C(0),p(0),C(t.info.numberOfChannels),C(16),C(0),C(0),B(t.info.sampleRate)],[hi[t.track.source._codec](t)]),jr=i=>{let e=[...G(i.info.decoderConfig.description??new ArrayBuffer(0))];return e=[...I(64),...I(21),...Kt(0),...p(0),...p(0),...I(5),...st(e.length),...e],e=[...C(1),...I(0),...I(4),...st(e.length),...e,...I(6),...I(1),...I(2)],e=[...I(3),...st(e.length),...e],S("esds",0,0,e)},$r=i=>{let t=3840,e=0,r=i.info.decoderConfig?.description;if(r){m(r.byteLength>=18);let n=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);t=n.getUint16(10,!0),e=n.getInt16(14,!0)}return w("dOps",[I(0),I(i.info.numberOfChannels),C(t),p(i.info.sampleRate),ot(e),I(0)])},qr=(i,t)=>w(i,[Array(6).fill(0),C(1)],[bi[t.track.source._codec](t)]),Xr=i=>w("vttC",[...D.encode(i.info.config.description)]);var Gr=i=>S("stts",0,0,[p(i.timeToSampleTable.length),i.timeToSampleTable.map(t=>[p(t.sampleCount),p(t.sampleDelta)])]),Yr=i=>{if(i.samples.every(e=>e.type==="key"))return null;let t=[...i.samples.entries()].filter(([,e])=>e.type==="key");return S("stss",0,0,[p(t.length),t.map(([e])=>p(e+1))])},Zr=i=>S("stsc",0,0,[p(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(t=>[p(t.firstChunk),p(t.samplesPerChunk),p(1)])]),Jr=i=>S("stsz",0,0,[p(0),p(i.samples.length),i.samples.map(t=>p(t.size))]),ei=i=>i.finalizedChunks.length>0&&R(i.finalizedChunks).offset>=2**32?S("co64",0,0,[p(i.finalizedChunks.length),i.finalizedChunks.map(t=>ee(t.offset))]):S("stco",0,0,[p(i.finalizedChunks.length),i.finalizedChunks.map(t=>p(t.offset))]),ti=i=>S("ctts",0,0,[p(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(t=>[p(t.sampleCount),p(t.sampleCompositionTimeOffset)])]),ri=i=>w("mvex",void 0,i.map(ii)),ii=i=>S("trex",0,0,[p(i.track.id),p(1),p(0),p(0),p(0)]),ut=(i,t)=>w("moof",void 0,[ai(i),...t.map(ni)]),ai=i=>S("mfhd",0,0,[p(i)]),Gt=i=>{let t=0,e=0,r=0,n=0,a=i.type==="delta";return e|=+a,a?t|=1:t|=2,t<<24|e<<16|r<<8|n},ni=i=>w("traf",void 0,[si(i),oi(i),ci(i)]),si=i=>{m(i.currentChunk);let t=0;t|=8,t|=16,t|=32,t|=131072;let e=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:e.timescaleUnitsToNextSample,size:e.size,flags:Gt(e)};return S("tfhd",0,t,[p(i.track.id),p(r.duration),p(r.size),p(r.flags)])},oi=i=>(m(i.currentChunk),S("tfdt",1,0,[ee(P(i.currentChunk.startTimestamp,i.timescale))])),ci=i=>{m(i.currentChunk);let t=i.currentChunk.samples.map(h=>h.timescaleUnitsToNextSample),e=i.currentChunk.samples.map(h=>h.size),r=i.currentChunk.samples.map(Gt),n=i.currentChunk.samples.map(h=>P(h.timestamp-h.decodeTimestamp,i.timescale)),a=new Set(t),s=new Set(e),o=new Set(r),c=new Set(n),u=o.size===2&&r[0]!==r[1],d=a.size>1,l=s.size>1,f=!u&&o.size>1,g=c.size>1||[...c].some(h=>h!==0),b=0;return b|=1,b|=4*+u,b|=256*+d,b|=512*+l,b|=1024*+f,b|=2048*+g,S("trun",1,b,[p(i.currentChunk.samples.length),p(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?p(r[0]):[],i.currentChunk.samples.map((h,k)=>[d?p(t[k]):[],l?p(e[k]):[],f?p(r[k]):[],g?jt(n[k]):[]])])},Yt=i=>w("mfra",void 0,[...i.map(ui),di()]),ui=(i,t)=>S("tfra",1,0,[p(i.track.id),p(63),p(i.finalizedChunks.length),i.finalizedChunks.map(r=>[ee(P(r.samples[0].timestamp,i.timescale)),ee(r.moofOffset),p(t+1),p(1),p(1)])]),di=()=>S("mfro",0,0,[p(0)]),Zt=()=>w("vtte"),Jt=(i,t,e,r,n)=>w("vttc",void 0,[n!==null?w("vsid",[jt(n)]):null,e!==null?w("iden",[...D.encode(e)]):null,t!==null?w("ctim",[...D.encode(Ve(t))]):null,r!==null?w("sttg",[...D.encode(r)]):null,w("payl",[...D.encode(i)])]),er=i=>w("vtta",[...D.encode(i)]),mi={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},li={avc:Hr,hevc:Lr,vp8:Qt,vp9:Qt,av1:Qr},fi={aac:"mp4a",opus:"Opus"},hi={aac:jr,opus:$r},pi={webvtt:"wvtt"},bi={webvtt:Xr};var oe=class{constructor(t){this.mutex=new $;this.trackTimestampInfo=new WeakMap;this.output=t}beforeTrackAdd(t){}onTrackClose(t){}validateAndNormalizeTimestamp(t,e,r){let n=e/1e6,a=this.trackTimestampInfo.get(t);if(!a){if(!r)throw new Error("First frame must be a key frame.");if(this.timestampsMustStartAtZero&&n>0)throw new Error(`Timestamps must start at zero (got ${n}s).`);a={timestampOffset:n,maxTimestamp:t.source._offsetTimestamps?0:n,lastKeyFrameTimestamp:t.source._offsetTimestamps?0:n},this.trackTimestampInfo.set(t,a)}if(t.source._offsetTimestamps&&(n-=a.timestampOffset),n<0)throw new Error(`Timestamps must be non-negative (got ${n}s).`);if(nn.start-a.start);e.push({start:r[0].start,size:r[0].data.byteLength});for(let n=1;nu.start<=r&&rgi){for(let u=0;u=e.written[s+1].start;)e.written[s].end=Math.max(e.written[s].end,e.written[s+1].end),e.written.splice(s+1,1)}createChunk(e){let n={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(n),this.chunks.sort((a,s)=>a.start-s.start),this.chunks.indexOf(n)}queueChunksForFlush(e=!1){m(this.writer);for(let r=0;r{if(i==="avc"){let a=Math.ceil(t/16)*Math.ceil(e/16),s=tr.find(l=>a<=l.maxMacroblocks&&r<=l.maxBitrate)??R(tr),o=s?s.level:0,c="64".padStart(2,"0"),u="00",d=o.toString(16).padStart(2,"0");return`avc1.${c}${u}${d}`}else if(i==="hevc"){let n="",s="6",o=t*e,c=rr.find(d=>o<=d.maxPictureSize&&r<=d.maxBitrate)??R(rr);return`hev1.${n}1.${s}.${c.tier}${c.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let n="00",a=t*e,s=ir.find(c=>a<=c.maxPictureSize&&r<=c.maxBitrate)??R(ir);return`vp09.${n}.${s.level}.08`}else if(i==="av1"){let a=t*e,s=ar.find(c=>a<=c.maxPictureSize&&r<=c.maxBitrate)??R(ar);return`av01.0.${s.level.toString().padStart(2,"0")}${s.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},sr=(i,t)=>{if(i==="avc"){if(!t||t.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${Ut(t.subarray(1,4))}`}else if(i==="hevc"){if(!t)throw new TypeError("HEVC description must be provided.");let e=new DataView(t.buffer,t.byteOffset,t.byteLength),r="hev1.",n=t[1]>>6&3,a=t[1]&31;r+=["","A","B","C"][n]+a,r+=".";let s=Bt(e.getUint32(2));r+=s.toString(16),r+=".";let o=t[1]>>5&1,c=t[12];r+=o===0?"L":"H",r+=c,r+=".";let u=[];for(let d=0;d<6;d++){let l=t[d+13];u.push(l)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(d=>d.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},or=(i,t,e)=>{if(i==="aac")return t>=2&&e<=24e3?"mp4a.40.29":e<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},cr=(i,t)=>{if(i==="aac")return`mp4a.40.${mt(t).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},mt=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let t=0,e=O(i,t,t+5);t+=5,e===31&&(e=32+O(i,t,t+6),t+=6);let r=O(i,t,t+4);t+=4;let n=null;if(r===15)n=O(i,t,t+24),t+=24;else{let o=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];r=1&&a<=7&&(s={1:1,2:2,3:3,4:4,5:5,6:6,7:8}[a]),{objectType:e,frequencyIndex:r,sampleRate:n,channelConfiguration:a,numberOfChannels:s}},ur=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},dr=i=>i==="aac"?{aac:{format:"aac"}}:i==="opus"?{opus:{format:"opus"}}:{},Be=i=>{if(!i)throw new TypeError("Video chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Video chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Video chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.codedWidth)||i.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(i.decoderConfig.codedHeight)||i.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(i.decoderConfig.description!==void 0&&!it(i.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.colorSpace!==void 0){let{colorSpace:t}=i.decoderConfig;if(typeof t!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let e=Object.keys(Y);if(t.primaries!=null&&!e.includes(t.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${e.join(", ")}.`);let r=Object.keys(Z);if(t.transfer!=null&&!r.includes(t.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let n=Object.keys(J);if(t.matrix!=null&&!n.includes(t.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${n.join(", ")}.`);if(t.fullRange!=null&&typeof t.fullRange!="boolean")throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if((i.decoderConfig.codec.startsWith("avc1")||i.decoderConfig.codec.startsWith("avc3"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for AVC must include a description, which is expected to be an AVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec.startsWith("hev1")||i.decoderConfig.codec.startsWith("hvc1"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for HEVC must include a description, which is expected to be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec==="vp8"||i.decoderConfig.codec.startsWith("vp09"))&&i.decoderConfig.colorSpace===void 0)throw new TypeError("Video chunk metadata decoder configuration for VP8/VP9 must include a colorSpace.")},Ne=i=>{if(!i)throw new TypeError("Audio chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Audio chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.sampleRate)||i.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(i.decoderConfig.numberOfChannels)||i.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(i.decoderConfig.description!==void 0&&!it(i.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.codec.startsWith("mp4a")&&!i.decoderConfig.description)throw new 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.");if(i.decoderConfig.codec==="opus"&&i.decoderConfig.description&&i.decoderConfig.description.byteLength<18)throw new TypeError("Invalid decoder description provided for Opus; must be at least 18 bytes long.")},We=i=>{if(!i)throw new TypeError("Subtitle metadata must be provided.");if(typeof i!="object")throw new TypeError("Subtitle metadata must be an object.");if(!i.config)throw new TypeError("Subtitle metadata must include a config object.");if(typeof i.config!="object")throw new TypeError("Subtitle metadata config must be an object.");if(typeof i.config.description!="string")throw new TypeError("Subtitle metadata config description must be a string.")};var Me=1e3,Ti=2082844800,P=(i,t,e=!0)=>{let r=i*t;return e?Math.round(r):r},He=class extends oe{constructor(e,r){super(e);this.timestampsMustStartAtZero=!0;this.auxTarget=new xe;this.auxWriter=this.auxTarget._createWriter();this.auxBoxWriter=new ke(this.auxWriter);this.ftypSize=null;this.mdat=null;this.trackDatas=[];this.creationTime=Math.floor(Date.now()/1e3)+Ti;this.finalizedChunks=[];this.nextFragmentNumber=1;this.writer=e._writer,this.boxWriter=new ke(this.writer);let n=this.writer instanceof ce?"in-memory":!1;this.fastStart=r._options.fastStart??n,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),r=this.output._tracks.some(n=>n.type==="video"&&n.source._codec==="avc");this.boxWriter.writeBox(qt({holdsAvc:r,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=De(!1):this.fastStart==="fragmented"||(this.mdat=De(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,r){let n=this.trackDatas.find(s=>s.track===e);if(n)return n;Be(r),m(r),m(r.decoderConfig),m(r.decoderConfig.codedWidth!==void 0),m(r.decoderConfig.codedHeight!==void 0);let a={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),a}getAudioTrackData(e,r){let n=this.trackDatas.find(s=>s.track===e);if(n)return n;Ne(r),m(r),m(r.decoderConfig);let a={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},timescale:r.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),a}getSubtitleTrackData(e,r){let n=this.trackDatas.find(s=>s.track===e);if(n)return n;We(r),m(r),m(r.config);let a={track:e,type:"subtitle",info:{config:r.config},timescale:1e3,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],lastCueEndTimestamp:0,cueQueue:[],nextSourceId:0,cueToSourceId:new WeakMap};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),this.validateAndNormalizeTimestamp(e,0,!0),a}async addEncodedVideoChunk(e,r,n){let a=await this.mutex.acquire();try{let s=this.getVideoTrackData(e,n),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=this.validateAndNormalizeTimestamp(s.track,r.timestamp,r.type==="key"),u=this.createSampleForTrack(s,o,c,(r.duration??0)/1e6,r.type);await this.registerSample(s,u)}finally{a()}}async addEncodedAudioChunk(e,r,n){let a=await this.mutex.acquire();try{let s=this.getAudioTrackData(e,n),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=this.validateAndNormalizeTimestamp(s.track,r.timestamp,c==="key"),d=this.createSampleForTrack(s,o,u,(r.duration??0)/1e6,c);await this.registerSample(s,d)}finally{a()}}async addSubtitleCue(e,r,n){let a=await this.mutex.acquire();try{let s=this.getSubtitleTrackData(e,n);this.validateAndNormalizeTimestamp(s.track,1e6*r.timestamp,!0),e.source._codec==="webvtt"&&(s.cueQueue.push(r),await this.processWebVTTCues(s,r.timestamp))}finally{a()}}async processWebVTTCues(e,r){for(;e.cueQueue.length>0;){let n=new Set([]);for(let d of e.cueQueue)m(d.timestamp<=r),m(e.lastCueEndTimestamp<=d.timestamp+d.duration),n.add(Math.max(d.timestamp,e.lastCueEndTimestamp)),n.add(d.timestamp+d.duration);let a=[...n].sort((d,l)=>d-l),s=a[0],o=a[1]??s;if(r=o)break;se.lastIndex=0;let f=se.test(l.text),g=l.timestamp+l.duration,b=e.cueToSourceId.get(l);if(b===void 0&&on.timestamp).sort((n,a)=>n-a);for(let n=0;n{if(e===o)return r.type==="key";let c=o.sampleQueue[0];return c&&c.type==="key"});a>=1&&s&&(n=!0,await this.finalizeFragment())}else n=a>=.5}n&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:r.timestamp,samples:[],offset:null,moofOffset:null}),m(e.currentChunk),e.currentChunk.samples.push(r),e.timestampProcessingQueue.push(r)}async finalizeCurrentChunk(e){if(m(this.fastStart!=="fragmented"),!!e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),this.finalizedChunks.push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||R(e.compactlyCodedChunkTable).samplesPerChunk!==e.currentChunk.samples.length)&&e.compactlyCodedChunkTable.push({firstChunk:e.finalizedChunks.length,samplesPerChunk:e.currentChunk.samples.length}),this.fastStart==="in-memory"){e.currentChunk.offset=0;return}e.currentChunk.offset=this.writer.getPos();for(let r of e.currentChunk.samples)m(r.data),this.writer.write(r.data),r.data=null;await this.writer.flush()}}async interleaveSamples(){m(this.fastStart==="fragmented");for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(r=>r.track===e))return;e:for(;;){let e=null,r=1/0;for(let a of this.trackDatas){if(a.sampleQueue.length===0&&!a.track.source._closed)break e;a.sampleQueue.length>0&&a.sampleQueue[0].timestampu.currentChunk),a=this.writer.getPos(),s=ut(r,n);this.boxWriter.writeBox(s);{let u=De(!1),d=0;for(let f of n)for(let g of f.currentChunk.samples)d+=g.size;let l=this.boxWriter.measureBox(u)+d;l>=2**32&&(u.largeSize=!0,l=this.boxWriter.measureBox(u)+d),u.size=l,this.boxWriter.writeBox(u)}for(let u of n){u.currentChunk.offset=this.writer.getPos(),u.currentChunk.moofOffset=a;for(let d of u.currentChunk.samples)this.writer.write(d.data),d.data=null}let o=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(s));let c=ut(r,n);this.boxWriter.writeBox(c),this.writer.seek(o);for(let u of n)u.finalizedChunks.push(u.currentChunk),this.finalizedChunks.push(u.currentChunk),u.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let r=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let n=this.trackDatas.find(a=>a.track===e);n&&await this.processWebVTTCues(n,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),r()}async finalize(){let e=await this.mutex.acquire();for(let r of this.trackDatas)r.type==="subtitle"&&r.track.source._codec==="webvtt"&&await this.processWebVTTCues(r,1/0);if(this.fastStart==="fragmented"){for(let r of this.trackDatas){for(let n of r.sampleQueue)await this.addSampleToTrack(r,n);this.processTimestamps(r)}await this.finalizeFragment(!1)}else for(let r of this.trackDatas)this.processTimestamps(r),await this.finalizeCurrentChunk(r);if(this.fastStart==="in-memory"){m(this.mdat);let r;for(let a=0;a<2;a++){let s=ge(this.trackDatas,this.creationTime),o=this.boxWriter.measureBox(s);r=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+o+r;for(let u of this.finalizedChunks){u.offset=c;for(let{data:d}of u.samples)m(d),c+=d.byteLength,r+=d.byteLength}if(c<2**32)break;r>=2**32&&(this.mdat.largeSize=!0)}let n=ge(this.trackDatas,this.creationTime);this.boxWriter.writeBox(n),this.mdat.size=r,this.boxWriter.writeBox(this.mdat);for(let a of this.finalizedChunks)for(let s of a.samples)m(s.data),this.writer.write(s.data),s.data=null}else if(this.fastStart==="fragmented"){let r=this.writer.getPos(),n=Yt(this.trackDatas);this.boxWriter.writeBox(n);let a=this.writer.getPos()-r;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(a)}else{m(this.mdat),m(this.ftypSize!==null);let r=this.boxWriter.offsets.get(this.mdat);m(r!==void 0);let n=this.writer.getPos()-r;this.mdat.size=n,this.mdat.largeSize=n>=2**32,this.boxWriter.patchBox(this.mdat);let a=ge(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(a);let s=r-this.writer.getPos();this.boxWriter.writeBox(Xt(s))}else this.boxWriter.writeBox(a)}e()}};var Ce=class{constructor(t){this.value=t}},me=class{constructor(t){this.value=t}},we=class{constructor(t){this.value=t}};var lt=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,ft=i=>i>=-64&&i<64?1:i>=-8192&&i<8192?2:i>=-(1<<20)&&i<1<<20?3:i>=-(1<<27)&&i<1<<27?4:i>=-(2**34)&&i<2**34?5:6,mr=i=>{if(i<127)return 1;if(i<16383)return 2;if(i<(1<<21)-1)return 3;if(i<(1<<28)-1)return 4;if(i<2**35-1)return 5;if(i<2**42-1)return 6;throw new Error("EBML VINT size not supported "+i)};var ht=2**15,lr="https://github.com/Vanilagy/webm-muxer",fr=6,hr=5,xi={avc:"V_MPEG4/ISO/AVC",hevc:"V_MPEGH/ISO/HEVC",vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1",aac:"A_AAC",opus:"A_OPUS",webvtt:"S_TEXT/WEBVTT"},Ci={video:1,audio:2,subtitle:17},Le=class extends oe{constructor(e,r){super(e);this.timestampsMustStartAtZero=!1;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap;this.dataOffsets=new WeakMap;this.trackDatas=[];this.segment=null;this.segmentInfo=null;this.seekHead=null;this.tracksElement=null;this.segmentDuration=null;this.cues=null;this.currentCluster=null;this.currentClusterMsTimestamp=null;this.trackDatasInCurrentCluster=new Set;this.duration=0;this.writer=e._writer,this.format=r,this.format._options.streamable&&(this.writer.ensureMonotonicity=!0)}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=lt(e)){let n=0;switch(r){case 6:this.helperView.setUint8(n++,e/2**40|0);case 5:this.helperView.setUint8(n++,e/2**32|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 new Error("Bad UINT size "+r)}this.writer.write(this.helper.subarray(0,n))}writeSignedInt(e,r=ft(e)){e<0&&(e+=2**(r*8)),this.writeUnsignedInt(e,r)}writeEBMLVarInt(e,r=mr(e)){let 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/2**32&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/2**40&3),this.helperView.setUint8(n++,e/2**32|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 new Error("Bad EBML VINT size "+r)}this.writer.write(this.helper.subarray(0,n))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(r=>r.charCodeAt(0))))}writeEBML(e){if(e!==null){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(),n=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+n);let a=this.writer.getPos();if(this.dataOffsets.set(e,a),this.writeEBML(e.data),e.size!==-1){let s=this.writer.getPos()-a,o=this.writer.getPos();this.writer.seek(r),this.writeEBMLVarInt(s,n),this.writer.seek(o)}}else if(typeof e.data=="number"){let r=e.size??lt(e.data);this.writeEBMLVarInt(r),this.writeUnsignedInt(e.data,r)}else if(typeof e.data=="string")this.writeEBMLVarInt(e.data.length),this.writeString(e.data);else if(e.data instanceof Uint8Array)this.writeEBMLVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof Ce)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof me)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof we){let r=e.size??ft(e.data.value);this.writeEBMLVarInt(r),this.writeSignedInt(e.data.value,r)}}}beforeTrackAdd(e){if(this.format instanceof le)if(e.type==="video"){if(!["vp8","vp9","av1"].includes(e.source._codec))throw new Error("WebM only supports VP8, VP9 and AV1 as video codecs. Switching to MKV removes this restriction.")}else if(e.type==="audio"){if(!["opus","vorbis"].includes(e.source._codec))throw new Error("WebM only supports Opus and Vorbis as audio codecs. Switching to MKV removes this restriction.")}else if(e.type==="subtitle"){if(e.source._codec!=="webvtt")throw new Error("WebM only supports WebVTT as subtitle codec. Switching to MKV removes this restriction.")}else throw new Error("WebM only supports video, audio and subtitle tracks. Switching to MKV removes this restriction.")}async start(){let e=await this.mutex.acquire();this.writeEBMLHeader(),this.format._options.streamable||this.createSeekHead(),this.createSegmentInfo(),this.createCues(),await this.writer.flush(),e()}writeEBMLHeader(){let e={id:440786851,data:[{id:17030,data:1},{id:17143,data:1},{id:17138,data:4},{id:17139,data:8},{id:17026,data:this.format instanceof le?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),r=new Uint8Array([21,73,169,102]),n=new Uint8Array([22,84,174,107]),a={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:n},{id:21420,size:5,data:0}]}]};this.seekHead=a}createSegmentInfo(){let e={id:17545,data:new me(0)};this.segmentDuration=e;let r={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:lr},{id:22337,data:lr},this.format._options.streamable?null:e]};this.segmentInfo=r}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let r of this.trackDatas)e.data.push({id:174,data:[{id:215,data:r.track.id},{id:29637,data:r.track.id},{id:131,data:Ci[r.type]},{id:134,data:xi[r.track.source._codec]},r.type==="video"?this.videoSpecificTrackInfo(r):null,r.type==="audio"?this.audioSpecificTrackInfo(r):null,r.type==="subtitle"?this.subtitleSpecificTrackInfo(r):null]})}videoSpecificTrackInfo(e){let r=[e.info.decoderConfig.description?{id:25506,data:G(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],n=e.info.decoderConfig.colorSpace,a={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},Oe(n)?{id:21936,data:[{id:21937,data:J[n.matrix]},{id:21946,data:Z[n.transfer]},{id:21947,data:Y[n.primaries]},{id:21945,data:n.fullRange?2:1}]}:null]};return r.push(a),r}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:G(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new Ce(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:D.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:fr,data:[this.format._options.streamable?null:this.seekHead,this.segmentInfo,this.tracksElement]};this.segment=e,this.writeEBML(e)}createCues(){this.cues={id:475249515,data:[]}}get segmentDataOffset(){return m(this.segment),this.dataOffsets.get(this.segment)}getVideoTrackData(e,r){let n=this.trackDatas.find(s=>s.track===e);if(n)return n;Be(r),m(r),m(r.decoderConfig),m(r.decoderConfig.codedWidth!==void 0),m(r.decoderConfig.codedHeight!==void 0);let a={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),a}getAudioTrackData(e,r){let n=this.trackDatas.find(s=>s.track===e);if(n)return n;Ne(r),m(r),m(r.decoderConfig);let a={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),a}getSubtitleTrackData(e,r){let n=this.trackDatas.find(s=>s.track===e);if(n)return n;We(r),m(r),m(r.config);let a={track:e,type:"subtitle",info:{config:r.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),a}async addEncodedVideoChunk(e,r,n){let a=await this.mutex.acquire();try{let s=this.getVideoTrackData(e,n),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type==="key",u=this.validateAndNormalizeTimestamp(s.track,r.timestamp,c),d=this.createInternalChunk(o,u,(r.duration??0)/1e6,r.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(s,d),s.chunkQueue.push(d),await this.interleaveChunks()}finally{a()}}async addEncodedAudioChunk(e,r,n){let a=await this.mutex.acquire();try{let s=this.getAudioTrackData(e,n),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=c==="key",d=this.validateAndNormalizeTimestamp(s.track,r.timestamp,u),l=this.createInternalChunk(o,d,(r.duration??0)/1e6,c);s.chunkQueue.push(l),await this.interleaveChunks()}finally{a()}}async addSubtitleCue(e,r,n){let a=await this.mutex.acquire();try{let s=this.getSubtitleTrackData(e,n),o=this.validateAndNormalizeTimestamp(s.track,1e6*r.timestamp,!0),c=r.text,u=Math.floor(o*1e3);se.lastIndex=0,c=c.replace(se,g=>{let h=Fe(g.slice(1,-1))-u;return`<${Ve(h)}>`});let d=D.encode(c),l=`${r.settings??""} +`,n);c===-1&&(c=t.length);let u=Fe(e[2]),f=Fe(e[3])-u,m=t.slice(a,c).trim();t=t.slice(c).trimStart(),be.lastIndex=0;let g={timestamp:u/1e3,duration:f/1e3,text:m,identifier:s,settings:o,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(g,b)}}},Cr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,Fe=i=>{let t=Cr.exec(i);if(!t)throw new Error("Expected match.");return 60*60*1e3*Number(t[1]||"0")+60*1e3*Number(t[2])+1e3*Number(t[3])+Number(t[4])},Ve=i=>{let t=Math.floor(i/36e5),e=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),s=i%1e3;return t.toString().padStart(2,"0")+":"+e.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var ke=class{constructor(t){this.writer=t;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap}writeU32(t){this.helperView.setUint32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(t){this.helperView.setUint32(0,Math.floor(t/2**32),!1),this.helperView.setUint32(4,t,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(t){for(let e=0;e[(i%256+256)%256],y=i=>(N.setUint16(0,i,!1),[w[0],w[1]]),wr=i=>(N.setInt16(0,i,!1),[w[0],w[1]]),Kt=i=>(N.setUint32(0,i,!1),[w[1],w[2],w[3]]),h=i=>(N.setUint32(0,i,!1),[w[0],w[1],w[2],w[3]]),jt=i=>(N.setInt32(0,i,!1),[w[0],w[1],w[2],w[3]]),te=i=>(N.setUint32(0,Math.floor(i/2**32),!1),N.setUint32(4,i,!1),[w[0],w[1],w[2],w[3],w[4],w[5],w[6],w[7]]),ot=i=>(N.setInt16(0,2**8*i,!1),[w[0],w[1]]),B=i=>(N.setInt32(0,2**16*i,!1),[w[0],w[1],w[2],w[3]]),st=i=>(N.setInt32(0,2**30*i,!1),[w[0],w[1],w[2],w[3]]),at=(i,t)=>{let e=[],r=i;do{let s=r&127;r>>=7,e.length>0&&(s|=128),e.push(s),t!==void 0&&t--}while(r>0||t);return e.reverse()},D=(i,t=!1)=>{let e=Array(i.length).fill(null).map((r,s)=>i.charCodeAt(s));return t&&e.push(0),e},ct=i=>{let t=null;for(let e of i)(!t||e.timestamp>t.timestamp)&&(t=e);return t},qt=i=>[B(i[0]),B(i[1]),st(i[2]),B(i[3]),B(i[4]),st(i[5]),B(i[6]),B(i[7]),st(i[8])],S=(i,t,e)=>({type:i,contents:t&&new Uint8Array(t.flat(10)),children:e}),v=(i,t,e,r,s)=>S(i,[A(t),Kt(e),r??[]],s),Xt=i=>i.fragmented?S("ftyp",[D("iso5"),h(512),D("iso5"),D("iso6"),D("mp41")]):S("ftyp",[D("isom"),h(512),D("isom"),i.holdsAvc?D("avc1"):[],D("mp41")]),De=i=>({type:"mdat",largeSize:i}),Gt=i=>({type:"free",size:i}),ge=(i,t,e=!1)=>S("moov",void 0,[yr(t,i),...i.map(r=>Sr(r,t)),e?ii(i):null]),yr=(i,t)=>{let e=z(Math.max(0,...t.filter(a=>a.samples.length>0).map(a=>{let o=ct(a.samples);return o.timestamp+o.duration})),Me),r=Math.max(0,...t.map(a=>a.track.id))+1,s=!G(i)||!G(e),n=s?te:h;return v("mvhd",+s,0,[n(i),n(i),h(Me),n(e),B(1),ot(1),Array(10).fill(0),qt(nt),Array(24).fill(0),h(r)])},Sr=(i,t)=>S("trak",void 0,[vr(i,t),_r(i,t)]),vr=(i,t)=>{let e=ct(i.samples),r=z(e?e.timestamp+e.duration:0,Me),s=!G(t)||!G(r),n=s?te:h,a;if(i.type==="video"){let o=i.track.metadata.rotation;a=o===void 0||typeof o=="number"?q(o??0):o}else a=nt;return v("tkhd",+s,3,[n(t),n(t),h(i.track.id),h(0),n(r),Array(8).fill(0),y(0),y(i.track.id),ot(i.type==="audio"?1:0),y(0),qt(a),B(i.type==="video"?i.info.width:0),B(i.type==="video"?i.info.height:0)])},_r=(i,t)=>S("mdia",void 0,[Ar(i,t),Rr(i),Or(i)]),Ar=(i,t)=>{let e=ct(i.samples),r=z(e?e.timestamp+e.duration:0,i.timescale),s=!G(t)||!G(r),n=s?te:h;return v("mdhd",+s,0,[n(t),n(t),h(i.timescale),n(r),y(21956),y(0)])},Ir={video:"vide",audio:"soun",subtitle:"text"},Er={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Rr=i=>v("hdlr",0,0,[D("mhlr"),D(Ir[i.type]),h(0),h(0),h(0),D(Er[i.type],!0)]),Or=i=>S("minf",void 0,[Dr[i.type](),Pr(),Br(i)]),Fr=()=>v("vmhd",0,1,[y(0),y(0),y(0),y(0)]),Vr=()=>v("smhd",0,0,[y(0),y(0)]),Mr=()=>v("nmhd",0,0),Dr={video:Fr,audio:Vr,subtitle:Mr},Pr=()=>S("dinf",void 0,[zr()]),zr=()=>v("dref",0,0,[h(1)],[Ur()]),Ur=()=>v("url ",0,1),Br=i=>{let t=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(e=>e.sampleCompositionTimeOffset!==0);return S("stbl",void 0,[Nr(i),Yr(i),Zr(i),Jr(i),ei(i),ti(i),t?ri(i):null])},Nr=i=>{let t;return i.type==="video"?t=Wr(mi[i.track.source._codec],i):i.type==="audio"?t=Kr(hi[i.track.source._codec],i):i.type==="subtitle"&&(t=Xr(bi[i.track.source._codec],i)),l(t),v("stsd",0,0,[h(1)],[t])},Wr=(i,t)=>S(i,[Array(6).fill(0),y(1),y(0),y(0),Array(12).fill(0),y(t.info.width),y(t.info.height),h(4718592),h(4718592),h(0),y(1),Array(32).fill(0),y(24),wr(65535)],[fi[t.track.source._codec](t),Re(t.info.decoderConfig.colorSpace)?Hr(t):null]),Hr=i=>S("colr",[D("nclx"),y(Z[i.info.decoderConfig.colorSpace.primaries]),y(J[i.info.decoderConfig.colorSpace.transfer]),y(ee[i.info.decoderConfig.colorSpace.matrix]),A((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Lr=i=>i.info.decoderConfig&&S("avcC",[...Y(i.info.decoderConfig.description)]),Qr=i=>i.info.decoderConfig&&S("hvcC",[...Y(i.info.decoderConfig.description)]),$t=i=>{if(!i.info.decoderConfig)return null;let t=i.info.decoderConfig;l(t.colorSpace);let e=t.codec.split("."),r=Number(e[1]),s=Number(e[2]),o=(Number(e[3])<<4)+(0<<1)+Number(t.colorSpace.fullRange);return v("vpcC",1,0,[A(r),A(s),A(o),A(2),A(2),A(2),y(0)])},$r=()=>S("av1C",[129,0,0,0]),Kr=(i,t)=>S(i,[Array(6).fill(0),y(1),y(0),y(0),h(0),y(t.info.numberOfChannels),y(16),y(0),y(0),B(t.info.sampleRate)],[pi[t.track.source._codec](t)]),jr=i=>{let e=[...Y(i.info.decoderConfig.description??new ArrayBuffer(0))];return e=[...A(64),...A(21),...Kt(0),...h(0),...h(0),...A(5),...at(e.length),...e],e=[...y(1),...A(0),...A(4),...at(e.length),...e,...A(6),...A(1),...A(2)],e=[...A(3),...at(e.length),...e],v("esds",0,0,e)},qr=i=>{let t=3840,e=0,r=i.info.decoderConfig?.description;if(r){l(r.byteLength>=18);let s=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);t=s.getUint16(10,!0),e=s.getInt16(14,!0)}return S("dOps",[A(0),A(i.info.numberOfChannels),y(t),h(i.info.sampleRate),ot(e),A(0)])},Xr=(i,t)=>S(i,[Array(6).fill(0),y(1)],[ki[t.track.source._codec](t)]),Gr=i=>S("vttC",[...P.encode(i.info.config.description)]);var Yr=i=>v("stts",0,0,[h(i.timeToSampleTable.length),i.timeToSampleTable.map(t=>[h(t.sampleCount),h(t.sampleDelta)])]),Zr=i=>{if(i.samples.every(e=>e.type==="key"))return null;let t=[...i.samples.entries()].filter(([,e])=>e.type==="key");return v("stss",0,0,[h(t.length),t.map(([e])=>h(e+1))])},Jr=i=>v("stsc",0,0,[h(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(t=>[h(t.firstChunk),h(t.samplesPerChunk),h(1)])]),ei=i=>v("stsz",0,0,[h(0),h(i.samples.length),i.samples.map(t=>h(t.size))]),ti=i=>i.finalizedChunks.length>0&&F(i.finalizedChunks).offset>=2**32?v("co64",0,0,[h(i.finalizedChunks.length),i.finalizedChunks.map(t=>te(t.offset))]):v("stco",0,0,[h(i.finalizedChunks.length),i.finalizedChunks.map(t=>h(t.offset))]),ri=i=>v("ctts",0,0,[h(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(t=>[h(t.sampleCount),h(t.sampleCompositionTimeOffset)])]),ii=i=>S("mvex",void 0,i.map(ni)),ni=i=>v("trex",0,0,[h(i.track.id),h(1),h(0),h(0),h(0)]),ut=(i,t)=>S("moof",void 0,[si(i),...t.map(ai)]),si=i=>v("mfhd",0,0,[h(i)]),Yt=i=>{let t=0,e=0,r=0,s=0,n=i.type==="delta";return e|=+n,n?t|=1:t|=2,t<<24|e<<16|r<<8|s},ai=i=>S("traf",void 0,[oi(i),ci(i),ui(i)]),oi=i=>{l(i.currentChunk);let t=0;t|=8,t|=16,t|=32,t|=131072;let e=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:e.timescaleUnitsToNextSample,size:e.size,flags:Yt(e)};return v("tfhd",0,t,[h(i.track.id),h(r.duration),h(r.size),h(r.flags)])},ci=i=>(l(i.currentChunk),v("tfdt",1,0,[te(z(i.currentChunk.startTimestamp,i.timescale))])),ui=i=>{l(i.currentChunk);let t=i.currentChunk.samples.map(p=>p.timescaleUnitsToNextSample),e=i.currentChunk.samples.map(p=>p.size),r=i.currentChunk.samples.map(Yt),s=i.currentChunk.samples.map(p=>z(p.timestamp-p.decodeTimestamp,i.timescale)),n=new Set(t),a=new Set(e),o=new Set(r),c=new Set(s),u=o.size===2&&r[0]!==r[1],d=n.size>1,f=a.size>1,m=!u&&o.size>1,g=c.size>1||[...c].some(p=>p!==0),b=0;return b|=1,b|=4*+u,b|=256*+d,b|=512*+f,b|=1024*+m,b|=2048*+g,v("trun",1,b,[h(i.currentChunk.samples.length),h(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?h(r[0]):[],i.currentChunk.samples.map((p,k)=>[d?h(t[k]):[],f?h(e[k]):[],m?h(r[k]):[],g?jt(s[k]):[]])])},Zt=i=>S("mfra",void 0,[...i.map(di),li()]),di=(i,t)=>v("tfra",1,0,[h(i.track.id),h(63),h(i.finalizedChunks.length),i.finalizedChunks.map(r=>[te(z(r.samples[0].timestamp,i.timescale)),te(r.moofOffset),h(t+1),h(1),h(1)])]),li=()=>v("mfro",0,0,[h(0)]),Jt=()=>S("vtte"),er=(i,t,e,r,s)=>S("vttc",void 0,[s!==null?S("vsid",[jt(s)]):null,e!==null?S("iden",[...P.encode(e)]):null,t!==null?S("ctim",[...P.encode(Ve(t))]):null,r!==null?S("sttg",[...P.encode(r)]):null,S("payl",[...P.encode(i)])]),tr=i=>S("vtta",[...P.encode(i)]),mi={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},fi={avc:Lr,hevc:Qr,vp8:$t,vp9:$t,av1:$r},hi={aac:"mp4a",opus:"Opus"},pi={aac:jr,opus:qr},bi={webvtt:"wvtt"},ki={webvtt:Gr};var oe=class{constructor(t){this.mutex=new j;this.trackTimestampInfo=new WeakMap;this.output=t}beforeTrackAdd(t){}onTrackClose(t){}validateAndNormalizeTimestamp(t,e,r){let s=e/1e6,n=this.trackTimestampInfo.get(t);if(!n){if(!r)throw new Error("First frame must be a key frame.");if(this.timestampsMustStartAtZero&&s>0)throw new Error(`Timestamps must start at zero (got ${s}s).`);n={timestampOffset:s,maxTimestamp:t.source._offsetTimestamps?0:s,lastKeyFrameTimestamp:t.source._offsetTimestamps?0:s},this.trackTimestampInfo.set(t,n)}if(t.source._offsetTimestamps&&(s-=n.timestampOffset),s<0)throw new Error(`Timestamps must be non-negative (got ${s}s).`);if(ss.start-n.start);e.push({start:r[0].start,size:r[0].data.byteLength});for(let s=1;su.start<=r&&rTi){for(let u=0;u=e.written[a+1].start;)e.written[a].end=Math.max(e.written[a].end,e.written[a+1].end),e.written.splice(a+1,1)}createChunk(e){let s={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(s),this.chunks.sort((n,a)=>n.start-a.start),this.chunks.indexOf(s)}queueChunksForFlush(e=!1){l(this.writer);for(let r=0;r{if(i==="avc"){let n=Math.ceil(t/16)*Math.ceil(e/16),a=rr.find(f=>n<=f.maxMacroblocks&&r<=f.maxBitrate)??F(rr),o=a?a.level:0,c="64".padStart(2,"0"),u="00",d=o.toString(16).padStart(2,"0");return`avc1.${c}${u}${d}`}else if(i==="hevc"){let s="",a="6",o=t*e,c=ir.find(d=>o<=d.maxPictureSize&&r<=d.maxBitrate)??F(ir);return`hev1.${s}1.${a}.${c.tier}${c.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let s="00",n=t*e,a=nr.find(c=>n<=c.maxPictureSize&&r<=c.maxBitrate)??F(nr);return`vp09.${s}.${a.level}.08`}else if(i==="av1"){let n=t*e,a=sr.find(c=>n<=c.maxPictureSize&&r<=c.maxBitrate)??F(sr);return`av01.0.${a.level.toString().padStart(2,"0")}${a.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},or=(i,t)=>{if(i==="avc"){if(!t||t.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${Bt(t.subarray(1,4))}`}else if(i==="hevc"){if(!t)throw new TypeError("HEVC description must be provided.");let e=new DataView(t.buffer,t.byteOffset,t.byteLength),r="hev1.",s=t[1]>>6&3,n=t[1]&31;r+=["","A","B","C"][s]+n,r+=".";let a=Nt(e.getUint32(2));r+=a.toString(16),r+=".";let o=t[1]>>5&1,c=t[12];r+=o===0?"L":"H",r+=c,r+=".";let u=[];for(let d=0;d<6;d++){let f=t[d+13];u.push(f)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(d=>d.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},cr=(i,t,e)=>{if(i==="aac")return t>=2&&e<=24e3?"mp4a.40.29":e<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},ur=(i,t)=>{if(i==="aac")return`mp4a.40.${lt(t).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},lt=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let t=0,e=V(i,t,t+5);t+=5,e===31&&(e=32+V(i,t,t+6),t+=6);let r=V(i,t,t+4);t+=4;let s=null;if(r===15)s=V(i,t,t+24),t+=24;else{let o=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];r=1&&n<=7&&(a={1:1,2:2,3:3,4:4,5:5,6:6,7:8}[n]),{objectType:e,frequencyIndex:r,sampleRate:s,channelConfiguration:n,numberOfChannels:a}},dr=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},lr=i=>i==="aac"?{aac:{format:"aac"}}:i==="opus"?{opus:{format:"opus"}}:{},Be=i=>{if(!i)throw new TypeError("Video chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Video chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Video chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.codedWidth)||i.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(i.decoderConfig.codedHeight)||i.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(i.decoderConfig.description!==void 0&&!it(i.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.colorSpace!==void 0){let{colorSpace:t}=i.decoderConfig;if(typeof t!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let e=Object.keys(Z);if(t.primaries!=null&&!e.includes(t.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${e.join(", ")}.`);let r=Object.keys(J);if(t.transfer!=null&&!r.includes(t.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let s=Object.keys(ee);if(t.matrix!=null&&!s.includes(t.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(t.fullRange!=null&&typeof t.fullRange!="boolean")throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if((i.decoderConfig.codec.startsWith("avc1")||i.decoderConfig.codec.startsWith("avc3"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for AVC must include a description, which is expected to be an AVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec.startsWith("hev1")||i.decoderConfig.codec.startsWith("hvc1"))&&!i.decoderConfig.description)throw new TypeError("Video chunk metadata decoder configuration for HEVC must include a description, which is expected to be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15.");if((i.decoderConfig.codec==="vp8"||i.decoderConfig.codec.startsWith("vp09"))&&i.decoderConfig.colorSpace===void 0)throw new TypeError("Video chunk metadata decoder configuration for VP8/VP9 must include a colorSpace.")},Ne=i=>{if(!i)throw new TypeError("Audio chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Audio chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(i.decoderConfig.sampleRate)||i.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(i.decoderConfig.numberOfChannels)||i.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(i.decoderConfig.description!==void 0&&!it(i.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.codec.startsWith("mp4a")&&!i.decoderConfig.description)throw new 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.");if(i.decoderConfig.codec==="opus"&&i.decoderConfig.description&&i.decoderConfig.description.byteLength<18)throw new TypeError("Invalid decoder description provided for Opus; must be at least 18 bytes long.")},We=i=>{if(!i)throw new TypeError("Subtitle metadata must be provided.");if(typeof i!="object")throw new TypeError("Subtitle metadata must be an object.");if(!i.config)throw new TypeError("Subtitle metadata must include a config object.");if(typeof i.config!="object")throw new TypeError("Subtitle metadata config must be an object.");if(typeof i.config.description!="string")throw new TypeError("Subtitle metadata config description must be a string.")};var Me=1e3,xi=2082844800,z=(i,t,e=!0)=>{let r=i*t;return e?Math.round(r):r},He=class extends oe{constructor(e,r){super(e);this.timestampsMustStartAtZero=!0;this.auxTarget=new xe;this.auxWriter=this.auxTarget._createWriter();this.auxBoxWriter=new ke(this.auxWriter);this.ftypSize=null;this.mdat=null;this.trackDatas=[];this.creationTime=Math.floor(Date.now()/1e3)+xi;this.finalizedChunks=[];this.nextFragmentNumber=1;this.writer=e._writer,this.boxWriter=new ke(this.writer);let s=this.writer instanceof ce?"in-memory":!1;this.fastStart=r._options.fastStart??s,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),r=this.output._tracks.some(s=>s.type==="video"&&s.source._codec==="avc");this.boxWriter.writeBox(Xt({holdsAvc:r,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=De(!1):this.fastStart==="fragmented"||(this.mdat=De(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Be(r),l(r),l(r.decoderConfig),l(r.decoderConfig.codedWidth!==void 0),l(r.decoderConfig.codedHeight!==void 0);let n={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getAudioTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Ne(r),l(r),l(r.decoderConfig);let n={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},timescale:r.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getSubtitleTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;We(r),l(r),l(r.config);let n={track:e,type:"subtitle",info:{config:r.config},timescale:1e3,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],lastCueEndTimestamp:0,cueQueue:[],nextSourceId:0,cueToSourceId:new WeakMap};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),this.validateAndNormalizeTimestamp(e,0,!0),n}async addEncodedVideoChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getVideoTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=this.validateAndNormalizeTimestamp(a.track,r.timestamp,r.type==="key"),u=this.createSampleForTrack(a,o,c,(r.duration??0)/1e6,r.type);await this.registerSample(a,u)}finally{n()}}async addEncodedAudioChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getAudioTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=this.validateAndNormalizeTimestamp(a.track,r.timestamp,c==="key"),d=this.createSampleForTrack(a,o,u,(r.duration??0)/1e6,c);await this.registerSample(a,d)}finally{n()}}async addSubtitleCue(e,r,s){let n=await this.mutex.acquire();try{let a=this.getSubtitleTrackData(e,s);this.validateAndNormalizeTimestamp(a.track,1e6*r.timestamp,!0),e.source._codec==="webvtt"&&(a.cueQueue.push(r),await this.processWebVTTCues(a,r.timestamp))}finally{n()}}async processWebVTTCues(e,r){for(;e.cueQueue.length>0;){let s=new Set([]);for(let d of e.cueQueue)l(d.timestamp<=r),l(e.lastCueEndTimestamp<=d.timestamp+d.duration),s.add(Math.max(d.timestamp,e.lastCueEndTimestamp)),s.add(d.timestamp+d.duration);let n=[...s].sort((d,f)=>d-f),a=n[0],o=n[1]??a;if(r=o)break;ae.lastIndex=0;let m=ae.test(f.text),g=f.timestamp+f.duration,b=e.cueToSourceId.get(f);if(b===void 0&&os.timestamp).sort((s,n)=>s-n);for(let s=0;s{if(e===o)return r.type==="key";let c=o.sampleQueue[0];return c&&c.type==="key"});n>=1&&a&&(s=!0,await this.finalizeFragment())}else s=n>=.5}s&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:r.timestamp,samples:[],offset:null,moofOffset:null}),l(e.currentChunk),e.currentChunk.samples.push(r),e.timestampProcessingQueue.push(r)}async finalizeCurrentChunk(e){if(l(this.fastStart!=="fragmented"),!!e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),this.finalizedChunks.push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||F(e.compactlyCodedChunkTable).samplesPerChunk!==e.currentChunk.samples.length)&&e.compactlyCodedChunkTable.push({firstChunk:e.finalizedChunks.length,samplesPerChunk:e.currentChunk.samples.length}),this.fastStart==="in-memory"){e.currentChunk.offset=0;return}e.currentChunk.offset=this.writer.getPos();for(let r of e.currentChunk.samples)l(r.data),this.writer.write(r.data),r.data=null;await this.writer.flush()}}async interleaveSamples(){l(this.fastStart==="fragmented");for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(r=>r.track===e))return;e:for(;;){let e=null,r=1/0;for(let n of this.trackDatas){if(n.sampleQueue.length===0&&!n.track.source._closed)break e;n.sampleQueue.length>0&&n.sampleQueue[0].timestampu.currentChunk),n=this.writer.getPos(),a=ut(r,s);this.boxWriter.writeBox(a);{let u=De(!1),d=0;for(let m of s)for(let g of m.currentChunk.samples)d+=g.size;let f=this.boxWriter.measureBox(u)+d;f>=2**32&&(u.largeSize=!0,f=this.boxWriter.measureBox(u)+d),u.size=f,this.boxWriter.writeBox(u)}for(let u of s){u.currentChunk.offset=this.writer.getPos(),u.currentChunk.moofOffset=n;for(let d of u.currentChunk.samples)this.writer.write(d.data),d.data=null}let o=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(a));let c=ut(r,s);this.boxWriter.writeBox(c),this.writer.seek(o);for(let u of s)u.finalizedChunks.push(u.currentChunk),this.finalizedChunks.push(u.currentChunk),u.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let r=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let s=this.trackDatas.find(n=>n.track===e);s&&await this.processWebVTTCues(s,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),r()}async finalize(){let e=await this.mutex.acquire();for(let r of this.trackDatas)r.type==="subtitle"&&r.track.source._codec==="webvtt"&&await this.processWebVTTCues(r,1/0);if(this.fastStart==="fragmented"){for(let r of this.trackDatas){for(let s of r.sampleQueue)await this.addSampleToTrack(r,s);this.processTimestamps(r)}await this.finalizeFragment(!1)}else for(let r of this.trackDatas)this.processTimestamps(r),await this.finalizeCurrentChunk(r);if(this.fastStart==="in-memory"){l(this.mdat);let r;for(let n=0;n<2;n++){let a=ge(this.trackDatas,this.creationTime),o=this.boxWriter.measureBox(a);r=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+o+r;for(let u of this.finalizedChunks){u.offset=c;for(let{data:d}of u.samples)l(d),c+=d.byteLength,r+=d.byteLength}if(c<2**32)break;r>=2**32&&(this.mdat.largeSize=!0)}let s=ge(this.trackDatas,this.creationTime);this.boxWriter.writeBox(s),this.mdat.size=r,this.boxWriter.writeBox(this.mdat);for(let n of this.finalizedChunks)for(let a of n.samples)l(a.data),this.writer.write(a.data),a.data=null}else if(this.fastStart==="fragmented"){let r=this.writer.getPos(),s=Zt(this.trackDatas);this.boxWriter.writeBox(s);let n=this.writer.getPos()-r;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(n)}else{l(this.mdat),l(this.ftypSize!==null);let r=this.boxWriter.offsets.get(this.mdat);l(r!==void 0);let s=this.writer.getPos()-r;this.mdat.size=s,this.mdat.largeSize=s>=2**32,this.boxWriter.patchBox(this.mdat);let n=ge(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(n);let a=r-this.writer.getPos();this.boxWriter.writeBox(Gt(a))}else this.boxWriter.writeBox(n)}e()}};var Ce=class{constructor(t){this.value=t}},le=class{constructor(t){this.value=t}},we=class{constructor(t){this.value=t}};var mt=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,ft=i=>i>=-64&&i<64?1:i>=-8192&&i<8192?2:i>=-(1<<20)&&i<1<<20?3:i>=-(1<<27)&&i<1<<27?4:i>=-(2**34)&&i<2**34?5:6,mr=i=>{if(i<127)return 1;if(i<16383)return 2;if(i<(1<<21)-1)return 3;if(i<(1<<28)-1)return 4;if(i<2**35-1)return 5;if(i<2**42-1)return 6;throw new Error("EBML VINT size not supported "+i)};var ht=2**15,fr="https://github.com/Vanilagy/webm-muxer",hr=6,pr=5,Ci={avc:"V_MPEG4/ISO/AVC",hevc:"V_MPEGH/ISO/HEVC",vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1",aac:"A_AAC",opus:"A_OPUS",webvtt:"S_TEXT/WEBVTT"},wi={video:1,audio:2,subtitle:17},Le=class extends oe{constructor(e,r){super(e);this.timestampsMustStartAtZero=!1;this.helper=new Uint8Array(8);this.helperView=new DataView(this.helper.buffer);this.offsets=new WeakMap;this.dataOffsets=new WeakMap;this.trackDatas=[];this.segment=null;this.segmentInfo=null;this.seekHead=null;this.tracksElement=null;this.segmentDuration=null;this.cues=null;this.currentCluster=null;this.currentClusterMsTimestamp=null;this.trackDatasInCurrentCluster=new Set;this.duration=0;this.writer=e._writer,this.format=r,this.format._options.streamable&&(this.writer.ensureMonotonicity=!0)}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=mt(e)){let s=0;switch(r){case 6:this.helperView.setUint8(s++,e/2**40|0);case 5:this.helperView.setUint8(s++,e/2**32|0);case 4:this.helperView.setUint8(s++,e>>24);case 3:this.helperView.setUint8(s++,e>>16);case 2:this.helperView.setUint8(s++,e>>8);case 1:this.helperView.setUint8(s++,e);break;default:throw new Error("Bad UINT size "+r)}this.writer.write(this.helper.subarray(0,s))}writeSignedInt(e,r=ft(e)){e<0&&(e+=2**(r*8)),this.writeUnsignedInt(e,r)}writeEBMLVarInt(e,r=mr(e)){let s=0;switch(r){case 1:this.helperView.setUint8(s++,128|e);break;case 2:this.helperView.setUint8(s++,64|e>>8),this.helperView.setUint8(s++,e);break;case 3:this.helperView.setUint8(s++,32|e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;case 4:this.helperView.setUint8(s++,16|e>>24),this.helperView.setUint8(s++,e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;case 5:this.helperView.setUint8(s++,8|e/2**32&7),this.helperView.setUint8(s++,e>>24),this.helperView.setUint8(s++,e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;case 6:this.helperView.setUint8(s++,4|e/2**40&3),this.helperView.setUint8(s++,e/2**32|0),this.helperView.setUint8(s++,e>>24),this.helperView.setUint8(s++,e>>16),this.helperView.setUint8(s++,e>>8),this.helperView.setUint8(s++,e);break;default:throw new Error("Bad EBML VINT size "+r)}this.writer.write(this.helper.subarray(0,s))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(r=>r.charCodeAt(0))))}writeEBML(e){if(e!==null){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(),s=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+s);let n=this.writer.getPos();if(this.dataOffsets.set(e,n),this.writeEBML(e.data),e.size!==-1){let a=this.writer.getPos()-n,o=this.writer.getPos();this.writer.seek(r),this.writeEBMLVarInt(a,s),this.writer.seek(o)}}else if(typeof e.data=="number"){let r=e.size??mt(e.data);this.writeEBMLVarInt(r),this.writeUnsignedInt(e.data,r)}else if(typeof e.data=="string")this.writeEBMLVarInt(e.data.length),this.writeString(e.data);else if(e.data instanceof Uint8Array)this.writeEBMLVarInt(e.data.byteLength,e.size),this.writer.write(e.data);else if(e.data instanceof Ce)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof le)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof we){let r=e.size??ft(e.data.value);this.writeEBMLVarInt(r),this.writeSignedInt(e.data.value,r)}}}beforeTrackAdd(e){if(this.format instanceof me)if(e.type==="video"){if(!["vp8","vp9","av1"].includes(e.source._codec))throw new Error("WebM only supports VP8, VP9 and AV1 as video codecs. Switching to MKV removes this restriction.")}else if(e.type==="audio"){if(!["opus","vorbis"].includes(e.source._codec))throw new Error("WebM only supports Opus and Vorbis as audio codecs. Switching to MKV removes this restriction.")}else if(e.type==="subtitle"){if(e.source._codec!=="webvtt")throw new Error("WebM only supports WebVTT as subtitle codec. Switching to MKV removes this restriction.")}else throw new Error("WebM only supports video, audio and subtitle tracks. Switching to MKV removes this restriction.")}async start(){let e=await this.mutex.acquire();this.writeEBMLHeader(),this.format._options.streamable||this.createSeekHead(),this.createSegmentInfo(),this.createCues(),await this.writer.flush(),e()}writeEBMLHeader(){let e={id:440786851,data:[{id:17030,data:1},{id:17143,data:1},{id:17138,data:4},{id:17139,data:8},{id:17026,data:this.format instanceof me?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),r=new Uint8Array([21,73,169,102]),s=new Uint8Array([22,84,174,107]),n={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:s},{id:21420,size:5,data:0}]}]};this.seekHead=n}createSegmentInfo(){let e={id:17545,data:new le(0)};this.segmentDuration=e;let r={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:fr},{id:22337,data:fr},this.format._options.streamable?null:e]};this.segmentInfo=r}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let r of this.trackDatas)e.data.push({id:174,data:[{id:215,data:r.track.id},{id:29637,data:r.track.id},{id:131,data:wi[r.type]},{id:134,data:Ci[r.track.source._codec]},r.type==="video"?this.videoSpecificTrackInfo(r):null,r.type==="audio"?this.audioSpecificTrackInfo(r):null,r.type==="subtitle"?this.subtitleSpecificTrackInfo(r):null]})}videoSpecificTrackInfo(e){let r=[e.info.decoderConfig.description?{id:25506,data:Y(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],s=e.info.decoderConfig.colorSpace,n={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},Re(s)?{id:21936,data:[{id:21937,data:ee[s.matrix]},{id:21946,data:J[s.transfer]},{id:21947,data:Z[s.primaries]},{id:21945,data:s.fullRange?2:1}]}:null]};return r.push(n),r}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:Y(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new Ce(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:P.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:hr,data:[this.format._options.streamable?null:this.seekHead,this.segmentInfo,this.tracksElement]};this.segment=e,this.writeEBML(e)}createCues(){this.cues={id:475249515,data:[]}}get segmentDataOffset(){return l(this.segment),this.dataOffsets.get(this.segment)}getVideoTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Be(r),l(r),l(r.decoderConfig),l(r.decoderConfig.codedWidth!==void 0),l(r.decoderConfig.codedHeight!==void 0);let n={track:e,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getAudioTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;Ne(r),l(r),l(r.decoderConfig);let n={track:e,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:r.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}getSubtitleTrackData(e,r){let s=this.trackDatas.find(a=>a.track===e);if(s)return s;We(r),l(r),l(r.config);let n={track:e,type:"subtitle",info:{config:r.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(n),this.trackDatas.sort((a,o)=>a.track.id-o.track.id),n}async addEncodedVideoChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getVideoTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type==="key",u=this.validateAndNormalizeTimestamp(a.track,r.timestamp,c),d=this.createInternalChunk(o,u,(r.duration??0)/1e6,r.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(a,d),a.chunkQueue.push(d),await this.interleaveChunks()}finally{n()}}async addEncodedAudioChunk(e,r,s){let n=await this.mutex.acquire();try{let a=this.getAudioTrackData(e,s),o=new Uint8Array(r.byteLength);r.copyTo(o);let c=r.type,u=c==="key",d=this.validateAndNormalizeTimestamp(a.track,r.timestamp,u),f=this.createInternalChunk(o,d,(r.duration??0)/1e6,c);a.chunkQueue.push(f),await this.interleaveChunks()}finally{n()}}async addSubtitleCue(e,r,s){let n=await this.mutex.acquire();try{let a=this.getSubtitleTrackData(e,s),o=this.validateAndNormalizeTimestamp(a.track,1e6*r.timestamp,!0),c=r.text,u=Math.floor(o*1e3);ae.lastIndex=0,c=c.replace(ae,g=>{let p=Fe(g.slice(1,-1))-u;return`<${Ve(p)}>`});let d=P.encode(c),f=`${r.settings??""} ${r.identifier??""} -${r.notes??""}`,f=this.createInternalChunk(d,o,r.duration,"key",l.trim()?D.encode(l):null);s.chunkQueue.push(f),await this.interleaveChunks()}finally{a()}}async interleaveChunks(){for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(r=>r.track===e))return;e:for(;;){let e=null,r=1/0;for(let a of this.trackDatas){if(a.chunkQueue.length===0&&!a.track.source._closed)break e;a.chunkQueue.length>0&&a.chunkQueue[0].timestamp=2&&n++;let u={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Mt(r.data,n+0,n+3,u)}createInternalChunk(e,r,n,a,s=null){return{data:e,type:a,timestamp:r,duration:n,additions:s}}writeBlock(e,r){this.segment||(this.createTracks(),this.createSegment());let n=Math.floor(1e3*r.timestamp),a=this.trackDatas.every(l=>{if(l.track.source._closed)return!0;if(e===l)return r.type==="key";let f=l.chunkQueue[0];return f&&f.type==="key"});(!this.currentCluster||a&&n-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(n);let s=n-this.currentClusterMsTimestamp;if(s<0)return;if(s>=ht)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${ht} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${ht} milliseconds.`);let c=new Uint8Array(4),u=new DataView(c.buffer);u.setUint8(0,128|e.track.id),u.setInt16(1,s,!1);let d=Math.floor(1e3*r.duration);if(d===0&&!r.additions){u.setUint8(3,+(r.type==="key")<<7);let l={id:163,data:[c,r.data]};this.writeEBML(l)}else{let l={id:160,data:[{id:161,data:[c,r.data]},r.type==="delta"?{id:251,data:new we(e.lastWrittenMsTimestamp-n)}:null,r.additions?{id:30113,data:[{id:166,data:[{id:165,data:r.additions},{id:238,data:1}]}]}:null,d>0?{id:155,data:d}:null]};this.writeEBML(l)}this.duration=Math.max(this.duration,n+d),e.lastWrittenMsTimestamp=n,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:hr,data:[{id:231,data:e}]},this.writeEBML(this.currentCluster),this.currentClusterMsTimestamp=e,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){m(this.currentCluster);let e=this.writer.getPos()-this.dataOffsets.get(this.currentCluster),r=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,hr),this.writer.seek(r);let n=this.offsets.get(this.currentCluster)-this.segmentDataOffset;m(this.cues),this.cues.data.push({id:187,data:[{id:179,data:this.currentClusterMsTimestamp},...[...this.trackDatasInCurrentCluster].map(a=>({id:183,data:[{id:247,data:a.track.id},{id:241,data:n}]}))]})}async onTrackClose(){let e=await this.mutex.acquire();await this.interleaveChunks(),e()}async finalize(){let e=await this.mutex.acquire();this.segment||(this.createTracks(),this.createSegment());for(let r of this.trackDatas)for(;r.chunkQueue.length>0;)this.writeBlock(r,r.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),m(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let r=this.writer.getPos(),n=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(n,fr),this.segmentDuration.data=new me(this.duration),this.writer.seek(this.offsets.get(this.segmentDuration)),this.writeEBML(this.segmentDuration),this.seekHead.data[0].data[1].data=this.offsets.get(this.cues)-this.segmentDataOffset,this.seekHead.data[1].data[1].data=this.offsets.get(this.segmentInfo)-this.segmentDataOffset,this.seekHead.data[2].data[1].data=this.offsets.get(this.tracksElement)-this.segmentDataOffset,this.writer.seek(this.offsets.get(this.seekHead)),this.writeEBML(this.seekHead),this.writer.seek(r)}e()}};var re=class{},pt=class extends re{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(t.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=t}_createMuxer(t){return new He(t,this)}},Qe=class extends re{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.streamable!==void 0&&typeof t.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=t}_createMuxer(t){return new Le(t,this)}},le=class extends Qe{};var fe=class{constructor(){this._connectedTrack=null;this._closed=!1;this._offsetTimestamps=!1}_ensureValidDigest(){if(!this._connectedTrack)throw new Error("Cannot call digest without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call digest before output has been started.");if(this._connectedTrack.output._finalizing)throw new Error("Cannot call digest after output has started finalizing.");if(this._closed)throw new Error("Cannot call digest after source has been closed.")}_start(){}async _flush(){}close(){if(this._closed)throw new Error("Source already closed.");if(!this._connectedTrack)throw new Error("Cannot call close without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call close before output has been started.");this._closed=!0,!this._connectedTrack.output._finalizing&&this._connectedTrack.output._muxer.onTrackClose(this._connectedTrack)}},K=class extends fe{constructor(e){super();this._connectedTrack=null;if(!ue.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${ue.join(", ")}.`);this._codec=e}},bt=class extends K{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,t,e)}},wi=5,yi=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!ue.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${ue.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.");if(i.latencyMode!==void 0&&!["quality","realtime"].includes(i.latencyMode))throw new TypeError("config.latencyMode, when provided, must be 'quality' or 'realtime'.")},ye=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastMultipleOfKeyFrameInterval=-1;this.lastWidth=null;this.lastHeight=null;yi(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(t.codedWidth!==this.lastWidth||t.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${t.codedWidth}x${t.codedHeight}.`)}else this.lastWidth=t.codedWidth,this.lastHeight=t.codedHeight;this.ensureEncoder(t),m(this.encoder);let e=Math.floor(t.timestamp/1e6/wi);this.encoder.encode(t,{keyFrame:e!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=e,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new VideoEncoder({output:(e,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,e,r),error:e=>console.error("Video encode error:",e)}),this.encoder.configure({codec:nr(this.codecConfig.codec,t.codedWidth,t.codedHeight,this.codecConfig.bitrate),width:t.codedWidth,height:t.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...ur(this.codecConfig.codec)}),m(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},kt=class extends K{constructor(t){super(t.codec),this._encoder=new ye(this,t)}digest(t){if(!(t instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},gt=class extends K{constructor(t,e){if(!(t instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(e.codec),this._encoder=new ye(this,e),this._canvas=t}digest(t,e=0){if(!Number.isFinite(t)||t<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(e)||e<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*t),duration:Math.round(1e6*e),alpha:"discard"}),n=this._encoder.digest(r);return r.close(),n}_flush(){return this._encoder.flush()}},Tt=class extends K{constructor(e,r){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");r={...r,latencyMode:"realtime"};super(r.codec);this._abortController=null;this._offsetTimestamps=!0;this._encoder=new ye(this,r),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),r=new WritableStream({write:n=>{this._encoder.digest(n),n.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(n=>{n instanceof DOMException&&n.name==="AbortError"||console.error("Pipe error:",n)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},j=class extends fe{constructor(e){super();this._connectedTrack=null;if(!de.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${de.join(", ")}.`);this._codec=e}},xt=class extends j{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,t,e)}},Si=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!de.includes(i.codec))throw new TypeError(`Invalid audio codec '${i.codec}'. Must be one of: ${de.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},Se=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastNumberOfChannels=null;this.lastSampleRate=null;Si(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(t.numberOfChannels!==this.lastNumberOfChannels||t.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${t.numberOfChannels} channels at ${t.sampleRate} Hz.`)}else this.lastNumberOfChannels=t.numberOfChannels,this.lastSampleRate=t.sampleRate;this.ensureEncoder(t),m(this.encoder),this.encoder.encode(t),this.encoder.encodeQueueSize>=4&&await new Promise(e=>this.encoder.addEventListener("dequeue",e,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new AudioEncoder({output:(e,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,e,r),error:e=>console.error("Audio encode error:",e)}),this.encoder.configure({codec:or(this.codecConfig.codec,t.numberOfChannels,t.sampleRate),numberOfChannels:t.numberOfChannels,sampleRate:t.sampleRate,bitrate:this.codecConfig.bitrate,...dr(this.codecConfig.codec)}),m(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},Ct=class extends j{constructor(t){super(t.codec),this._encoder=new Se(this,t)}digest(t){if(!(t instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},wt=class extends j{constructor(e){super(e.codec);this._accumulatedFrameCount=0;this._encoder=new Se(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let r=e.numberOfChannels,n=e.sampleRate,a=e.length,s=new Float32Array(r*a);for(let u=0;u{this._encoder.digest(n),n.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(n=>{n instanceof DOMException&&n.name==="AbortError"||console.error("Pipe error:",n)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},he=class extends fe{constructor(e){super();this._connectedTrack=null;if(!Ue.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${Ue.join(", ")}.`);this._codec=e}},St=class extends he{constructor(t){super(t),this._parser=new Ee({codec:t,output:(e,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,e,r),error:e=>console.error("Subtitle parse error:",e)})}digest(t){if(typeof t!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(t),this._connectedTrack.output._muxer.mutex.currentPromise}};var vt=class{constructor(t){this._tracks=[];this._started=!1;this._finalizing=!1;this._mutex=new $;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!(t.format instanceof re))throw new TypeError("options.format must be an OutputFormat.");if(!(t.target instanceof te))throw new TypeError("options.target must be a Target.");if(t.target._output)throw new Error("Target is already used for another output.");t.target._output=this,this._writer=t.target._createWriter(),this._muxer=t.format._createMuxer(this)}addVideoTrack(t,e={}){if(!(t instanceof K))throw new TypeError("source must be a VideoSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");if(typeof e.rotation=="number"&&![0,90,180,270].includes(e.rotation))throw new TypeError(`Invalid video rotation: ${e.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(e.rotation)&&(e.rotation.length!==9||e.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${e.rotation.join()}`);if(e.frameRate!==void 0&&(!Number.isInteger(e.frameRate)||e.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.frameRate}. Must be a positive integer.`);this._addTrack("video",t,e)}addAudioTrack(t,e={}){if(!(t instanceof j))throw new TypeError("source must be an AudioSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",t,e)}addSubtitleTrack(t,e={}){if(!(t instanceof he))throw new TypeError("source must be a SubtitleSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",t,e)}_addTrack(t,e,r){if(this._started)throw new Error("Cannot add track after output has started.");if(e._connectedTrack)throw new Error("Source is already used for a track.");let n={id:this._tracks.length+1,output:this,type:t,source:e,metadata:r};this._muxer.beforeTrackAdd(n),this._tracks.push(n),e._connectedTrack=n}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let t=await this._mutex.acquire();await this._muxer.start();for(let e of this._tracks)e.source._start();t()}async finalize(){if(!this._started)throw new Error("Cannot finalize before starting.");if(this._finalizing)throw new Error("Cannot call finalize twice.");this._finalizing=!0;let t=await this._mutex.acquire(),e=this._tracks.map(r=>r.source._flush());await Promise.all(e),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),t()}};var ie=class{constructor(){this._sizePromise=null}_getSize(){return this._sizePromise??=this._retrieveSize()}},It=class extends ie{constructor(t){if(!(t instanceof ArrayBuffer)&&!(t instanceof Uint8Array))throw new TypeError("buffer must be an ArrayBuffer or Uint8Array.");super(),this._bytes=t instanceof Uint8Array?t:new Uint8Array(t)}async _read(t,e){return this._bytes.subarray(t,e)}async _retrieveSize(){return this._bytes.byteLength}},_t=class extends ie{constructor(t){if(!(t instanceof Blob))throw new TypeError("blob must be a Blob.");super(),this._blob=t}async _read(t,e){let n=await this._blob.slice(t,e).arrayBuffer();return new Uint8Array(n)}async _retrieveSize(){return this._blob.size}};var Ke=class{constructor(t){this.input=t}};var ve=class{constructor(t){this._backing=t}isVideoTrack(){return this instanceof W}isAudioTrack(){return this instanceof H}computeDuration(){return this._backing.computeDuration()}},W=class extends ve{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getCodedWidth(){return this._backing.getCodedWidth()}getCodedHeight(){return this._backing.getCodedHeight()}getRotation(){return this._backing.getRotation()}async getDisplayWidth(){return await this._backing.getRotation()%180===0?this._backing.getCodedWidth():this._backing.getCodedHeight()}async getDisplayHeight(){return await this._backing.getRotation()%180===0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},H=class extends ve{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getNumberOfChannels(){return this._backing.getNumberOfChannels()}getSampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}};var pe=class{constructor(t,e=1/0){this.source=t;this.maxStorableBytes=e;this.loadedSegments=[];this.loadingSegments=[];this.sourceSizePromise=null;this.nextAge=0;this.totalStoredBytes=0}async loadRange(t,e){e=Math.min(e,await this.source._getSize());let r=this.loadingSegments.find(c=>c.start<=t&&c.end>=e);if(r){await r.promise;return}if(this.loadedSegments.some(c=>c.start<=t&&c.end>=e))return;let a=this.source._read(t,e),s={start:t,end:e,promise:a};this.loadingSegments.push(s);let o=await a;Nt(this.loadingSegments,s),this.insertIntoLoadedSegments(t,o)}insertIntoLoadedSegments(t,e){let r={start:t,end:t+e.byteLength,bytes:e,view:new DataView(e.buffer),age:this.nextAge++},n=_(this.loadedSegments,t,a=>a.start);(n===-1||this.loadedSegments[n].start=r.end)break;r.start<=s.start&&s.end<=r.end&&(this.loadedSegments.splice(a,1),a--)}for(;this.totalStoredBytes>this.maxStorableBytes&&this.loadedSegments.length>1;){let a=null,s=-1;for(let o=0;oa.start),n=null;if(r!==-1)for(let a=r;at)break;if(e<=s.end){n=s;break}}if(!n)throw new Error(`No segment loaded for range [${t}, ${e}).`);return n.age=this.nextAge++,{view:n.view,offset:n.bytes.byteOffset+t-n.start}}forgetRange(t,e){if(e<=t)return;let r=_(this.loadedSegments,t,a=>a.start);if(r===-1)return;let n=this.loadedSegments[r];n.start!==t||n.end!==e||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=n.bytes.byteLength)}};var ae=class{constructor(t){this.reader=t;this.pos=0}readRange(t,e){let{view:r,offset:n}=this.reader.getViewAndOffset(t,e);return new Uint8Array(r.buffer,n,e-t)}readU8(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,t.getUint8(e)}readU16(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,t.getUint16(e,!1)}readU24(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=t.getUint16(e,!1),n=t.getUint8(e+2);return r*256+n}readS32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getUint32(e,!1)}readI32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU64(){let t=this.readU32(),e=this.readU32();return t*4294967296+e}readF64(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,t.getFloat64(e,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(t){let{view:e,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+t);this.pos+=t;let n="";for(let a=0;an.computeDuration()));return Math.max(0,...r)}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e="video/mp4";if(this.tracks.length>0){let r=await Promise.all(this.tracks.map(a=>a.inputTrack.getCodecMimeType())),n=[...new Set(r)];e+=`; codecs="${n.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&nn.presentationTimestamp-a.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let r=this.isobmffReader.readBoxHeader();m(r.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+r.totalSize),this.isobmffReader.pos=e,this.traverseBox();let n=Q(this.fragments,e,s=>s.moofOffset);m(n!==-1);let a=this.fragments[n];m(a.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+r.totalSize);for(let[s,o]of a.trackData){if(o.startTimestampIsFinal)continue;let c=this.tracks.find(f=>f.id===s);this.isobmffReader.pos=0;let u=null,d=null,l=_(c.fragments,e-1,f=>f.moofOffset);for(l!==-1&&(u=c.fragments[l],d=u,this.isobmffReader.pos=u.moofOffset+u.moofSize);this.isobmffReader.posh.moofOffset);if(b===-1){this.isobmffReader.pos=f;let h=await this.readFragment();u&&(u.nextFragment=h),u=h}else{let h=this.fragments[b];u&&(u.nextFragment=h),u=h}}this.isobmffReader.pos=f+g.totalSize}u&&u.trackData.has(s)&&(d=u)}if(d){let f=d.trackData.get(s);m(f.startTimestampIsFinal),br(o,f.endTimestamp)}o.startTimestampIsFinal=!0}return a}readContiguousBoxes(e){let r=this.isobmffReader.pos;for(;this.isobmffReader.pos-rl.every((f,g)=>f===u[g]));d===-1?a.rotation=0:a.rotation=90*d}break;case"mdhd":{let a=this.currentTrack;m(a);let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3,s===0?(this.isobmffReader.pos+=8,a.timescale=this.isobmffReader.readU32(),a.durationInTimescale=this.isobmffReader.readU32()):s===1&&(this.isobmffReader.pos+=16,a.timescale=this.isobmffReader.readU32(),a.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let a=this.currentTrack;m(a),this.isobmffReader.pos+=8;let s=this.isobmffReader.readAscii(4);s==="vide"?a.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:s==="soun"&&(a.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let a=this.currentTrack;m(a),a.sampleTableOffset=e,this.readContiguousBoxes(r.contentSize)}break;case"stsd":{let a=this.currentTrack;if(m(a),a.info===null||a.sampleTable)break;let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=this.isobmffReader.readU32();for(let c=0;c0){if(d===1)this.isobmffReader.pos+=4*4;else if(d===2){this.isobmffReader.pos+=4,f=this.isobmffReader.readF64(),l=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let g=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),h=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}a.info.numberOfChannels=l,a.info.sampleRate=f,this.readContiguousBoxes(e+u.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let a=this.currentTrack;m(a&&a.info),a.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"hvcC":{let a=this.currentTrack;m(a&&a.info),a.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"colr":{let a=this.currentTrack;if(m(a&&a.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let o=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),u=this.isobmffReader.readU16(),d=!!(this.isobmffReader.readU8()&128);a.info.colorSpace={primaries:Dt[o],transfer:Pt[c],matrix:zt[u],fullRange:d}}break;case"wave":r.totalSize>8&&this.readContiguousBoxes(r.contentSize);break;case"esds":{let a=this.currentTrack;m(a&&a.info),this.isobmffReader.pos+=4;let s=this.isobmffReader.readU8();m(s===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let o=this.isobmffReader.readU8(),c=(o&128)!==0,u=(o&64)!==0,d=(o&32)!==0;if(c&&(this.isobmffReader.pos+=2),u){let h=this.isobmffReader.readU8();this.isobmffReader.pos+=h}d&&(this.isobmffReader.pos+=2);let l=this.isobmffReader.readU8();m(l===4),this.isobmffReader.readIsomVariableInteger();let f=this.isobmffReader.readU8();m(f===64),this.isobmffReader.pos+=12;let g=this.isobmffReader.readU8();m(g===5);let b=this.isobmffReader.readIsomVariableInteger();a.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+b)}break;case"stts":{let a=this.currentTrack;if(m(a),!a.sampleTable)break;this.isobmffReader.pos+=4;let s=this.isobmffReader.readU32(),o=0,c=0;for(let u=0;uv.id===s);if(!o)break;o.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),u=(c&48)>>4,d=(c&12)>>2,l=c&3,f=this.isobmffReader,g=[f.readU8.bind(f),f.readU16.bind(f),f.readU24.bind(f),f.readU32.bind(f)],b=g[u],h=g[d],k=g[l],y=this.isobmffReader.readU32();for(let v=0;vs.moofOffset);this.fragments.splice(a+1,0,this.currentFragment);for(let[,s]of this.currentFragment.trackData){let o=s.samples[0],c=R(s.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,o.byteOffset),this.currentFragment.dataEnd=Math.max(this.currentFragment.dataEnd,c.byteOffset+c.byteSize)}this.currentFragment=null}break;case"traf":if(m(this.currentFragment),this.readContiguousBoxes(r.contentSize),this.currentTrack){let a=this.currentFragment.trackData.get(this.currentTrack.id);if(a){let s=_(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(s+1,0,this.currentFragment);let{currentFragmentState:o}=this.currentTrack;m(o),o.startTimestamp!==null&&(br(a,o.startTimestamp),a.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{m(this.currentFragment),this.isobmffReader.pos+=1;let a=this.isobmffReader.readU24(),s=!!(a&1),o=!!(a&2),c=!!(a&8),u=!!(a&16),d=!!(a&32),l=!!(a&65536),f=!!(a&131072),g=this.isobmffReader.readU32(),b=this.tracks.find(k=>k.id===g);if(!b)break;let h=this.fragmentTrackDefaults.find(k=>k.trackId===g);this.currentTrack=b,b.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:h?.defaultSampleDescriptionIndex??null,defaultSampleDuration:h?.defaultSampleDuration??null,defaultSampleSize:h?.defaultSampleSize??null,defaultSampleFlags:h?.defaultSampleFlags??null,startTimestamp:null},s?b.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():f&&(b.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),o&&(b.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(b.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),u&&(b.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),d&&(b.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),l&&(b.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let a=this.currentTrack;if(!a)break;m(a.currentFragmentState);let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=s===0?this.isobmffReader.readU32():this.isobmffReader.readU64();a.currentFragmentState.startTimestamp=o}break;case"trun":{let a=this.currentTrack;if(!a)break;if(m(this.currentFragment),m(a.currentFragmentState),this.currentFragment.trackData.has(a.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let s=this.isobmffReader.readU8(),o=this.isobmffReader.readU24(),c=!!(o&1),u=!!(o&4),d=!!(o&256),l=!!(o&512),f=!!(o&1024),g=!!(o&2048),b=this.isobmffReader.readU32(),h=a.currentFragmentState.baseDataOffset;c&&(h+=this.isobmffReader.readI32());let k=null;u&&(k=this.isobmffReader.readU32());let y=h;if(b===0){this.currentFragment.implicitBaseDataOffset=y;break}let v=0,T={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(a.id,T);for(let U=0;U({presentationTimestamp:U.presentationTimestamp,sampleIndex:M})).sort((U,M)=>U.presentationTimestamp-M.presentationTimestamp);let A=T.samples[T.presentationTimestamps[0].sampleIndex],F=T.samples[R(T.presentationTimestamps).sampleIndex];T.startTimestamp=A.presentationTimestamp,T.endTimestamp=F.presentationTimestamp+F.duration,this.currentFragment.implicitBaseDataOffset=y}break}this.isobmffReader.pos=n}},$e=class{constructor(t){this.internalTrack=t;this.chunkToSampleIndex=new WeakMap;this.chunkToFragmentLocation=new WeakMap}getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let e=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return e?e/1e6:0}async getFirstChunk(t){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let e=this.internalTrack.fragments[0];return{fragmentIndex:e?0:-1,sampleIndex:e?0:-1,correctSampleFound:!!e}},0,1/0,t):this.fetchChunkForSampleIndex(0,t)}roundToMicrosecond(t){return(Math.floor(t*1e6)+.99999999)/1e6}async getChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,e);{let n=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a=pr(n,r);return this.fetchChunkForSampleIndex(a,e)}}async getNextChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let n=this.chunkToFragmentLocation.get(t);if(n===void 0)throw new Error("Chunk was not created from this track.");let a=n.fragment.trackData.get(this.internalTrack.id),s=a.samples[n.sampleIndex],o=Q(this.internalTrack.fragments,n.fragment.moofOffset,c=>c.moofOffset);return m(o!==-1),this.performFragmentedLookup(()=>{if(n.sampleIndex+1l.moofOffset);return m(d!==-1),{fragmentIndex:d,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:o,sampleIndex:-1,correctSampleFound:!1}}},s.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,e)}async getKeyChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,e);let n=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a=pr(n,r),s=a===-1?-1:_i(n,a);return this.fetchChunkForSampleIndex(s,e)}async getNextKeyChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(t);if(s===void 0)throw new Error("Chunk was not created from this track.");let o=s.fragment.trackData.get(this.internalTrack.id),c=o.samples[s.sampleIndex],u=Q(this.internalTrack.fragments,s.fragment.moofOffset,d=>d.moofOffset);return m(u!==-1),this.performFragmentedLookup(()=>{let d=o.samples.findIndex((l,f)=>l.isKeyFrame&&f>s.sampleIndex);if(d!==-1)return{fragmentIndex:u,sampleIndex:d,correctSampleFound:!0};{let l=s.fragment;for(;l.nextFragment;){l=l.nextFragment;let f=l.trackData.get(this.internalTrack.id);if(f){let g=Q(this.internalTrack.fragments,l.moofOffset,h=>h.moofOffset);m(g!==-1);let b=f.samples.findIndex(h=>h.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:g,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},c.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");let n=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),a=Ai(n,r);return this.fetchChunkForSampleIndex(a,e)}async fetchChunkForSampleIndex(t,e){if(t===-1)return null;let r=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Ii(r,t);if(!n)return null;let a;e.metadataOnly?a=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(n.chunkOffset,n.chunkOffset+n.chunkSize),a=this.internalTrack.demuxer.chunkReader.readRange(n.sampleOffset,n.sampleOffset+n.sampleSize));let s=1e6*n.presentationTimestamp/this.internalTrack.timescale,o=1e6*n.duration/this.internalTrack.timescale,c=this.createChunk(a,s,o,n.isKeyFrame);return this.chunkToSampleIndex.set(c,t),c}async fetchChunkInFragment(t,e,r){if(e===-1)return null;let a=t.trackData.get(this.internalTrack.id).samples[e];m(a);let s;r.metadataOnly?s=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(t.dataStart,t.dataEnd),s=this.internalTrack.demuxer.chunkReader.readRange(a.byteOffset,a.byteOffset+a.byteSize));let o=1e6*a.presentationTimestamp/this.internalTrack.timescale,c=1e6*a.duration/this.internalTrack.timescale,u=this.createChunk(s,o,c,a.isKeyFrame);return this.chunkToFragmentLocation.set(u,{fragment:t,sampleIndex:e}),u}findSampleInFragmentsForTimestamp(t){let e=_(this.internalTrack.fragments,t,a=>a.trackData.get(this.internalTrack.id).startTimestamp),r=-1,n=!1;if(e!==-1){let s=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=_(s.presentationTimestamps,t,c=>c.presentationTimestamp);m(o!==-1),r=s.presentationTimestamps[o].sampleIndex,n=ta.trackData.get(this.internalTrack.id).startTimestamp),r=-1,n=!1;if(e!==-1){let s=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=Wt(s.presentationTimestamps,u=>s.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=t);if(o===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=s.presentationTimestamps[o].sampleIndex,n=ty.timestamp);k!==-1&&(h=this.internalTrack.fragmentLookupTable[k])}if(o===-1)d.pos=h?.moofOffset??0;else{let k=this.internalTrack.fragments[o];!h||k.moofOffset>=k.moofOffset?(d.pos=k.moofOffset+k.moofSize,f=k):d.pos=h.moofOffset}for(;d.posr)break;if(f.nextFragment){d.pos=f.nextFragment.moofOffset+f.nextFragment.moofSize,f=f.nextFragment;continue}}await d.reader.loadRange(d.pos,d.pos+16);let k=d.pos,y=d.readBoxHeader();if(y.name==="moof"){let v=Q(a.fragments,k,T=>T.moofOffset);if(v===-1){d.pos=k;let T=await a.readFragment();f&&(f.nextFragment=T),f=T;let{fragmentIndex:A,sampleIndex:F,correctSampleFound:U}=t();if(U){let M=this.internalTrack.fragments[A];return this.fetchChunkInFragment(M,F,n)}A!==-1&&(g=A,b=F)}else{let T=a.fragments[v];f&&(f.nextFragment=T),f=T}}d.pos=k+y.totalSize}if(g!==-1){let k=this.internalTrack.fragments[g];return this.fetchChunkInFragment(k,b,n)}return null}finally{s()}}},At=class extends $e{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getCodedWidth(){return this.internalTrack.info.width}async getCodedHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:sr(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}}createChunk(t,e,r,n){return new EncodedVideoChunk({data:t,timestamp:e,duration:r,type:n?"key":"delta"})}},Rt=class extends $e{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}async getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return{codec:cr(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}}createChunk(t,e,r,n){return new EncodedAudioChunk({data:t,timestamp:e,duration:r,type:n?"key":"delta"})}},pr=(i,t)=>{let e=_(i.presentationTimestamps,t,r=>r.presentationTimestamp);return e===-1?-1:i.presentationTimestamps[e].sampleIndex},Ii=(i,t)=>{let e=_(i.sampleTimingEntries,t,h=>h.startIndex),r=i.sampleTimingEntries[e];if(!r||r.startIndex+r.count<=t)return null;let a=r.startDecodeTimestamp+(t-r.startIndex)*r.delta,s=_(i.sampleCompositionTimeOffsets,t,h=>h.startIndex),o=i.sampleCompositionTimeOffsets[s];o&&(a+=o.offset);let c=i.sampleSizes[Math.min(t,i.sampleSizes.length-1)],u=_(i.sampleToChunk,t,h=>h.startSampleIndex),d=i.sampleToChunk[u];m(d);let l=d.startChunkIndex+Math.floor((t-d.startSampleIndex)/d.samplesPerChunk),f=i.chunkOffsets[l],g=0,b=f;if(i.sampleSizes.length===1)b+=c*(t-d.startSampleIndex),g+=c*d.samplesPerChunk;else{let h=d.startSampleIndex+(l-d.startChunkIndex)*d.samplesPerChunk;for(let k=h;kh)!==-1:!0}},_i=(i,t)=>{if(!i.keySampleIndices)return t;let e=_(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e]??-1},Ai=(i,t)=>{if(!i.keySampleIndices)return t+1;let e=_(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e+1]??-1},br=(i,t)=>{i.startTimestamp+=t,i.endTimestamp+=t;for(let e of i.samples)e.presentationTimestamp+=t;for(let e of i.presentationTimestamps)e.presentationTimestamp+=t};var ne=class{},qe=class extends ne{async _canReadInput(t){if(await t._mainReader.source._getSize()<8)return!1;let r=new ae(t._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(t){return new je(t)}},Xe=class extends ne{async _canReadInput(){return!1}_createDemuxer(){throw new Error("Not implemented")}},Ge=new qe,Ri=Ge,Oi=Ge,Ot=new Xe,kr=Ot,Ei=Ot,Fi=[Ge,kr];var Et=class{constructor(t){this._demuxerPromise=null;this._format=null;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!Array.isArray(t.formats)||t.formats.some(e=>!(e instanceof ne)))throw new TypeError("options.formats must be an array of InputFormat.");if(!(t.source instanceof ie))throw new TypeError("options.source must be a Source.");this._formats=t.formats,this._source=t.source,this._mainReader=new pe(t.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let t of this._formats)if(await t._canReadInput(this))return this._format=t,t._createDemuxer(this);throw new Error("Input has an unrecognizable format.")})()}async getFormat(){return await this._getDemuxer(),m(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 getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var L=i=>{if(!i||typeof i!="object")throw new TypeError("options must be an object.");if(i.metadataOnly!==void 0&&typeof i.metadataOnly!="boolean")throw new TypeError("options.metadataOnly, when defined, must be a boolean.")},z=i=>{if(typeof i!="number"||Number.isNaN(i))throw new TypeError("timestamp must be a number.")},Ie=class{async*chunks(t,e=1/0){let r=[],{promise:n,resolve:a}=E(),{promise:s,resolve:o}=E(),c=!1,u=[],d=()=>Math.max(2,u.length);(async()=>{let l=t??await this.getFirstChunk();for(;l&&!c&&!(l.timestamp/1e6>=e);){if(r.length>d()){({promise:s,resolve:o}=E()),await s;continue}r.push(l),a(),{promise:n,resolve:a}=E(),l=await this.getNextChunk(l)}c=!0,a()})();try{for(;;)if(r.length>0){yield r.shift();let l=performance.now();for(u.push(l);u.length>0&&l-u[0]>=1e3;)u.shift();o()}else if(!c)await n;else break}finally{c=!0,o()}}},_e=class{_duplicateFrame(t){return structuredClone(t)}async*mediaFramesAtTimestamps(t){Lt(t);let e=Ht(t),r=[],n=[],{promise:a,resolve:s}=E(),{promise:o,resolve:c}=E(),u=!1,d=!1,l=8,f=null,g=h=>{n.push(h),s(),{promise:a,resolve:s}=E()},b=await this._createDecoder(h=>{if(c(),d){h.close();return}let k=!1;for(;r.length>0&&r[0]===h.timestamp;)g(this._duplicateFrame(h)),r.shift(),k=!0;k?(f?.close(),f=h):h.close()});(async()=>{let h=this._createChunkDrain(),k=null,y=null;for await(let v of e){for(z(v);n.length+b.decodeQueueSize>l;)({promise:o,resolve:c}=E()),await o;if(d)break;let T=await h.getChunk(v);if(!T){g(null);continue}let A=await h.getKeyChunk(v);if(!A){g(null);continue}for(r.push(T.timestamp),k&&A.timestamp===k.timestamp&&T.timestamp>=y.timestamp?(m(y),T.timestamp===y.timestamp&&r.length===1&&(f&&g(this._duplicateFrame(f)),r.shift())):(k=A,y=A,b.decode(A));y.timestamp!==T.timestamp;){let F=await h.getNextChunk(y);m(F),y=F,b.decode(F)}b.decodeQueueSize>=10&&await new Promise(F=>b.addEventListener("dequeue",F,{once:!0}))}await b.flush(),b.close(),u=!0,s()})();try{for(;;)if(n.length>0){let h=n.shift();m(h!==void 0),yield h,c()}else if(!u)await a;else break}finally{d=!0,c();for(let h of n)h?.close();f?.close()}}async*mediaFramesInRange(t=0,e=1/0){z(t),z(e);let r=[],n=!1,a=null,{promise:s,resolve:o}=E(),{promise:c,resolve:u}=E(),d=!1,l=!1,f=8,g=await this._createDecoder(k=>{u();let y=k.timestamp/1e6;if(y>=e&&(l=!0),l){k.close();return}a&&(y>t?(r.push(a),n=!0):a.close()),y>=t&&(r.push(k),n=!0),a=n?null:k,r.length>0&&(o(),{promise:s,resolve:o}=E())}),b=this._createChunkDrain(),h=await b.getKeyChunk(t)??await b.getFirstChunk();if(h){(async()=>{let k=h,y=1/0;if(e<1/0){let T=await b.getChunk(e),A=T?T.type==="key"&&T.timestamp/1e6===e?T:await b.getNextKeyChunk(T):null;A&&(y=A.timestamp/1e6)}let v=b.chunks(h,y);for(await v.next();k&&!l;){if(r.length+g.decodeQueueSize>f){({promise:c,resolve:u}=E()),await c;continue}g.decode(k);let T=await v.next();if(T.done)break;k=T.value}await v.return(),await g.flush(),g.close(),!n&&a&&r.push(a),d=!0,o()})();try{for(;;)if(r.length>0)yield r.shift(),u();else if(!d)await s;else break}finally{l=!0,u();for(let k of r)k.close()}}}},Ye=class extends Ie{constructor(t){if(!(t instanceof W))throw new TypeError("videoTrack must be an InputVideoTrack.");super(),this._videoTrack=t}getFirstChunk(t={}){return L(t),this._videoTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return z(t),L(e),this._videoTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return L(e),this._videoTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return z(t),L(e),this._videoTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return L(e),this._videoTrack._backing.getNextKeyChunk(t,e)}},Ze=class extends _e{constructor(e){if(!(e instanceof W))throw new TypeError("videoTrack must be an InputVideoTrack.");super();this._decoderConfig=null;this._videoTrack=e}async _createDecoder(e){this._decoderConfig??=await this._videoTrack.getDecoderConfig();let r=new VideoDecoder({output:e,error:n=>console.error(n)});return r.configure(this._decoderConfig),r}_createChunkDrain(){return new Ye(this._videoTrack)}async getFrame(e){z(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}frames(e=0,r=1/0){return this.mediaFramesInRange(e,r)}framesAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},Ft=class{constructor(t,e){if(!(t instanceof W))throw new TypeError("videoTrack must be an InputVideoTrack.");if(e&&typeof e!="object")throw new TypeError("dimensions, when defined, must be an object.");if(e&&(!Number.isInteger(e.width)||e.width<=0))throw new TypeError("dimensions.width must be a positive integer.");if(e&&(!Number.isInteger(e.height)||e.height<=0))throw new TypeError("dimensions.height must be a positive integer.");this._videoTrack=t,this._dimensions=e,this._videoFrameDrain=new Ze(t)}async _videoFrameToWrappedCanvas(t){let e=this._dimensions?.width??await this._videoTrack.getDisplayWidth(),r=this._dimensions?.height??await this._videoTrack.getDisplayHeight(),n=await this._videoTrack.getRotation(),a=document.createElement("canvas");a.width=e,a.height=r;let s=a.getContext("2d",{alpha:!1});m(s),s.translate(e/2,r/2),s.rotate(n*Math.PI/180),s.translate(-e/2,-r/2);let[o,c]=n%180===0?[e,r]:[r,e];s.drawImage(t,(e-o)/2,(r-c)/2,o,c);let u={canvas:a,timestamp:t.timestamp/1e6,duration:(t.duration??0)/1e6};return t.close(),u}async getCanvas(t){z(t);let e=await this._videoFrameDrain.getFrame(t);return e&&this._videoFrameToWrappedCanvas(e)}async*canvases(t=0,e=1/0){for await(let r of this._videoFrameDrain.frames(t,e))yield this._videoFrameToWrappedCanvas(r)}async*canvasesAtTimestamps(t){for await(let e of this._videoFrameDrain.framesAtTimestamps(t))yield e&&this._videoFrameToWrappedCanvas(e)}},Je=class extends Ie{constructor(t){if(!(t instanceof H))throw new TypeError("audioTrack must be an InputAudioTrack.");super(),this._audioTrack=t}getFirstChunk(t={}){return L(t),this._audioTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return z(t),L(e),this._audioTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return L(e),this._audioTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return z(t),L(e),this._audioTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return L(e),this._audioTrack._backing.getNextKeyChunk(t,e)}},et=class extends _e{constructor(e){if(!(e instanceof H))throw new TypeError("audioTrack must be an InputAudioTrack.");super();this._decoderConfig=null;this._audioTrack=e}async _createDecoder(e){this._decoderConfig??=await this._audioTrack.getDecoderConfig();let r=new AudioDecoder({output:e,error:n=>console.error(n)});return r.configure(this._decoderConfig),r}_createChunkDrain(){return new Je(this._audioTrack)}async getData(e){z(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}data(e=0,r=1/0){return this.mediaFramesInRange(e,r)}dataAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},Vt=class{constructor(t){if(!(t instanceof H))throw new TypeError("audioTrack must be an InputAudioTrack.");this._audioDataDrain=new et(t)}_audioDataToWrappedArrayBuffer(t){let e=new AudioBuffer({numberOfChannels:t.numberOfChannels,length:t.numberOfFrames,sampleRate:t.sampleRate}),r=new Float32Array(t.allocationSize({planeIndex:0,format:"f32-planar"})/4);for(let s=0;sr.track===e))return;e:for(;;){let e=null,r=1/0;for(let n of this.trackDatas){if(n.chunkQueue.length===0&&!n.track.source._closed)break e;n.chunkQueue.length>0&&n.chunkQueue[0].timestamp=2&&s++;let u={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Dt(r.data,s+0,s+3,u)}createInternalChunk(e,r,s,n,a=null){return{data:e,type:n,timestamp:r,duration:s,additions:a}}writeBlock(e,r){this.segment||(this.createTracks(),this.createSegment());let s=Math.floor(1e3*r.timestamp),n=this.trackDatas.every(f=>{if(f.track.source._closed)return!0;if(e===f)return r.type==="key";let m=f.chunkQueue[0];return m&&m.type==="key"});(!this.currentCluster||n&&s-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(s);let a=s-this.currentClusterMsTimestamp;if(a<0)return;if(a>=ht)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${ht} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${ht} milliseconds.`);let c=new Uint8Array(4),u=new DataView(c.buffer);u.setUint8(0,128|e.track.id),u.setInt16(1,a,!1);let d=Math.floor(1e3*r.duration);if(d===0&&!r.additions){u.setUint8(3,+(r.type==="key")<<7);let f={id:163,data:[c,r.data]};this.writeEBML(f)}else{let f={id:160,data:[{id:161,data:[c,r.data]},r.type==="delta"?{id:251,data:new we(e.lastWrittenMsTimestamp-s)}:null,r.additions?{id:30113,data:[{id:166,data:[{id:165,data:r.additions},{id:238,data:1}]}]}:null,d>0?{id:155,data:d}:null]};this.writeEBML(f)}this.duration=Math.max(this.duration,s+d),e.lastWrittenMsTimestamp=s,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:pr,data:[{id:231,data:e}]},this.writeEBML(this.currentCluster),this.currentClusterMsTimestamp=e,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){l(this.currentCluster);let e=this.writer.getPos()-this.dataOffsets.get(this.currentCluster),r=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,pr),this.writer.seek(r);let s=this.offsets.get(this.currentCluster)-this.segmentDataOffset;l(this.cues),this.cues.data.push({id:187,data:[{id:179,data:this.currentClusterMsTimestamp},...[...this.trackDatasInCurrentCluster].map(n=>({id:183,data:[{id:247,data:n.track.id},{id:241,data:s}]}))]})}async onTrackClose(){let e=await this.mutex.acquire();await this.interleaveChunks(),e()}async finalize(){let e=await this.mutex.acquire();this.segment||(this.createTracks(),this.createSegment());for(let r of this.trackDatas)for(;r.chunkQueue.length>0;)this.writeBlock(r,r.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),l(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let r=this.writer.getPos(),s=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(s,hr),this.segmentDuration.data=new le(this.duration),this.writer.seek(this.offsets.get(this.segmentDuration)),this.writeEBML(this.segmentDuration),this.seekHead.data[0].data[1].data=this.offsets.get(this.cues)-this.segmentDataOffset,this.seekHead.data[1].data[1].data=this.offsets.get(this.segmentInfo)-this.segmentDataOffset,this.seekHead.data[2].data[1].data=this.offsets.get(this.tracksElement)-this.segmentDataOffset,this.writer.seek(this.offsets.get(this.seekHead)),this.writeEBML(this.seekHead),this.writer.seek(r)}e()}};var ie=class{},pt=class extends ie{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(t.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=t}_createMuxer(t){return new He(t,this)}},Qe=class extends ie{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.streamable!==void 0&&typeof t.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=t}_createMuxer(t){return new Le(t,this)}},me=class extends Qe{};var fe=class{constructor(){this._connectedTrack=null;this._closed=!1;this._offsetTimestamps=!1}_ensureValidDigest(){if(!this._connectedTrack)throw new Error("Cannot call digest without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call digest before output has been started.");if(this._connectedTrack.output._finalizing)throw new Error("Cannot call digest after output has started finalizing.");if(this._closed)throw new Error("Cannot call digest after source has been closed.")}_start(){}async _flush(){}close(){if(this._closed)throw new Error("Source already closed.");if(!this._connectedTrack)throw new Error("Cannot call close without connecting the source to an output track.");if(!this._connectedTrack.output._started)throw new Error("Cannot call close before output has been started.");this._closed=!0,!this._connectedTrack.output._finalizing&&this._connectedTrack.output._muxer.onTrackClose(this._connectedTrack)}},$=class extends fe{constructor(e){super();this._connectedTrack=null;if(!ue.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${ue.join(", ")}.`);this._codec=e}},bt=class extends ${constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,t,e)}},yi=5,Si=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!ue.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${ue.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.");if(i.latencyMode!==void 0&&!["quality","realtime"].includes(i.latencyMode))throw new TypeError("config.latencyMode, when provided, must be 'quality' or 'realtime'.")},ye=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastMultipleOfKeyFrameInterval=-1;this.lastWidth=null;this.lastHeight=null;Si(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(t.codedWidth!==this.lastWidth||t.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${t.codedWidth}x${t.codedHeight}.`)}else this.lastWidth=t.codedWidth,this.lastHeight=t.codedHeight;this.ensureEncoder(t),l(this.encoder);let e=Math.floor(t.timestamp/1e6/yi);this.encoder.encode(t,{keyFrame:e!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=e,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new VideoEncoder({output:(e,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,e,r),error:e=>console.error("Video encode error:",e)}),this.encoder.configure({codec:ar(this.codecConfig.codec,t.codedWidth,t.codedHeight,this.codecConfig.bitrate),width:t.codedWidth,height:t.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...dr(this.codecConfig.codec)}),l(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},kt=class extends ${constructor(t){super(t.codec),this._encoder=new ye(this,t)}digest(t){if(!(t instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},gt=class extends ${constructor(t,e){if(!(t instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(e.codec),this._encoder=new ye(this,e),this._canvas=t}digest(t,e=0){if(!Number.isFinite(t)||t<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(e)||e<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*t),duration:Math.round(1e6*e),alpha:"discard"}),s=this._encoder.digest(r);return r.close(),s}_flush(){return this._encoder.flush()}},Tt=class extends ${constructor(e,r){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");r={...r,latencyMode:"realtime"};super(r.codec);this._abortController=null;this._offsetTimestamps=!0;this._encoder=new ye(this,r),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),r=new WritableStream({write:s=>{this._encoder.digest(s),s.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(s=>{s instanceof DOMException&&s.name==="AbortError"||console.error("Pipe error:",s)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},K=class extends fe{constructor(e){super();this._connectedTrack=null;if(!de.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${de.join(", ")}.`);this._codec=e}},xt=class extends K{constructor(t){super(t)}digest(t,e){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,t,e)}},vi=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!de.includes(i.codec))throw new TypeError(`Invalid audio codec '${i.codec}'. Must be one of: ${de.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},Se=class{constructor(t,e){this.source=t;this.codecConfig=e;this.encoder=null;this.muxer=null;this.lastNumberOfChannels=null;this.lastSampleRate=null;vi(e)}async digest(t){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(t.numberOfChannels!==this.lastNumberOfChannels||t.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${t.numberOfChannels} channels at ${t.sampleRate} Hz.`)}else this.lastNumberOfChannels=t.numberOfChannels,this.lastSampleRate=t.sampleRate;this.ensureEncoder(t),l(this.encoder),this.encoder.encode(t),this.encoder.encodeQueueSize>=4&&await new Promise(e=>this.encoder.addEventListener("dequeue",e,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(t){this.encoder||(this.encoder=new AudioEncoder({output:(e,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,e,r),error:e=>console.error("Audio encode error:",e)}),this.encoder.configure({codec:cr(this.codecConfig.codec,t.numberOfChannels,t.sampleRate),numberOfChannels:t.numberOfChannels,sampleRate:t.sampleRate,bitrate:this.codecConfig.bitrate,...lr(this.codecConfig.codec)}),l(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},Ct=class extends K{constructor(t){super(t.codec),this._encoder=new Se(this,t)}digest(t){if(!(t instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(t)}_flush(){return this._encoder.flush()}},wt=class extends K{constructor(e){super(e.codec);this._accumulatedFrameCount=0;this._encoder=new Se(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let r=e.numberOfChannels,s=e.sampleRate,n=e.length,a=new Float32Array(r*n);for(let u=0;u{this._encoder.digest(s),s.close()}});e.readable.pipeTo(r,{signal:this._abortController.signal}).catch(s=>{s instanceof DOMException&&s.name==="AbortError"||console.error("Pipe error:",s)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},he=class extends fe{constructor(e){super();this._connectedTrack=null;if(!Ue.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${Ue.join(", ")}.`);this._codec=e}},St=class extends he{constructor(t){super(t),this._parser=new Oe({codec:t,output:(e,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,e,r),error:e=>console.error("Subtitle parse error:",e)})}digest(t){if(typeof t!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(t),this._connectedTrack.output._muxer.mutex.currentPromise}};var vt=class{constructor(t){this._tracks=[];this._started=!1;this._finalizing=!1;this._mutex=new j;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!(t.format instanceof ie))throw new TypeError("options.format must be an OutputFormat.");if(!(t.target instanceof re))throw new TypeError("options.target must be a Target.");if(t.target._output)throw new Error("Target is already used for another output.");t.target._output=this,this._writer=t.target._createWriter(),this._muxer=t.format._createMuxer(this)}addVideoTrack(t,e={}){if(!(t instanceof $))throw new TypeError("source must be a VideoSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");if(typeof e.rotation=="number"&&![0,90,180,270].includes(e.rotation))throw new TypeError(`Invalid video rotation: ${e.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(e.rotation)&&(e.rotation.length!==9||e.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${e.rotation.join()}`);if(e.frameRate!==void 0&&(!Number.isInteger(e.frameRate)||e.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.frameRate}. Must be a positive integer.`);this._addTrack("video",t,e)}addAudioTrack(t,e={}){if(!(t instanceof K))throw new TypeError("source must be an AudioSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",t,e)}addSubtitleTrack(t,e={}){if(!(t instanceof he))throw new TypeError("source must be a SubtitleSource.");if(!e||typeof e!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",t,e)}_addTrack(t,e,r){if(this._started)throw new Error("Cannot add track after output has started.");if(e._connectedTrack)throw new Error("Source is already used for a track.");let s={id:this._tracks.length+1,output:this,type:t,source:e,metadata:r};this._muxer.beforeTrackAdd(s),this._tracks.push(s),e._connectedTrack=s}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let t=await this._mutex.acquire();await this._muxer.start();for(let e of this._tracks)e.source._start();t()}async finalize(){if(!this._started)throw new Error("Cannot finalize before starting.");if(this._finalizing)throw new Error("Cannot call finalize twice.");this._finalizing=!0;let t=await this._mutex.acquire(),e=this._tracks.map(r=>r.source._flush());await Promise.all(e),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),t()}};var X=class{constructor(){this._sizePromise=null}_getSize(){return this._sizePromise??=this._retrieveSize()}},_t=class extends X{constructor(t){if(!(t instanceof ArrayBuffer)&&!(t instanceof Uint8Array))throw new TypeError("buffer must be an ArrayBuffer or Uint8Array.");super(),this._bytes=t instanceof Uint8Array?t:new Uint8Array(t)}async _read(t,e){return this._bytes.subarray(t,e)}async _retrieveSize(){return this._bytes.byteLength}},At=class extends X{constructor(t){if(!(t instanceof Blob))throw new TypeError("blob must be a Blob.");super(),this._blob=t}async _read(t,e){let s=await this._blob.slice(t,e).arrayBuffer();return new Uint8Array(s)}async _retrieveSize(){return this._blob.size}},It=class extends X{constructor(e,r={}){if(typeof e!="string")throw new TypeError("url must be a string.");if(!r||typeof r!="object")throw new TypeError("options must be an object.");if(r.withCredentials!==void 0&&typeof r.withCredentials!="boolean")throw new TypeError("options.withCredentials, when specified, must be a boolean.");super();this._fullData=null;this._url=e,this._withCredentials=r.withCredentials??!1}_makeRequest(e){return new Promise((r,s)=>{let n=new XMLHttpRequest;n.open("GET",this._url,!0),n.responseType="arraybuffer",n.withCredentials=this._withCredentials,e&&n.setRequestHeader("Range",`bytes=${e.start}-${e.end-1}`),n.onload=()=>{if(n.status>=200&&n.status<300){let a=n.response;e||(this._fullData=a),r({response:a,statusCode:n.status})}else s(new Error(`Error fetching ${this._url}: ${n.status} ${n.statusText}`))},n.onerror=()=>{s(new Error("Network error occurred."))},n.ontimeout=()=>{s(new Error("Request timed out."))},n.send()})}async _read(e,r){if(this._fullData)return new Uint8Array(this._fullData,e,r-e);let{response:s,statusCode:n}=await this._makeRequest({start:e,end:r});return n===200?new Uint8Array(s).subarray(e,r):new Uint8Array(s)}async _retrieveSize(){if(this._fullData)return this._fullData.byteLength;let e=new XMLHttpRequest;e.open("HEAD",this._url,!0),e.withCredentials=this._withCredentials,await new Promise((s,n)=>{e.onload=()=>{e.status>=200&&e.status<300?s():n(new Error(`Error fetching ${this._url} (HEAD): ${e.status} ${e.statusText}`))},e.onerror=()=>{s()},e.send()});let r=e.getResponseHeader("Content-Length");if(!r){let{response:s}=await this._makeRequest();return s.byteLength}return parseInt(r,10)}};var $e=class{constructor(t){this.input=t}};var ve=class{constructor(t){this._backing=t}isVideoTrack(){return this instanceof W}isAudioTrack(){return this instanceof H}computeDuration(){return this._backing.computeDuration()}},W=class extends ve{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getCodedWidth(){return this._backing.getCodedWidth()}getCodedHeight(){return this._backing.getCodedHeight()}getRotation(){return this._backing.getRotation()}async getDisplayWidth(){return await this._backing.getRotation()%180===0?this._backing.getCodedWidth():this._backing.getCodedHeight()}async getDisplayHeight(){return await this._backing.getRotation()%180===0?this._backing.getCodedHeight():this._backing.getCodedWidth()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},H=class extends ve{constructor(t){super(t),this._backing=t}getCodec(){return this._backing.getCodec()}getNumberOfChannels(){return this._backing.getNumberOfChannels()}getSampleRate(){return this._backing.getSampleRate()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}};var pe=class{constructor(t,e=1/0){this.source=t;this.maxStorableBytes=e;this.loadedSegments=[];this.loadingSegments=[];this.sourceSizePromise=null;this.nextAge=0;this.totalStoredBytes=0}async loadRange(t,e){e=Math.min(e,await this.source._getSize());let r=this.loadingSegments.find(c=>c.start<=t&&c.end>=e);if(r){await r.promise;return}if(this.loadedSegments.some(c=>c.start<=t&&c.end>=e))return;let n=this.source._read(t,e),a={start:t,end:e,promise:n};this.loadingSegments.push(a);let o=await n;Wt(this.loadingSegments,a),this.insertIntoLoadedSegments(t,o)}insertIntoLoadedSegments(t,e){let r={start:t,end:t+e.byteLength,bytes:e,view:new DataView(e.buffer),age:this.nextAge++},s=E(this.loadedSegments,t,n=>n.start);(s===-1||this.loadedSegments[s].start=r.end)break;r.start<=a.start&&a.end<=r.end&&(this.loadedSegments.splice(n,1),n--)}for(;this.totalStoredBytes>this.maxStorableBytes&&this.loadedSegments.length>1;){let n=null,a=-1;for(let o=0;on.start),s=null;if(r!==-1)for(let n=r;nt)break;if(e<=a.end){s=a;break}}if(!s)throw new Error(`No segment loaded for range [${t}, ${e}).`);return s.age=this.nextAge++,{view:s.view,offset:s.bytes.byteOffset+t-s.start}}forgetRange(t,e){if(e<=t)return;let r=E(this.loadedSegments,t,n=>n.start);if(r===-1)return;let s=this.loadedSegments[r];s.start!==t||s.end!==e||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=s.bytes.byteLength)}};var ne=class{constructor(t){this.reader=t;this.pos=0}readRange(t,e){let{view:r,offset:s}=this.reader.getViewAndOffset(t,e);return new Uint8Array(r.buffer,s,e-t)}readU8(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,t.getUint8(e)}readU16(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,t.getUint16(e,!1)}readU24(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=t.getUint16(e,!1),s=t.getUint8(e+2);return r*256+s}readS32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getUint32(e,!1)}readI32(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,t.getInt32(e,!1)}readU64(){let t=this.readU32(),e=this.readU32();return t*4294967296+e}readF64(){let{view:t,offset:e}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,t.getFloat64(e,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(t){let{view:e,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+t);this.pos+=t;let s="";for(let n=0;ns.computeDuration()));return Math.max(0,...r)}async getTracks(){return await this.readMetadata(),this.tracks.map(e=>e.inputTrack)}async getMimeType(){await this.readMetadata();let e="video/mp4";if(this.tracks.length>0){let r=await Promise.all(this.tracks.map(n=>n.inputTrack.getCodecMimeType())),s=[...new Set(r)];e+=`; codecs="${s.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&ss.presentationTimestamp-n.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let r=this.isobmffReader.readBoxHeader();l(r.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+r.totalSize),this.isobmffReader.pos=e,this.traverseBox();let s=Q(this.fragments,e,a=>a.moofOffset);l(s!==-1);let n=this.fragments[s];l(n.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+r.totalSize);for(let[a,o]of n.trackData){if(o.startTimestampIsFinal)continue;let c=this.tracks.find(m=>m.id===a);this.isobmffReader.pos=0;let u=null,d=null,f=E(c.fragments,e-1,m=>m.moofOffset);for(f!==-1&&(u=c.fragments[f],d=u,this.isobmffReader.pos=u.moofOffset+u.moofSize);this.isobmffReader.posp.moofOffset);if(b===-1){this.isobmffReader.pos=m;let p=await this.readFragment();u&&(u.nextFragment=p),u=p}else{let p=this.fragments[b];u&&(u.nextFragment=p),u=p}}this.isobmffReader.pos=m+g.totalSize}u&&u.trackData.has(a)&&(d=u)}if(d){let m=d.trackData.get(a);l(m.startTimestampIsFinal),kr(o,m.endTimestamp)}o.startTimestampIsFinal=!0}return n}readContiguousBoxes(e){let r=this.isobmffReader.pos;for(;this.isobmffReader.pos-rf.every((m,g)=>m===u[g]));d===-1?n.rotation=0:n.rotation=90*d}break;case"mdhd":{let n=this.currentTrack;l(n);let a=this.isobmffReader.readU8();this.isobmffReader.pos+=3,a===0?(this.isobmffReader.pos+=8,n.timescale=this.isobmffReader.readU32(),n.durationInTimescale=this.isobmffReader.readU32()):a===1&&(this.isobmffReader.pos+=16,n.timescale=this.isobmffReader.readU32(),n.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let n=this.currentTrack;l(n),this.isobmffReader.pos+=8;let a=this.isobmffReader.readAscii(4);a==="vide"?n.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:a==="soun"&&(n.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let n=this.currentTrack;l(n),n.sampleTableOffset=e,this.readContiguousBoxes(r.contentSize)}break;case"stsd":{let n=this.currentTrack;if(l(n),n.info===null||n.sampleTable)break;let a=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=this.isobmffReader.readU32();for(let c=0;c0){if(d===1)this.isobmffReader.pos+=4*4;else if(d===2){this.isobmffReader.pos+=4,m=this.isobmffReader.readF64(),f=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let g=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),p=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}n.info.numberOfChannels=f,n.info.sampleRate=m,this.readContiguousBoxes(e+u.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let n=this.currentTrack;l(n&&n.info),n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"hvcC":{let n=this.currentTrack;l(n&&n.info),n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+r.contentSize)}break;case"colr":{let n=this.currentTrack;if(l(n&&n.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let o=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),u=this.isobmffReader.readU16(),d=!!(this.isobmffReader.readU8()&128);n.info.colorSpace={primaries:Pt[o],transfer:zt[c],matrix:Ut[u],fullRange:d}}break;case"wave":r.totalSize>8&&this.readContiguousBoxes(r.contentSize);break;case"esds":{let n=this.currentTrack;l(n&&n.info),this.isobmffReader.pos+=4;let a=this.isobmffReader.readU8();l(a===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let o=this.isobmffReader.readU8(),c=(o&128)!==0,u=(o&64)!==0,d=(o&32)!==0;if(c&&(this.isobmffReader.pos+=2),u){let p=this.isobmffReader.readU8();this.isobmffReader.pos+=p}d&&(this.isobmffReader.pos+=2);let f=this.isobmffReader.readU8();l(f===4),this.isobmffReader.readIsomVariableInteger();let m=this.isobmffReader.readU8();l(m===64),this.isobmffReader.pos+=12;let g=this.isobmffReader.readU8();l(g===5);let b=this.isobmffReader.readIsomVariableInteger();n.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+b)}break;case"stts":{let n=this.currentTrack;if(l(n),!n.sampleTable)break;this.isobmffReader.pos+=4;let a=this.isobmffReader.readU32(),o=0,c=0;for(let u=0;ux.id===a);if(!o)break;o.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),u=(c&48)>>4,d=(c&12)>>2,f=c&3,m=this.isobmffReader,g=[m.readU8.bind(m),m.readU16.bind(m),m.readU24.bind(m),m.readU32.bind(m)],b=g[u],p=g[d],k=g[f],T=this.isobmffReader.readU32();for(let x=0;xa.moofOffset);this.fragments.splice(n+1,0,this.currentFragment);for(let[,a]of this.currentFragment.trackData){let o=a.samples[0],c=F(a.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,o.byteOffset),this.currentFragment.dataEnd=Math.max(this.currentFragment.dataEnd,c.byteOffset+c.byteSize)}this.currentFragment=null}break;case"traf":if(l(this.currentFragment),this.readContiguousBoxes(r.contentSize),this.currentTrack){let n=this.currentFragment.trackData.get(this.currentTrack.id);if(n){let a=E(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(a+1,0,this.currentFragment);let{currentFragmentState:o}=this.currentTrack;l(o),o.startTimestamp!==null&&(kr(n,o.startTimestamp),n.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{l(this.currentFragment),this.isobmffReader.pos+=1;let n=this.isobmffReader.readU24(),a=!!(n&1),o=!!(n&2),c=!!(n&8),u=!!(n&16),d=!!(n&32),f=!!(n&65536),m=!!(n&131072),g=this.isobmffReader.readU32(),b=this.tracks.find(k=>k.id===g);if(!b)break;let p=this.fragmentTrackDefaults.find(k=>k.trackId===g);this.currentTrack=b,b.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:p?.defaultSampleDescriptionIndex??null,defaultSampleDuration:p?.defaultSampleDuration??null,defaultSampleSize:p?.defaultSampleSize??null,defaultSampleFlags:p?.defaultSampleFlags??null,startTimestamp:null},a?b.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():m&&(b.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),o&&(b.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(b.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),u&&(b.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),d&&(b.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),f&&(b.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let n=this.currentTrack;if(!n)break;l(n.currentFragmentState);let a=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let o=a===0?this.isobmffReader.readU32():this.isobmffReader.readU64();n.currentFragmentState.startTimestamp=o}break;case"trun":{let n=this.currentTrack;if(!n)break;if(l(this.currentFragment),l(n.currentFragmentState),this.currentFragment.trackData.has(n.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let a=this.isobmffReader.readU8(),o=this.isobmffReader.readU24(),c=!!(o&1),u=!!(o&4),d=!!(o&256),f=!!(o&512),m=!!(o&1024),g=!!(o&2048),b=this.isobmffReader.readU32(),p=n.currentFragmentState.baseDataOffset;c&&(p+=this.isobmffReader.readI32());let k=null;u&&(k=this.isobmffReader.readU32());let T=p;if(b===0){this.currentFragment.implicitBaseDataOffset=T;break}let x=0,C={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(n.id,C);for(let I=0;I({presentationTimestamp:I.presentationTimestamp,sampleIndex:R})).sort((I,R)=>I.presentationTimestamp-R.presentationTimestamp);let O=C.samples[C.presentationTimestamps[0].sampleIndex],_=C.samples[F(C.presentationTimestamps).sampleIndex];C.startTimestamp=O.presentationTimestamp,C.endTimestamp=_.presentationTimestamp+_.duration,this.currentFragment.implicitBaseDataOffset=T}break}this.isobmffReader.pos=s}},je=class{constructor(t){this.internalTrack=t;this.chunkToSampleIndex=new WeakMap;this.chunkToFragmentLocation=new WeakMap}getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let e=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return e?e/1e6:0}async getFirstChunk(t){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let e=this.internalTrack.fragments[0];return{fragmentIndex:e?0:-1,sampleIndex:e?0:-1,correctSampleFound:!!e}},0,1/0,t):this.fetchChunkForSampleIndex(0,t)}roundToMicrosecond(t){return(Math.floor(t*1e6)+.99999999)/1e6}async getChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,e);{let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=br(s,r);return this.fetchChunkForSampleIndex(n,e)}}async getNextChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(t);if(s===void 0)throw new Error("Chunk was not created from this track.");let n=s.fragment.trackData.get(this.internalTrack.id),a=n.samples[s.sampleIndex],o=Q(this.internalTrack.fragments,s.fragment.moofOffset,c=>c.moofOffset);return l(o!==-1),this.performFragmentedLookup(()=>{if(s.sampleIndex+1f.moofOffset);return l(d!==-1),{fragmentIndex:d,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:o,sampleIndex:-1,correctSampleFound:!1}}},a.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,e)}async getKeyChunk(t,e){t=this.roundToMicrosecond(t);let r=t*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,e);let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=br(s,r),a=n===-1?-1:Ii(s,n);return this.fetchChunkForSampleIndex(a,e)}async getNextKeyChunk(t,e){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(t);if(a===void 0)throw new Error("Chunk was not created from this track.");let o=a.fragment.trackData.get(this.internalTrack.id),c=o.samples[a.sampleIndex],u=Q(this.internalTrack.fragments,a.fragment.moofOffset,d=>d.moofOffset);return l(u!==-1),this.performFragmentedLookup(()=>{let d=o.samples.findIndex((f,m)=>f.isKeyFrame&&m>a.sampleIndex);if(d!==-1)return{fragmentIndex:u,sampleIndex:d,correctSampleFound:!0};{let f=a.fragment;for(;f.nextFragment;){f=f.nextFragment;let m=f.trackData.get(this.internalTrack.id);if(m){let g=Q(this.internalTrack.fragments,f.moofOffset,p=>p.moofOffset);l(g!==-1);let b=m.samples.findIndex(p=>p.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:g,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},c.presentationTimestamp,1/0,e)}let r=this.chunkToSampleIndex.get(t);if(r===void 0)throw new Error("Chunk was not created from this track.");let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Ei(s,r);return this.fetchChunkForSampleIndex(n,e)}async fetchChunkForSampleIndex(t,e){if(t===-1)return null;let r=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=Ai(r,t);if(!s)return null;let n;e.metadataOnly?n=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(s.chunkOffset,s.chunkOffset+s.chunkSize),n=this.internalTrack.demuxer.chunkReader.readRange(s.sampleOffset,s.sampleOffset+s.sampleSize));let a=1e6*s.presentationTimestamp/this.internalTrack.timescale,o=1e6*s.duration/this.internalTrack.timescale,c=this.createChunk(n,a,o,s.isKeyFrame);return this.chunkToSampleIndex.set(c,t),c}async fetchChunkInFragment(t,e,r){if(e===-1)return null;let n=t.trackData.get(this.internalTrack.id).samples[e];l(n);let a;r.metadataOnly?a=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(t.dataStart,t.dataEnd),a=this.internalTrack.demuxer.chunkReader.readRange(n.byteOffset,n.byteOffset+n.byteSize));let o=1e6*n.presentationTimestamp/this.internalTrack.timescale,c=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(a,o,c,n.isKeyFrame);return this.chunkToFragmentLocation.set(u,{fragment:t,sampleIndex:e}),u}findSampleInFragmentsForTimestamp(t){let e=E(this.internalTrack.fragments,t,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(e!==-1){let a=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=E(a.presentationTimestamps,t,c=>c.presentationTimestamp);l(o!==-1),r=a.presentationTimestamps[o].sampleIndex,s=tn.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(e!==-1){let a=this.internalTrack.fragments[e].trackData.get(this.internalTrack.id),o=Ht(a.presentationTimestamps,u=>a.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=t);if(o===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=a.presentationTimestamps[o].sampleIndex,s=tT.timestamp);k!==-1&&(p=this.internalTrack.fragmentLookupTable[k])}if(o===-1)d.pos=p?.moofOffset??0;else{let k=this.internalTrack.fragments[o];!p||k.moofOffset>=k.moofOffset?(d.pos=k.moofOffset+k.moofSize,m=k):d.pos=p.moofOffset}for(;d.posr)break;if(m.nextFragment){d.pos=m.nextFragment.moofOffset+m.nextFragment.moofSize,m=m.nextFragment;continue}}await d.reader.loadRange(d.pos,d.pos+16);let k=d.pos,T=d.readBoxHeader();if(T.name==="moof"){let x=Q(n.fragments,k,C=>C.moofOffset);if(x===-1){d.pos=k;let C=await n.readFragment();m&&(m.nextFragment=C),m=C;let{fragmentIndex:O,sampleIndex:_,correctSampleFound:I}=t();if(I){let R=this.internalTrack.fragments[O];return this.fetchChunkInFragment(R,_,s)}O!==-1&&(g=O,b=_)}else{let C=n.fragments[x];m&&(m.nextFragment=C),m=C}}d.pos=k+T.totalSize}if(g!==-1){let k=this.internalTrack.fragments[g];return this.fetchChunkInFragment(k,b,s)}return null}finally{a()}}},Et=class extends je{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getCodedWidth(){return this.internalTrack.info.width}async getCodedHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:or(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),codedWidth:this.internalTrack.info.width,codedHeight:this.internalTrack.info.height,description:this.internalTrack.info.codecDescription??void 0,colorSpace:this.internalTrack.info.colorSpace??void 0}}createChunk(t,e,r,s){return new EncodedVideoChunk({data:t,timestamp:e,duration:r,type:s?"key":"delta"})}},Rt=class extends je{constructor(t){super(t),this.internalTrack=t}async getCodec(){return this.internalTrack.info.codec}async getNumberOfChannels(){return this.internalTrack.info.numberOfChannels}async getSampleRate(){return this.internalTrack.info.sampleRate}async getDecoderConfig(){return{codec:ur(this.internalTrack.info.codec,this.internalTrack.info.codecDescription),numberOfChannels:this.internalTrack.info.numberOfChannels,sampleRate:this.internalTrack.info.sampleRate,description:this.internalTrack.info.codecDescription??void 0}}createChunk(t,e,r,s){return new EncodedAudioChunk({data:t,timestamp:e,duration:r,type:s?"key":"delta"})}},br=(i,t)=>{let e=E(i.presentationTimestamps,t,r=>r.presentationTimestamp);return e===-1?-1:i.presentationTimestamps[e].sampleIndex},Ai=(i,t)=>{let e=E(i.sampleTimingEntries,t,p=>p.startIndex),r=i.sampleTimingEntries[e];if(!r||r.startIndex+r.count<=t)return null;let n=r.startDecodeTimestamp+(t-r.startIndex)*r.delta,a=E(i.sampleCompositionTimeOffsets,t,p=>p.startIndex),o=i.sampleCompositionTimeOffsets[a];o&&(n+=o.offset);let c=i.sampleSizes[Math.min(t,i.sampleSizes.length-1)],u=E(i.sampleToChunk,t,p=>p.startSampleIndex),d=i.sampleToChunk[u];l(d);let f=d.startChunkIndex+Math.floor((t-d.startSampleIndex)/d.samplesPerChunk),m=i.chunkOffsets[f],g=0,b=m;if(i.sampleSizes.length===1)b+=c*(t-d.startSampleIndex),g+=c*d.samplesPerChunk;else{let p=d.startSampleIndex+(f-d.startChunkIndex)*d.samplesPerChunk;for(let k=p;kp)!==-1:!0}},Ii=(i,t)=>{if(!i.keySampleIndices)return t;let e=E(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e]??-1},Ei=(i,t)=>{if(!i.keySampleIndices)return t+1;let e=E(i.keySampleIndices,t,r=>r);return i.keySampleIndices[e+1]??-1},kr=(i,t)=>{i.startTimestamp+=t,i.endTimestamp+=t;for(let e of i.samples)e.presentationTimestamp+=t;for(let e of i.presentationTimestamps)e.presentationTimestamp+=t};var se=class{},qe=class extends se{async _canReadInput(t){if(await t._mainReader.source._getSize()<8)return!1;let r=new ne(t._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(t){return new Ke(t)}},Xe=class extends se{async _canReadInput(){return!1}_createDemuxer(){throw new Error("Not implemented")}},Ge=new qe,Ri=Ge,Oi=Ge,Ot=new Xe,gr=Ot,Fi=Ot,Vi=[Ge,gr];var Ft=class{constructor(t){this._demuxerPromise=null;this._format=null;if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(!Array.isArray(t.formats)||t.formats.some(e=>!(e instanceof se)))throw new TypeError("options.formats must be an array of InputFormat.");if(!(t.source instanceof X))throw new TypeError("options.source must be a Source.");this._formats=t.formats,this._source=t.source,this._mainReader=new pe(t.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let t of this._formats)if(await t._canReadInput(this))return this._format=t,t._createDemuxer(this);throw new Error("Input has an unrecognizable format.")})()}async getFormat(){return await this._getDemuxer(),l(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 getPrimaryVideoTrack(){return(await this.getTracks()).find(e=>e.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(e=>e.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(e=>e.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var L=i=>{if(!i||typeof i!="object")throw new TypeError("options must be an object.");if(i.metadataOnly!==void 0&&typeof i.metadataOnly!="boolean")throw new TypeError("options.metadataOnly, when defined, must be a boolean.")},U=i=>{if(typeof i!="number"||Number.isNaN(i))throw new TypeError("timestamp must be a number.")},_e=class{async*chunks(t,e=1/0){let r=[],{promise:s,resolve:n}=M(),{promise:a,resolve:o}=M(),c=!1,u=null,d=[],f=()=>Math.max(2,d.length);(async()=>{let m=t??await this.getFirstChunk();for(;m&&!c&&!(m.timestamp/1e6>=e);){if(r.length>f()){({promise:a,resolve:o}=M()),await a;continue}r.push(m),n(),{promise:s,resolve:n}=M(),m=await this.getNextChunk(m)}c=!0,n()})().catch(m=>{u||(u=m,n())});try{for(;;){if(u)throw u;if(r.length>0){yield r.shift();let m=performance.now();for(d.push(m);d.length>0&&m-d[0]>=1e3;)d.shift();o()}else if(!c)await s;else break}}finally{c=!0,o()}}},Ae=class{_duplicateFrame(t){return structuredClone(t)}async*mediaFramesAtTimestamps(t){Qt(t);let e=Lt(t),r=[],s=8,n=[],{promise:a,resolve:o}=M(),{promise:c,resolve:u}=M(),d=!1,f=!1,m=null,g=null,b=T=>{n.push(T),o(),{promise:a,resolve:o}=M()},p=new Error,k=await this._createDecoder(T=>{if(u(),f){T.close();return}let x=!1;for(;r.length>0&&r[0]===T.timestamp;)b(this._duplicateFrame(T)),r.shift(),x=!0;x?(g?.close(),g=T):T.close()},T=>{m||(T.stack=p.stack,m=T,o())});(async()=>{let T=this._createChunkDrain(),x=null,C=null;for await(let O of e){for(U(O);n.length+k.decodeQueueSize>s;)({promise:c,resolve:u}=M()),await c;if(f)break;let _=await T.getChunk(O);if(!_){b(null);continue}let I=await T.getKeyChunk(O);if(!I){b(null);continue}for(r.push(_.timestamp),x&&I.timestamp===x.timestamp&&_.timestamp>=C.timestamp?(l(C),_.timestamp===C.timestamp&&r.length===1&&(g&&b(this._duplicateFrame(g)),r.shift())):(x=I,C=I,k.decode(I));C.timestamp!==_.timestamp;){let R=await T.getNextChunk(C);l(R),C=R,k.decode(R)}k.decodeQueueSize>=10&&await new Promise(R=>k.addEventListener("dequeue",R,{once:!0}))}await k.flush(),k.close(),d=!0,o()})().catch(T=>{m||(m=T,o())});try{for(;;){if(m)throw m;if(n.length>0){let T=n.shift();l(T!==void 0),yield T,u()}else if(!d)await a;else break}}finally{f=!0,u();for(let T of n)T?.close();g?.close()}}async*mediaFramesInRange(t=0,e=1/0){U(t),U(e);let r=8,s=[],n=!1,a=null,{promise:o,resolve:c}=M(),{promise:u,resolve:d}=M(),f=!1,m=!1,g=null,b=new Error,p=await this._createDecoder(x=>{d();let C=x.timestamp/1e6;if(C>=e&&(m=!0),m){x.close();return}a&&(C>t?(s.push(a),n=!0):a.close()),C>=t&&(s.push(x),n=!0),a=n?null:x,s.length>0&&(c(),{promise:o,resolve:c}=M())},x=>{g||(x.stack=b.stack,g=x,c())}),k=this._createChunkDrain(),T=await k.getKeyChunk(t)??await k.getFirstChunk();if(T){(async()=>{let x=T,C=1/0;if(e<1/0){let _=await k.getChunk(e),I=_?_.type==="key"&&_.timestamp/1e6===e?_:await k.getNextKeyChunk(_):null;I&&(C=I.timestamp/1e6)}let O=k.chunks(T,C);for(await O.next();x&&!m;){if(s.length+p.decodeQueueSize>r){({promise:u,resolve:d}=M()),await u;continue}p.decode(x);let _=await O.next();if(_.done)break;x=_.value}await O.return(),await p.flush(),p.close(),!n&&a&&s.push(a),f=!0,c()})().catch(x=>{g||(g=x,c())});try{for(;;){if(g)throw g;if(s.length>0)yield s.shift(),d();else if(!f)await o;else break}}finally{m=!0,d();for(let x of s)x.close()}}}},Ye=class extends _e{constructor(t){if(!(t instanceof W))throw new TypeError("videoTrack must be an InputVideoTrack.");super(),this._videoTrack=t}getFirstChunk(t={}){return L(t),this._videoTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return U(t),L(e),this._videoTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return L(e),this._videoTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return U(t),L(e),this._videoTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return L(e),this._videoTrack._backing.getNextKeyChunk(t,e)}},Ze=class extends Ae{constructor(e){if(!(e instanceof W))throw new TypeError("videoTrack must be an InputVideoTrack.");super();this._decoderConfig=null;this._videoTrack=e}async _createDecoder(e,r){this._decoderConfig??=await this._videoTrack.getDecoderConfig();let s=new VideoDecoder({output:e,error:r});return s.configure(this._decoderConfig),s}_createChunkDrain(){return new Ye(this._videoTrack)}async getFrame(e){U(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}frames(e=0,r=1/0){return this.mediaFramesInRange(e,r)}framesAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},Vt=class{constructor(t,e){if(!(t instanceof W))throw new TypeError("videoTrack must be an InputVideoTrack.");if(e&&typeof e!="object")throw new TypeError("dimensions, when defined, must be an object.");if(e&&(!Number.isInteger(e.width)||e.width<=0))throw new TypeError("dimensions.width must be a positive integer.");if(e&&(!Number.isInteger(e.height)||e.height<=0))throw new TypeError("dimensions.height must be a positive integer.");this._videoTrack=t,this._dimensions=e,this._videoFrameDrain=new Ze(t)}async _videoFrameToWrappedCanvas(t){let e=this._dimensions?.width??await this._videoTrack.getDisplayWidth(),r=this._dimensions?.height??await this._videoTrack.getDisplayHeight(),s=await this._videoTrack.getRotation(),n=document.createElement("canvas");n.width=e,n.height=r;let a=n.getContext("2d",{alpha:!1});l(a),a.translate(e/2,r/2),a.rotate(s*Math.PI/180),a.translate(-e/2,-r/2);let[o,c]=s%180===0?[e,r]:[r,e];a.drawImage(t,(e-o)/2,(r-c)/2,o,c);let u={canvas:n,timestamp:t.timestamp/1e6,duration:(t.duration??0)/1e6};return t.close(),u}async getCanvas(t){U(t);let e=await this._videoFrameDrain.getFrame(t);return e&&this._videoFrameToWrappedCanvas(e)}async*canvases(t=0,e=1/0){for await(let r of this._videoFrameDrain.frames(t,e))yield this._videoFrameToWrappedCanvas(r)}async*canvasesAtTimestamps(t){for await(let e of this._videoFrameDrain.framesAtTimestamps(t))yield e&&this._videoFrameToWrappedCanvas(e)}},Je=class extends _e{constructor(t){if(!(t instanceof H))throw new TypeError("audioTrack must be an InputAudioTrack.");super(),this._audioTrack=t}getFirstChunk(t={}){return L(t),this._audioTrack._backing.getFirstChunk(t)}getChunk(t,e={}){return U(t),L(e),this._audioTrack._backing.getChunk(t,e)}getNextChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return L(e),this._audioTrack._backing.getNextChunk(t,e)}getKeyChunk(t,e={}){return U(t),L(e),this._audioTrack._backing.getKeyChunk(t,e)}getNextKeyChunk(t,e={}){if(!(t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return L(e),this._audioTrack._backing.getNextKeyChunk(t,e)}},et=class extends Ae{constructor(e){if(!(e instanceof H))throw new TypeError("audioTrack must be an InputAudioTrack.");super();this._decoderConfig=null;this._audioTrack=e}async _createDecoder(e,r){this._decoderConfig??=await this._audioTrack.getDecoderConfig();let s=new AudioDecoder({output:e,error:r});return s.configure(this._decoderConfig),s}_createChunkDrain(){return new Je(this._audioTrack)}async getData(e){U(e);for await(let r of this.mediaFramesAtTimestamps([e]))return r;throw new Error("Internal error: Iterator returned nothing.")}data(e=0,r=1/0){return this.mediaFramesInRange(e,r)}dataAtTimestamps(e){return this.mediaFramesAtTimestamps(e)}},Mt=class{constructor(t){if(!(t instanceof H))throw new TypeError("audioTrack must be an InputAudioTrack.");this._audioDataDrain=new et(t)}_audioDataToWrappedArrayBuffer(t){let e=new AudioBuffer({numberOfChannels:t.numberOfChannels,length:t.numberOfFrames,sampleRate:t.sampleRate}),r=new Float32Array(t.allocationSize({planeIndex:0,format:"f32-planar"})/4);for(let a=0;a { + const xhr = new XMLHttpRequest(); + xhr.open("GET", this._url, true); + xhr.responseType = "arraybuffer"; + xhr.withCredentials = this._withCredentials; + if (range) { + xhr.setRequestHeader("Range", `bytes=${range.start}-${range.end - 1}`); + } + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + const buffer = xhr.response; + if (!range) { + this._fullData = buffer; + } + resolve({ + response: buffer, + statusCode: xhr.status + }); + } else { + reject(new Error(`Error fetching ${this._url}: ${xhr.status} ${xhr.statusText}`)); + } + }; + xhr.onerror = () => { + reject(new Error("Network error occurred.")); + }; + xhr.ontimeout = () => { + reject(new Error("Request timed out.")); + }; + xhr.send(); + }); + } + /** @internal */ + async _read(start, end) { + if (this._fullData) { + return new Uint8Array(this._fullData, start, end - start); + } + const { response, statusCode } = await this._makeRequest({ start, end }); + if (statusCode === 200) { + const fullData = new Uint8Array(response); + return fullData.subarray(start, end); + } + return new Uint8Array(response); + } + /** @internal */ + async _retrieveSize() { + if (this._fullData) { + return this._fullData.byteLength; + } + const xhr = new XMLHttpRequest(); + xhr.open("HEAD", this._url, true); + xhr.withCredentials = this._withCredentials; + await new Promise((resolve, reject) => { + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(); + } else { + reject(new Error(`Error fetching ${this._url} (HEAD): ${xhr.status} ${xhr.statusText}`)); + } + }; + xhr.onerror = () => { + resolve(); + }; + xhr.send(); + }); + const contentLength = xhr.getResponseHeader("Content-Length"); + if (!contentLength) { + const { response } = await this._makeRequest(); + return response.byteLength; + } + return parseInt(contentLength, 10); + } +}; // src/demuxer.ts var Demuxer = class { @@ -5926,9 +6017,10 @@ var BaseChunkDrain = class { let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers(); let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let ended = false; + let outOfBandError = null; const timestamps = []; const maxQueueSize = () => Math.max(2, timestamps.length); - void (async () => { + (async () => { let chunk = startChunk ?? await this.getFirstChunk(); while (chunk && !ended) { if (chunk.timestamp / 1e6 >= endTimestamp) { @@ -5946,10 +6038,17 @@ var BaseChunkDrain = class { } ended = true; onQueueNotEmpty(); - })(); + })().catch((error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (chunkQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (chunkQueue.length > 0) { yield chunkQueue.shift(); const now = performance.now(); timestamps.push(now); @@ -5978,18 +6077,20 @@ var BaseMediaFrameDrain = class { validateAnyIterable(timestamps); const timestampIterator = toAsyncIterator(timestamps); const timestampsOfInterest = []; + const MAX_QUEUE_SIZE = 8; const frameQueue = []; let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers(); let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let decoderIsFlushed = false; let ended = false; - const MAX_QUEUE_SIZE = 8; + let outOfBandError = null; let lastUsedFrame = null; const pushToQueue = (frame) => { frameQueue.push(frame); onQueueNotEmpty(); ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers()); }; + const decoderError = new Error(); const decoder = await this._createDecoder((frame) => { onQueueDequeue(); if (ended) { @@ -6008,8 +6109,14 @@ var BaseMediaFrameDrain = class { } else { frame.close(); } + }, (error) => { + if (!outOfBandError) { + error.stack = decoderError.stack; + outOfBandError = error; + onQueueNotEmpty(); + } }); - void (async () => { + (async () => { const chunkDrain = this._createChunkDrain(); let lastKeyChunk = null; let lastChunk = null; @@ -6060,10 +6167,17 @@ var BaseMediaFrameDrain = class { decoder.close(); decoderIsFlushed = true; onQueueNotEmpty(); - })(); + })().catch((error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (frameQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (frameQueue.length > 0) { const nextFrame = frameQueue.shift(); assert(nextFrame !== void 0); yield nextFrame; @@ -6086,6 +6200,7 @@ var BaseMediaFrameDrain = class { async *mediaFramesInRange(startTimestamp = 0, endTimestamp = Infinity) { validateTimestamp(startTimestamp); validateTimestamp(endTimestamp); + const MAX_QUEUE_SIZE = 8; const frameQueue = []; let firstFrameQueued = false; let lastFrame = null; @@ -6093,7 +6208,8 @@ var BaseMediaFrameDrain = class { let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let decoderIsFlushed = false; let ended = false; - const MAX_QUEUE_SIZE = 8; + let outOfBandError = null; + const decoderError = new Error(); const decoder = await this._createDecoder((frame) => { onQueueDequeue(); const frameTimestamp = frame.timestamp / 1e6; @@ -6121,13 +6237,19 @@ var BaseMediaFrameDrain = class { onQueueNotEmpty(); ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers()); } + }, (error) => { + if (!outOfBandError) { + error.stack = decoderError.stack; + outOfBandError = error; + onQueueNotEmpty(); + } }); const chunkDrain = this._createChunkDrain(); const keyChunk = await chunkDrain.getKeyChunk(startTimestamp) ?? await chunkDrain.getFirstChunk(); if (!keyChunk) { return; } - void (async () => { + (async () => { let currentChunk = keyChunk; let chunksEndTimestamp = Infinity; if (endTimestamp < Infinity) { @@ -6160,10 +6282,17 @@ var BaseMediaFrameDrain = class { } decoderIsFlushed = true; onQueueNotEmpty(); - })(); + })().catch((error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (frameQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (frameQueue.length > 0) { yield frameQueue.shift(); onQueueDequeue(); } else if (!decoderIsFlushed) { @@ -6229,12 +6358,9 @@ var VideoFrameDrain = class extends BaseMediaFrameDrain { this._videoTrack = videoTrack; } /** @internal */ - async _createDecoder(onFrame) { + async _createDecoder(onFrame, onError) { this._decoderConfig ??= await this._videoTrack.getDecoderConfig(); - const decoder = new VideoDecoder({ - output: onFrame, - error: (error) => console.error(error) - }); + const decoder = new VideoDecoder({ output: onFrame, error: onError }); decoder.configure(this._decoderConfig); return decoder; } @@ -6361,12 +6487,9 @@ var AudioDataDrain = class extends BaseMediaFrameDrain { this._audioTrack = audioTrack; } /** @internal */ - async _createDecoder(onData) { + async _createDecoder(onData, onError) { this._decoderConfig ??= await this._audioTrack.getDecoderConfig(); - const decoder = new AudioDecoder({ - output: onData, - error: (error) => console.error(error) - }); + const decoder = new AudioDecoder({ output: onData, error: onError }); decoder.configure(this._decoderConfig); return decoder; } @@ -6476,6 +6599,7 @@ export { SubtitleSource, Target, TextSubtitleSource, + UrlSource, VIDEO_CODECS, VideoFrameDrain, VideoFrameSource, diff --git a/src/index.ts b/src/index.ts index 6656240..1b1c489 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,7 +36,7 @@ export { } from './codec'; export { Target, ArrayBufferTarget, StreamTarget, StreamTargetChunk, StreamTargetOptions } from './target'; export { Rotation, TransformationMatrix, AnyIterable } from './misc'; -export { Source, BufferSource, BlobSource } from './source'; +export { Source, BufferSource, BlobSource, UrlSource } from './source'; export { InputFormat, IsobmffInputFormat, diff --git a/src/media-drain.ts b/src/media-drain.ts index 0f8682c..5454a23 100644 --- a/src/media-drain.ts +++ b/src/media-drain.ts @@ -36,12 +36,17 @@ export abstract class BaseChunkDrain Math.max(2, timestamps.length); // The following is the "pump" process that keeps pumping chunks into the queue - void (async () => { + (async () => { let chunk = startChunk ?? await this.getFirstChunk(); while (chunk && !ended) { @@ -65,11 +70,18 @@ export abstract class BaseChunkDrain { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (chunkQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (chunkQueue.length > 0) { yield chunkQueue.shift()!; const now = performance.now(); timestamps.push(now); @@ -98,7 +110,10 @@ export abstract class BaseMediaFrameDrain< MediaFrame extends VideoFrame | AudioData, > { /** @internal */ - abstract _createDecoder(onMedia: (media: MediaFrame) => unknown): Promise; + abstract _createDecoder( + onMedia: (media: MediaFrame) => unknown, + onError: (error: DOMException) => unknown + ): Promise; /** @internal */ abstract _createChunkDrain(): BaseChunkDrain; @@ -112,21 +127,26 @@ export abstract class BaseMediaFrameDrain< const timestampIterator = toAsyncIterator(timestamps); const timestampsOfInterest: number[] = []; + const MAX_QUEUE_SIZE = 8; const frameQueue: (MediaFrame | null)[] = []; let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers(); let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let decoderIsFlushed = false; let ended = false; - const MAX_QUEUE_SIZE = 8; + // This stores errors that are "out of band" in the sense that they didn't occur in the normal flow of this + // method but instead in a different context. This error should not go unnoticed and must be bubbled up to + // the consumer. + let outOfBandError = null as Error | null; - let lastUsedFrame: MediaFrame | null = null; + let lastUsedFrame = null as MediaFrame | null; const pushToQueue = (frame: MediaFrame | null) => { frameQueue.push(frame); onQueueNotEmpty(); ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers()); }; + const decoderError = new Error(); const decoder = await this._createDecoder((frame) => { onQueueDequeue(); @@ -148,10 +168,16 @@ export abstract class BaseMediaFrameDrain< } else { frame.close(); } + }, (error) => { + if (!outOfBandError) { + error.stack = decoderError.stack; // Provide a more useful stack trace + outOfBandError = error; + onQueueNotEmpty(); + } }); // The following is the "pump" process that keeps pumping chunks into the decoder - void (async () => { + (async () => { const chunkDrain = this._createChunkDrain(); let lastKeyChunk: Chunk | null = null; let lastChunk: Chunk | null = null; @@ -221,11 +247,18 @@ export abstract class BaseMediaFrameDrain< decoderIsFlushed = true; onQueueNotEmpty(); // To unstuck the generator - })(); + })().catch((error: Error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (frameQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (frameQueue.length > 0) { const nextFrame = frameQueue.shift(); assert(nextFrame !== undefined); yield nextFrame; @@ -243,7 +276,7 @@ export abstract class BaseMediaFrameDrain< for (const frame of frameQueue) { frame?.close(); } - (lastUsedFrame as MediaFrame | null)?.close(); + lastUsedFrame?.close(); } } @@ -251,6 +284,7 @@ export abstract class BaseMediaFrameDrain< validateTimestamp(startTimestamp); validateTimestamp(endTimestamp); + const MAX_QUEUE_SIZE = 8; const frameQueue: MediaFrame[] = []; let firstFrameQueued = false; let lastFrame: MediaFrame | null = null; @@ -259,8 +293,12 @@ export abstract class BaseMediaFrameDrain< let decoderIsFlushed = false; let ended = false; - const MAX_QUEUE_SIZE = 8; + // This stores errors that are "out of band" in the sense that they didn't occur in the normal flow of this + // method but instead in a different context. This error should not go unnoticed and must be bubbled up to + // the consumer. + let outOfBandError = null as Error | null; + const decoderError = new Error(); const decoder = await this._createDecoder((frame) => { onQueueDequeue(); const frameTimestamp = frame.timestamp / 1e6; @@ -298,6 +336,12 @@ export abstract class BaseMediaFrameDrain< onQueueNotEmpty(); ({ promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers()); } + }, (error) => { + if (!outOfBandError) { + error.stack = decoderError.stack; // Provide a more useful stack trace + outOfBandError = error; + onQueueNotEmpty(); + } }); const chunkDrain = this._createChunkDrain(); @@ -307,7 +351,7 @@ export abstract class BaseMediaFrameDrain< } // The following is the "pump" process that keeps pumping chunks into the decoder - void (async () => { + (async () => { let currentChunk: Chunk | null = keyChunk; let chunksEndTimestamp = Infinity; @@ -359,11 +403,18 @@ export abstract class BaseMediaFrameDrain< decoderIsFlushed = true; onQueueNotEmpty(); // To unstuck the generator - })(); + })().catch((error: Error) => { + if (!outOfBandError) { + outOfBandError = error; + onQueueNotEmpty(); + } + }); try { while (true) { - if (frameQueue.length > 0) { + if (outOfBandError) { + throw outOfBandError; + } else if (frameQueue.length > 0) { yield frameQueue.shift()!; onQueueDequeue(); } else if (!decoderIsFlushed) { @@ -450,13 +501,10 @@ export class VideoFrameDrain extends BaseMediaFrameDrain unknown) { + async _createDecoder(onFrame: (frame: VideoFrame) => unknown, onError: (error: DOMException) => unknown) { this._decoderConfig ??= await this._videoTrack.getDecoderConfig(); - const decoder = new VideoDecoder({ - output: onFrame, - error: error => console.error(error), - }); + const decoder = new VideoDecoder({ output: onFrame, error: onError }); decoder.configure(this._decoderConfig); return decoder; @@ -638,13 +686,10 @@ export class AudioDataDrain extends BaseMediaFrameDrain unknown) { + async _createDecoder(onData: (data: AudioData) => unknown, onError: (error: DOMException) => unknown) { this._decoderConfig ??= await this._audioTrack.getDecoderConfig(); - const decoder = new AudioDecoder({ - output: onData, - error: error => console.error(error), - }); + const decoder = new AudioDecoder({ output: onData, error: onError }); decoder.configure(this._decoderConfig); return decoder; diff --git a/src/source.ts b/src/source.ts index 072cf4e..dde1ab0 100644 --- a/src/source.ts +++ b/src/source.ts @@ -67,3 +67,127 @@ export class BlobSource extends Source { return this._blob.size; } } + +/** @public */ +export class UrlSource extends Source { + /** @internal */ + private _url: string; + /** @internal */ + private _withCredentials: boolean; + /** @internal */ + private _fullData: ArrayBuffer | null = null; + + constructor(url: string, options: { withCredentials?: boolean } = {}) { + if (typeof url !== 'string') { + throw new TypeError('url must be a string.'); + } + if (!options || typeof options !== 'object') { + throw new TypeError('options must be an object.'); + } + if (options.withCredentials !== undefined && typeof options.withCredentials !== 'boolean') { + throw new TypeError('options.withCredentials, when specified, must be a boolean.'); + } + + super(); + + this._url = url; + this._withCredentials = options.withCredentials ?? false; + } + + /** @internal */ + private _makeRequest( + range?: { start: number; end: number }, + ): Promise<{ response: ArrayBuffer; statusCode: number }> { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); // We use XMLHttpRequest instead of fetch since it supports more protocols + xhr.open('GET', this._url, true); + xhr.responseType = 'arraybuffer'; + xhr.withCredentials = this._withCredentials; + + if (range) { + xhr.setRequestHeader('Range', `bytes=${range.start}-${range.end - 1}`); + } + + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + const buffer = xhr.response as ArrayBuffer; + + if (!range) { + this._fullData = buffer; + } + + resolve({ + response: buffer, + statusCode: xhr.status, + }); + } else { + reject(new Error(`Error fetching ${this._url}: ${xhr.status} ${xhr.statusText}`)); + } + }; + + xhr.onerror = () => { + reject(new Error('Network error occurred.')); + }; + + xhr.ontimeout = () => { + reject(new Error('Request timed out.')); + }; + + xhr.send(); + }); + } + + /** @internal */ + override async _read(start: number, end: number): Promise { + if (this._fullData) { + return new Uint8Array(this._fullData, start, end - start); + } + + const { response, statusCode } = await this._makeRequest({ start, end }); + + // If server doesn't support range requests, it will return 200 instead of 206. In that case, let's manually + // slice the response. + if (statusCode === 200) { + const fullData = new Uint8Array(response); + return fullData.subarray(start, end); + } + + return new Uint8Array(response); + } + + /** @internal */ + override async _retrieveSize(): Promise { + if (this._fullData) { + return this._fullData.byteLength; + } + + const xhr = new XMLHttpRequest(); + xhr.open('HEAD', this._url, true); + xhr.withCredentials = this._withCredentials; + + await new Promise((resolve, reject) => { + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + resolve(); + } else { + reject(new Error(`Error fetching ${this._url} (HEAD): ${xhr.status} ${xhr.statusText}`)); + } + }; + + xhr.onerror = () => { + resolve(); + }; + + xhr.send(); + }); + + const contentLength = xhr.getResponseHeader('Content-Length'); + if (!contentLength) { + // If Content-Length is not available, make a GET request to get the full size + const { response } = await this._makeRequest(); + return response.byteLength; + } + + return parseInt(contentLength, 10); + } +}