diff --git a/dev/demux.html b/dev/demux.html index 6dbe5d5..debadef 100644 --- a/dev/demux.html +++ b/dev/demux.html @@ -13,10 +13,32 @@ source }); + const videoTrack = await input.getPrimaryVideoTrack(); + const drain = new Metamuxer.VideoFrameDrain(videoTrack); + const width = await videoTrack.getWidth(); + const height = await videoTrack.getHeight(); + + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + document.body.append(canvas); + + const context = canvas.getContext('2d'); + + // Top-level for await loop inside the event listener + for await (const frame of drain.frames()) { + context.drawImage(frame, 0, 0, width, height); + frame.close(); + + await new Promise(resolve => setTimeout(resolve, 1000 / 24)); + } + + /* const videoTrack = await input.getPrimaryVideoTrack(); const audioTrack = await input.getPrimaryAudioTrack();; console.log(videoTrack.computeDuration()); console.log(await audioTrack.computeDuration()); + */ /* const audioTrack = await input.getPrimaryAudioTrack(); diff --git a/dev/player.html b/dev/player.html new file mode 100644 index 0000000..e8877c2 --- /dev/null +++ b/dev/player.html @@ -0,0 +1,282 @@ + + + + + + + \ No newline at end of file diff --git a/dist/metamuxer.js b/dist/metamuxer.js index 9f0e66f..9b6cf8f 100644 --- a/dist/metamuxer.js +++ b/dist/metamuxer.js @@ -6095,8 +6095,11 @@ ${cue.notes ?? ""}`; let firstFrameQueued = false; let lastFrame = null; let { promise: queueNotEmpty, resolve: onQueueNotEmpty } = promiseWithResolvers(); + let { promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers(); let ended = false; + const MAX_QUEUE_SIZE = 8; const decoder = await this.createDecoder((frame) => { + onQueueDequeue(); const frameTimestamp = frame.timestamp / 1e6; if (frameTimestamp >= endTimestamp) { ended = true; @@ -6142,10 +6145,12 @@ ${cue.notes ?? ""}`; const chunks = chunkDrain.chunks(keyChunk, chunksEndTimestamp); await chunks.next(); while (currentChunk && !ended) { - decoder.decode(currentChunk); - if (decoder.decodeQueueSize >= 10) { - await new Promise((resolve) => decoder.addEventListener("dequeue", resolve, { once: true })); + if (frameQueue.length + decoder.decodeQueueSize > MAX_QUEUE_SIZE) { + ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers()); + await queueDequeue; + continue; } + decoder.decode(currentChunk); const chunkResult = await chunks.next(); if (chunkResult.done) { break; @@ -6165,6 +6170,7 @@ ${cue.notes ?? ""}`; while (true) { if (frameQueue.length > 0) { yield frameQueue.shift(); + onQueueDequeue(); } else if (!decoderIsFlushed) { await queueNotEmpty; } else { @@ -6173,6 +6179,10 @@ ${cue.notes ?? ""}`; } } finally { ended = true; + onQueueDequeue(); + for (const frame of frameQueue) { + frame.close(); + } } } }; @@ -6298,9 +6308,11 @@ ${cue.notes ?? ""}`; data.copyTo(dataBytes, { planeIndex: i }); audioBuffer.copyToChannel(dataBytes, i); } + const sampleDuration = 1 / data.sampleRate; return { buffer: audioBuffer, - timestamp: data.timestamp / 1e6 + // Rounding the timestamp based on the sample duration removes audio playback artifacts + timestamp: Math.round(data.timestamp / 1e6 / sampleDuration) * sampleDuration }; } async getBuffer(timestamp) { diff --git a/dist/metamuxer.min.js b/dist/metamuxer.min.js index a4ad80c..a3828fa 100644 --- a/dist/metamuxer.min.js +++ b/dist/metamuxer.min.js @@ -1,10 +1,10 @@ -"use strict";var Metamuxer=(()=>{var ht=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var Tr=Object.getOwnPropertyNames;var xr=Object.prototype.hasOwnProperty;var Cr=(i,e)=>{for(var t in e)ht(i,t,{get:e[t],enumerable:!0})},Sr=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Tr(e))!xr.call(i,s)&&s!==t&&ht(i,s,{get:()=>e[s],enumerable:!(r=gr(e,s))||r.enumerable});return i};var wr=i=>Sr(ht({},"__esModule",{value:!0}),i);var Vi={};Cr(Vi,{ALL_FORMATS:()=>br,AUDIO_CODECS:()=>J,ArrayBufferSource:()=>tt,ArrayBufferTarget:()=>ce,AudioBufferDrain:()=>ft,AudioBufferSource:()=>Ye,AudioDataDrain:()=>Re,AudioDataSource:()=>Ge,AudioSource:()=>U,BlobSource:()=>rt,CanvasSource:()=>je,EncodedAudioChunkDrain:()=>Ae,EncodedAudioChunkSource:()=>Xe,EncodedVideoChunkDrain:()=>Ie,EncodedVideoChunkSource:()=>$e,ISOBMFF:()=>ve,Input:()=>ut,MATROSKA:()=>ct,MKV:()=>Ft,MOV:()=>pr,MP4:()=>fr,MediaSource:()=>te,MediaStreamAudioTrackSource:()=>Ze,MediaStreamVideoTrackSource:()=>qe,MkvOutputFormat:()=>xe,Mp4OutputFormat:()=>Ke,Output:()=>et,OutputFormat:()=>L,SUBTITLE_CODECS:()=>ke,Source:()=>me,StreamTarget:()=>Ue,SubtitleSource:()=>re,Target:()=>H,TextSubtitleSource:()=>Je,VIDEO_CODECS:()=>Z,VideoFrameDrain:()=>lt,VideoFrameSource:()=>Qe,VideoSource:()=>z,WEBM:()=>hr,WebMOutputFormat:()=>ee});function d(i){if(!i)throw new Error("Assertion failed.")}var A=i=>i&&i[i.length-1],$=i=>i>=0&&i<2**32,R=(i,e,t)=>{let r=0;for(let s=e;s>c;r<<=1,r|=o}return r},Mt=(i,e,t,r)=>{for(let s=e;s>t-s-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),M=new TextEncoder,bt=i=>Object.fromEntries(Object.entries(i).map(([e,t])=>[t,e])),j={bt709:1,bt470bg:5,smpte170m:6},Vt=bt(j),q={bt709:1,smpte170m:6,"iec61966-2-1":13},Pt=bt(q),X={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Dt=bt(X),_e=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,kt=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),N=class{currentPromise=Promise.resolve();async acquire(){let e,t=new Promise(s=>{e=s}),r=this.currentPromise;return this.currentPromise=t,await r,e}},W=i=>{let e=i*(Math.PI/180),t=Math.cos(e),r=Math.sin(e);return[t,r,0,-r,t,0,0,0,1]},gt=W(0),zt=i=>[...i].map(e=>e.toString(16).padStart(2,"0")).join(""),Ut=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),B=(i,e,t)=>{let r=0,s=i.length-1,n=-1;for(;r<=s;){let a=r+s>>1,c=t(i[a]);c===e?(n=a,s=a-1):c{let r=-1,s=0,n=i.length-1;for(;s<=n;){let a=s+(n-s+1)/2|0;t(i[a])<=e?(r=a,s=a+1):n=a-1}return r},G=()=>{let i,e;return{promise:new Promise((r,s)=>{i=r,e=s}),resolve:i,reject:e}},Bt=(i,e)=>{let t=i.indexOf(e);t!==-1&&i.splice(t,1)};var fe=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,yr=/^WEBVTT(.|\n)*?\n{2}/,ne=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Ee=class{options;preambleText=null;preambleEmitted=!1;constructor(e){this.options=e}parse(e){e=e.replaceAll(`\r +"use strict";var Metamuxer=(()=>{var ht=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var Tr=Object.getOwnPropertyNames;var xr=Object.prototype.hasOwnProperty;var Cr=(i,e)=>{for(var t in e)ht(i,t,{get:e[t],enumerable:!0})},Sr=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Tr(e))!xr.call(i,s)&&s!==t&&ht(i,s,{get:()=>e[s],enumerable:!(r=gr(e,s))||r.enumerable});return i};var wr=i=>Sr(ht({},"__esModule",{value:!0}),i);var Vi={};Cr(Vi,{ALL_FORMATS:()=>br,AUDIO_CODECS:()=>J,ArrayBufferSource:()=>tt,ArrayBufferTarget:()=>ce,AudioBufferDrain:()=>ft,AudioBufferSource:()=>Ye,AudioDataDrain:()=>Re,AudioDataSource:()=>Ge,AudioSource:()=>B,BlobSource:()=>rt,CanvasSource:()=>je,EncodedAudioChunkDrain:()=>Ae,EncodedAudioChunkSource:()=>Xe,EncodedVideoChunkDrain:()=>Ie,EncodedVideoChunkSource:()=>Qe,ISOBMFF:()=>ve,Input:()=>ut,MATROSKA:()=>ct,MKV:()=>Ft,MOV:()=>pr,MP4:()=>fr,MediaSource:()=>te,MediaStreamAudioTrackSource:()=>Ze,MediaStreamVideoTrackSource:()=>qe,MkvOutputFormat:()=>xe,Mp4OutputFormat:()=>Ke,Output:()=>et,OutputFormat:()=>Q,SUBTITLE_CODECS:()=>ke,Source:()=>le,StreamTarget:()=>Ue,SubtitleSource:()=>re,Target:()=>K,TextSubtitleSource:()=>Je,VIDEO_CODECS:()=>Z,VideoFrameDrain:()=>dt,VideoFrameSource:()=>$e,VideoSource:()=>U,WEBM:()=>hr,WebMOutputFormat:()=>ee});function m(i){if(!i)throw new Error("Assertion failed.")}var R=i=>i&&i[i.length-1],$=i=>i>=0&&i<2**32,O=(i,e,t)=>{let r=0;for(let s=e;s>c;r<<=1,r|=o}return r},Mt=(i,e,t,r)=>{for(let s=e;s>t-s-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),M=new TextEncoder,bt=i=>Object.fromEntries(Object.entries(i).map(([e,t])=>[t,e])),q={bt709:1,bt470bg:5,smpte170m:6},Vt=bt(q),X={bt709:1,smpte170m:6,"iec61966-2-1":13},Pt=bt(X),G={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Dt=bt(G),_e=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,kt=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),H=class{currentPromise=Promise.resolve();async acquire(){let e,t=new Promise(s=>{e=s}),r=this.currentPromise;return this.currentPromise=t,await r,e}},L=i=>{let e=i*(Math.PI/180),t=Math.cos(e),r=Math.sin(e);return[t,r,0,-r,t,0,0,0,1]},gt=L(0),zt=i=>[...i].map(e=>e.toString(16).padStart(2,"0")).join(""),Ut=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),N=(i,e,t)=>{let r=0,s=i.length-1,n=-1;for(;r<=s;){let a=r+s>>1,c=t(i[a]);c===e?(n=a,s=a-1):c{let r=-1,s=0,n=i.length-1;for(;s<=n;){let a=s+(n-s+1)/2|0;t(i[a])<=e?(r=a,s=a+1):n=a-1}return r},W=()=>{let i,e;return{promise:new Promise((r,s)=>{i=r,e=s}),resolve:i,reject:e}},Bt=(i,e)=>{let t=i.indexOf(e);t!==-1&&i.splice(t,1)};var fe=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,yr=/^WEBVTT(.|\n)*?\n{2}/,ne=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Ee=class{options;preambleText=null;preambleEmitted=!1;constructor(e){this.options=e}parse(e){e=e.replaceAll(`\r `,` `).replaceAll("\r",` `),fe.lastIndex=0;let t;if(!this.preambleText){if(!yr.test(e)){let s=new Error("WebVTT preamble incorrect.");throw this.options.error(s),s}t=fe.exec(e);let r=e.slice(0,t?.index??e.length).trimEnd();if(!r){let s=new Error("No WebVTT preamble provided.");throw this.options.error(s),s}this.preambleText=r,t&&(e=e.slice(t.index),fe.lastIndex=0)}for(;t=fe.exec(e);){let r=e.slice(0,t.index),s=t[1],n=t.index+t[0].length,a=e.indexOf(` `,n)+1,c=e.slice(n,a).trim(),o=e.indexOf(` -`,n);o===-1&&(o=e.length);let u=Fe(t[2]),l=Fe(t[3])-u,p=e.slice(a,o).trim();e=e.slice(o).trimStart(),fe.lastIndex=0;let h={timestamp:u/1e3,duration:l/1e3,text:p,identifier:s,settings:c,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(h,b)}}},vr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,Fe=i=>{let e=vr.exec(i);if(!e)throw new Error("Expected match.");return 60*60*1e3*Number(e[1]||"0")+60*1e3*Number(e[2])+1e3*Number(e[3])+Number(e[4])},Me=i=>{let e=Math.floor(i/36e5),t=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),s=i%1e3;return e.toString().padStart(2,"0")+":"+t.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var pe=class{constructor(e){this.writer=e}helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(e){this.helperView.setUint32(0,Math.floor(e/2**32),!1),this.helperView.setUint32(4,e,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(e){for(let t=0;t[(i%256+256)%256],x=i=>(D.setUint16(0,i,!1),[T[0],T[1]]),Ir=i=>(D.setInt16(0,i,!1),[T[0],T[1]]),Wt=i=>(D.setUint32(0,i,!1),[T[1],T[2],T[3]]),f=i=>(D.setUint32(0,i,!1),[T[0],T[1],T[2],T[3]]),Ht=i=>(D.setInt32(0,i,!1),[T[0],T[1],T[2],T[3]]),Y=i=>(D.setUint32(0,Math.floor(i/2**32),!1),D.setUint32(4,i,!1),[T[0],T[1],T[2],T[3],T[4],T[5],T[6],T[7]]),Ct=i=>(D.setInt16(0,2**8*i,!1),[T[0],T[1]]),P=i=>(D.setInt32(0,2**16*i,!1),[T[0],T[1],T[2],T[3]]),Tt=i=>(D.setInt32(0,2**30*i,!1),[T[0],T[1],T[2],T[3]]),xt=(i,e)=>{let t=[],r=i;do{let s=r&127;r>>=7,t.length>0&&(s|=128),t.push(s),e!==void 0&&e--}while(r>0||e);return t.reverse()},O=(i,e=!1)=>{let t=Array(i.length).fill(null).map((r,s)=>i.charCodeAt(s));return e&&t.push(0),t},St=i=>{let e=null;for(let t of i)(!e||t.timestamp>e.timestamp)&&(e=t);return e},Lt=i=>[P(i[0]),P(i[1]),Tt(i[2]),P(i[3]),P(i[4]),Tt(i[5]),P(i[6]),P(i[7]),Tt(i[8])],C=(i,e,t)=>({type:i,contents:e&&new Uint8Array(e.flat(10)),children:t}),S=(i,e,t,r,s)=>C(i,[y(e),Wt(t),r??[]],s),Kt=i=>i.fragmented?C("ftyp",[O("iso5"),f(512),O("iso5"),O("iso6"),O("mp41")]):C("ftyp",[O("isom"),f(512),O("isom"),i.holdsAvc?O("avc1"):[],O("mp41")]),Pe=i=>({type:"mdat",largeSize:i}),$t=i=>({type:"free",size:i}),he=(i,e,t=!1)=>C("moov",void 0,[Ar(e,i),...i.map(r=>Rr(r,e)),t?oi(i):null]),Ar=(i,e)=>{let t=V(Math.max(0,...e.filter(a=>a.samples.length>0).map(a=>{let c=St(a.samples);return c.timestamp+c.duration})),Ve),r=Math.max(0,...e.map(a=>a.track.id))+1,s=!$(i)||!$(t),n=s?Y:f;return S("mvhd",+s,0,[n(i),n(i),f(Ve),n(t),P(1),Ct(1),Array(10).fill(0),Lt(gt),Array(24).fill(0),f(r)])},Rr=(i,e)=>C("trak",void 0,[Or(i,e),_r(i,e)]),Or=(i,e)=>{let t=St(i.samples),r=V(t?t.timestamp+t.duration:0,Ve),s=!$(e)||!$(r),n=s?Y:f,a;if(i.type==="video"){let c=i.track.metadata.rotation;a=c===void 0||typeof c=="number"?W(c??0):c}else a=gt;return S("tkhd",+s,3,[n(e),n(e),f(i.track.id),f(0),n(r),Array(8).fill(0),x(0),x(i.track.id),Ct(i.type==="audio"?1:0),x(0),Lt(a),P(i.type==="video"?i.info.width:0),P(i.type==="video"?i.info.height:0)])},_r=(i,e)=>C("mdia",void 0,[Er(i,e),Vr(i),Pr(i)]),Er=(i,e)=>{let t=St(i.samples),r=V(t?t.timestamp+t.duration:0,i.timescale),s=!$(e)||!$(r),n=s?Y:f;return S("mdhd",+s,0,[n(e),n(e),f(i.timescale),n(r),x(21956),x(0)])},Fr={video:"vide",audio:"soun",subtitle:"text"},Mr={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Vr=i=>S("hdlr",0,0,[O("mhlr"),O(Fr[i.type]),f(0),f(0),f(0),O(Mr[i.type],!0)]),Pr=i=>C("minf",void 0,[Br[i.type](),Nr(),Lr(i)]),Dr=()=>S("vmhd",0,1,[x(0),x(0),x(0),x(0)]),zr=()=>S("smhd",0,0,[x(0),x(0)]),Ur=()=>S("nmhd",0,0),Br={video:Dr,audio:zr,subtitle:Ur},Nr=()=>C("dinf",void 0,[Wr()]),Wr=()=>S("dref",0,0,[f(1)],[Hr()]),Hr=()=>S("url ",0,1),Lr=i=>{let e=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(t=>t.sampleCompositionTimeOffset!==0);return C("stbl",void 0,[Kr(i),ti(i),ri(i),ii(i),si(i),ni(i),e?ai(i):null])},Kr=i=>{let e;return i.type==="video"?e=$r(bi[i.track.source._codec],i):i.type==="audio"?e=Gr(gi[i.track.source._codec],i):i.type==="subtitle"&&(e=Jr(xi[i.track.source._codec],i)),d(e),S("stsd",0,0,[f(1)],[e])},$r=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),Array(12).fill(0),x(e.info.width),x(e.info.height),f(4718592),f(4718592),f(0),x(1),Array(32).fill(0),x(24),Ir(65535)],[ki[e.track.source._codec](e),_e(e.info.decoderConfig.colorSpace)?Qr(e):null]),Qr=i=>C("colr",[O("nclx"),x(j[i.info.decoderConfig.colorSpace.primaries]),x(q[i.info.decoderConfig.colorSpace.transfer]),x(X[i.info.decoderConfig.colorSpace.matrix]),y((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),jr=i=>i.info.decoderConfig&&C("avcC",[...Q(i.info.decoderConfig.description)]),qr=i=>i.info.decoderConfig&&C("hvcC",[...Q(i.info.decoderConfig.description)]),Nt=i=>{if(!i.info.decoderConfig)return null;let e=i.info.decoderConfig;d(e.colorSpace);let t=e.codec.split("."),r=Number(t[1]),s=Number(t[2]),c=(Number(t[3])<<4)+(0<<1)+Number(e.colorSpace.fullRange);return S("vpcC",1,0,[y(r),y(s),y(c),y(2),y(2),y(2),x(0)])},Xr=()=>C("av1C",[129,0,0,0]),Gr=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),f(0),x(e.info.numberOfChannels),x(16),x(0),x(0),P(e.info.sampleRate)],[Ti[e.track.source._codec](e)]),Yr=i=>{let t=[...Q(i.info.decoderConfig.description??new ArrayBuffer(0))];return t=[...y(64),...y(21),...Wt(0),...f(0),...f(0),...y(5),...xt(t.length),...t],t=[...x(1),...y(0),...y(4),...xt(t.length),...t,...y(6),...y(1),...y(2)],t=[...y(3),...xt(t.length),...t],S("esds",0,0,t)},Zr=i=>{let e=3840,t=0,r=i.info.decoderConfig?.description;if(r){d(r.byteLength>=18);let s=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);e=s.getUint16(10,!0),t=s.getInt16(14,!0)}return C("dOps",[y(0),y(i.info.numberOfChannels),x(e),f(i.info.sampleRate),Ct(t),y(0)])},Jr=(i,e)=>C(i,[Array(6).fill(0),x(1)],[Ci[e.track.source._codec](e)]),ei=i=>C("vttC",[...M.encode(i.info.config.description)]);var ti=i=>S("stts",0,0,[f(i.timeToSampleTable.length),i.timeToSampleTable.map(e=>[f(e.sampleCount),f(e.sampleDelta)])]),ri=i=>{if(i.samples.every(t=>t.type==="key"))return null;let e=[...i.samples.entries()].filter(([,t])=>t.type==="key");return S("stss",0,0,[f(e.length),e.map(([t])=>f(t+1))])},ii=i=>S("stsc",0,0,[f(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(e=>[f(e.firstChunk),f(e.samplesPerChunk),f(1)])]),si=i=>S("stsz",0,0,[f(0),f(i.samples.length),i.samples.map(e=>f(e.size))]),ni=i=>i.finalizedChunks.length>0&&A(i.finalizedChunks).offset>=2**32?S("co64",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>Y(e.offset))]):S("stco",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>f(e.offset))]),ai=i=>S("ctts",0,0,[f(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(e=>[f(e.sampleCount),f(e.sampleCompositionTimeOffset)])]),oi=i=>C("mvex",void 0,i.map(ci)),ci=i=>S("trex",0,0,[f(i.track.id),f(1),f(0),f(0),f(0)]),wt=(i,e)=>C("moof",void 0,[ui(i),...e.map(mi)]),ui=i=>S("mfhd",0,0,[f(i)]),Qt=i=>{let e=0,t=0,r=0,s=0,n=i.type==="delta";return t|=+n,n?e|=1:e|=2,e<<24|t<<16|r<<8|s},mi=i=>C("traf",void 0,[di(i),li(i),fi(i)]),di=i=>{d(i.currentChunk);let e=0;e|=8,e|=16,e|=32,e|=131072;let t=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:t.timescaleUnitsToNextSample,size:t.size,flags:Qt(t)};return S("tfhd",0,e,[f(i.track.id),f(r.duration),f(r.size),f(r.flags)])},li=i=>(d(i.currentChunk),S("tfdt",1,0,[Y(V(i.currentChunk.startTimestamp,i.timescale))])),fi=i=>{d(i.currentChunk);let e=i.currentChunk.samples.map(k=>k.timescaleUnitsToNextSample),t=i.currentChunk.samples.map(k=>k.size),r=i.currentChunk.samples.map(Qt),s=i.currentChunk.samples.map(k=>V(k.timestamp-k.decodeTimestamp,i.timescale)),n=new Set(e),a=new Set(t),c=new Set(r),o=new Set(s),u=c.size===2&&r[0]!==r[1],m=n.size>1,l=a.size>1,p=!u&&c.size>1,h=o.size>1||[...o].some(k=>k!==0),b=0;return b|=1,b|=4*+u,b|=256*+m,b|=512*+l,b|=1024*+p,b|=2048*+h,S("trun",1,b,[f(i.currentChunk.samples.length),f(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?f(r[0]):[],i.currentChunk.samples.map((k,g)=>[m?f(e[g]):[],l?f(t[g]):[],p?f(r[g]):[],h?Ht(s[g]):[]])])},jt=i=>C("mfra",void 0,[...i.map(pi),hi()]),pi=(i,e)=>S("tfra",1,0,[f(i.track.id),f(63),f(i.finalizedChunks.length),i.finalizedChunks.map(r=>[Y(V(r.samples[0].timestamp,i.timescale)),Y(r.moofOffset),f(e+1),f(1),f(1)])]),hi=()=>S("mfro",0,0,[f(0)]),qt=()=>C("vtte"),Xt=(i,e,t,r,s)=>C("vttc",void 0,[s!==null?C("vsid",[Ht(s)]):null,t!==null?C("iden",[...M.encode(t)]):null,e!==null?C("ctim",[...M.encode(Me(e))]):null,r!==null?C("sttg",[...M.encode(r)]):null,C("payl",[...M.encode(i)])]),Gt=i=>C("vtta",[...M.encode(i)]),bi={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},ki={avc:jr,hevc:qr,vp8:Nt,vp9:Nt,av1:Xr},gi={aac:"mp4a",opus:"Opus"},Ti={aac:Yr,opus:Zr},xi={webvtt:"wvtt"},Ci={webvtt:ei};var ae=class{output;mutex=new N;constructor(e){this.output=e}beforeTrackAdd(e){}onTrackClose(e){}trackTimestampInfo=new WeakMap;validateAndNormalizeTimestamp(e,t,r){let s=t/1e6,n=this.trackTimestampInfo.get(e);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:e.source._offsetTimestamps?0:s,lastKeyFrameTimestamp:e.source._offsetTimestamps?0:s},this.trackTimestampInfo.set(e,n)}if(e.source._offsetTimestamps&&(s-=n.timestampOffset),s<0)throw new Error(`Timestamps must be non-negative (got ${s}s).`);if(sr.start-s.start);e.push({start:t[0].start,size:t[0].data.byteLength});for(let r=1;ro.start<=t&&twi){for(let o=0;o=e.written[n+1].start;)e.written[n].end=Math.max(e.written[n].end,e.written[n+1].end),e.written.splice(n+1,1)}createChunk(e){let r={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(r),this.chunks.sort((s,n)=>s.start-n.start),this.chunks.indexOf(r)}queueChunksForFlush(e=!1){d(this.writer);for(let t=0;t{if(i==="avc"){let n=Math.ceil(e/16)*Math.ceil(t/16),a=Yt.find(l=>n<=l.maxMacroblocks&&r<=l.maxBitrate)??A(Yt),c=a?a.level:0,o="64".padStart(2,"0"),u="00",m=c.toString(16).padStart(2,"0");return`avc1.${o}${u}${m}`}else if(i==="hevc"){let s="",a="6",c=e*t,o=Zt.find(m=>c<=m.maxPictureSize&&r<=m.maxBitrate)??A(Zt);return`hev1.${s}1.${a}.${o.tier}${o.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let s="00",n=e*t,a=Jt.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??A(Jt);return`vp09.${s}.${a.level}.08`}else if(i==="av1"){let n=e*t,a=er.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??A(er);return`av01.0.${a.level.toString().padStart(2,"0")}${a.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},rr=(i,e)=>{if(i==="avc"){if(!e||e.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${zt(e.subarray(1,4))}`}else if(i==="hevc"){if(!e)throw new TypeError("HEVC description must be provided.");let t=new DataView(e.buffer,e.byteOffset,e.byteLength),r="hev1.",s=e[1]>>6&3,n=e[1]&31;r+=["","A","B","C"][s]+n,r+=".";let a=Ut(t.getUint32(2));r+=a.toString(16),r+=".";let c=e[1]>>5&1,o=e[12];r+=c===0?"L":"H",r+=o,r+=".";let u=[];for(let m=0;m<6;m++){let l=e[m+13];u.push(l)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(m=>m.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},ir=(i,e,t)=>{if(i==="aac")return e>=2&&t<=24e3?"mp4a.40.29":t<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},sr=(i,e)=>{if(i==="aac")return`mp4a.40.${yt(e).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},yt=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=0,t=R(i,e,e+5);e+=5,t===31&&(t=32+R(i,e,e+6),e+=6);let r=R(i,e,e+4);e+=4;let s=null;if(r===15)s=R(i,e,e+24),e+=24;else{let c=[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:t,frequencyIndex:r,sampleRate:s,channelConfiguration:n,numberOfChannels:a}},nr=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},ar=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&&!kt(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:e}=i.decoderConfig;if(typeof e!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let t=Object.keys(j);if(e.primaries!=null&&!t.includes(e.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${t.join(", ")}.`);let r=Object.keys(q);if(e.transfer!=null&&!r.includes(e.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let s=Object.keys(X);if(e.matrix!=null&&!s.includes(e.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(e.fullRange!=null&&typeof e.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&&!kt(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 Ve=1e3,yi=2082844800,V=(i,e,t=!0)=>{let r=i*e;return t?Math.round(r):r},He=class extends ae{timestampsMustStartAtZero=!0;writer;boxWriter;fastStart;auxTarget=new ce;auxWriter=this.auxTarget._createWriter();auxBoxWriter=new pe(this.auxWriter);ftypSize=null;mdat=null;trackDatas=[];creationTime=Math.floor(Date.now()/1e3)+yi;finalizedChunks=[];nextFragmentNumber=1;constructor(e,t){super(e),this.writer=e._writer,this.boxWriter=new pe(this.writer);let r=this.writer instanceof oe?"in-memory":!1;this.fastStart=t._options.fastStart??r,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),t=this.output._tracks.some(r=>r.type==="video"&&r.source._codec==="avc");this.boxWriter.writeBox(Kt({holdsAvc:t,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=Pe(!1):this.fastStart==="fragmented"||(this.mdat=Pe(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Be(t),d(t),d(t.decoderConfig),d(t.decoderConfig.codedWidth!==void 0),d(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ne(t),d(t),d(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},timescale:t.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;We(t),d(t),d(t.config);let s={track:e,type:"subtitle",info:{config:t.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(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),this.validateAndNormalizeTimestamp(e,0,!0),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=this.validateAndNormalizeTimestamp(n.track,t.timestamp,t.type==="key"),o=this.createSampleForTrack(n,a,c,(t.duration??0)/1e6,t.type);await this.registerSample(n,o)}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c==="key"),u=this.createSampleForTrack(n,a,o,(t.duration??0)/1e6,c);await this.registerSample(n,u)}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r);this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),e.source._codec==="webvtt"&&(n.cueQueue.push(t),await this.processWebVTTCues(n,t.timestamp))}finally{s()}}async processWebVTTCues(e,t){for(;e.cueQueue.length>0;){let r=new Set([]);for(let u of e.cueQueue)d(u.timestamp<=t),d(e.lastCueEndTimestamp<=u.timestamp+u.duration),r.add(Math.max(u.timestamp,e.lastCueEndTimestamp)),r.add(u.timestamp+u.duration);let s=[...r].sort((u,m)=>u-m),n=s[0],a=s[1]??n;if(t=a)break;ne.lastIndex=0;let l=ne.test(m.text),p=m.timestamp+m.duration,h=e.cueToSourceId.get(m);if(h===void 0&&ar.timestamp).sort((r,s)=>r-s);for(let r=0;r{if(e===a)return t.type==="key";let c=a.sampleQueue[0];return c&&c.type==="key"});s>=1&&n&&(r=!0,await this.finalizeFragment())}else r=s>=.5}r&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:t.timestamp,samples:[],offset:null,moofOffset:null}),d(e.currentChunk),e.currentChunk.samples.push(t),e.timestampProcessingQueue.push(t)}async finalizeCurrentChunk(e){if(d(this.fastStart!=="fragmented"),!!e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),this.finalizedChunks.push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||A(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 t of e.currentChunk.samples)d(t.data),this.writer.write(t.data),t.data=null;await this.writer.flush()}}async interleaveSamples(){d(this.fastStart==="fragmented");for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(t=>t.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.sampleQueue.length===0&&!s.track.source._closed)break e;s.sampleQueue.length>0&&s.sampleQueue[0].timestampo.currentChunk),s=this.writer.getPos(),n=wt(t,r);this.boxWriter.writeBox(n);{let o=Pe(!1),u=0;for(let l of r)for(let p of l.currentChunk.samples)u+=p.size;let m=this.boxWriter.measureBox(o)+u;m>=2**32&&(o.largeSize=!0,m=this.boxWriter.measureBox(o)+u),o.size=m,this.boxWriter.writeBox(o)}for(let o of r){o.currentChunk.offset=this.writer.getPos(),o.currentChunk.moofOffset=s;for(let u of o.currentChunk.samples)this.writer.write(u.data),u.data=null}let a=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(n));let c=wt(t,r);this.boxWriter.writeBox(c),this.writer.seek(a);for(let o of r)o.finalizedChunks.push(o.currentChunk),this.finalizedChunks.push(o.currentChunk),o.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let t=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let r=this.trackDatas.find(s=>s.track===e);r&&await this.processWebVTTCues(r,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),t()}async finalize(){let e=await this.mutex.acquire();for(let t of this.trackDatas)t.type==="subtitle"&&t.track.source._codec==="webvtt"&&await this.processWebVTTCues(t,1/0);if(this.fastStart==="fragmented"){for(let t of this.trackDatas){for(let r of t.sampleQueue)await this.addSampleToTrack(t,r);this.processTimestamps(t)}await this.finalizeFragment(!1)}else for(let t of this.trackDatas)this.processTimestamps(t),await this.finalizeCurrentChunk(t);if(this.fastStart==="in-memory"){d(this.mdat);let t;for(let s=0;s<2;s++){let n=he(this.trackDatas,this.creationTime),a=this.boxWriter.measureBox(n);t=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+a+t;for(let o of this.finalizedChunks){o.offset=c;for(let{data:u}of o.samples)d(u),c+=u.byteLength,t+=u.byteLength}if(c<2**32)break;t>=2**32&&(this.mdat.largeSize=!0)}let r=he(this.trackDatas,this.creationTime);this.boxWriter.writeBox(r),this.mdat.size=t,this.boxWriter.writeBox(this.mdat);for(let s of this.finalizedChunks)for(let n of s.samples)d(n.data),this.writer.write(n.data),n.data=null}else if(this.fastStart==="fragmented"){let t=this.writer.getPos(),r=jt(this.trackDatas);this.boxWriter.writeBox(r);let s=this.writer.getPos()-t;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(s)}else{d(this.mdat),d(this.ftypSize!==null);let t=this.boxWriter.offsets.get(this.mdat);d(t!==void 0);let r=this.writer.getPos()-t;this.mdat.size=r,this.mdat.largeSize=r>=2**32,this.boxWriter.patchBox(this.mdat);let s=he(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(s);let n=t-this.writer.getPos();this.boxWriter.writeBox($t(n))}else this.boxWriter.writeBox(s)}e()}};var ge=class{value;constructor(e){this.value=e}},ue=class{value;constructor(e){this.value=e}},Te=class{value;constructor(e){this.value=e}};var vt=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,It=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,or=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 At=2**15,cr="https://github.com/Vanilagy/webm-muxer",ur=6,mr=5,vi={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"},Ii={video:1,audio:2,subtitle:17},Le=class extends ae{timestampsMustStartAtZero=!1;writer;format;helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;dataOffsets=new WeakMap;trackDatas=[];segment=null;segmentInfo=null;seekHead=null;tracksElement=null;segmentDuration=null;cues=null;currentCluster=null;currentClusterMsTimestamp=null;trackDatasInCurrentCluster=new Set;duration=0;constructor(e,t){super(e),this.writer=e._writer,this.format=t,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,t=vt(e)){let r=0;switch(t){case 6:this.helperView.setUint8(r++,e/2**40|0);case 5:this.helperView.setUint8(r++,e/2**32|0);case 4:this.helperView.setUint8(r++,e>>24);case 3:this.helperView.setUint8(r++,e>>16);case 2:this.helperView.setUint8(r++,e>>8);case 1:this.helperView.setUint8(r++,e);break;default:throw new Error("Bad UINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeSignedInt(e,t=It(e)){e<0&&(e+=2**(t*8)),this.writeUnsignedInt(e,t)}writeEBMLVarInt(e,t=or(e)){let r=0;switch(t){case 1:this.helperView.setUint8(r++,128|e);break;case 2:this.helperView.setUint8(r++,64|e>>8),this.helperView.setUint8(r++,e);break;case 3:this.helperView.setUint8(r++,32|e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 4:this.helperView.setUint8(r++,16|e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 5:this.helperView.setUint8(r++,8|e/2**32&7),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 6:this.helperView.setUint8(r++,4|e/2**40&3),this.helperView.setUint8(r++,e/2**32|0),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;default:throw new Error("Bad EBML VINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(t=>t.charCodeAt(0))))}writeEBML(e){if(e!==null){if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let t of e)this.writeEBML(t);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let t=this.writer.getPos(),r=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+r);let s=this.writer.getPos();if(this.dataOffsets.set(e,s),this.writeEBML(e.data),e.size!==-1){let n=this.writer.getPos()-s,a=this.writer.getPos();this.writer.seek(t),this.writeEBMLVarInt(n,r),this.writer.seek(a)}}else if(typeof e.data=="number"){let t=e.size??vt(e.data);this.writeEBMLVarInt(t),this.writeUnsignedInt(e.data,t)}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 ge)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof ue)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof Te){let t=e.size??It(e.data.value);this.writeEBMLVarInt(t),this.writeSignedInt(e.data.value,t)}}}beforeTrackAdd(e){if(this.format instanceof ee)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 ee?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),t=new Uint8Array([21,73,169,102]),r=new Uint8Array([22,84,174,107]),s={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:t},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]}]};this.seekHead=s}createSegmentInfo(){let e={id:17545,data:new ue(0)};this.segmentDuration=e;let t={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:cr},{id:22337,data:cr},this.format._options.streamable?null:e]};this.segmentInfo=t}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let t of this.trackDatas)e.data.push({id:174,data:[{id:215,data:t.track.id},{id:29637,data:t.track.id},{id:131,data:Ii[t.type]},{id:134,data:vi[t.track.source._codec]},t.type==="video"?this.videoSpecificTrackInfo(t):null,t.type==="audio"?this.audioSpecificTrackInfo(t):null,t.type==="subtitle"?this.subtitleSpecificTrackInfo(t):null]})}videoSpecificTrackInfo(e){let t=[e.info.decoderConfig.description?{id:25506,data:Q(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],r=e.info.decoderConfig.colorSpace,s={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},_e(r)?{id:21936,data:[{id:21937,data:X[r.matrix]},{id:21946,data:q[r.transfer]},{id:21947,data:j[r.primaries]},{id:21945,data:r.fullRange?2:1}]}:null]};return t.push(s),t}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:Q(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new ge(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:M.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:ur,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 d(this.segment),this.dataOffsets.get(this.segment)}getVideoTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Be(t),d(t),d(t.decoderConfig),d(t.decoderConfig.codedWidth!==void 0),d(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ne(t),d(t),d(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;We(t),d(t),d(t.config);let s={track:e,type:"subtitle",info:{config:t.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type==="key",o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c),u=this.createInternalChunk(a,o,(t.duration??0)/1e6,t.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(n,u),n.chunkQueue.push(u),await this.interleaveChunks()}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=c==="key",u=this.validateAndNormalizeTimestamp(n.track,t.timestamp,o),m=this.createInternalChunk(a,u,(t.duration??0)/1e6,c);n.chunkQueue.push(m),await this.interleaveChunks()}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r),a=this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),c=t.text,o=Math.floor(a*1e3);ne.lastIndex=0,c=c.replace(ne,p=>{let b=Fe(p.slice(1,-1))-o;return`<${Me(b)}>`});let u=M.encode(c),m=`${t.settings??""} +`,n);o===-1&&(o=e.length);let u=Fe(t[2]),d=Fe(t[3])-u,p=e.slice(a,o).trim();e=e.slice(o).trimStart(),fe.lastIndex=0;let h={timestamp:u/1e3,duration:d/1e3,text:p,identifier:s,settings:c,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(h,b)}}},vr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,Fe=i=>{let e=vr.exec(i);if(!e)throw new Error("Expected match.");return 60*60*1e3*Number(e[1]||"0")+60*1e3*Number(e[2])+1e3*Number(e[3])+Number(e[4])},Me=i=>{let e=Math.floor(i/36e5),t=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),s=i%1e3;return e.toString().padStart(2,"0")+":"+t.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var pe=class{constructor(e){this.writer=e}helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(e){this.helperView.setUint32(0,Math.floor(e/2**32),!1),this.helperView.setUint32(4,e,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(e){for(let t=0;t[(i%256+256)%256],x=i=>(z.setUint16(0,i,!1),[T[0],T[1]]),Ir=i=>(z.setInt16(0,i,!1),[T[0],T[1]]),Wt=i=>(z.setUint32(0,i,!1),[T[1],T[2],T[3]]),f=i=>(z.setUint32(0,i,!1),[T[0],T[1],T[2],T[3]]),Ht=i=>(z.setInt32(0,i,!1),[T[0],T[1],T[2],T[3]]),Y=i=>(z.setUint32(0,Math.floor(i/2**32),!1),z.setUint32(4,i,!1),[T[0],T[1],T[2],T[3],T[4],T[5],T[6],T[7]]),Ct=i=>(z.setInt16(0,2**8*i,!1),[T[0],T[1]]),D=i=>(z.setInt32(0,2**16*i,!1),[T[0],T[1],T[2],T[3]]),Tt=i=>(z.setInt32(0,2**30*i,!1),[T[0],T[1],T[2],T[3]]),xt=(i,e)=>{let t=[],r=i;do{let s=r&127;r>>=7,t.length>0&&(s|=128),t.push(s),e!==void 0&&e--}while(r>0||e);return t.reverse()},_=(i,e=!1)=>{let t=Array(i.length).fill(null).map((r,s)=>i.charCodeAt(s));return e&&t.push(0),t},St=i=>{let e=null;for(let t of i)(!e||t.timestamp>e.timestamp)&&(e=t);return e},Lt=i=>[D(i[0]),D(i[1]),Tt(i[2]),D(i[3]),D(i[4]),Tt(i[5]),D(i[6]),D(i[7]),Tt(i[8])],C=(i,e,t)=>({type:i,contents:e&&new Uint8Array(e.flat(10)),children:t}),S=(i,e,t,r,s)=>C(i,[I(e),Wt(t),r??[]],s),Kt=i=>i.fragmented?C("ftyp",[_("iso5"),f(512),_("iso5"),_("iso6"),_("mp41")]):C("ftyp",[_("isom"),f(512),_("isom"),i.holdsAvc?_("avc1"):[],_("mp41")]),Pe=i=>({type:"mdat",largeSize:i}),Qt=i=>({type:"free",size:i}),he=(i,e,t=!1)=>C("moov",void 0,[Ar(e,i),...i.map(r=>Rr(r,e)),t?oi(i):null]),Ar=(i,e)=>{let t=V(Math.max(0,...e.filter(a=>a.samples.length>0).map(a=>{let c=St(a.samples);return c.timestamp+c.duration})),Ve),r=Math.max(0,...e.map(a=>a.track.id))+1,s=!$(i)||!$(t),n=s?Y:f;return S("mvhd",+s,0,[n(i),n(i),f(Ve),n(t),D(1),Ct(1),Array(10).fill(0),Lt(gt),Array(24).fill(0),f(r)])},Rr=(i,e)=>C("trak",void 0,[Or(i,e),_r(i,e)]),Or=(i,e)=>{let t=St(i.samples),r=V(t?t.timestamp+t.duration:0,Ve),s=!$(e)||!$(r),n=s?Y:f,a;if(i.type==="video"){let c=i.track.metadata.rotation;a=c===void 0||typeof c=="number"?L(c??0):c}else a=gt;return S("tkhd",+s,3,[n(e),n(e),f(i.track.id),f(0),n(r),Array(8).fill(0),x(0),x(i.track.id),Ct(i.type==="audio"?1:0),x(0),Lt(a),D(i.type==="video"?i.info.width:0),D(i.type==="video"?i.info.height:0)])},_r=(i,e)=>C("mdia",void 0,[Er(i,e),Vr(i),Pr(i)]),Er=(i,e)=>{let t=St(i.samples),r=V(t?t.timestamp+t.duration:0,i.timescale),s=!$(e)||!$(r),n=s?Y:f;return S("mdhd",+s,0,[n(e),n(e),f(i.timescale),n(r),x(21956),x(0)])},Fr={video:"vide",audio:"soun",subtitle:"text"},Mr={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Vr=i=>S("hdlr",0,0,[_("mhlr"),_(Fr[i.type]),f(0),f(0),f(0),_(Mr[i.type],!0)]),Pr=i=>C("minf",void 0,[Br[i.type](),Nr(),Lr(i)]),Dr=()=>S("vmhd",0,1,[x(0),x(0),x(0),x(0)]),zr=()=>S("smhd",0,0,[x(0),x(0)]),Ur=()=>S("nmhd",0,0),Br={video:Dr,audio:zr,subtitle:Ur},Nr=()=>C("dinf",void 0,[Wr()]),Wr=()=>S("dref",0,0,[f(1)],[Hr()]),Hr=()=>S("url ",0,1),Lr=i=>{let e=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(t=>t.sampleCompositionTimeOffset!==0);return C("stbl",void 0,[Kr(i),ti(i),ri(i),ii(i),si(i),ni(i),e?ai(i):null])},Kr=i=>{let e;return i.type==="video"?e=Qr(bi[i.track.source._codec],i):i.type==="audio"?e=Gr(gi[i.track.source._codec],i):i.type==="subtitle"&&(e=Jr(xi[i.track.source._codec],i)),m(e),S("stsd",0,0,[f(1)],[e])},Qr=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),Array(12).fill(0),x(e.info.width),x(e.info.height),f(4718592),f(4718592),f(0),x(1),Array(32).fill(0),x(24),Ir(65535)],[ki[e.track.source._codec](e),_e(e.info.decoderConfig.colorSpace)?$r(e):null]),$r=i=>C("colr",[_("nclx"),x(q[i.info.decoderConfig.colorSpace.primaries]),x(X[i.info.decoderConfig.colorSpace.transfer]),x(G[i.info.decoderConfig.colorSpace.matrix]),I((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),jr=i=>i.info.decoderConfig&&C("avcC",[...j(i.info.decoderConfig.description)]),qr=i=>i.info.decoderConfig&&C("hvcC",[...j(i.info.decoderConfig.description)]),Nt=i=>{if(!i.info.decoderConfig)return null;let e=i.info.decoderConfig;m(e.colorSpace);let t=e.codec.split("."),r=Number(t[1]),s=Number(t[2]),c=(Number(t[3])<<4)+(0<<1)+Number(e.colorSpace.fullRange);return S("vpcC",1,0,[I(r),I(s),I(c),I(2),I(2),I(2),x(0)])},Xr=()=>C("av1C",[129,0,0,0]),Gr=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),f(0),x(e.info.numberOfChannels),x(16),x(0),x(0),D(e.info.sampleRate)],[Ti[e.track.source._codec](e)]),Yr=i=>{let t=[...j(i.info.decoderConfig.description??new ArrayBuffer(0))];return t=[...I(64),...I(21),...Wt(0),...f(0),...f(0),...I(5),...xt(t.length),...t],t=[...x(1),...I(0),...I(4),...xt(t.length),...t,...I(6),...I(1),...I(2)],t=[...I(3),...xt(t.length),...t],S("esds",0,0,t)},Zr=i=>{let e=3840,t=0,r=i.info.decoderConfig?.description;if(r){m(r.byteLength>=18);let s=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);e=s.getUint16(10,!0),t=s.getInt16(14,!0)}return C("dOps",[I(0),I(i.info.numberOfChannels),x(e),f(i.info.sampleRate),Ct(t),I(0)])},Jr=(i,e)=>C(i,[Array(6).fill(0),x(1)],[Ci[e.track.source._codec](e)]),ei=i=>C("vttC",[...M.encode(i.info.config.description)]);var ti=i=>S("stts",0,0,[f(i.timeToSampleTable.length),i.timeToSampleTable.map(e=>[f(e.sampleCount),f(e.sampleDelta)])]),ri=i=>{if(i.samples.every(t=>t.type==="key"))return null;let e=[...i.samples.entries()].filter(([,t])=>t.type==="key");return S("stss",0,0,[f(e.length),e.map(([t])=>f(t+1))])},ii=i=>S("stsc",0,0,[f(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(e=>[f(e.firstChunk),f(e.samplesPerChunk),f(1)])]),si=i=>S("stsz",0,0,[f(0),f(i.samples.length),i.samples.map(e=>f(e.size))]),ni=i=>i.finalizedChunks.length>0&&R(i.finalizedChunks).offset>=2**32?S("co64",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>Y(e.offset))]):S("stco",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>f(e.offset))]),ai=i=>S("ctts",0,0,[f(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(e=>[f(e.sampleCount),f(e.sampleCompositionTimeOffset)])]),oi=i=>C("mvex",void 0,i.map(ci)),ci=i=>S("trex",0,0,[f(i.track.id),f(1),f(0),f(0),f(0)]),wt=(i,e)=>C("moof",void 0,[ui(i),...e.map(li)]),ui=i=>S("mfhd",0,0,[f(i)]),$t=i=>{let e=0,t=0,r=0,s=0,n=i.type==="delta";return t|=+n,n?e|=1:e|=2,e<<24|t<<16|r<<8|s},li=i=>C("traf",void 0,[mi(i),di(i),fi(i)]),mi=i=>{m(i.currentChunk);let e=0;e|=8,e|=16,e|=32,e|=131072;let t=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:t.timescaleUnitsToNextSample,size:t.size,flags:$t(t)};return S("tfhd",0,e,[f(i.track.id),f(r.duration),f(r.size),f(r.flags)])},di=i=>(m(i.currentChunk),S("tfdt",1,0,[Y(V(i.currentChunk.startTimestamp,i.timescale))])),fi=i=>{m(i.currentChunk);let e=i.currentChunk.samples.map(k=>k.timescaleUnitsToNextSample),t=i.currentChunk.samples.map(k=>k.size),r=i.currentChunk.samples.map($t),s=i.currentChunk.samples.map(k=>V(k.timestamp-k.decodeTimestamp,i.timescale)),n=new Set(e),a=new Set(t),c=new Set(r),o=new Set(s),u=c.size===2&&r[0]!==r[1],l=n.size>1,d=a.size>1,p=!u&&c.size>1,h=o.size>1||[...o].some(k=>k!==0),b=0;return b|=1,b|=4*+u,b|=256*+l,b|=512*+d,b|=1024*+p,b|=2048*+h,S("trun",1,b,[f(i.currentChunk.samples.length),f(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?f(r[0]):[],i.currentChunk.samples.map((k,g)=>[l?f(e[g]):[],d?f(t[g]):[],p?f(r[g]):[],h?Ht(s[g]):[]])])},jt=i=>C("mfra",void 0,[...i.map(pi),hi()]),pi=(i,e)=>S("tfra",1,0,[f(i.track.id),f(63),f(i.finalizedChunks.length),i.finalizedChunks.map(r=>[Y(V(r.samples[0].timestamp,i.timescale)),Y(r.moofOffset),f(e+1),f(1),f(1)])]),hi=()=>S("mfro",0,0,[f(0)]),qt=()=>C("vtte"),Xt=(i,e,t,r,s)=>C("vttc",void 0,[s!==null?C("vsid",[Ht(s)]):null,t!==null?C("iden",[...M.encode(t)]):null,e!==null?C("ctim",[...M.encode(Me(e))]):null,r!==null?C("sttg",[...M.encode(r)]):null,C("payl",[...M.encode(i)])]),Gt=i=>C("vtta",[...M.encode(i)]),bi={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},ki={avc:jr,hevc:qr,vp8:Nt,vp9:Nt,av1:Xr},gi={aac:"mp4a",opus:"Opus"},Ti={aac:Yr,opus:Zr},xi={webvtt:"wvtt"},Ci={webvtt:ei};var ae=class{output;mutex=new H;constructor(e){this.output=e}beforeTrackAdd(e){}onTrackClose(e){}trackTimestampInfo=new WeakMap;validateAndNormalizeTimestamp(e,t,r){let s=t/1e6,n=this.trackTimestampInfo.get(e);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:e.source._offsetTimestamps?0:s,lastKeyFrameTimestamp:e.source._offsetTimestamps?0:s},this.trackTimestampInfo.set(e,n)}if(e.source._offsetTimestamps&&(s-=n.timestampOffset),s<0)throw new Error(`Timestamps must be non-negative (got ${s}s).`);if(sr.start-s.start);e.push({start:t[0].start,size:t[0].data.byteLength});for(let r=1;ro.start<=t&&twi){for(let o=0;o=e.written[n+1].start;)e.written[n].end=Math.max(e.written[n].end,e.written[n+1].end),e.written.splice(n+1,1)}createChunk(e){let r={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(r),this.chunks.sort((s,n)=>s.start-n.start),this.chunks.indexOf(r)}queueChunksForFlush(e=!1){m(this.writer);for(let t=0;t{if(i==="avc"){let n=Math.ceil(e/16)*Math.ceil(t/16),a=Yt.find(d=>n<=d.maxMacroblocks&&r<=d.maxBitrate)??R(Yt),c=a?a.level:0,o="64".padStart(2,"0"),u="00",l=c.toString(16).padStart(2,"0");return`avc1.${o}${u}${l}`}else if(i==="hevc"){let s="",a="6",c=e*t,o=Zt.find(l=>c<=l.maxPictureSize&&r<=l.maxBitrate)??R(Zt);return`hev1.${s}1.${a}.${o.tier}${o.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let s="00",n=e*t,a=Jt.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??R(Jt);return`vp09.${s}.${a.level}.08`}else if(i==="av1"){let n=e*t,a=er.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??R(er);return`av01.0.${a.level.toString().padStart(2,"0")}${a.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},rr=(i,e)=>{if(i==="avc"){if(!e||e.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${zt(e.subarray(1,4))}`}else if(i==="hevc"){if(!e)throw new TypeError("HEVC description must be provided.");let t=new DataView(e.buffer,e.byteOffset,e.byteLength),r="hev1.",s=e[1]>>6&3,n=e[1]&31;r+=["","A","B","C"][s]+n,r+=".";let a=Ut(t.getUint32(2));r+=a.toString(16),r+=".";let c=e[1]>>5&1,o=e[12];r+=c===0?"L":"H",r+=o,r+=".";let u=[];for(let l=0;l<6;l++){let d=e[l+13];u.push(d)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(l=>l.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},ir=(i,e,t)=>{if(i==="aac")return e>=2&&t<=24e3?"mp4a.40.29":t<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},sr=(i,e)=>{if(i==="aac")return`mp4a.40.${yt(e).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},yt=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=0,t=O(i,e,e+5);e+=5,t===31&&(t=32+O(i,e,e+6),e+=6);let r=O(i,e,e+4);e+=4;let s=null;if(r===15)s=O(i,e,e+24),e+=24;else{let c=[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:t,frequencyIndex:r,sampleRate:s,channelConfiguration:n,numberOfChannels:a}},nr=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},ar=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&&!kt(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:e}=i.decoderConfig;if(typeof e!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let t=Object.keys(q);if(e.primaries!=null&&!t.includes(e.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${t.join(", ")}.`);let r=Object.keys(X);if(e.transfer!=null&&!r.includes(e.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let s=Object.keys(G);if(e.matrix!=null&&!s.includes(e.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(e.fullRange!=null&&typeof e.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&&!kt(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 Ve=1e3,yi=2082844800,V=(i,e,t=!0)=>{let r=i*e;return t?Math.round(r):r},He=class extends ae{timestampsMustStartAtZero=!0;writer;boxWriter;fastStart;auxTarget=new ce;auxWriter=this.auxTarget._createWriter();auxBoxWriter=new pe(this.auxWriter);ftypSize=null;mdat=null;trackDatas=[];creationTime=Math.floor(Date.now()/1e3)+yi;finalizedChunks=[];nextFragmentNumber=1;constructor(e,t){super(e),this.writer=e._writer,this.boxWriter=new pe(this.writer);let r=this.writer instanceof oe?"in-memory":!1;this.fastStart=t._options.fastStart??r,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),t=this.output._tracks.some(r=>r.type==="video"&&r.source._codec==="avc");this.boxWriter.writeBox(Kt({holdsAvc:t,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=Pe(!1):this.fastStart==="fragmented"||(this.mdat=Pe(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Be(t),m(t),m(t.decoderConfig),m(t.decoderConfig.codedWidth!==void 0),m(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ne(t),m(t),m(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},timescale:t.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;We(t),m(t),m(t.config);let s={track:e,type:"subtitle",info:{config:t.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(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),this.validateAndNormalizeTimestamp(e,0,!0),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=this.validateAndNormalizeTimestamp(n.track,t.timestamp,t.type==="key"),o=this.createSampleForTrack(n,a,c,(t.duration??0)/1e6,t.type);await this.registerSample(n,o)}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c==="key"),u=this.createSampleForTrack(n,a,o,(t.duration??0)/1e6,c);await this.registerSample(n,u)}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r);this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),e.source._codec==="webvtt"&&(n.cueQueue.push(t),await this.processWebVTTCues(n,t.timestamp))}finally{s()}}async processWebVTTCues(e,t){for(;e.cueQueue.length>0;){let r=new Set([]);for(let u of e.cueQueue)m(u.timestamp<=t),m(e.lastCueEndTimestamp<=u.timestamp+u.duration),r.add(Math.max(u.timestamp,e.lastCueEndTimestamp)),r.add(u.timestamp+u.duration);let s=[...r].sort((u,l)=>u-l),n=s[0],a=s[1]??n;if(t=a)break;ne.lastIndex=0;let d=ne.test(l.text),p=l.timestamp+l.duration,h=e.cueToSourceId.get(l);if(h===void 0&&ar.timestamp).sort((r,s)=>r-s);for(let r=0;r{if(e===a)return t.type==="key";let c=a.sampleQueue[0];return c&&c.type==="key"});s>=1&&n&&(r=!0,await this.finalizeFragment())}else r=s>=.5}r&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:t.timestamp,samples:[],offset:null,moofOffset:null}),m(e.currentChunk),e.currentChunk.samples.push(t),e.timestampProcessingQueue.push(t)}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 t of e.currentChunk.samples)m(t.data),this.writer.write(t.data),t.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(t=>t.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.sampleQueue.length===0&&!s.track.source._closed)break e;s.sampleQueue.length>0&&s.sampleQueue[0].timestampo.currentChunk),s=this.writer.getPos(),n=wt(t,r);this.boxWriter.writeBox(n);{let o=Pe(!1),u=0;for(let d of r)for(let p of d.currentChunk.samples)u+=p.size;let l=this.boxWriter.measureBox(o)+u;l>=2**32&&(o.largeSize=!0,l=this.boxWriter.measureBox(o)+u),o.size=l,this.boxWriter.writeBox(o)}for(let o of r){o.currentChunk.offset=this.writer.getPos(),o.currentChunk.moofOffset=s;for(let u of o.currentChunk.samples)this.writer.write(u.data),u.data=null}let a=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(n));let c=wt(t,r);this.boxWriter.writeBox(c),this.writer.seek(a);for(let o of r)o.finalizedChunks.push(o.currentChunk),this.finalizedChunks.push(o.currentChunk),o.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let t=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let r=this.trackDatas.find(s=>s.track===e);r&&await this.processWebVTTCues(r,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),t()}async finalize(){let e=await this.mutex.acquire();for(let t of this.trackDatas)t.type==="subtitle"&&t.track.source._codec==="webvtt"&&await this.processWebVTTCues(t,1/0);if(this.fastStart==="fragmented"){for(let t of this.trackDatas){for(let r of t.sampleQueue)await this.addSampleToTrack(t,r);this.processTimestamps(t)}await this.finalizeFragment(!1)}else for(let t of this.trackDatas)this.processTimestamps(t),await this.finalizeCurrentChunk(t);if(this.fastStart==="in-memory"){m(this.mdat);let t;for(let s=0;s<2;s++){let n=he(this.trackDatas,this.creationTime),a=this.boxWriter.measureBox(n);t=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+a+t;for(let o of this.finalizedChunks){o.offset=c;for(let{data:u}of o.samples)m(u),c+=u.byteLength,t+=u.byteLength}if(c<2**32)break;t>=2**32&&(this.mdat.largeSize=!0)}let r=he(this.trackDatas,this.creationTime);this.boxWriter.writeBox(r),this.mdat.size=t,this.boxWriter.writeBox(this.mdat);for(let s of this.finalizedChunks)for(let n of s.samples)m(n.data),this.writer.write(n.data),n.data=null}else if(this.fastStart==="fragmented"){let t=this.writer.getPos(),r=jt(this.trackDatas);this.boxWriter.writeBox(r);let s=this.writer.getPos()-t;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(s)}else{m(this.mdat),m(this.ftypSize!==null);let t=this.boxWriter.offsets.get(this.mdat);m(t!==void 0);let r=this.writer.getPos()-t;this.mdat.size=r,this.mdat.largeSize=r>=2**32,this.boxWriter.patchBox(this.mdat);let s=he(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(s);let n=t-this.writer.getPos();this.boxWriter.writeBox(Qt(n))}else this.boxWriter.writeBox(s)}e()}};var ge=class{value;constructor(e){this.value=e}},ue=class{value;constructor(e){this.value=e}},Te=class{value;constructor(e){this.value=e}};var vt=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,It=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,or=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 At=2**15,cr="https://github.com/Vanilagy/webm-muxer",ur=6,lr=5,vi={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"},Ii={video:1,audio:2,subtitle:17},Le=class extends ae{timestampsMustStartAtZero=!1;writer;format;helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;dataOffsets=new WeakMap;trackDatas=[];segment=null;segmentInfo=null;seekHead=null;tracksElement=null;segmentDuration=null;cues=null;currentCluster=null;currentClusterMsTimestamp=null;trackDatasInCurrentCluster=new Set;duration=0;constructor(e,t){super(e),this.writer=e._writer,this.format=t,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,t=vt(e)){let r=0;switch(t){case 6:this.helperView.setUint8(r++,e/2**40|0);case 5:this.helperView.setUint8(r++,e/2**32|0);case 4:this.helperView.setUint8(r++,e>>24);case 3:this.helperView.setUint8(r++,e>>16);case 2:this.helperView.setUint8(r++,e>>8);case 1:this.helperView.setUint8(r++,e);break;default:throw new Error("Bad UINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeSignedInt(e,t=It(e)){e<0&&(e+=2**(t*8)),this.writeUnsignedInt(e,t)}writeEBMLVarInt(e,t=or(e)){let r=0;switch(t){case 1:this.helperView.setUint8(r++,128|e);break;case 2:this.helperView.setUint8(r++,64|e>>8),this.helperView.setUint8(r++,e);break;case 3:this.helperView.setUint8(r++,32|e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 4:this.helperView.setUint8(r++,16|e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 5:this.helperView.setUint8(r++,8|e/2**32&7),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 6:this.helperView.setUint8(r++,4|e/2**40&3),this.helperView.setUint8(r++,e/2**32|0),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;default:throw new Error("Bad EBML VINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(t=>t.charCodeAt(0))))}writeEBML(e){if(e!==null){if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let t of e)this.writeEBML(t);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let t=this.writer.getPos(),r=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+r);let s=this.writer.getPos();if(this.dataOffsets.set(e,s),this.writeEBML(e.data),e.size!==-1){let n=this.writer.getPos()-s,a=this.writer.getPos();this.writer.seek(t),this.writeEBMLVarInt(n,r),this.writer.seek(a)}}else if(typeof e.data=="number"){let t=e.size??vt(e.data);this.writeEBMLVarInt(t),this.writeUnsignedInt(e.data,t)}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 ge)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof ue)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof Te){let t=e.size??It(e.data.value);this.writeEBMLVarInt(t),this.writeSignedInt(e.data.value,t)}}}beforeTrackAdd(e){if(this.format instanceof ee)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 ee?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),t=new Uint8Array([21,73,169,102]),r=new Uint8Array([22,84,174,107]),s={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:t},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]}]};this.seekHead=s}createSegmentInfo(){let e={id:17545,data:new ue(0)};this.segmentDuration=e;let t={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:cr},{id:22337,data:cr},this.format._options.streamable?null:e]};this.segmentInfo=t}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let t of this.trackDatas)e.data.push({id:174,data:[{id:215,data:t.track.id},{id:29637,data:t.track.id},{id:131,data:Ii[t.type]},{id:134,data:vi[t.track.source._codec]},t.type==="video"?this.videoSpecificTrackInfo(t):null,t.type==="audio"?this.audioSpecificTrackInfo(t):null,t.type==="subtitle"?this.subtitleSpecificTrackInfo(t):null]})}videoSpecificTrackInfo(e){let t=[e.info.decoderConfig.description?{id:25506,data:j(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],r=e.info.decoderConfig.colorSpace,s={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},_e(r)?{id:21936,data:[{id:21937,data:G[r.matrix]},{id:21946,data:X[r.transfer]},{id:21947,data:q[r.primaries]},{id:21945,data:r.fullRange?2:1}]}:null]};return t.push(s),t}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:j(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new ge(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:M.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:ur,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,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Be(t),m(t),m(t.decoderConfig),m(t.decoderConfig.codedWidth!==void 0),m(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ne(t),m(t),m(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;We(t),m(t),m(t.config);let s={track:e,type:"subtitle",info:{config:t.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type==="key",o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c),u=this.createInternalChunk(a,o,(t.duration??0)/1e6,t.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(n,u),n.chunkQueue.push(u),await this.interleaveChunks()}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=c==="key",u=this.validateAndNormalizeTimestamp(n.track,t.timestamp,o),l=this.createInternalChunk(a,u,(t.duration??0)/1e6,c);n.chunkQueue.push(l),await this.interleaveChunks()}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r),a=this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),c=t.text,o=Math.floor(a*1e3);ne.lastIndex=0,c=c.replace(ne,p=>{let b=Fe(p.slice(1,-1))-o;return`<${Me(b)}>`});let u=M.encode(c),l=`${t.settings??""} ${t.identifier??""} -${t.notes??""}`,l=this.createInternalChunk(u,a,t.duration,"key",m.trim()?M.encode(m):null);n.chunkQueue.push(l),await this.interleaveChunks()}finally{s()}}async interleaveChunks(){for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(t=>t.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.chunkQueue.length===0&&!s.track.source._closed)break e;s.chunkQueue.length>0&&s.chunkQueue[0].timestamp=2&&r++;let o={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Mt(t.data,r+0,r+3,o)}createInternalChunk(e,t,r,s,n=null){return{data:e,type:s,timestamp:t,duration:r,additions:n}}writeBlock(e,t){this.segment||(this.createTracks(),this.createSegment());let r=Math.floor(1e3*t.timestamp),s=this.trackDatas.every(m=>{if(m.track.source._closed)return!0;if(e===m)return t.type==="key";let l=m.chunkQueue[0];return l&&l.type==="key"});(!this.currentCluster||s&&r-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(r);let n=r-this.currentClusterMsTimestamp;if(n<0)return;if(n>=At)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${At} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${At} milliseconds.`);let c=new Uint8Array(4),o=new DataView(c.buffer);o.setUint8(0,128|e.track.id),o.setInt16(1,n,!1);let u=Math.floor(1e3*t.duration);if(u===0&&!t.additions){o.setUint8(3,+(t.type==="key")<<7);let m={id:163,data:[c,t.data]};this.writeEBML(m)}else{let m={id:160,data:[{id:161,data:[c,t.data]},t.type==="delta"?{id:251,data:new Te(e.lastWrittenMsTimestamp-r)}:null,t.additions?{id:30113,data:[{id:166,data:[{id:165,data:t.additions},{id:238,data:1}]}]}:null,u>0?{id:155,data:u}:null]};this.writeEBML(m)}this.duration=Math.max(this.duration,r+u),e.lastWrittenMsTimestamp=r,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:mr,data:[{id:231,data:e}]},this.writeEBML(this.currentCluster),this.currentClusterMsTimestamp=e,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){d(this.currentCluster);let e=this.writer.getPos()-this.dataOffsets.get(this.currentCluster),t=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,mr),this.writer.seek(t);let r=this.offsets.get(this.currentCluster)-this.segmentDataOffset;d(this.cues),this.cues.data.push({id:187,data:[{id:179,data:this.currentClusterMsTimestamp},...[...this.trackDatasInCurrentCluster].map(s=>({id:183,data:[{id:247,data:s.track.id},{id:241,data:r}]}))]})}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 t of this.trackDatas)for(;t.chunkQueue.length>0;)this.writeBlock(t,t.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),d(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let t=this.writer.getPos(),r=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(r,ur),this.segmentDuration.data=new ue(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(t)}e()}};var L=class{},Ke=class extends L{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(e.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=e}_createMuxer(e){return new He(e,this)}},xe=class extends L{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.streamable!==void 0&&typeof e.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=e}_createMuxer(e){return new Le(e,this)}},ee=class extends xe{};var te=class{_connectedTrack=null;_closed=!1;_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)}},z=class extends te{_connectedTrack=null;_codec;constructor(e){if(super(),!Z.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${Z.join(", ")}.`);this._codec=e}},$e=class extends z{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,e,t)}},Ai=5,Ri=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!Z.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${Z.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'.")},Ce=class{constructor(e,t){this.source=e;this.codecConfig=t;Ri(t)}encoder=null;muxer=null;lastMultipleOfKeyFrameInterval=-1;lastWidth=null;lastHeight=null;async digest(e){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(e.codedWidth!==this.lastWidth||e.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${e.codedWidth}x${e.codedHeight}.`)}else this.lastWidth=e.codedWidth,this.lastHeight=e.codedHeight;this.ensureEncoder(e),d(this.encoder);let t=Math.floor(e.timestamp/1e6/Ai);this.encoder.encode(e,{keyFrame:t!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=t,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new VideoEncoder({output:(t,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,t,r),error:t=>console.error("Video encode error:",t)}),this.encoder.configure({codec:tr(this.codecConfig.codec,e.codedWidth,e.codedHeight,this.codecConfig.bitrate),width:e.codedWidth,height:e.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...nr(this.codecConfig.codec)}),d(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},Qe=class extends z{_encoder;constructor(e){super(e.codec),this._encoder=new Ce(this,e)}digest(e){if(!(e instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},je=class extends z{_encoder;_canvas;constructor(e,t){if(!(e instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(t.codec),this._encoder=new Ce(this,t),this._canvas=e}digest(e,t=0){if(!Number.isFinite(e)||e<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(t)||t<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*e),duration:Math.round(1e6*t),alpha:"discard"}),s=this._encoder.digest(r);return r.close(),s}_flush(){return this._encoder.flush()}},qe=class extends z{_encoder;_abortController=null;_track;_offsetTimestamps=!0;constructor(e,t){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");t={...t,latencyMode:"realtime"},super(t.codec),this._encoder=new Ce(this,t),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),t=new WritableStream({write:r=>{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},U=class extends te{_connectedTrack=null;_codec;constructor(e){if(super(),!J.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${J.join(", ")}.`);this._codec=e}},Xe=class extends U{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,e,t)}},Oi=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!J.includes(i.codec))throw new TypeError(`Invalid audio codec '${i.codec}'. Must be one of: ${J.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},Se=class{constructor(e,t){this.source=e;this.codecConfig=t;Oi(t)}encoder=null;muxer=null;lastNumberOfChannels=null;lastSampleRate=null;async digest(e){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(e.numberOfChannels!==this.lastNumberOfChannels||e.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${e.numberOfChannels} channels at ${e.sampleRate} Hz.`)}else this.lastNumberOfChannels=e.numberOfChannels,this.lastSampleRate=e.sampleRate;this.ensureEncoder(e),d(this.encoder),this.encoder.encode(e),this.encoder.encodeQueueSize>=4&&await new Promise(t=>this.encoder.addEventListener("dequeue",t,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new AudioEncoder({output:(t,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,t,r),error:t=>console.error("Audio encode error:",t)}),this.encoder.configure({codec:ir(this.codecConfig.codec,e.numberOfChannels,e.sampleRate),numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,bitrate:this.codecConfig.bitrate,...ar(this.codecConfig.codec)}),d(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},Ge=class extends U{_encoder;constructor(e){super(e.codec),this._encoder=new Se(this,e)}digest(e){if(!(e instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},Ye=class extends U{_encoder;_accumulatedFrameCount=0;constructor(e){super(e.codec),this._encoder=new Se(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let t=e.numberOfChannels,r=e.sampleRate,s=e.length,n=new Float32Array(t*s);for(let o=0;o{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},re=class extends te{_connectedTrack=null;_codec;constructor(e){if(super(),!ke.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${ke.join(", ")}.`);this._codec=e}},Je=class extends re{_parser;constructor(e){super(e),this._parser=new Ee({codec:e,output:(t,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,t,r),error:t=>console.error("Subtitle parse error:",t)})}digest(e){if(typeof e!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(e),this._connectedTrack.output._muxer.mutex.currentPromise}};var et=class{_muxer;_writer;_tracks=[];_started=!1;_finalizing=!1;_mutex=new N;constructor(e){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(!(e.format instanceof L))throw new TypeError("options.format must be an OutputFormat.");if(!(e.target instanceof H))throw new TypeError("options.target must be a Target.");if(e.target._output)throw new Error("Target is already used for another output.");e.target._output=this,this._writer=e.target._createWriter(),this._muxer=e.format._createMuxer(this)}addVideoTrack(e,t={}){if(!(e instanceof z))throw new TypeError("source must be a VideoSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");if(typeof t.rotation=="number"&&![0,90,180,270].includes(t.rotation))throw new TypeError(`Invalid video rotation: ${t.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(t.rotation)&&(t.rotation.length!==9||t.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${t.rotation.join()}`);if(t.frameRate!==void 0&&(!Number.isInteger(t.frameRate)||t.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${t.frameRate}. Must be a positive integer.`);this._addTrack("video",e,t)}addAudioTrack(e,t={}){if(!(e instanceof U))throw new TypeError("source must be an AudioSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",e,t)}addSubtitleTrack(e,t={}){if(!(e instanceof re))throw new TypeError("source must be a SubtitleSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",e,t)}_addTrack(e,t,r){if(this._started)throw new Error("Cannot add track after output has started.");if(t._connectedTrack)throw new Error("Source is already used for a track.");let s={id:this._tracks.length+1,output:this,type:e,source:t,metadata:r};this._muxer.beforeTrackAdd(s),this._tracks.push(s),t._connectedTrack=s}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let e=await this._mutex.acquire();await this._muxer.start();for(let t of this._tracks)t.source._start();e()}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 e=await this._mutex.acquire(),t=this._tracks.map(r=>r.source._flush());await Promise.all(t),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),e()}};var me=class{_sizePromise=null;_getSize(){return this._sizePromise??=this._retrieveSize()}},tt=class extends me{constructor(t){super();this.buffer=t}async _read(t,r){return new Uint8Array(this.buffer,t,r-t)}async _retrieveSize(){return this.buffer.byteLength}},rt=class extends me{constructor(t){super();this.blob=t}async _read(t,r){let n=await this.blob.slice(t,r).arrayBuffer();return new Uint8Array(n)}async _retrieveSize(){return this.blob.size}};var de=class{input;constructor(e){this.input=e}};var it=class{_backing;constructor(e){this._backing=e}isVideoTrack(){return this instanceof we}isAudioTrack(){return this instanceof ye}computeDuration(){return this._backing.computeDuration()}},we=class extends it{_backing;constructor(e){super(e),this._backing=e}getCodec(){return this._backing.getCodec()}getWidth(){return this._backing.getWidth()}getHeight(){return this._backing.getHeight()}getRotation(){return this._backing.getRotation()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},ye=class extends it{_backing;constructor(e){super(e),this._backing=e}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 le=class{constructor(e,t=1/0){this.source=e;this.maxStorableBytes=t}loadedSegments=[];loadingSegments=[];sourceSizePromise=null;nextAge=0;totalStoredBytes=0;async loadRange(e,t){t=Math.min(t,await this.source._getSize());let r=this.loadingSegments.find(o=>o.start<=e&&o.end>=t);if(r){await r.promise;return}if(this.loadedSegments.some(o=>o.start<=e&&o.end>=t))return;let n=this.source._read(e,t),a={start:e,end:t,promise:n};this.loadingSegments.push(a);let c=await n;Bt(this.loadingSegments,a),this.insertIntoLoadedSegments(e,c)}insertIntoLoadedSegments(e,t){let r={start:e,end:e+t.byteLength,bytes:t,view:new DataView(t.buffer),age:this.nextAge++},s=I(this.loadedSegments,e,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 c=0;cn.start),s=null;if(r!==-1)for(let n=r;ne)break;if(t<=a.end){s=a;break}}if(!s)throw new Error(`No segment loaded for range [${e}, ${t}).`);return s.age=this.nextAge++,{view:s.view,offset:s.bytes.byteOffset+e-s.start}}forgetRange(e,t){if(t<=e)return;let r=I(this.loadedSegments,e,n=>n.start);if(r===-1)return;let s=this.loadedSegments[r];s.start!==e||s.end!==t||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=s.bytes.byteLength)}};var ie=class{constructor(e){this.reader=e}pos=0;readRange(e,t){let{view:r,offset:s}=this.reader.getViewAndOffset(e,t);return new Uint8Array(r.buffer,s,t-e)}readU8(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,e.getUint8(t)}readU16(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,e.getUint16(t,!1)}readU24(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=e.getUint16(t,!1),s=e.getUint8(t+2);return r*256+s}readS32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getUint32(t,!1)}readI32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU64(){let e=this.readU32(),t=this.readU32();return e*4294967296+t}readF64(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,e.getFloat64(t,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(e){let{view:t,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+e);this.pos+=e;let s="";for(let n=0;nr.computeDuration()));return Math.max(0,...t)}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 t=await Promise.all(this.tracks.map(s=>s.inputTrack.getCodecMimeType())),r=[...new Set(t)];e+=`; codecs="${r.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&rr.presentationTimestamp-s.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let t=this.isobmffReader.readBoxHeader();d(t.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+t.totalSize),this.isobmffReader.pos=e,this.traverseBox();let r=B(this.fragments,e,n=>n.moofOffset);d(r!==-1);let s=this.fragments[r];d(s.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+t.totalSize);for(let[n,a]of s.trackData){if(a.startTimestampIsFinal)continue;let c=this.tracks.find(l=>l.id===n);this.isobmffReader.pos=0;let o=null,u=null,m=I(c.fragments,e-1,l=>l.moofOffset);for(m!==-1&&(o=c.fragments[m],u=o,this.isobmffReader.pos=o.moofOffset+o.moofSize);this.isobmffReader.posb.moofOffset);if(h===-1){this.isobmffReader.pos=l;let b=await this.readFragment();o&&(o.nextFragment=b),o=b}else{let b=this.fragments[h];o&&(o.nextFragment=b),o=b}}this.isobmffReader.pos=l+p.totalSize}o&&o.trackData.has(n)&&(u=o)}if(u){let l=u.trackData.get(n);d(l.startTimestampIsFinal),lr(a,l.endTimestamp)}a.startTimestampIsFinal=!0}return s}readContiguousBoxes(e){let t=this.isobmffReader.pos;for(;this.isobmffReader.pos-tm.every((l,p)=>l===o[p]));u===-1?s.rotation=0:s.rotation=90*u}break;case"mdhd":{let s=this.currentTrack;d(s);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3,n===0?(this.isobmffReader.pos+=8,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU32()):n===1&&(this.isobmffReader.pos+=16,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let s=this.currentTrack;d(s),this.isobmffReader.pos+=8;let n=this.isobmffReader.readAscii(4);n==="vide"?s.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:n==="soun"&&(s.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let s=this.currentTrack;d(s),s.sampleTableOffset=e,this.readContiguousBoxes(t.contentSize)}break;case"stsd":{let s=this.currentTrack;if(d(s),s.info===null||s.sampleTable)break;let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=this.isobmffReader.readU32();for(let c=0;c0){if(u===1)this.isobmffReader.pos+=4*4;else if(u===2){this.isobmffReader.pos+=4,l=this.isobmffReader.readF64(),m=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let p=this.isobmffReader.readU32(),h=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}s.info.numberOfChannels=m,s.info.sampleRate=l,this.readContiguousBoxes(e+o.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let s=this.currentTrack;d(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"hvcC":{let s=this.currentTrack;d(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"colr":{let s=this.currentTrack;if(d(s&&s.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let a=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),o=this.isobmffReader.readU16(),u=!!(this.isobmffReader.readU8()&128);s.info.colorSpace={primaries:Vt[a],transfer:Pt[c],matrix:Dt[o],fullRange:u}}break;case"wave":t.totalSize>8&&this.readContiguousBoxes(t.contentSize);break;case"esds":{let s=this.currentTrack;d(s&&s.info),this.isobmffReader.pos+=4;let n=this.isobmffReader.readU8();d(n===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let a=this.isobmffReader.readU8(),c=(a&128)!==0,o=(a&64)!==0,u=(a&32)!==0;if(c&&(this.isobmffReader.pos+=2),o){let b=this.isobmffReader.readU8();this.isobmffReader.pos+=b}u&&(this.isobmffReader.pos+=2);let m=this.isobmffReader.readU8();d(m===4),this.isobmffReader.readIsomVariableInteger();let l=this.isobmffReader.readU8();d(l===64),this.isobmffReader.pos+=12;let p=this.isobmffReader.readU8();d(p===5);let h=this.isobmffReader.readIsomVariableInteger();s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+h)}break;case"stts":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),a=0,c=0;for(let o=0;ow.id===n);if(!a)break;a.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),o=(c&48)>>4,u=(c&12)>>2,m=c&3,l=this.isobmffReader,p=[l.readU8.bind(l),l.readU16.bind(l),l.readU24.bind(l),l.readU32.bind(l)],h=p[o],b=p[u],k=p[m],g=this.isobmffReader.readU32();for(let w=0;wn.moofOffset);this.fragments.splice(s+1,0,this.currentFragment);for(let[,n]of this.currentFragment.trackData){let a=n.samples[0],c=A(n.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,a.byteOffset),this.currentFragment.dataEnd=Math.max(this.currentFragment.dataEnd,c.byteOffset+c.byteSize)}this.currentFragment=null}break;case"traf":if(d(this.currentFragment),this.readContiguousBoxes(t.contentSize),this.currentTrack){let s=this.currentFragment.trackData.get(this.currentTrack.id);if(s){let n=I(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(n+1,0,this.currentFragment);let{currentFragmentState:a}=this.currentTrack;d(a),a.startTimestamp!==null&&(lr(s,a.startTimestamp),s.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{d(this.currentFragment),this.isobmffReader.pos+=1;let s=this.isobmffReader.readU24(),n=!!(s&1),a=!!(s&2),c=!!(s&8),o=!!(s&16),u=!!(s&32),m=!!(s&65536),l=!!(s&131072),p=this.isobmffReader.readU32(),h=this.tracks.find(k=>k.id===p);if(!h)break;let b=this.fragmentTrackDefaults.find(k=>k.trackId===p);this.currentTrack=h,h.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:b?.defaultSampleDescriptionIndex??null,defaultSampleDuration:b?.defaultSampleDuration??null,defaultSampleSize:b?.defaultSampleSize??null,defaultSampleFlags:b?.defaultSampleFlags??null,startTimestamp:null},n?h.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():l&&(h.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),a&&(h.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(h.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),o&&(h.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),u&&(h.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),m&&(h.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let s=this.currentTrack;if(!s)break;d(s.currentFragmentState);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=n===0?this.isobmffReader.readU32():this.isobmffReader.readU64();s.currentFragmentState.startTimestamp=a}break;case"trun":{let s=this.currentTrack;if(!s)break;if(d(this.currentFragment),d(s.currentFragmentState),this.currentFragment.trackData.has(s.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let n=this.isobmffReader.readU8(),a=this.isobmffReader.readU24(),c=!!(a&1),o=!!(a&4),u=!!(a&256),m=!!(a&512),l=!!(a&1024),p=!!(a&2048),h=this.isobmffReader.readU32(),b=s.currentFragmentState.baseDataOffset;c&&(b+=this.isobmffReader.readI32());let k=null;o&&(k=this.isobmffReader.readU32());let g=b;if(h===0){this.currentFragment.implicitBaseDataOffset=g;break}let w=0,v={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(s.id,v);for(let E=0;E({presentationTimestamp:E.presentationTimestamp,sampleIndex:F})).sort((E,F)=>E.presentationTimestamp-F.presentationTimestamp);let _=v.samples[v.presentationTimestamps[0].sampleIndex],K=v.samples[A(v.presentationTimestamps).sampleIndex];v.startTimestamp=_.presentationTimestamp,v.endTimestamp=K.presentationTimestamp+K.duration,this.currentFragment.implicitBaseDataOffset=g}break}this.isobmffReader.pos=r}},nt=class{constructor(e){this.internalTrack=e}chunkToSampleIndex=new WeakMap;sampleIndexToChunk=new Map;chunkToFragmentLocation=new WeakMap;fragmentLocationToChunk=new Map;getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let t=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return t?t/1e6:0}async getFirstChunk(e){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let t=this.internalTrack.fragments[0];return{fragmentIndex:t?0:-1,sampleIndex:t?0:-1,correctSampleFound:!!t}},0,1/0,e):this.fetchChunkForSampleIndex(0,e)}async getChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,t);{let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=dr(s,r);return this.fetchChunkForSampleIndex(n,t)}}async getNextChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(e);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],c=B(this.internalTrack.fragments,s.fragment.moofOffset,o=>o.moofOffset);return d(c!==-1),this.performFragmentedLookup(()=>{if(s.sampleIndex+1l.moofOffset);return d(m!==-1),{fragmentIndex:m,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:c,sampleIndex:-1,correctSampleFound:!1}}},a.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,t)}async getKeyChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,t);let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=dr(s,r),a=n===-1?-1:Fi(s,n);return this.fetchChunkForSampleIndex(a,t)}async getNextKeyChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(e);if(a===void 0)throw new Error("Chunk was not created from this track.");let c=a.fragment.trackData.get(this.internalTrack.id),o=c.samples[a.sampleIndex],u=B(this.internalTrack.fragments,a.fragment.moofOffset,m=>m.moofOffset);return d(u!==-1),this.performFragmentedLookup(()=>{let m=c.samples.findIndex((l,p)=>l.isKeyFrame&&p>a.sampleIndex);if(m!==-1)return{fragmentIndex:u,sampleIndex:m,correctSampleFound:!0};{let l=a.fragment;for(;l.nextFragment;){l=l.nextFragment;let p=l.trackData.get(this.internalTrack.id);if(p){let h=B(this.internalTrack.fragments,l.moofOffset,k=>k.moofOffset);d(h!==-1);let b=p.samples.findIndex(k=>k.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:h,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},o.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Mi(s,r);return this.fetchChunkForSampleIndex(n,t)}async fetchChunkForSampleIndex(e,t){if(e===-1)return null;let r=this.sampleIndexToChunk.get(e)?.deref();if(r)return r;let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Ei(s,e);if(!n)return null;let a;t.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 c=1e6*n.presentationTimestamp/this.internalTrack.timescale,o=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(a,c,o,n.isKeyFrame);return this.chunkToSampleIndex.set(u,e),this.sampleIndexToChunk.set(e,new WeakRef(u)),u}async fetchChunkInFragment(e,t,r){if(t===-1)return null;let s=`${e.moofOffset}:${t}`,n=this.fragmentLocationToChunk.get(s)?.deref();if(n)return n;let c=e.trackData.get(this.internalTrack.id).samples[t];d(c);let o;r.metadataOnly?o=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(e.dataStart,e.dataEnd),o=this.internalTrack.demuxer.chunkReader.readRange(c.byteOffset,c.byteOffset+c.byteSize));let u=1e6*c.presentationTimestamp/this.internalTrack.timescale,m=1e6*c.duration/this.internalTrack.timescale,l=this.createChunk(o,u,m,c.isKeyFrame);return this.chunkToFragmentLocation.set(l,{fragment:e,sampleIndex:t}),this.fragmentLocationToChunk.set(s,new WeakRef(l)),l}findSampleInFragmentsForTimestamp(e){let t=I(this.internalTrack.fragments,e,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=I(a.presentationTimestamps,e,o=>o.presentationTimestamp);d(c!==-1),r=a.presentationTimestamps[c].sampleIndex,s=en.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=a.presentationTimestamps.findLastIndex(u=>a.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=e);if(c===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=a.presentationTimestamps[c].sampleIndex,s=ew.timestamp);g!==-1&&(k=this.internalTrack.fragmentLookupTable[g])}if(c===-1)m.pos=k?.moofOffset??0;else{let g=this.internalTrack.fragments[c];!k||g.moofOffset>=g.moofOffset?(m.pos=g.moofOffset+g.moofSize,p=g):m.pos=k.moofOffset}for(;m.posr)break;if(p.nextFragment){m.pos=p.nextFragment.moofOffset+p.nextFragment.moofSize,p=p.nextFragment;continue}}await m.reader.loadRange(m.pos,m.pos+16);let g=m.pos,w=m.readBoxHeader();if(w.name==="moof"){let v=B(n.fragments,g,_=>_.moofOffset);if(v===-1){m.pos=g;let _=await n.readFragment();p&&(p.nextFragment=_),p=_;let{fragmentIndex:K,sampleIndex:E,correctSampleFound:F}=e();if(F){let se=this.internalTrack.fragments[K];return this.fetchChunkInFragment(se,E,s)}K!==-1&&(h=K,b=E)}else{let _=n.fragments[v];p&&(p.nextFragment=_),p=_}}m.pos=g+w.totalSize}if(h!==-1){let g=this.internalTrack.fragments[h];return this.fetchChunkInFragment(g,b,s)}return null}finally{a()}}},Rt=class extends nt{internalTrack;constructor(e){super(e),this.internalTrack=e}async getCodec(){return this.internalTrack.info.codec}async getWidth(){return this.internalTrack.info.width}async getHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:rr(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(e,t,r,s){return new EncodedVideoChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},Ot=class extends nt{internalTrack;constructor(e){super(e),this.internalTrack=e}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:sr(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(e,t,r,s){return new EncodedAudioChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},dr=(i,e)=>{let t=I(i.presentationTimestamps,e,r=>r.presentationTimestamp);return t===-1?-1:i.presentationTimestamps[t].sampleIndex},Ei=(i,e)=>{let t=I(i.sampleTimingEntries,e,k=>k.startIndex),r=i.sampleTimingEntries[t];if(!r||r.startIndex+r.count<=e)return null;let n=r.startDecodeTimestamp+(e-r.startIndex)*r.delta,a=I(i.sampleCompositionTimeOffsets,e,k=>k.startIndex),c=i.sampleCompositionTimeOffsets[a];c&&(n+=c.offset);let o=i.sampleSizes[Math.min(e,i.sampleSizes.length-1)],u=I(i.sampleToChunk,e,k=>k.startSampleIndex),m=i.sampleToChunk[u];d(m);let l=m.startChunkIndex+Math.floor((e-m.startSampleIndex)/m.samplesPerChunk),p=i.chunkOffsets[l],h=0,b=p;if(i.sampleSizes.length===1)b+=o*(e-m.startSampleIndex),h+=o*m.samplesPerChunk;else{let k=m.startSampleIndex+(l-m.startChunkIndex)*m.samplesPerChunk;for(let g=k;gk)!==-1:!0}},Fi=(i,e)=>{if(!i.keySampleIndices)return e;let t=I(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t]??-1},Mi=(i,e)=>{if(!i.keySampleIndices)return e+1;let t=I(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t+1]??-1},lr=(i,e)=>{i.startTimestamp+=e,i.endTimestamp+=e;for(let t of i.samples)t.presentationTimestamp+=e;for(let t of i.presentationTimestamps)t.presentationTimestamp+=e};var at=class extends de{};var ot=class{},_t=class extends ot{async _canReadInput(e){if(await e._mainReader.source._getSize()<8)return!1;let r=new ie(e._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(e){return new st(e)}},Et=class extends ot{async _canReadInput(){return!1}_createDemuxer(e){return new at(e)}},ve=new _t,fr=ve,pr=ve,ct=new Et,Ft=ct,hr=ct,br=[ve,Ft];var ut=class{_source;_formats;_mainReader;_demuxerPromise=null;_format=null;constructor(e){this._formats=e.formats,this._source=e.source,this._mainReader=new le(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let e of this._formats)if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw new Error("Input has an unrecognizable format.")})()}async getFormat(){return await this._getDemuxer(),d(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(t=>t.isVideoTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(t=>t.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(t=>t.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(t=>t.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var mt=class{async*chunks(e,t=1/0){let r=[],{promise:s,resolve:n}=G(),{promise:a,resolve:c}=G(),o=!1,u=[],m=()=>Math.max(2,u.length);(async()=>{let l=e??await this.getFirstChunk();for(;l&&!o&&!(l.timestamp/1e6>=t);){if(r.length>m()){({promise:a,resolve:c}=G()),await a;continue}r.push(l),n(),{promise:s,resolve:n}=G(),l=await this.getNextChunk(l)}o=!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();c()}else if(!o)await s;else break}finally{o=!0,c()}}},dt=class{async getKeyMediaFrame(e){let t=null,r=await this.createDecoder(a=>t=a),n=await this.createChunkDrain().getKeyChunk(e);return n?(r.decode(n),await r.flush(),r.close(),t):null}async getMediaFrame(e){let t=null,r=await this.createDecoder(o=>{o.timestamp/1e6<=e?(t?.close(),t=o):o.close()}),s=this.createChunkDrain(),n=await s.getKeyChunk(e);if(!n)return null;let a=await s.getChunk(e);d(a),r.decode(n);let c=n;for(;c!==a;){let o=await s.getNextChunk(c);d(o),c=o,r.decode(o),r.decodeQueueSize>=10&&await new Promise(u=>r.addEventListener("dequeue",u,{once:!0}))}return await r.flush(),r.close(),t}async*mediaFrames(e=0,t=1/0){let r=[],s=!1,n=null,{promise:a,resolve:c}=G(),o=!1,u=await this.createDecoder(h=>{let b=h.timestamp/1e6;if(b>=t&&(o=!0),o){h.close();return}n&&(b>e?(r.push(n),s=!0):n.close()),b>=e&&(r.push(h),s=!0),n=s?null:h,r.length>0&&(c(),{promise:a,resolve:c}=G())}),m=this.createChunkDrain(),l=await m.getKeyChunk(e)??await m.getFirstChunk();if(!l)return;let p=!1;(async()=>{let h=l,b=1/0;if(t<1/0){let g=await m.getChunk(t),w=g?g.type==="key"&&g.timestamp/1e6===t?g:await m.getNextKeyChunk(g):null;w&&(b=w.timestamp/1e6)}let k=m.chunks(l,b);for(await k.next();h&&!o;){u.decode(h),u.decodeQueueSize>=10&&await new Promise(w=>u.addEventListener("dequeue",w,{once:!0}));let g=await k.next();if(g.done)break;h=g.value}await k.return(),await u.flush(),u.close(),!s&&n&&r.push(n),p=!0,c()})();try{for(;;)if(r.length>0)yield r.shift();else if(!p)await a;else break}finally{o=!0}}},Ie=class extends mt{constructor(t){super();this.videoTrack=t}getFirstChunk(t={}){return this.videoTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.videoTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.videoTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.videoTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.videoTrack._backing.getNextKeyChunk(t,r)}},lt=class extends dt{constructor(t){super();this.videoTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.videoTrack.getDecoderConfig());let r=new VideoDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new Ie(this.videoTrack)}getKeyFrame(t){return this.getKeyMediaFrame(t)}getFrame(t){return this.getMediaFrame(t)}frames(t=0,r=1/0){return this.mediaFrames(t,r)}},Ae=class extends mt{constructor(t){super();this.audioTrack=t}getFirstChunk(t={}){return this.audioTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.audioTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.audioTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.audioTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.audioTrack._backing.getNextKeyChunk(t,r)}},Re=class extends dt{constructor(t){super();this.audioTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.audioTrack.getDecoderConfig());let r=new AudioDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new Ae(this.audioTrack)}getKeyData(t){return this.getKeyMediaFrame(t)}getData(t){return this.getMediaFrame(t)}data(t=0,r=1/0){return this.mediaFrames(t,r)}},ft=class{constructor(e){this.audioTrack=e;this.audioDataDrain=new Re(e)}audioDataDrain;audioDataToWrappedArrayBuffer(e){if(!e)return null;let t=new AudioBuffer({numberOfChannels:e.numberOfChannels,length:e.numberOfFrames,sampleRate:e.sampleRate});for(let r=0;rt.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.chunkQueue.length===0&&!s.track.source._closed)break e;s.chunkQueue.length>0&&s.chunkQueue[0].timestamp=2&&r++;let o={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Mt(t.data,r+0,r+3,o)}createInternalChunk(e,t,r,s,n=null){return{data:e,type:s,timestamp:t,duration:r,additions:n}}writeBlock(e,t){this.segment||(this.createTracks(),this.createSegment());let r=Math.floor(1e3*t.timestamp),s=this.trackDatas.every(l=>{if(l.track.source._closed)return!0;if(e===l)return t.type==="key";let d=l.chunkQueue[0];return d&&d.type==="key"});(!this.currentCluster||s&&r-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(r);let n=r-this.currentClusterMsTimestamp;if(n<0)return;if(n>=At)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${At} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${At} milliseconds.`);let c=new Uint8Array(4),o=new DataView(c.buffer);o.setUint8(0,128|e.track.id),o.setInt16(1,n,!1);let u=Math.floor(1e3*t.duration);if(u===0&&!t.additions){o.setUint8(3,+(t.type==="key")<<7);let l={id:163,data:[c,t.data]};this.writeEBML(l)}else{let l={id:160,data:[{id:161,data:[c,t.data]},t.type==="delta"?{id:251,data:new Te(e.lastWrittenMsTimestamp-r)}:null,t.additions?{id:30113,data:[{id:166,data:[{id:165,data:t.additions},{id:238,data:1}]}]}:null,u>0?{id:155,data:u}:null]};this.writeEBML(l)}this.duration=Math.max(this.duration,r+u),e.lastWrittenMsTimestamp=r,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:lr,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),t=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,lr),this.writer.seek(t);let r=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(s=>({id:183,data:[{id:247,data:s.track.id},{id:241,data:r}]}))]})}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 t of this.trackDatas)for(;t.chunkQueue.length>0;)this.writeBlock(t,t.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),m(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let t=this.writer.getPos(),r=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(r,ur),this.segmentDuration.data=new ue(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(t)}e()}};var Q=class{},Ke=class extends Q{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(e.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=e}_createMuxer(e){return new He(e,this)}},xe=class extends Q{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.streamable!==void 0&&typeof e.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=e}_createMuxer(e){return new Le(e,this)}},ee=class extends xe{};var te=class{_connectedTrack=null;_closed=!1;_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)}},U=class extends te{_connectedTrack=null;_codec;constructor(e){if(super(),!Z.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${Z.join(", ")}.`);this._codec=e}},Qe=class extends U{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,e,t)}},Ai=5,Ri=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!Z.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${Z.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'.")},Ce=class{constructor(e,t){this.source=e;this.codecConfig=t;Ri(t)}encoder=null;muxer=null;lastMultipleOfKeyFrameInterval=-1;lastWidth=null;lastHeight=null;async digest(e){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(e.codedWidth!==this.lastWidth||e.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${e.codedWidth}x${e.codedHeight}.`)}else this.lastWidth=e.codedWidth,this.lastHeight=e.codedHeight;this.ensureEncoder(e),m(this.encoder);let t=Math.floor(e.timestamp/1e6/Ai);this.encoder.encode(e,{keyFrame:t!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=t,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new VideoEncoder({output:(t,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,t,r),error:t=>console.error("Video encode error:",t)}),this.encoder.configure({codec:tr(this.codecConfig.codec,e.codedWidth,e.codedHeight,this.codecConfig.bitrate),width:e.codedWidth,height:e.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...nr(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())}},$e=class extends U{_encoder;constructor(e){super(e.codec),this._encoder=new Ce(this,e)}digest(e){if(!(e instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},je=class extends U{_encoder;_canvas;constructor(e,t){if(!(e instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(t.codec),this._encoder=new Ce(this,t),this._canvas=e}digest(e,t=0){if(!Number.isFinite(e)||e<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(t)||t<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*e),duration:Math.round(1e6*t),alpha:"discard"}),s=this._encoder.digest(r);return r.close(),s}_flush(){return this._encoder.flush()}},qe=class extends U{_encoder;_abortController=null;_track;_offsetTimestamps=!0;constructor(e,t){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");t={...t,latencyMode:"realtime"},super(t.codec),this._encoder=new Ce(this,t),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),t=new WritableStream({write:r=>{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},B=class extends te{_connectedTrack=null;_codec;constructor(e){if(super(),!J.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${J.join(", ")}.`);this._codec=e}},Xe=class extends B{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,e,t)}},Oi=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!J.includes(i.codec))throw new TypeError(`Invalid audio codec '${i.codec}'. Must be one of: ${J.join(", ")}.`);if(!Number.isInteger(i.bitrate)||i.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},Se=class{constructor(e,t){this.source=e;this.codecConfig=t;Oi(t)}encoder=null;muxer=null;lastNumberOfChannels=null;lastSampleRate=null;async digest(e){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(e.numberOfChannels!==this.lastNumberOfChannels||e.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${e.numberOfChannels} channels at ${e.sampleRate} Hz.`)}else this.lastNumberOfChannels=e.numberOfChannels,this.lastSampleRate=e.sampleRate;this.ensureEncoder(e),m(this.encoder),this.encoder.encode(e),this.encoder.encodeQueueSize>=4&&await new Promise(t=>this.encoder.addEventListener("dequeue",t,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new AudioEncoder({output:(t,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,t,r),error:t=>console.error("Audio encode error:",t)}),this.encoder.configure({codec:ir(this.codecConfig.codec,e.numberOfChannels,e.sampleRate),numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,bitrate:this.codecConfig.bitrate,...ar(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())}},Ge=class extends B{_encoder;constructor(e){super(e.codec),this._encoder=new Se(this,e)}digest(e){if(!(e instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},Ye=class extends B{_encoder;_accumulatedFrameCount=0;constructor(e){super(e.codec),this._encoder=new Se(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let t=e.numberOfChannels,r=e.sampleRate,s=e.length,n=new Float32Array(t*s);for(let o=0;o{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},re=class extends te{_connectedTrack=null;_codec;constructor(e){if(super(),!ke.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${ke.join(", ")}.`);this._codec=e}},Je=class extends re{_parser;constructor(e){super(e),this._parser=new Ee({codec:e,output:(t,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,t,r),error:t=>console.error("Subtitle parse error:",t)})}digest(e){if(typeof e!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(e),this._connectedTrack.output._muxer.mutex.currentPromise}};var et=class{_muxer;_writer;_tracks=[];_started=!1;_finalizing=!1;_mutex=new H;constructor(e){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(!(e.format instanceof Q))throw new TypeError("options.format must be an OutputFormat.");if(!(e.target instanceof K))throw new TypeError("options.target must be a Target.");if(e.target._output)throw new Error("Target is already used for another output.");e.target._output=this,this._writer=e.target._createWriter(),this._muxer=e.format._createMuxer(this)}addVideoTrack(e,t={}){if(!(e instanceof U))throw new TypeError("source must be a VideoSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");if(typeof t.rotation=="number"&&![0,90,180,270].includes(t.rotation))throw new TypeError(`Invalid video rotation: ${t.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(t.rotation)&&(t.rotation.length!==9||t.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${t.rotation.join()}`);if(t.frameRate!==void 0&&(!Number.isInteger(t.frameRate)||t.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${t.frameRate}. Must be a positive integer.`);this._addTrack("video",e,t)}addAudioTrack(e,t={}){if(!(e instanceof B))throw new TypeError("source must be an AudioSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",e,t)}addSubtitleTrack(e,t={}){if(!(e instanceof re))throw new TypeError("source must be a SubtitleSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",e,t)}_addTrack(e,t,r){if(this._started)throw new Error("Cannot add track after output has started.");if(t._connectedTrack)throw new Error("Source is already used for a track.");let s={id:this._tracks.length+1,output:this,type:e,source:t,metadata:r};this._muxer.beforeTrackAdd(s),this._tracks.push(s),t._connectedTrack=s}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let e=await this._mutex.acquire();await this._muxer.start();for(let t of this._tracks)t.source._start();e()}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 e=await this._mutex.acquire(),t=this._tracks.map(r=>r.source._flush());await Promise.all(t),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),e()}};var le=class{_sizePromise=null;_getSize(){return this._sizePromise??=this._retrieveSize()}},tt=class extends le{constructor(t){super();this.buffer=t}async _read(t,r){return new Uint8Array(this.buffer,t,r-t)}async _retrieveSize(){return this.buffer.byteLength}},rt=class extends le{constructor(t){super();this.blob=t}async _read(t,r){let n=await this.blob.slice(t,r).arrayBuffer();return new Uint8Array(n)}async _retrieveSize(){return this.blob.size}};var me=class{input;constructor(e){this.input=e}};var it=class{_backing;constructor(e){this._backing=e}isVideoTrack(){return this instanceof we}isAudioTrack(){return this instanceof ye}computeDuration(){return this._backing.computeDuration()}},we=class extends it{_backing;constructor(e){super(e),this._backing=e}getCodec(){return this._backing.getCodec()}getWidth(){return this._backing.getWidth()}getHeight(){return this._backing.getHeight()}getRotation(){return this._backing.getRotation()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},ye=class extends it{_backing;constructor(e){super(e),this._backing=e}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 de=class{constructor(e,t=1/0){this.source=e;this.maxStorableBytes=t}loadedSegments=[];loadingSegments=[];sourceSizePromise=null;nextAge=0;totalStoredBytes=0;async loadRange(e,t){t=Math.min(t,await this.source._getSize());let r=this.loadingSegments.find(o=>o.start<=e&&o.end>=t);if(r){await r.promise;return}if(this.loadedSegments.some(o=>o.start<=e&&o.end>=t))return;let n=this.source._read(e,t),a={start:e,end:t,promise:n};this.loadingSegments.push(a);let c=await n;Bt(this.loadingSegments,a),this.insertIntoLoadedSegments(e,c)}insertIntoLoadedSegments(e,t){let r={start:e,end:e+t.byteLength,bytes:t,view:new DataView(t.buffer),age:this.nextAge++},s=A(this.loadedSegments,e,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 c=0;cn.start),s=null;if(r!==-1)for(let n=r;ne)break;if(t<=a.end){s=a;break}}if(!s)throw new Error(`No segment loaded for range [${e}, ${t}).`);return s.age=this.nextAge++,{view:s.view,offset:s.bytes.byteOffset+e-s.start}}forgetRange(e,t){if(t<=e)return;let r=A(this.loadedSegments,e,n=>n.start);if(r===-1)return;let s=this.loadedSegments[r];s.start!==e||s.end!==t||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=s.bytes.byteLength)}};var ie=class{constructor(e){this.reader=e}pos=0;readRange(e,t){let{view:r,offset:s}=this.reader.getViewAndOffset(e,t);return new Uint8Array(r.buffer,s,t-e)}readU8(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,e.getUint8(t)}readU16(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,e.getUint16(t,!1)}readU24(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=e.getUint16(t,!1),s=e.getUint8(t+2);return r*256+s}readS32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getUint32(t,!1)}readI32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU64(){let e=this.readU32(),t=this.readU32();return e*4294967296+t}readF64(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,e.getFloat64(t,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(e){let{view:t,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+e);this.pos+=e;let s="";for(let n=0;nr.computeDuration()));return Math.max(0,...t)}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 t=await Promise.all(this.tracks.map(s=>s.inputTrack.getCodecMimeType())),r=[...new Set(t)];e+=`; codecs="${r.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&rr.presentationTimestamp-s.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let t=this.isobmffReader.readBoxHeader();m(t.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+t.totalSize),this.isobmffReader.pos=e,this.traverseBox();let r=N(this.fragments,e,n=>n.moofOffset);m(r!==-1);let s=this.fragments[r];m(s.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+t.totalSize);for(let[n,a]of s.trackData){if(a.startTimestampIsFinal)continue;let c=this.tracks.find(d=>d.id===n);this.isobmffReader.pos=0;let o=null,u=null,l=A(c.fragments,e-1,d=>d.moofOffset);for(l!==-1&&(o=c.fragments[l],u=o,this.isobmffReader.pos=o.moofOffset+o.moofSize);this.isobmffReader.posb.moofOffset);if(h===-1){this.isobmffReader.pos=d;let b=await this.readFragment();o&&(o.nextFragment=b),o=b}else{let b=this.fragments[h];o&&(o.nextFragment=b),o=b}}this.isobmffReader.pos=d+p.totalSize}o&&o.trackData.has(n)&&(u=o)}if(u){let d=u.trackData.get(n);m(d.startTimestampIsFinal),dr(a,d.endTimestamp)}a.startTimestampIsFinal=!0}return s}readContiguousBoxes(e){let t=this.isobmffReader.pos;for(;this.isobmffReader.pos-tl.every((d,p)=>d===o[p]));u===-1?s.rotation=0:s.rotation=90*u}break;case"mdhd":{let s=this.currentTrack;m(s);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3,n===0?(this.isobmffReader.pos+=8,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU32()):n===1&&(this.isobmffReader.pos+=16,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let s=this.currentTrack;m(s),this.isobmffReader.pos+=8;let n=this.isobmffReader.readAscii(4);n==="vide"?s.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:n==="soun"&&(s.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let s=this.currentTrack;m(s),s.sampleTableOffset=e,this.readContiguousBoxes(t.contentSize)}break;case"stsd":{let s=this.currentTrack;if(m(s),s.info===null||s.sampleTable)break;let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=this.isobmffReader.readU32();for(let c=0;c0){if(u===1)this.isobmffReader.pos+=4*4;else if(u===2){this.isobmffReader.pos+=4,d=this.isobmffReader.readF64(),l=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let p=this.isobmffReader.readU32(),h=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}s.info.numberOfChannels=l,s.info.sampleRate=d,this.readContiguousBoxes(e+o.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let s=this.currentTrack;m(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"hvcC":{let s=this.currentTrack;m(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"colr":{let s=this.currentTrack;if(m(s&&s.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let a=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),o=this.isobmffReader.readU16(),u=!!(this.isobmffReader.readU8()&128);s.info.colorSpace={primaries:Vt[a],transfer:Pt[c],matrix:Dt[o],fullRange:u}}break;case"wave":t.totalSize>8&&this.readContiguousBoxes(t.contentSize);break;case"esds":{let s=this.currentTrack;m(s&&s.info),this.isobmffReader.pos+=4;let n=this.isobmffReader.readU8();m(n===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let a=this.isobmffReader.readU8(),c=(a&128)!==0,o=(a&64)!==0,u=(a&32)!==0;if(c&&(this.isobmffReader.pos+=2),o){let b=this.isobmffReader.readU8();this.isobmffReader.pos+=b}u&&(this.isobmffReader.pos+=2);let l=this.isobmffReader.readU8();m(l===4),this.isobmffReader.readIsomVariableInteger();let d=this.isobmffReader.readU8();m(d===64),this.isobmffReader.pos+=12;let p=this.isobmffReader.readU8();m(p===5);let h=this.isobmffReader.readIsomVariableInteger();s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+h)}break;case"stts":{let s=this.currentTrack;if(m(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),a=0,c=0;for(let o=0;ow.id===n);if(!a)break;a.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),o=(c&48)>>4,u=(c&12)>>2,l=c&3,d=this.isobmffReader,p=[d.readU8.bind(d),d.readU16.bind(d),d.readU24.bind(d),d.readU32.bind(d)],h=p[o],b=p[u],k=p[l],g=this.isobmffReader.readU32();for(let w=0;wn.moofOffset);this.fragments.splice(s+1,0,this.currentFragment);for(let[,n]of this.currentFragment.trackData){let a=n.samples[0],c=R(n.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,a.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(t.contentSize),this.currentTrack){let s=this.currentFragment.trackData.get(this.currentTrack.id);if(s){let n=A(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(n+1,0,this.currentFragment);let{currentFragmentState:a}=this.currentTrack;m(a),a.startTimestamp!==null&&(dr(s,a.startTimestamp),s.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{m(this.currentFragment),this.isobmffReader.pos+=1;let s=this.isobmffReader.readU24(),n=!!(s&1),a=!!(s&2),c=!!(s&8),o=!!(s&16),u=!!(s&32),l=!!(s&65536),d=!!(s&131072),p=this.isobmffReader.readU32(),h=this.tracks.find(k=>k.id===p);if(!h)break;let b=this.fragmentTrackDefaults.find(k=>k.trackId===p);this.currentTrack=h,h.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:b?.defaultSampleDescriptionIndex??null,defaultSampleDuration:b?.defaultSampleDuration??null,defaultSampleSize:b?.defaultSampleSize??null,defaultSampleFlags:b?.defaultSampleFlags??null,startTimestamp:null},n?h.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():d&&(h.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),a&&(h.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(h.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),o&&(h.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),u&&(h.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),l&&(h.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let s=this.currentTrack;if(!s)break;m(s.currentFragmentState);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=n===0?this.isobmffReader.readU32():this.isobmffReader.readU64();s.currentFragmentState.startTimestamp=a}break;case"trun":{let s=this.currentTrack;if(!s)break;if(m(this.currentFragment),m(s.currentFragmentState),this.currentFragment.trackData.has(s.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let n=this.isobmffReader.readU8(),a=this.isobmffReader.readU24(),c=!!(a&1),o=!!(a&4),u=!!(a&256),l=!!(a&512),d=!!(a&1024),p=!!(a&2048),h=this.isobmffReader.readU32(),b=s.currentFragmentState.baseDataOffset;c&&(b+=this.isobmffReader.readI32());let k=null;o&&(k=this.isobmffReader.readU32());let g=b;if(h===0){this.currentFragment.implicitBaseDataOffset=g;break}let w=0,y={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(s.id,y);for(let E=0;E({presentationTimestamp:E.presentationTimestamp,sampleIndex:F})).sort((E,F)=>E.presentationTimestamp-F.presentationTimestamp);let v=y.samples[y.presentationTimestamps[0].sampleIndex],P=y.samples[R(y.presentationTimestamps).sampleIndex];y.startTimestamp=v.presentationTimestamp,y.endTimestamp=P.presentationTimestamp+P.duration,this.currentFragment.implicitBaseDataOffset=g}break}this.isobmffReader.pos=r}},nt=class{constructor(e){this.internalTrack=e}chunkToSampleIndex=new WeakMap;sampleIndexToChunk=new Map;chunkToFragmentLocation=new WeakMap;fragmentLocationToChunk=new Map;getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let t=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return t?t/1e6:0}async getFirstChunk(e){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let t=this.internalTrack.fragments[0];return{fragmentIndex:t?0:-1,sampleIndex:t?0:-1,correctSampleFound:!!t}},0,1/0,e):this.fetchChunkForSampleIndex(0,e)}async getChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,t);{let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=mr(s,r);return this.fetchChunkForSampleIndex(n,t)}}async getNextChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(e);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],c=N(this.internalTrack.fragments,s.fragment.moofOffset,o=>o.moofOffset);return m(c!==-1),this.performFragmentedLookup(()=>{if(s.sampleIndex+1d.moofOffset);return m(l!==-1),{fragmentIndex:l,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:c,sampleIndex:-1,correctSampleFound:!1}}},a.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,t)}async getKeyChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,t);let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=mr(s,r),a=n===-1?-1:Fi(s,n);return this.fetchChunkForSampleIndex(a,t)}async getNextKeyChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(e);if(a===void 0)throw new Error("Chunk was not created from this track.");let c=a.fragment.trackData.get(this.internalTrack.id),o=c.samples[a.sampleIndex],u=N(this.internalTrack.fragments,a.fragment.moofOffset,l=>l.moofOffset);return m(u!==-1),this.performFragmentedLookup(()=>{let l=c.samples.findIndex((d,p)=>d.isKeyFrame&&p>a.sampleIndex);if(l!==-1)return{fragmentIndex:u,sampleIndex:l,correctSampleFound:!0};{let d=a.fragment;for(;d.nextFragment;){d=d.nextFragment;let p=d.trackData.get(this.internalTrack.id);if(p){let h=N(this.internalTrack.fragments,d.moofOffset,k=>k.moofOffset);m(h!==-1);let b=p.samples.findIndex(k=>k.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:h,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},o.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Mi(s,r);return this.fetchChunkForSampleIndex(n,t)}async fetchChunkForSampleIndex(e,t){if(e===-1)return null;let r=this.sampleIndexToChunk.get(e)?.deref();if(r)return r;let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Ei(s,e);if(!n)return null;let a;t.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 c=1e6*n.presentationTimestamp/this.internalTrack.timescale,o=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(a,c,o,n.isKeyFrame);return this.chunkToSampleIndex.set(u,e),this.sampleIndexToChunk.set(e,new WeakRef(u)),u}async fetchChunkInFragment(e,t,r){if(t===-1)return null;let s=`${e.moofOffset}:${t}`,n=this.fragmentLocationToChunk.get(s)?.deref();if(n)return n;let c=e.trackData.get(this.internalTrack.id).samples[t];m(c);let o;r.metadataOnly?o=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(e.dataStart,e.dataEnd),o=this.internalTrack.demuxer.chunkReader.readRange(c.byteOffset,c.byteOffset+c.byteSize));let u=1e6*c.presentationTimestamp/this.internalTrack.timescale,l=1e6*c.duration/this.internalTrack.timescale,d=this.createChunk(o,u,l,c.isKeyFrame);return this.chunkToFragmentLocation.set(d,{fragment:e,sampleIndex:t}),this.fragmentLocationToChunk.set(s,new WeakRef(d)),d}findSampleInFragmentsForTimestamp(e){let t=A(this.internalTrack.fragments,e,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=A(a.presentationTimestamps,e,o=>o.presentationTimestamp);m(c!==-1),r=a.presentationTimestamps[c].sampleIndex,s=en.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=a.presentationTimestamps.findLastIndex(u=>a.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=e);if(c===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=a.presentationTimestamps[c].sampleIndex,s=ew.timestamp);g!==-1&&(k=this.internalTrack.fragmentLookupTable[g])}if(c===-1)l.pos=k?.moofOffset??0;else{let g=this.internalTrack.fragments[c];!k||g.moofOffset>=g.moofOffset?(l.pos=g.moofOffset+g.moofSize,p=g):l.pos=k.moofOffset}for(;l.posr)break;if(p.nextFragment){l.pos=p.nextFragment.moofOffset+p.nextFragment.moofSize,p=p.nextFragment;continue}}await l.reader.loadRange(l.pos,l.pos+16);let g=l.pos,w=l.readBoxHeader();if(w.name==="moof"){let y=N(n.fragments,g,v=>v.moofOffset);if(y===-1){l.pos=g;let v=await n.readFragment();p&&(p.nextFragment=v),p=v;let{fragmentIndex:P,sampleIndex:E,correctSampleFound:F}=e();if(F){let se=this.internalTrack.fragments[P];return this.fetchChunkInFragment(se,E,s)}P!==-1&&(h=P,b=E)}else{let v=n.fragments[y];p&&(p.nextFragment=v),p=v}}l.pos=g+w.totalSize}if(h!==-1){let g=this.internalTrack.fragments[h];return this.fetchChunkInFragment(g,b,s)}return null}finally{a()}}},Rt=class extends nt{internalTrack;constructor(e){super(e),this.internalTrack=e}async getCodec(){return this.internalTrack.info.codec}async getWidth(){return this.internalTrack.info.width}async getHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:rr(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(e,t,r,s){return new EncodedVideoChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},Ot=class extends nt{internalTrack;constructor(e){super(e),this.internalTrack=e}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:sr(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(e,t,r,s){return new EncodedAudioChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},mr=(i,e)=>{let t=A(i.presentationTimestamps,e,r=>r.presentationTimestamp);return t===-1?-1:i.presentationTimestamps[t].sampleIndex},Ei=(i,e)=>{let t=A(i.sampleTimingEntries,e,k=>k.startIndex),r=i.sampleTimingEntries[t];if(!r||r.startIndex+r.count<=e)return null;let n=r.startDecodeTimestamp+(e-r.startIndex)*r.delta,a=A(i.sampleCompositionTimeOffsets,e,k=>k.startIndex),c=i.sampleCompositionTimeOffsets[a];c&&(n+=c.offset);let o=i.sampleSizes[Math.min(e,i.sampleSizes.length-1)],u=A(i.sampleToChunk,e,k=>k.startSampleIndex),l=i.sampleToChunk[u];m(l);let d=l.startChunkIndex+Math.floor((e-l.startSampleIndex)/l.samplesPerChunk),p=i.chunkOffsets[d],h=0,b=p;if(i.sampleSizes.length===1)b+=o*(e-l.startSampleIndex),h+=o*l.samplesPerChunk;else{let k=l.startSampleIndex+(d-l.startChunkIndex)*l.samplesPerChunk;for(let g=k;gk)!==-1:!0}},Fi=(i,e)=>{if(!i.keySampleIndices)return e;let t=A(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t]??-1},Mi=(i,e)=>{if(!i.keySampleIndices)return e+1;let t=A(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t+1]??-1},dr=(i,e)=>{i.startTimestamp+=e,i.endTimestamp+=e;for(let t of i.samples)t.presentationTimestamp+=e;for(let t of i.presentationTimestamps)t.presentationTimestamp+=e};var at=class extends me{};var ot=class{},_t=class extends ot{async _canReadInput(e){if(await e._mainReader.source._getSize()<8)return!1;let r=new ie(e._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(e){return new st(e)}},Et=class extends ot{async _canReadInput(){return!1}_createDemuxer(e){return new at(e)}},ve=new _t,fr=ve,pr=ve,ct=new Et,Ft=ct,hr=ct,br=[ve,Ft];var ut=class{_source;_formats;_mainReader;_demuxerPromise=null;_format=null;constructor(e){this._formats=e.formats,this._source=e.source,this._mainReader=new de(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let e of this._formats)if(await e._canReadInput(this))return this._format=e,e._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(t=>t.isVideoTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(t=>t.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(t=>t.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(t=>t.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var lt=class{async*chunks(e,t=1/0){let r=[],{promise:s,resolve:n}=W(),{promise:a,resolve:c}=W(),o=!1,u=[],l=()=>Math.max(2,u.length);(async()=>{let d=e??await this.getFirstChunk();for(;d&&!o&&!(d.timestamp/1e6>=t);){if(r.length>l()){({promise:a,resolve:c}=W()),await a;continue}r.push(d),n(),{promise:s,resolve:n}=W(),d=await this.getNextChunk(d)}o=!0,n()})();try{for(;;)if(r.length>0){yield r.shift();let d=performance.now();for(u.push(d);u.length>0&&d-u[0]>=1e3;)u.shift();c()}else if(!o)await s;else break}finally{o=!0,c()}}},mt=class{async getKeyMediaFrame(e){let t=null,r=await this.createDecoder(a=>t=a),n=await this.createChunkDrain().getKeyChunk(e);return n?(r.decode(n),await r.flush(),r.close(),t):null}async getMediaFrame(e){let t=null,r=await this.createDecoder(o=>{o.timestamp/1e6<=e?(t?.close(),t=o):o.close()}),s=this.createChunkDrain(),n=await s.getKeyChunk(e);if(!n)return null;let a=await s.getChunk(e);m(a),r.decode(n);let c=n;for(;c!==a;){let o=await s.getNextChunk(c);m(o),c=o,r.decode(o),r.decodeQueueSize>=10&&await new Promise(u=>r.addEventListener("dequeue",u,{once:!0}))}return await r.flush(),r.close(),t}async*mediaFrames(e=0,t=1/0){let r=[],s=!1,n=null,{promise:a,resolve:c}=W(),{promise:o,resolve:u}=W(),l=!1,d=8,p=await this.createDecoder(g=>{u();let w=g.timestamp/1e6;if(w>=t&&(l=!0),l){g.close();return}n&&(w>e?(r.push(n),s=!0):n.close()),w>=e&&(r.push(g),s=!0),n=s?null:g,r.length>0&&(c(),{promise:a,resolve:c}=W())}),h=this.createChunkDrain(),b=await h.getKeyChunk(e)??await h.getFirstChunk();if(!b)return;let k=!1;(async()=>{let g=b,w=1/0;if(t<1/0){let v=await h.getChunk(t),P=v?v.type==="key"&&v.timestamp/1e6===t?v:await h.getNextKeyChunk(v):null;P&&(w=P.timestamp/1e6)}let y=h.chunks(b,w);for(await y.next();g&&!l;){if(r.length+p.decodeQueueSize>d){({promise:o,resolve:u}=W()),await o;continue}p.decode(g);let v=await y.next();if(v.done)break;g=v.value}await y.return(),await p.flush(),p.close(),!s&&n&&r.push(n),k=!0,c()})();try{for(;;)if(r.length>0)yield r.shift(),u();else if(!k)await a;else break}finally{l=!0,u();for(let g of r)g.close()}}},Ie=class extends lt{constructor(t){super();this.videoTrack=t}getFirstChunk(t={}){return this.videoTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.videoTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.videoTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.videoTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.videoTrack._backing.getNextKeyChunk(t,r)}},dt=class extends mt{constructor(t){super();this.videoTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.videoTrack.getDecoderConfig());let r=new VideoDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new Ie(this.videoTrack)}getKeyFrame(t){return this.getKeyMediaFrame(t)}getFrame(t){return this.getMediaFrame(t)}frames(t=0,r=1/0){return this.mediaFrames(t,r)}},Ae=class extends lt{constructor(t){super();this.audioTrack=t}getFirstChunk(t={}){return this.audioTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.audioTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.audioTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.audioTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.audioTrack._backing.getNextKeyChunk(t,r)}},Re=class extends mt{constructor(t){super();this.audioTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.audioTrack.getDecoderConfig());let r=new AudioDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new Ae(this.audioTrack)}getKeyData(t){return this.getKeyMediaFrame(t)}getData(t){return this.getMediaFrame(t)}data(t=0,r=1/0){return this.mediaFrames(t,r)}},ft=class{constructor(e){this.audioTrack=e;this.audioDataDrain=new Re(e)}audioDataDrain;audioDataToWrappedArrayBuffer(e){if(!e)return null;let t=new AudioBuffer({numberOfChannels:e.numberOfChannels,length:e.numberOfFrames,sampleRate:e.sampleRate});for(let s=0;si&&i[i.length-1],L=i=>i>=0&&i<2**32,R=(i,e,t)=>{let r=0;for(let s=e;s>c;r<<=1,r|=o}return r},Et=(i,e,t,r)=>{for(let s=e;s>t-s-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),M=new TextEncoder,Ye=i=>Object.fromEntries(Object.entries(i).map(([e,t])=>[t,e])),$={bt709:1,bt470bg:5,smpte170m:6},Ft=Ye($),Q={bt709:1,smpte170m:6,"iec61966-2-1":13},Mt=Ye(Q),j={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Vt=Ye(j),ye=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,Ze=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),N=class{currentPromise=Promise.resolve();async acquire(){let e,t=new Promise(s=>{e=s}),r=this.currentPromise;return this.currentPromise=t,await r,e}},W=i=>{let e=i*(Math.PI/180),t=Math.cos(e),r=Math.sin(e);return[t,r,0,-r,t,0,0,0,1]},Je=W(0),Pt=i=>[...i].map(e=>e.toString(16).padStart(2,"0")).join(""),Dt=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),z=(i,e,t)=>{let r=0,s=i.length-1,n=-1;for(;r<=s;){let a=r+s>>1,c=t(i[a]);c===e?(n=a,s=a-1):c{let r=-1,s=0,n=i.length-1;for(;s<=n;){let a=s+(n-s+1)/2|0;t(i[a])<=e?(r=a,s=a+1):n=a-1}return r},q=()=>{let i,e;return{promise:new Promise((r,s)=>{i=r,e=s}),resolve:i,reject:e}},zt=(i,e)=>{let t=i.indexOf(e);t!==-1&&i.splice(t,1)};var de=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,fr=/^WEBVTT(.|\n)*?\n{2}/,ee=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,ve=class{options;preambleText=null;preambleEmitted=!1;constructor(e){this.options=e}parse(e){e=e.replaceAll(`\r +function m(i){if(!i)throw new Error("Assertion failed.")}var R=i=>i&&i[i.length-1],K=i=>i>=0&&i<2**32,O=(i,e,t)=>{let r=0;for(let s=e;s>c;r<<=1,r|=o}return r},Et=(i,e,t,r)=>{for(let s=e;s>t-s-1<i instanceof ArrayBuffer?new Uint8Array(i):new Uint8Array(i.buffer,i.byteOffset,i.byteLength),M=new TextEncoder,Ye=i=>Object.fromEntries(Object.entries(i).map(([e,t])=>[t,e])),$={bt709:1,bt470bg:5,smpte170m:6},Ft=Ye($),j={bt709:1,smpte170m:6,"iec61966-2-1":13},Mt=Ye(j),q={rgb:0,bt709:1,bt470bg:5,smpte170m:6},Vt=Ye(q),ye=i=>!!i&&!!i.primaries&&!!i.transfer&&!!i.matrix&&i.fullRange!==void 0,Ze=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i)&&!(i instanceof DataView),H=class{currentPromise=Promise.resolve();async acquire(){let e,t=new Promise(s=>{e=s}),r=this.currentPromise;return this.currentPromise=t,await r,e}},L=i=>{let e=i*(Math.PI/180),t=Math.cos(e),r=Math.sin(e);return[t,r,0,-r,t,0,0,0,1]},Je=L(0),Pt=i=>[...i].map(e=>e.toString(16).padStart(2,"0")).join(""),Dt=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),U=(i,e,t)=>{let r=0,s=i.length-1,n=-1;for(;r<=s;){let a=r+s>>1,c=t(i[a]);c===e?(n=a,s=a-1):c{let r=-1,s=0,n=i.length-1;for(;s<=n;){let a=s+(n-s+1)/2|0;t(i[a])<=e?(r=a,s=a+1):n=a-1}return r},B=()=>{let i,e;return{promise:new Promise((r,s)=>{i=r,e=s}),resolve:i,reject:e}},zt=(i,e)=>{let t=i.indexOf(e);t!==-1&&i.splice(t,1)};var me=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,fr=/^WEBVTT(.|\n)*?\n{2}/,ee=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,ve=class{options;preambleText=null;preambleEmitted=!1;constructor(e){this.options=e}parse(e){e=e.replaceAll(`\r `,` `).replaceAll("\r",` -`),de.lastIndex=0;let t;if(!this.preambleText){if(!fr.test(e)){let s=new Error("WebVTT preamble incorrect.");throw this.options.error(s),s}t=de.exec(e);let r=e.slice(0,t?.index??e.length).trimEnd();if(!r){let s=new Error("No WebVTT preamble provided.");throw this.options.error(s),s}this.preambleText=r,t&&(e=e.slice(t.index),de.lastIndex=0)}for(;t=de.exec(e);){let r=e.slice(0,t.index),s=t[1],n=t.index+t[0].length,a=e.indexOf(` +`),me.lastIndex=0;let t;if(!this.preambleText){if(!fr.test(e)){let s=new Error("WebVTT preamble incorrect.");throw this.options.error(s),s}t=me.exec(e);let r=e.slice(0,t?.index??e.length).trimEnd();if(!r){let s=new Error("No WebVTT preamble provided.");throw this.options.error(s),s}this.preambleText=r,t&&(e=e.slice(t.index),me.lastIndex=0)}for(;t=me.exec(e);){let r=e.slice(0,t.index),s=t[1],n=t.index+t[0].length,a=e.indexOf(` `,n)+1,c=e.slice(n,a).trim(),o=e.indexOf(` -`,n);o===-1&&(o=e.length);let u=Ie(t[2]),l=Ie(t[3])-u,p=e.slice(a,o).trim();e=e.slice(o).trimStart(),de.lastIndex=0;let h={timestamp:u/1e3,duration:l/1e3,text:p,identifier:s,settings:c,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(h,b)}}},pr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,Ie=i=>{let e=pr.exec(i);if(!e)throw new Error("Expected match.");return 60*60*1e3*Number(e[1]||"0")+60*1e3*Number(e[2])+1e3*Number(e[3])+Number(e[4])},Ae=i=>{let e=Math.floor(i/36e5),t=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),s=i%1e3;return e.toString().padStart(2,"0")+":"+t.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var le=class{constructor(e){this.writer=e}helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(e){this.helperView.setUint32(0,Math.floor(e/2**32),!1),this.helperView.setUint32(4,e,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(e){for(let t=0;t[(i%256+256)%256],x=i=>(D.setUint16(0,i,!1),[T[0],T[1]]),hr=i=>(D.setInt16(0,i,!1),[T[0],T[1]]),Bt=i=>(D.setUint32(0,i,!1),[T[1],T[2],T[3]]),f=i=>(D.setUint32(0,i,!1),[T[0],T[1],T[2],T[3]]),Nt=i=>(D.setInt32(0,i,!1),[T[0],T[1],T[2],T[3]]),X=i=>(D.setUint32(0,Math.floor(i/2**32),!1),D.setUint32(4,i,!1),[T[0],T[1],T[2],T[3],T[4],T[5],T[6],T[7]]),rt=i=>(D.setInt16(0,2**8*i,!1),[T[0],T[1]]),P=i=>(D.setInt32(0,2**16*i,!1),[T[0],T[1],T[2],T[3]]),et=i=>(D.setInt32(0,2**30*i,!1),[T[0],T[1],T[2],T[3]]),tt=(i,e)=>{let t=[],r=i;do{let s=r&127;r>>=7,t.length>0&&(s|=128),t.push(s),e!==void 0&&e--}while(r>0||e);return t.reverse()},O=(i,e=!1)=>{let t=Array(i.length).fill(null).map((r,s)=>i.charCodeAt(s));return e&&t.push(0),t},it=i=>{let e=null;for(let t of i)(!e||t.timestamp>e.timestamp)&&(e=t);return e},Wt=i=>[P(i[0]),P(i[1]),et(i[2]),P(i[3]),P(i[4]),et(i[5]),P(i[6]),P(i[7]),et(i[8])],C=(i,e,t)=>({type:i,contents:e&&new Uint8Array(e.flat(10)),children:t}),S=(i,e,t,r,s)=>C(i,[y(e),Bt(t),r??[]],s),Ht=i=>i.fragmented?C("ftyp",[O("iso5"),f(512),O("iso5"),O("iso6"),O("mp41")]):C("ftyp",[O("isom"),f(512),O("isom"),i.holdsAvc?O("avc1"):[],O("mp41")]),Oe=i=>({type:"mdat",largeSize:i}),Lt=i=>({type:"free",size:i}),fe=(i,e,t=!1)=>C("moov",void 0,[br(e,i),...i.map(r=>kr(r,e)),t?Gr(i):null]),br=(i,e)=>{let t=V(Math.max(0,...e.filter(a=>a.samples.length>0).map(a=>{let c=it(a.samples);return c.timestamp+c.duration})),Re),r=Math.max(0,...e.map(a=>a.track.id))+1,s=!L(i)||!L(t),n=s?X:f;return S("mvhd",+s,0,[n(i),n(i),f(Re),n(t),P(1),rt(1),Array(10).fill(0),Wt(Je),Array(24).fill(0),f(r)])},kr=(i,e)=>C("trak",void 0,[gr(i,e),Tr(i,e)]),gr=(i,e)=>{let t=it(i.samples),r=V(t?t.timestamp+t.duration:0,Re),s=!L(e)||!L(r),n=s?X:f,a;if(i.type==="video"){let c=i.track.metadata.rotation;a=c===void 0||typeof c=="number"?W(c??0):c}else a=Je;return S("tkhd",+s,3,[n(e),n(e),f(i.track.id),f(0),n(r),Array(8).fill(0),x(0),x(i.track.id),rt(i.type==="audio"?1:0),x(0),Wt(a),P(i.type==="video"?i.info.width:0),P(i.type==="video"?i.info.height:0)])},Tr=(i,e)=>C("mdia",void 0,[xr(i,e),wr(i),yr(i)]),xr=(i,e)=>{let t=it(i.samples),r=V(t?t.timestamp+t.duration:0,i.timescale),s=!L(e)||!L(r),n=s?X:f;return S("mdhd",+s,0,[n(e),n(e),f(i.timescale),n(r),x(21956),x(0)])},Cr={video:"vide",audio:"soun",subtitle:"text"},Sr={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},wr=i=>S("hdlr",0,0,[O("mhlr"),O(Cr[i.type]),f(0),f(0),f(0),O(Sr[i.type],!0)]),yr=i=>C("minf",void 0,[Rr[i.type](),Or(),Fr(i)]),vr=()=>S("vmhd",0,1,[x(0),x(0),x(0),x(0)]),Ir=()=>S("smhd",0,0,[x(0),x(0)]),Ar=()=>S("nmhd",0,0),Rr={video:vr,audio:Ir,subtitle:Ar},Or=()=>C("dinf",void 0,[_r()]),_r=()=>S("dref",0,0,[f(1)],[Er()]),Er=()=>S("url ",0,1),Fr=i=>{let e=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(t=>t.sampleCompositionTimeOffset!==0);return C("stbl",void 0,[Mr(i),Kr(i),$r(i),Qr(i),jr(i),qr(i),e?Xr(i):null])},Mr=i=>{let e;return i.type==="video"?e=Vr(ni[i.track.source._codec],i):i.type==="audio"?e=Br(oi[i.track.source._codec],i):i.type==="subtitle"&&(e=Hr(ui[i.track.source._codec],i)),d(e),S("stsd",0,0,[f(1)],[e])},Vr=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),Array(12).fill(0),x(e.info.width),x(e.info.height),f(4718592),f(4718592),f(0),x(1),Array(32).fill(0),x(24),hr(65535)],[ai[e.track.source._codec](e),ye(e.info.decoderConfig.colorSpace)?Pr(e):null]),Pr=i=>C("colr",[O("nclx"),x($[i.info.decoderConfig.colorSpace.primaries]),x(Q[i.info.decoderConfig.colorSpace.transfer]),x(j[i.info.decoderConfig.colorSpace.matrix]),y((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Dr=i=>i.info.decoderConfig&&C("avcC",[...K(i.info.decoderConfig.description)]),zr=i=>i.info.decoderConfig&&C("hvcC",[...K(i.info.decoderConfig.description)]),Ut=i=>{if(!i.info.decoderConfig)return null;let e=i.info.decoderConfig;d(e.colorSpace);let t=e.codec.split("."),r=Number(t[1]),s=Number(t[2]),c=(Number(t[3])<<4)+(0<<1)+Number(e.colorSpace.fullRange);return S("vpcC",1,0,[y(r),y(s),y(c),y(2),y(2),y(2),x(0)])},Ur=()=>C("av1C",[129,0,0,0]),Br=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),f(0),x(e.info.numberOfChannels),x(16),x(0),x(0),P(e.info.sampleRate)],[ci[e.track.source._codec](e)]),Nr=i=>{let t=[...K(i.info.decoderConfig.description??new ArrayBuffer(0))];return t=[...y(64),...y(21),...Bt(0),...f(0),...f(0),...y(5),...tt(t.length),...t],t=[...x(1),...y(0),...y(4),...tt(t.length),...t,...y(6),...y(1),...y(2)],t=[...y(3),...tt(t.length),...t],S("esds",0,0,t)},Wr=i=>{let e=3840,t=0,r=i.info.decoderConfig?.description;if(r){d(r.byteLength>=18);let s=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);e=s.getUint16(10,!0),t=s.getInt16(14,!0)}return C("dOps",[y(0),y(i.info.numberOfChannels),x(e),f(i.info.sampleRate),rt(t),y(0)])},Hr=(i,e)=>C(i,[Array(6).fill(0),x(1)],[mi[e.track.source._codec](e)]),Lr=i=>C("vttC",[...M.encode(i.info.config.description)]);var Kr=i=>S("stts",0,0,[f(i.timeToSampleTable.length),i.timeToSampleTable.map(e=>[f(e.sampleCount),f(e.sampleDelta)])]),$r=i=>{if(i.samples.every(t=>t.type==="key"))return null;let e=[...i.samples.entries()].filter(([,t])=>t.type==="key");return S("stss",0,0,[f(e.length),e.map(([t])=>f(t+1))])},Qr=i=>S("stsc",0,0,[f(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(e=>[f(e.firstChunk),f(e.samplesPerChunk),f(1)])]),jr=i=>S("stsz",0,0,[f(0),f(i.samples.length),i.samples.map(e=>f(e.size))]),qr=i=>i.finalizedChunks.length>0&&A(i.finalizedChunks).offset>=2**32?S("co64",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>X(e.offset))]):S("stco",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>f(e.offset))]),Xr=i=>S("ctts",0,0,[f(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(e=>[f(e.sampleCount),f(e.sampleCompositionTimeOffset)])]),Gr=i=>C("mvex",void 0,i.map(Yr)),Yr=i=>S("trex",0,0,[f(i.track.id),f(1),f(0),f(0),f(0)]),st=(i,e)=>C("moof",void 0,[Zr(i),...e.map(Jr)]),Zr=i=>S("mfhd",0,0,[f(i)]),Kt=i=>{let e=0,t=0,r=0,s=0,n=i.type==="delta";return t|=+n,n?e|=1:e|=2,e<<24|t<<16|r<<8|s},Jr=i=>C("traf",void 0,[ei(i),ti(i),ri(i)]),ei=i=>{d(i.currentChunk);let e=0;e|=8,e|=16,e|=32,e|=131072;let t=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:t.timescaleUnitsToNextSample,size:t.size,flags:Kt(t)};return S("tfhd",0,e,[f(i.track.id),f(r.duration),f(r.size),f(r.flags)])},ti=i=>(d(i.currentChunk),S("tfdt",1,0,[X(V(i.currentChunk.startTimestamp,i.timescale))])),ri=i=>{d(i.currentChunk);let e=i.currentChunk.samples.map(k=>k.timescaleUnitsToNextSample),t=i.currentChunk.samples.map(k=>k.size),r=i.currentChunk.samples.map(Kt),s=i.currentChunk.samples.map(k=>V(k.timestamp-k.decodeTimestamp,i.timescale)),n=new Set(e),a=new Set(t),c=new Set(r),o=new Set(s),u=c.size===2&&r[0]!==r[1],m=n.size>1,l=a.size>1,p=!u&&c.size>1,h=o.size>1||[...o].some(k=>k!==0),b=0;return b|=1,b|=4*+u,b|=256*+m,b|=512*+l,b|=1024*+p,b|=2048*+h,S("trun",1,b,[f(i.currentChunk.samples.length),f(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?f(r[0]):[],i.currentChunk.samples.map((k,g)=>[m?f(e[g]):[],l?f(t[g]):[],p?f(r[g]):[],h?Nt(s[g]):[]])])},$t=i=>C("mfra",void 0,[...i.map(ii),si()]),ii=(i,e)=>S("tfra",1,0,[f(i.track.id),f(63),f(i.finalizedChunks.length),i.finalizedChunks.map(r=>[X(V(r.samples[0].timestamp,i.timescale)),X(r.moofOffset),f(e+1),f(1),f(1)])]),si=()=>S("mfro",0,0,[f(0)]),Qt=()=>C("vtte"),jt=(i,e,t,r,s)=>C("vttc",void 0,[s!==null?C("vsid",[Nt(s)]):null,t!==null?C("iden",[...M.encode(t)]):null,e!==null?C("ctim",[...M.encode(Ae(e))]):null,r!==null?C("sttg",[...M.encode(r)]):null,C("payl",[...M.encode(i)])]),qt=i=>C("vtta",[...M.encode(i)]),ni={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},ai={avc:Dr,hevc:zr,vp8:Ut,vp9:Ut,av1:Ur},oi={aac:"mp4a",opus:"Opus"},ci={aac:Nr,opus:Wr},ui={webvtt:"wvtt"},mi={webvtt:Lr};var te=class{output;mutex=new N;constructor(e){this.output=e}beforeTrackAdd(e){}onTrackClose(e){}trackTimestampInfo=new WeakMap;validateAndNormalizeTimestamp(e,t,r){let s=t/1e6,n=this.trackTimestampInfo.get(e);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:e.source._offsetTimestamps?0:s,lastKeyFrameTimestamp:e.source._offsetTimestamps?0:s},this.trackTimestampInfo.set(e,n)}if(e.source._offsetTimestamps&&(s-=n.timestampOffset),s<0)throw new Error(`Timestamps must be non-negative (got ${s}s).`);if(sr.start-s.start);e.push({start:t[0].start,size:t[0].data.byteLength});for(let r=1;ro.start<=t&&tli){for(let o=0;o=e.written[n+1].start;)e.written[n].end=Math.max(e.written[n].end,e.written[n+1].end),e.written.splice(n+1,1)}createChunk(e){let r={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(r),this.chunks.sort((s,n)=>s.start-n.start),this.chunks.indexOf(r)}queueChunksForFlush(e=!1){d(this.writer);for(let t=0;t{if(i==="avc"){let n=Math.ceil(e/16)*Math.ceil(t/16),a=Xt.find(l=>n<=l.maxMacroblocks&&r<=l.maxBitrate)??A(Xt),c=a?a.level:0,o="64".padStart(2,"0"),u="00",m=c.toString(16).padStart(2,"0");return`avc1.${o}${u}${m}`}else if(i==="hevc"){let s="",a="6",c=e*t,o=Gt.find(m=>c<=m.maxPictureSize&&r<=m.maxBitrate)??A(Gt);return`hev1.${s}1.${a}.${o.tier}${o.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let s="00",n=e*t,a=Yt.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??A(Yt);return`vp09.${s}.${a.level}.08`}else if(i==="av1"){let n=e*t,a=Zt.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??A(Zt);return`av01.0.${a.level.toString().padStart(2,"0")}${a.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},er=(i,e)=>{if(i==="avc"){if(!e||e.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${Pt(e.subarray(1,4))}`}else if(i==="hevc"){if(!e)throw new TypeError("HEVC description must be provided.");let t=new DataView(e.buffer,e.byteOffset,e.byteLength),r="hev1.",s=e[1]>>6&3,n=e[1]&31;r+=["","A","B","C"][s]+n,r+=".";let a=Dt(t.getUint32(2));r+=a.toString(16),r+=".";let c=e[1]>>5&1,o=e[12];r+=c===0?"L":"H",r+=o,r+=".";let u=[];for(let m=0;m<6;m++){let l=e[m+13];u.push(l)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(m=>m.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},tr=(i,e,t)=>{if(i==="aac")return e>=2&&t<=24e3?"mp4a.40.29":t<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},rr=(i,e)=>{if(i==="aac")return`mp4a.40.${at(e).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},at=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=0,t=R(i,e,e+5);e+=5,t===31&&(t=32+R(i,e,e+6),e+=6);let r=R(i,e,e+4);e+=4;let s=null;if(r===15)s=R(i,e,e+24),e+=24;else{let c=[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:t,frequencyIndex:r,sampleRate:s,channelConfiguration:n,numberOfChannels:a}},ir=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},sr=i=>i==="aac"?{aac:{format:"aac"}}:i==="opus"?{opus:{format:"opus"}}:{},Me=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&&!Ze(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:e}=i.decoderConfig;if(typeof e!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let t=Object.keys($);if(e.primaries!=null&&!t.includes(e.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${t.join(", ")}.`);let r=Object.keys(Q);if(e.transfer!=null&&!r.includes(e.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let s=Object.keys(j);if(e.matrix!=null&&!s.includes(e.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(e.fullRange!=null&&typeof e.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.")},Ve=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&&!Ze(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.")},Pe=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 Re=1e3,fi=2082844800,V=(i,e,t=!0)=>{let r=i*e;return t?Math.round(r):r},De=class extends te{timestampsMustStartAtZero=!0;writer;boxWriter;fastStart;auxTarget=new he;auxWriter=this.auxTarget._createWriter();auxBoxWriter=new le(this.auxWriter);ftypSize=null;mdat=null;trackDatas=[];creationTime=Math.floor(Date.now()/1e3)+fi;finalizedChunks=[];nextFragmentNumber=1;constructor(e,t){super(e),this.writer=e._writer,this.boxWriter=new le(this.writer);let r=this.writer instanceof re?"in-memory":!1;this.fastStart=t._options.fastStart??r,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),t=this.output._tracks.some(r=>r.type==="video"&&r.source._codec==="avc");this.boxWriter.writeBox(Ht({holdsAvc:t,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=Oe(!1):this.fastStart==="fragmented"||(this.mdat=Oe(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Me(t),d(t),d(t.decoderConfig),d(t.decoderConfig.codedWidth!==void 0),d(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ve(t),d(t),d(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},timescale:t.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Pe(t),d(t),d(t.config);let s={track:e,type:"subtitle",info:{config:t.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(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),this.validateAndNormalizeTimestamp(e,0,!0),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=this.validateAndNormalizeTimestamp(n.track,t.timestamp,t.type==="key"),o=this.createSampleForTrack(n,a,c,(t.duration??0)/1e6,t.type);await this.registerSample(n,o)}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c==="key"),u=this.createSampleForTrack(n,a,o,(t.duration??0)/1e6,c);await this.registerSample(n,u)}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r);this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),e.source._codec==="webvtt"&&(n.cueQueue.push(t),await this.processWebVTTCues(n,t.timestamp))}finally{s()}}async processWebVTTCues(e,t){for(;e.cueQueue.length>0;){let r=new Set([]);for(let u of e.cueQueue)d(u.timestamp<=t),d(e.lastCueEndTimestamp<=u.timestamp+u.duration),r.add(Math.max(u.timestamp,e.lastCueEndTimestamp)),r.add(u.timestamp+u.duration);let s=[...r].sort((u,m)=>u-m),n=s[0],a=s[1]??n;if(t=a)break;ee.lastIndex=0;let l=ee.test(m.text),p=m.timestamp+m.duration,h=e.cueToSourceId.get(m);if(h===void 0&&ar.timestamp).sort((r,s)=>r-s);for(let r=0;r{if(e===a)return t.type==="key";let c=a.sampleQueue[0];return c&&c.type==="key"});s>=1&&n&&(r=!0,await this.finalizeFragment())}else r=s>=.5}r&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:t.timestamp,samples:[],offset:null,moofOffset:null}),d(e.currentChunk),e.currentChunk.samples.push(t),e.timestampProcessingQueue.push(t)}async finalizeCurrentChunk(e){if(d(this.fastStart!=="fragmented"),!!e.currentChunk){if(e.finalizedChunks.push(e.currentChunk),this.finalizedChunks.push(e.currentChunk),(e.compactlyCodedChunkTable.length===0||A(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 t of e.currentChunk.samples)d(t.data),this.writer.write(t.data),t.data=null;await this.writer.flush()}}async interleaveSamples(){d(this.fastStart==="fragmented");for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(t=>t.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.sampleQueue.length===0&&!s.track.source._closed)break e;s.sampleQueue.length>0&&s.sampleQueue[0].timestampo.currentChunk),s=this.writer.getPos(),n=st(t,r);this.boxWriter.writeBox(n);{let o=Oe(!1),u=0;for(let l of r)for(let p of l.currentChunk.samples)u+=p.size;let m=this.boxWriter.measureBox(o)+u;m>=2**32&&(o.largeSize=!0,m=this.boxWriter.measureBox(o)+u),o.size=m,this.boxWriter.writeBox(o)}for(let o of r){o.currentChunk.offset=this.writer.getPos(),o.currentChunk.moofOffset=s;for(let u of o.currentChunk.samples)this.writer.write(u.data),u.data=null}let a=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(n));let c=st(t,r);this.boxWriter.writeBox(c),this.writer.seek(a);for(let o of r)o.finalizedChunks.push(o.currentChunk),this.finalizedChunks.push(o.currentChunk),o.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let t=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let r=this.trackDatas.find(s=>s.track===e);r&&await this.processWebVTTCues(r,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),t()}async finalize(){let e=await this.mutex.acquire();for(let t of this.trackDatas)t.type==="subtitle"&&t.track.source._codec==="webvtt"&&await this.processWebVTTCues(t,1/0);if(this.fastStart==="fragmented"){for(let t of this.trackDatas){for(let r of t.sampleQueue)await this.addSampleToTrack(t,r);this.processTimestamps(t)}await this.finalizeFragment(!1)}else for(let t of this.trackDatas)this.processTimestamps(t),await this.finalizeCurrentChunk(t);if(this.fastStart==="in-memory"){d(this.mdat);let t;for(let s=0;s<2;s++){let n=fe(this.trackDatas,this.creationTime),a=this.boxWriter.measureBox(n);t=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+a+t;for(let o of this.finalizedChunks){o.offset=c;for(let{data:u}of o.samples)d(u),c+=u.byteLength,t+=u.byteLength}if(c<2**32)break;t>=2**32&&(this.mdat.largeSize=!0)}let r=fe(this.trackDatas,this.creationTime);this.boxWriter.writeBox(r),this.mdat.size=t,this.boxWriter.writeBox(this.mdat);for(let s of this.finalizedChunks)for(let n of s.samples)d(n.data),this.writer.write(n.data),n.data=null}else if(this.fastStart==="fragmented"){let t=this.writer.getPos(),r=$t(this.trackDatas);this.boxWriter.writeBox(r);let s=this.writer.getPos()-t;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(s)}else{d(this.mdat),d(this.ftypSize!==null);let t=this.boxWriter.offsets.get(this.mdat);d(t!==void 0);let r=this.writer.getPos()-t;this.mdat.size=r,this.mdat.largeSize=r>=2**32,this.boxWriter.patchBox(this.mdat);let s=fe(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(s);let n=t-this.writer.getPos();this.boxWriter.writeBox(Lt(n))}else this.boxWriter.writeBox(s)}e()}};var be=class{value;constructor(e){this.value=e}},ne=class{value;constructor(e){this.value=e}},ke=class{value;constructor(e){this.value=e}};var ot=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,ct=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,nr=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 ut=2**15,ar="https://github.com/Vanilagy/webm-muxer",or=6,cr=5,pi={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"},hi={video:1,audio:2,subtitle:17},ze=class extends te{timestampsMustStartAtZero=!1;writer;format;helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;dataOffsets=new WeakMap;trackDatas=[];segment=null;segmentInfo=null;seekHead=null;tracksElement=null;segmentDuration=null;cues=null;currentCluster=null;currentClusterMsTimestamp=null;trackDatasInCurrentCluster=new Set;duration=0;constructor(e,t){super(e),this.writer=e._writer,this.format=t,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,t=ot(e)){let r=0;switch(t){case 6:this.helperView.setUint8(r++,e/2**40|0);case 5:this.helperView.setUint8(r++,e/2**32|0);case 4:this.helperView.setUint8(r++,e>>24);case 3:this.helperView.setUint8(r++,e>>16);case 2:this.helperView.setUint8(r++,e>>8);case 1:this.helperView.setUint8(r++,e);break;default:throw new Error("Bad UINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeSignedInt(e,t=ct(e)){e<0&&(e+=2**(t*8)),this.writeUnsignedInt(e,t)}writeEBMLVarInt(e,t=nr(e)){let r=0;switch(t){case 1:this.helperView.setUint8(r++,128|e);break;case 2:this.helperView.setUint8(r++,64|e>>8),this.helperView.setUint8(r++,e);break;case 3:this.helperView.setUint8(r++,32|e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 4:this.helperView.setUint8(r++,16|e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 5:this.helperView.setUint8(r++,8|e/2**32&7),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 6:this.helperView.setUint8(r++,4|e/2**40&3),this.helperView.setUint8(r++,e/2**32|0),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;default:throw new Error("Bad EBML VINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(t=>t.charCodeAt(0))))}writeEBML(e){if(e!==null){if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let t of e)this.writeEBML(t);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let t=this.writer.getPos(),r=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+r);let s=this.writer.getPos();if(this.dataOffsets.set(e,s),this.writeEBML(e.data),e.size!==-1){let n=this.writer.getPos()-s,a=this.writer.getPos();this.writer.seek(t),this.writeEBMLVarInt(n,r),this.writer.seek(a)}}else if(typeof e.data=="number"){let t=e.size??ot(e.data);this.writeEBMLVarInt(t),this.writeUnsignedInt(e.data,t)}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 be)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof ne)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof ke){let t=e.size??ct(e.data.value);this.writeEBMLVarInt(t),this.writeSignedInt(e.data.value,t)}}}beforeTrackAdd(e){if(this.format instanceof ae)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 ae?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),t=new Uint8Array([21,73,169,102]),r=new Uint8Array([22,84,174,107]),s={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:t},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]}]};this.seekHead=s}createSegmentInfo(){let e={id:17545,data:new ne(0)};this.segmentDuration=e;let t={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:ar},{id:22337,data:ar},this.format._options.streamable?null:e]};this.segmentInfo=t}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let t of this.trackDatas)e.data.push({id:174,data:[{id:215,data:t.track.id},{id:29637,data:t.track.id},{id:131,data:hi[t.type]},{id:134,data:pi[t.track.source._codec]},t.type==="video"?this.videoSpecificTrackInfo(t):null,t.type==="audio"?this.audioSpecificTrackInfo(t):null,t.type==="subtitle"?this.subtitleSpecificTrackInfo(t):null]})}videoSpecificTrackInfo(e){let t=[e.info.decoderConfig.description?{id:25506,data:K(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],r=e.info.decoderConfig.colorSpace,s={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},ye(r)?{id:21936,data:[{id:21937,data:j[r.matrix]},{id:21946,data:Q[r.transfer]},{id:21947,data:$[r.primaries]},{id:21945,data:r.fullRange?2:1}]}:null]};return t.push(s),t}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:K(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new be(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:M.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:or,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 d(this.segment),this.dataOffsets.get(this.segment)}getVideoTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Me(t),d(t),d(t.decoderConfig),d(t.decoderConfig.codedWidth!==void 0),d(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ve(t),d(t),d(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Pe(t),d(t),d(t.config);let s={track:e,type:"subtitle",info:{config:t.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type==="key",o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c),u=this.createInternalChunk(a,o,(t.duration??0)/1e6,t.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(n,u),n.chunkQueue.push(u),await this.interleaveChunks()}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=c==="key",u=this.validateAndNormalizeTimestamp(n.track,t.timestamp,o),m=this.createInternalChunk(a,u,(t.duration??0)/1e6,c);n.chunkQueue.push(m),await this.interleaveChunks()}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r),a=this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),c=t.text,o=Math.floor(a*1e3);ee.lastIndex=0,c=c.replace(ee,p=>{let b=Ie(p.slice(1,-1))-o;return`<${Ae(b)}>`});let u=M.encode(c),m=`${t.settings??""} +`,n);o===-1&&(o=e.length);let u=Ie(t[2]),d=Ie(t[3])-u,p=e.slice(a,o).trim();e=e.slice(o).trimStart(),me.lastIndex=0;let h={timestamp:u/1e3,duration:d/1e3,text:p,identifier:s,settings:c,notes:r},b={};this.preambleEmitted||(b.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(h,b)}}},pr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,Ie=i=>{let e=pr.exec(i);if(!e)throw new Error("Expected match.");return 60*60*1e3*Number(e[1]||"0")+60*1e3*Number(e[2])+1e3*Number(e[3])+Number(e[4])},Ae=i=>{let e=Math.floor(i/36e5),t=Math.floor(i%(60*60*1e3)/(60*1e3)),r=Math.floor(i%(60*1e3)/1e3),s=i%1e3;return e.toString().padStart(2,"0")+":"+t.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var de=class{constructor(e){this.writer=e}helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;writeU32(e){this.helperView.setUint32(0,e,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(e){this.helperView.setUint32(0,Math.floor(e/2**32),!1),this.helperView.setUint32(4,e,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(e){for(let t=0;t[(i%256+256)%256],x=i=>(z.setUint16(0,i,!1),[T[0],T[1]]),hr=i=>(z.setInt16(0,i,!1),[T[0],T[1]]),Bt=i=>(z.setUint32(0,i,!1),[T[1],T[2],T[3]]),f=i=>(z.setUint32(0,i,!1),[T[0],T[1],T[2],T[3]]),Nt=i=>(z.setInt32(0,i,!1),[T[0],T[1],T[2],T[3]]),X=i=>(z.setUint32(0,Math.floor(i/2**32),!1),z.setUint32(4,i,!1),[T[0],T[1],T[2],T[3],T[4],T[5],T[6],T[7]]),rt=i=>(z.setInt16(0,2**8*i,!1),[T[0],T[1]]),D=i=>(z.setInt32(0,2**16*i,!1),[T[0],T[1],T[2],T[3]]),et=i=>(z.setInt32(0,2**30*i,!1),[T[0],T[1],T[2],T[3]]),tt=(i,e)=>{let t=[],r=i;do{let s=r&127;r>>=7,t.length>0&&(s|=128),t.push(s),e!==void 0&&e--}while(r>0||e);return t.reverse()},_=(i,e=!1)=>{let t=Array(i.length).fill(null).map((r,s)=>i.charCodeAt(s));return e&&t.push(0),t},it=i=>{let e=null;for(let t of i)(!e||t.timestamp>e.timestamp)&&(e=t);return e},Wt=i=>[D(i[0]),D(i[1]),et(i[2]),D(i[3]),D(i[4]),et(i[5]),D(i[6]),D(i[7]),et(i[8])],C=(i,e,t)=>({type:i,contents:e&&new Uint8Array(e.flat(10)),children:t}),S=(i,e,t,r,s)=>C(i,[I(e),Bt(t),r??[]],s),Ht=i=>i.fragmented?C("ftyp",[_("iso5"),f(512),_("iso5"),_("iso6"),_("mp41")]):C("ftyp",[_("isom"),f(512),_("isom"),i.holdsAvc?_("avc1"):[],_("mp41")]),Oe=i=>({type:"mdat",largeSize:i}),Lt=i=>({type:"free",size:i}),fe=(i,e,t=!1)=>C("moov",void 0,[br(e,i),...i.map(r=>kr(r,e)),t?Gr(i):null]),br=(i,e)=>{let t=V(Math.max(0,...e.filter(a=>a.samples.length>0).map(a=>{let c=it(a.samples);return c.timestamp+c.duration})),Re),r=Math.max(0,...e.map(a=>a.track.id))+1,s=!K(i)||!K(t),n=s?X:f;return S("mvhd",+s,0,[n(i),n(i),f(Re),n(t),D(1),rt(1),Array(10).fill(0),Wt(Je),Array(24).fill(0),f(r)])},kr=(i,e)=>C("trak",void 0,[gr(i,e),Tr(i,e)]),gr=(i,e)=>{let t=it(i.samples),r=V(t?t.timestamp+t.duration:0,Re),s=!K(e)||!K(r),n=s?X:f,a;if(i.type==="video"){let c=i.track.metadata.rotation;a=c===void 0||typeof c=="number"?L(c??0):c}else a=Je;return S("tkhd",+s,3,[n(e),n(e),f(i.track.id),f(0),n(r),Array(8).fill(0),x(0),x(i.track.id),rt(i.type==="audio"?1:0),x(0),Wt(a),D(i.type==="video"?i.info.width:0),D(i.type==="video"?i.info.height:0)])},Tr=(i,e)=>C("mdia",void 0,[xr(i,e),wr(i),yr(i)]),xr=(i,e)=>{let t=it(i.samples),r=V(t?t.timestamp+t.duration:0,i.timescale),s=!K(e)||!K(r),n=s?X:f;return S("mdhd",+s,0,[n(e),n(e),f(i.timescale),n(r),x(21956),x(0)])},Cr={video:"vide",audio:"soun",subtitle:"text"},Sr={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},wr=i=>S("hdlr",0,0,[_("mhlr"),_(Cr[i.type]),f(0),f(0),f(0),_(Sr[i.type],!0)]),yr=i=>C("minf",void 0,[Rr[i.type](),Or(),Fr(i)]),vr=()=>S("vmhd",0,1,[x(0),x(0),x(0),x(0)]),Ir=()=>S("smhd",0,0,[x(0),x(0)]),Ar=()=>S("nmhd",0,0),Rr={video:vr,audio:Ir,subtitle:Ar},Or=()=>C("dinf",void 0,[_r()]),_r=()=>S("dref",0,0,[f(1)],[Er()]),Er=()=>S("url ",0,1),Fr=i=>{let e=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(t=>t.sampleCompositionTimeOffset!==0);return C("stbl",void 0,[Mr(i),Kr(i),Qr(i),$r(i),jr(i),qr(i),e?Xr(i):null])},Mr=i=>{let e;return i.type==="video"?e=Vr(ni[i.track.source._codec],i):i.type==="audio"?e=Br(oi[i.track.source._codec],i):i.type==="subtitle"&&(e=Hr(ui[i.track.source._codec],i)),m(e),S("stsd",0,0,[f(1)],[e])},Vr=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),Array(12).fill(0),x(e.info.width),x(e.info.height),f(4718592),f(4718592),f(0),x(1),Array(32).fill(0),x(24),hr(65535)],[ai[e.track.source._codec](e),ye(e.info.decoderConfig.colorSpace)?Pr(e):null]),Pr=i=>C("colr",[_("nclx"),x($[i.info.decoderConfig.colorSpace.primaries]),x(j[i.info.decoderConfig.colorSpace.transfer]),x(q[i.info.decoderConfig.colorSpace.matrix]),I((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Dr=i=>i.info.decoderConfig&&C("avcC",[...Q(i.info.decoderConfig.description)]),zr=i=>i.info.decoderConfig&&C("hvcC",[...Q(i.info.decoderConfig.description)]),Ut=i=>{if(!i.info.decoderConfig)return null;let e=i.info.decoderConfig;m(e.colorSpace);let t=e.codec.split("."),r=Number(t[1]),s=Number(t[2]),c=(Number(t[3])<<4)+(0<<1)+Number(e.colorSpace.fullRange);return S("vpcC",1,0,[I(r),I(s),I(c),I(2),I(2),I(2),x(0)])},Ur=()=>C("av1C",[129,0,0,0]),Br=(i,e)=>C(i,[Array(6).fill(0),x(1),x(0),x(0),f(0),x(e.info.numberOfChannels),x(16),x(0),x(0),D(e.info.sampleRate)],[ci[e.track.source._codec](e)]),Nr=i=>{let t=[...Q(i.info.decoderConfig.description??new ArrayBuffer(0))];return t=[...I(64),...I(21),...Bt(0),...f(0),...f(0),...I(5),...tt(t.length),...t],t=[...x(1),...I(0),...I(4),...tt(t.length),...t,...I(6),...I(1),...I(2)],t=[...I(3),...tt(t.length),...t],S("esds",0,0,t)},Wr=i=>{let e=3840,t=0,r=i.info.decoderConfig?.description;if(r){m(r.byteLength>=18);let s=ArrayBuffer.isView(r)?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(r);e=s.getUint16(10,!0),t=s.getInt16(14,!0)}return C("dOps",[I(0),I(i.info.numberOfChannels),x(e),f(i.info.sampleRate),rt(t),I(0)])},Hr=(i,e)=>C(i,[Array(6).fill(0),x(1)],[li[e.track.source._codec](e)]),Lr=i=>C("vttC",[...M.encode(i.info.config.description)]);var Kr=i=>S("stts",0,0,[f(i.timeToSampleTable.length),i.timeToSampleTable.map(e=>[f(e.sampleCount),f(e.sampleDelta)])]),Qr=i=>{if(i.samples.every(t=>t.type==="key"))return null;let e=[...i.samples.entries()].filter(([,t])=>t.type==="key");return S("stss",0,0,[f(e.length),e.map(([t])=>f(t+1))])},$r=i=>S("stsc",0,0,[f(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(e=>[f(e.firstChunk),f(e.samplesPerChunk),f(1)])]),jr=i=>S("stsz",0,0,[f(0),f(i.samples.length),i.samples.map(e=>f(e.size))]),qr=i=>i.finalizedChunks.length>0&&R(i.finalizedChunks).offset>=2**32?S("co64",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>X(e.offset))]):S("stco",0,0,[f(i.finalizedChunks.length),i.finalizedChunks.map(e=>f(e.offset))]),Xr=i=>S("ctts",0,0,[f(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(e=>[f(e.sampleCount),f(e.sampleCompositionTimeOffset)])]),Gr=i=>C("mvex",void 0,i.map(Yr)),Yr=i=>S("trex",0,0,[f(i.track.id),f(1),f(0),f(0),f(0)]),st=(i,e)=>C("moof",void 0,[Zr(i),...e.map(Jr)]),Zr=i=>S("mfhd",0,0,[f(i)]),Kt=i=>{let e=0,t=0,r=0,s=0,n=i.type==="delta";return t|=+n,n?e|=1:e|=2,e<<24|t<<16|r<<8|s},Jr=i=>C("traf",void 0,[ei(i),ti(i),ri(i)]),ei=i=>{m(i.currentChunk);let e=0;e|=8,e|=16,e|=32,e|=131072;let t=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:t.timescaleUnitsToNextSample,size:t.size,flags:Kt(t)};return S("tfhd",0,e,[f(i.track.id),f(r.duration),f(r.size),f(r.flags)])},ti=i=>(m(i.currentChunk),S("tfdt",1,0,[X(V(i.currentChunk.startTimestamp,i.timescale))])),ri=i=>{m(i.currentChunk);let e=i.currentChunk.samples.map(k=>k.timescaleUnitsToNextSample),t=i.currentChunk.samples.map(k=>k.size),r=i.currentChunk.samples.map(Kt),s=i.currentChunk.samples.map(k=>V(k.timestamp-k.decodeTimestamp,i.timescale)),n=new Set(e),a=new Set(t),c=new Set(r),o=new Set(s),u=c.size===2&&r[0]!==r[1],l=n.size>1,d=a.size>1,p=!u&&c.size>1,h=o.size>1||[...o].some(k=>k!==0),b=0;return b|=1,b|=4*+u,b|=256*+l,b|=512*+d,b|=1024*+p,b|=2048*+h,S("trun",1,b,[f(i.currentChunk.samples.length),f(i.currentChunk.offset-i.currentChunk.moofOffset||0),u?f(r[0]):[],i.currentChunk.samples.map((k,g)=>[l?f(e[g]):[],d?f(t[g]):[],p?f(r[g]):[],h?Nt(s[g]):[]])])},Qt=i=>C("mfra",void 0,[...i.map(ii),si()]),ii=(i,e)=>S("tfra",1,0,[f(i.track.id),f(63),f(i.finalizedChunks.length),i.finalizedChunks.map(r=>[X(V(r.samples[0].timestamp,i.timescale)),X(r.moofOffset),f(e+1),f(1),f(1)])]),si=()=>S("mfro",0,0,[f(0)]),$t=()=>C("vtte"),jt=(i,e,t,r,s)=>C("vttc",void 0,[s!==null?C("vsid",[Nt(s)]):null,t!==null?C("iden",[...M.encode(t)]):null,e!==null?C("ctim",[...M.encode(Ae(e))]):null,r!==null?C("sttg",[...M.encode(r)]):null,C("payl",[...M.encode(i)])]),qt=i=>C("vtta",[...M.encode(i)]),ni={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},ai={avc:Dr,hevc:zr,vp8:Ut,vp9:Ut,av1:Ur},oi={aac:"mp4a",opus:"Opus"},ci={aac:Nr,opus:Wr},ui={webvtt:"wvtt"},li={webvtt:Lr};var te=class{output;mutex=new H;constructor(e){this.output=e}beforeTrackAdd(e){}onTrackClose(e){}trackTimestampInfo=new WeakMap;validateAndNormalizeTimestamp(e,t,r){let s=t/1e6,n=this.trackTimestampInfo.get(e);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:e.source._offsetTimestamps?0:s,lastKeyFrameTimestamp:e.source._offsetTimestamps?0:s},this.trackTimestampInfo.set(e,n)}if(e.source._offsetTimestamps&&(s-=n.timestampOffset),s<0)throw new Error(`Timestamps must be non-negative (got ${s}s).`);if(sr.start-s.start);e.push({start:t[0].start,size:t[0].data.byteLength});for(let r=1;ro.start<=t&&tdi){for(let o=0;o=e.written[n+1].start;)e.written[n].end=Math.max(e.written[n].end,e.written[n+1].end),e.written.splice(n+1,1)}createChunk(e){let r={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(r),this.chunks.sort((s,n)=>s.start-n.start),this.chunks.indexOf(r)}queueChunksForFlush(e=!1){m(this.writer);for(let t=0;t{if(i==="avc"){let n=Math.ceil(e/16)*Math.ceil(t/16),a=Xt.find(d=>n<=d.maxMacroblocks&&r<=d.maxBitrate)??R(Xt),c=a?a.level:0,o="64".padStart(2,"0"),u="00",l=c.toString(16).padStart(2,"0");return`avc1.${o}${u}${l}`}else if(i==="hevc"){let s="",a="6",c=e*t,o=Gt.find(l=>c<=l.maxPictureSize&&r<=l.maxBitrate)??R(Gt);return`hev1.${s}1.${a}.${o.tier}${o.level}.B0`}else{if(i==="vp8")return"vp8";if(i==="vp9"){let s="00",n=e*t,a=Yt.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??R(Yt);return`vp09.${s}.${a.level}.08`}else if(i==="av1"){let n=e*t,a=Zt.find(o=>n<=o.maxPictureSize&&r<=o.maxBitrate)??R(Zt);return`av01.0.${a.level.toString().padStart(2,"0")}${a.tier}.08`}}throw new TypeError(`Unhandled codec '${i}'.`)},er=(i,e)=>{if(i==="avc"){if(!e||e.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${Pt(e.subarray(1,4))}`}else if(i==="hevc"){if(!e)throw new TypeError("HEVC description must be provided.");let t=new DataView(e.buffer,e.byteOffset,e.byteLength),r="hev1.",s=e[1]>>6&3,n=e[1]&31;r+=["","A","B","C"][s]+n,r+=".";let a=Dt(t.getUint32(2));r+=a.toString(16),r+=".";let c=e[1]>>5&1,o=e[12];r+=c===0?"L":"H",r+=o,r+=".";let u=[];for(let l=0;l<6;l++){let d=e[l+13];u.push(d)}for(;u[u.length-1]===0;)u.pop();return r+=u.map(l=>l.toString(16)).join("."),r}throw new TypeError(`Unhandled codec '${i}'.`)},tr=(i,e,t)=>{if(i==="aac")return e>=2&&t<=24e3?"mp4a.40.29":t<=24e3?"mp4a.40.5":"mp4a.40.2";if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},rr=(i,e)=>{if(i==="aac")return`mp4a.40.${at(e).objectType}`;if(i==="opus")return"opus";if(i==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${i}'.`)},at=i=>{if(!i||i.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=0,t=O(i,e,e+5);e+=5,t===31&&(t=32+O(i,e,e+6),e+=6);let r=O(i,e,e+4);e+=4;let s=null;if(r===15)s=O(i,e,e+24),e+=24;else{let c=[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:t,frequencyIndex:r,sampleRate:s,channelConfiguration:n,numberOfChannels:a}},ir=i=>i==="avc"?{avc:{format:"avc"}}:i==="hevc"?{hevc:{format:"hevc"}}:{},sr=i=>i==="aac"?{aac:{format:"aac"}}:i==="opus"?{opus:{format:"opus"}}:{},Me=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&&!Ze(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:e}=i.decoderConfig;if(typeof e!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let t=Object.keys($);if(e.primaries!=null&&!t.includes(e.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${t.join(", ")}.`);let r=Object.keys(j);if(e.transfer!=null&&!r.includes(e.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);let s=Object.keys(q);if(e.matrix!=null&&!s.includes(e.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${s.join(", ")}.`);if(e.fullRange!=null&&typeof e.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.")},Ve=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&&!Ze(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.")},Pe=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 Re=1e3,fi=2082844800,V=(i,e,t=!0)=>{let r=i*e;return t?Math.round(r):r},De=class extends te{timestampsMustStartAtZero=!0;writer;boxWriter;fastStart;auxTarget=new he;auxWriter=this.auxTarget._createWriter();auxBoxWriter=new de(this.auxWriter);ftypSize=null;mdat=null;trackDatas=[];creationTime=Math.floor(Date.now()/1e3)+fi;finalizedChunks=[];nextFragmentNumber=1;constructor(e,t){super(e),this.writer=e._writer,this.boxWriter=new de(this.writer);let r=this.writer instanceof re?"in-memory":!1;this.fastStart=t._options.fastStart??r,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),t=this.output._tracks.some(r=>r.type==="video"&&r.source._codec==="avc");this.boxWriter.writeBox(Ht({holdsAvc:t,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=Oe(!1):this.fastStart==="fragmented"||(this.mdat=Oe(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Me(t),m(t),m(t.decoderConfig),m(t.decoderConfig.codedWidth!==void 0),m(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},timescale:e.metadata.frameRate??57600,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ve(t),m(t),m(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},timescale:t.decoderConfig.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[]};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Pe(t),m(t),m(t.config);let s={track:e,type:"subtitle",info:{config:t.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(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),this.validateAndNormalizeTimestamp(e,0,!0),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=this.validateAndNormalizeTimestamp(n.track,t.timestamp,t.type==="key"),o=this.createSampleForTrack(n,a,c,(t.duration??0)/1e6,t.type);await this.registerSample(n,o)}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c==="key"),u=this.createSampleForTrack(n,a,o,(t.duration??0)/1e6,c);await this.registerSample(n,u)}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r);this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),e.source._codec==="webvtt"&&(n.cueQueue.push(t),await this.processWebVTTCues(n,t.timestamp))}finally{s()}}async processWebVTTCues(e,t){for(;e.cueQueue.length>0;){let r=new Set([]);for(let u of e.cueQueue)m(u.timestamp<=t),m(e.lastCueEndTimestamp<=u.timestamp+u.duration),r.add(Math.max(u.timestamp,e.lastCueEndTimestamp)),r.add(u.timestamp+u.duration);let s=[...r].sort((u,l)=>u-l),n=s[0],a=s[1]??n;if(t=a)break;ee.lastIndex=0;let d=ee.test(l.text),p=l.timestamp+l.duration,h=e.cueToSourceId.get(l);if(h===void 0&&ar.timestamp).sort((r,s)=>r-s);for(let r=0;r{if(e===a)return t.type==="key";let c=a.sampleQueue[0];return c&&c.type==="key"});s>=1&&n&&(r=!0,await this.finalizeFragment())}else r=s>=.5}r&&(e.currentChunk&&await this.finalizeCurrentChunk(e),e.currentChunk={startTimestamp:t.timestamp,samples:[],offset:null,moofOffset:null}),m(e.currentChunk),e.currentChunk.samples.push(t),e.timestampProcessingQueue.push(t)}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 t of e.currentChunk.samples)m(t.data),this.writer.write(t.data),t.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(t=>t.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.sampleQueue.length===0&&!s.track.source._closed)break e;s.sampleQueue.length>0&&s.sampleQueue[0].timestampo.currentChunk),s=this.writer.getPos(),n=st(t,r);this.boxWriter.writeBox(n);{let o=Oe(!1),u=0;for(let d of r)for(let p of d.currentChunk.samples)u+=p.size;let l=this.boxWriter.measureBox(o)+u;l>=2**32&&(o.largeSize=!0,l=this.boxWriter.measureBox(o)+u),o.size=l,this.boxWriter.writeBox(o)}for(let o of r){o.currentChunk.offset=this.writer.getPos(),o.currentChunk.moofOffset=s;for(let u of o.currentChunk.samples)this.writer.write(u.data),u.data=null}let a=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(n));let c=st(t,r);this.boxWriter.writeBox(c),this.writer.seek(a);for(let o of r)o.finalizedChunks.push(o.currentChunk),this.finalizedChunks.push(o.currentChunk),o.currentChunk=null;e&&await this.writer.flush()}async onTrackClose(e){let t=await this.mutex.acquire();if(e.type==="subtitle"&&e.source._codec==="webvtt"){let r=this.trackDatas.find(s=>s.track===e);r&&await this.processWebVTTCues(r,1/0)}this.fastStart==="fragmented"&&await this.interleaveSamples(),t()}async finalize(){let e=await this.mutex.acquire();for(let t of this.trackDatas)t.type==="subtitle"&&t.track.source._codec==="webvtt"&&await this.processWebVTTCues(t,1/0);if(this.fastStart==="fragmented"){for(let t of this.trackDatas){for(let r of t.sampleQueue)await this.addSampleToTrack(t,r);this.processTimestamps(t)}await this.finalizeFragment(!1)}else for(let t of this.trackDatas)this.processTimestamps(t),await this.finalizeCurrentChunk(t);if(this.fastStart==="in-memory"){m(this.mdat);let t;for(let s=0;s<2;s++){let n=fe(this.trackDatas,this.creationTime),a=this.boxWriter.measureBox(n);t=this.boxWriter.measureBox(this.mdat);let c=this.writer.getPos()+a+t;for(let o of this.finalizedChunks){o.offset=c;for(let{data:u}of o.samples)m(u),c+=u.byteLength,t+=u.byteLength}if(c<2**32)break;t>=2**32&&(this.mdat.largeSize=!0)}let r=fe(this.trackDatas,this.creationTime);this.boxWriter.writeBox(r),this.mdat.size=t,this.boxWriter.writeBox(this.mdat);for(let s of this.finalizedChunks)for(let n of s.samples)m(n.data),this.writer.write(n.data),n.data=null}else if(this.fastStart==="fragmented"){let t=this.writer.getPos(),r=Qt(this.trackDatas);this.boxWriter.writeBox(r);let s=this.writer.getPos()-t;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(s)}else{m(this.mdat),m(this.ftypSize!==null);let t=this.boxWriter.offsets.get(this.mdat);m(t!==void 0);let r=this.writer.getPos()-t;this.mdat.size=r,this.mdat.largeSize=r>=2**32,this.boxWriter.patchBox(this.mdat);let s=fe(this.trackDatas,this.creationTime);if(typeof this.fastStart=="object"){this.writer.seek(this.ftypSize),this.boxWriter.writeBox(s);let n=t-this.writer.getPos();this.boxWriter.writeBox(Lt(n))}else this.boxWriter.writeBox(s)}e()}};var be=class{value;constructor(e){this.value=e}},ne=class{value;constructor(e){this.value=e}},ke=class{value;constructor(e){this.value=e}};var ot=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,ct=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,nr=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 ut=2**15,ar="https://github.com/Vanilagy/webm-muxer",or=6,cr=5,pi={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"},hi={video:1,audio:2,subtitle:17},ze=class extends te{timestampsMustStartAtZero=!1;writer;format;helper=new Uint8Array(8);helperView=new DataView(this.helper.buffer);offsets=new WeakMap;dataOffsets=new WeakMap;trackDatas=[];segment=null;segmentInfo=null;seekHead=null;tracksElement=null;segmentDuration=null;cues=null;currentCluster=null;currentClusterMsTimestamp=null;trackDatasInCurrentCluster=new Set;duration=0;constructor(e,t){super(e),this.writer=e._writer,this.format=t,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,t=ot(e)){let r=0;switch(t){case 6:this.helperView.setUint8(r++,e/2**40|0);case 5:this.helperView.setUint8(r++,e/2**32|0);case 4:this.helperView.setUint8(r++,e>>24);case 3:this.helperView.setUint8(r++,e>>16);case 2:this.helperView.setUint8(r++,e>>8);case 1:this.helperView.setUint8(r++,e);break;default:throw new Error("Bad UINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeSignedInt(e,t=ct(e)){e<0&&(e+=2**(t*8)),this.writeUnsignedInt(e,t)}writeEBMLVarInt(e,t=nr(e)){let r=0;switch(t){case 1:this.helperView.setUint8(r++,128|e);break;case 2:this.helperView.setUint8(r++,64|e>>8),this.helperView.setUint8(r++,e);break;case 3:this.helperView.setUint8(r++,32|e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 4:this.helperView.setUint8(r++,16|e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 5:this.helperView.setUint8(r++,8|e/2**32&7),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;case 6:this.helperView.setUint8(r++,4|e/2**40&3),this.helperView.setUint8(r++,e/2**32|0),this.helperView.setUint8(r++,e>>24),this.helperView.setUint8(r++,e>>16),this.helperView.setUint8(r++,e>>8),this.helperView.setUint8(r++,e);break;default:throw new Error("Bad EBML VINT size "+t)}this.writer.write(this.helper.subarray(0,r))}writeString(e){this.writer.write(new Uint8Array(e.split("").map(t=>t.charCodeAt(0))))}writeEBML(e){if(e!==null){if(e instanceof Uint8Array)this.writer.write(e);else if(Array.isArray(e))for(let t of e)this.writeEBML(t);else if(this.offsets.set(e,this.writer.getPos()),this.writeUnsignedInt(e.id),Array.isArray(e.data)){let t=this.writer.getPos(),r=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+r);let s=this.writer.getPos();if(this.dataOffsets.set(e,s),this.writeEBML(e.data),e.size!==-1){let n=this.writer.getPos()-s,a=this.writer.getPos();this.writer.seek(t),this.writeEBMLVarInt(n,r),this.writer.seek(a)}}else if(typeof e.data=="number"){let t=e.size??ot(e.data);this.writeEBMLVarInt(t),this.writeUnsignedInt(e.data,t)}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 be)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof ne)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof ke){let t=e.size??ct(e.data.value);this.writeEBMLVarInt(t),this.writeSignedInt(e.data.value,t)}}}beforeTrackAdd(e){if(this.format instanceof ae)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 ae?"webm":"matroska"},{id:17031,data:2},{id:17029,data:2}]};this.writeEBML(e)}createSeekHead(){let e=new Uint8Array([28,83,187,107]),t=new Uint8Array([21,73,169,102]),r=new Uint8Array([22,84,174,107]),s={id:290298740,data:[{id:19899,data:[{id:21419,data:e},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:t},{id:21420,size:5,data:0}]},{id:19899,data:[{id:21419,data:r},{id:21420,size:5,data:0}]}]};this.seekHead=s}createSegmentInfo(){let e={id:17545,data:new ne(0)};this.segmentDuration=e;let t={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:ar},{id:22337,data:ar},this.format._options.streamable?null:e]};this.segmentInfo=t}createTracks(){let e={id:374648427,data:[]};this.tracksElement=e;for(let t of this.trackDatas)e.data.push({id:174,data:[{id:215,data:t.track.id},{id:29637,data:t.track.id},{id:131,data:hi[t.type]},{id:134,data:pi[t.track.source._codec]},t.type==="video"?this.videoSpecificTrackInfo(t):null,t.type==="audio"?this.audioSpecificTrackInfo(t):null,t.type==="subtitle"?this.subtitleSpecificTrackInfo(t):null]})}videoSpecificTrackInfo(e){let t=[e.info.decoderConfig.description?{id:25506,data:Q(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],r=e.info.decoderConfig.colorSpace,s={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},ye(r)?{id:21936,data:[{id:21937,data:q[r.matrix]},{id:21946,data:j[r.transfer]},{id:21947,data:$[r.primaries]},{id:21945,data:r.fullRange?2:1}]}:null]};return t.push(s),t}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:Q(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new be(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:M.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:or,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,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Me(t),m(t),m(t.decoderConfig),m(t.decoderConfig.codedWidth!==void 0),m(t.decoderConfig.codedHeight!==void 0);let s={track:e,type:"video",info:{width:t.decoderConfig.codedWidth,height:t.decoderConfig.codedHeight,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getAudioTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Ve(t),m(t),m(t.decoderConfig);let s={track:e,type:"audio",info:{numberOfChannels:t.decoderConfig.numberOfChannels,sampleRate:t.decoderConfig.sampleRate,decoderConfig:t.decoderConfig},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}getSubtitleTrackData(e,t){let r=this.trackDatas.find(n=>n.track===e);if(r)return r;Pe(t),m(t),m(t.config);let s={track:e,type:"subtitle",info:{config:t.config},chunkQueue:[],lastWrittenMsTimestamp:null};return this.trackDatas.push(s),this.trackDatas.sort((n,a)=>n.track.id-a.track.id),s}async addEncodedVideoChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type==="key",o=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c),u=this.createInternalChunk(a,o,(t.duration??0)/1e6,t.type);e.source._codec==="vp9"&&this.fixVP9ColorSpace(n,u),n.chunkQueue.push(u),await this.interleaveChunks()}finally{s()}}async addEncodedAudioChunk(e,t,r){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,r),a=new Uint8Array(t.byteLength);t.copyTo(a);let c=t.type,o=c==="key",u=this.validateAndNormalizeTimestamp(n.track,t.timestamp,o),l=this.createInternalChunk(a,u,(t.duration??0)/1e6,c);n.chunkQueue.push(l),await this.interleaveChunks()}finally{s()}}async addSubtitleCue(e,t,r){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,r),a=this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),c=t.text,o=Math.floor(a*1e3);ee.lastIndex=0,c=c.replace(ee,p=>{let b=Ie(p.slice(1,-1))-o;return`<${Ae(b)}>`});let u=M.encode(c),l=`${t.settings??""} ${t.identifier??""} -${t.notes??""}`,l=this.createInternalChunk(u,a,t.duration,"key",m.trim()?M.encode(m):null);n.chunkQueue.push(l),await this.interleaveChunks()}finally{s()}}async interleaveChunks(){for(let e of this.output._tracks)if(!e.source._closed&&!this.trackDatas.some(t=>t.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.chunkQueue.length===0&&!s.track.source._closed)break e;s.chunkQueue.length>0&&s.chunkQueue[0].timestamp=2&&r++;let o={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Et(t.data,r+0,r+3,o)}createInternalChunk(e,t,r,s,n=null){return{data:e,type:s,timestamp:t,duration:r,additions:n}}writeBlock(e,t){this.segment||(this.createTracks(),this.createSegment());let r=Math.floor(1e3*t.timestamp),s=this.trackDatas.every(m=>{if(m.track.source._closed)return!0;if(e===m)return t.type==="key";let l=m.chunkQueue[0];return l&&l.type==="key"});(!this.currentCluster||s&&r-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(r);let n=r-this.currentClusterMsTimestamp;if(n<0)return;if(n>=ut)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${ut} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${ut} milliseconds.`);let c=new Uint8Array(4),o=new DataView(c.buffer);o.setUint8(0,128|e.track.id),o.setInt16(1,n,!1);let u=Math.floor(1e3*t.duration);if(u===0&&!t.additions){o.setUint8(3,+(t.type==="key")<<7);let m={id:163,data:[c,t.data]};this.writeEBML(m)}else{let m={id:160,data:[{id:161,data:[c,t.data]},t.type==="delta"?{id:251,data:new ke(e.lastWrittenMsTimestamp-r)}:null,t.additions?{id:30113,data:[{id:166,data:[{id:165,data:t.additions},{id:238,data:1}]}]}:null,u>0?{id:155,data:u}:null]};this.writeEBML(m)}this.duration=Math.max(this.duration,r+u),e.lastWrittenMsTimestamp=r,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:cr,data:[{id:231,data:e}]},this.writeEBML(this.currentCluster),this.currentClusterMsTimestamp=e,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){d(this.currentCluster);let e=this.writer.getPos()-this.dataOffsets.get(this.currentCluster),t=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,cr),this.writer.seek(t);let r=this.offsets.get(this.currentCluster)-this.segmentDataOffset;d(this.cues),this.cues.data.push({id:187,data:[{id:179,data:this.currentClusterMsTimestamp},...[...this.trackDatasInCurrentCluster].map(s=>({id:183,data:[{id:247,data:s.track.id},{id:241,data:r}]}))]})}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 t of this.trackDatas)for(;t.chunkQueue.length>0;)this.writeBlock(t,t.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),d(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let t=this.writer.getPos(),r=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(r,or),this.segmentDuration.data=new ne(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(t)}e()}};var Y=class{},mt=class extends Y{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(e.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=e}_createMuxer(e){return new De(e,this)}},Ue=class extends Y{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.streamable!==void 0&&typeof e.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=e}_createMuxer(e){return new ze(e,this)}},ae=class extends Ue{};var oe=class{_connectedTrack=null;_closed=!1;_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)}},U=class extends oe{_connectedTrack=null;_codec;constructor(e){if(super(),!ie.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${ie.join(", ")}.`);this._codec=e}},dt=class extends U{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,e,t)}},bi=5,ki=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!ie.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${ie.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'.")},ge=class{constructor(e,t){this.source=e;this.codecConfig=t;ki(t)}encoder=null;muxer=null;lastMultipleOfKeyFrameInterval=-1;lastWidth=null;lastHeight=null;async digest(e){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(e.codedWidth!==this.lastWidth||e.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${e.codedWidth}x${e.codedHeight}.`)}else this.lastWidth=e.codedWidth,this.lastHeight=e.codedHeight;this.ensureEncoder(e),d(this.encoder);let t=Math.floor(e.timestamp/1e6/bi);this.encoder.encode(e,{keyFrame:t!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=t,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new VideoEncoder({output:(t,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,t,r),error:t=>console.error("Video encode error:",t)}),this.encoder.configure({codec:Jt(this.codecConfig.codec,e.codedWidth,e.codedHeight,this.codecConfig.bitrate),width:e.codedWidth,height:e.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...ir(this.codecConfig.codec)}),d(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},lt=class extends U{_encoder;constructor(e){super(e.codec),this._encoder=new ge(this,e)}digest(e){if(!(e instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},ft=class extends U{_encoder;_canvas;constructor(e,t){if(!(e instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(t.codec),this._encoder=new ge(this,t),this._canvas=e}digest(e,t=0){if(!Number.isFinite(e)||e<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(t)||t<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*e),duration:Math.round(1e6*t),alpha:"discard"}),s=this._encoder.digest(r);return r.close(),s}_flush(){return this._encoder.flush()}},pt=class extends U{_encoder;_abortController=null;_track;_offsetTimestamps=!0;constructor(e,t){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");t={...t,latencyMode:"realtime"},super(t.codec),this._encoder=new ge(this,t),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),t=new WritableStream({write:r=>{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},B=class extends oe{_connectedTrack=null;_codec;constructor(e){if(super(),!se.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${se.join(", ")}.`);this._codec=e}},ht=class extends B{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,e,t)}},gi=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.")},Te=class{constructor(e,t){this.source=e;this.codecConfig=t;gi(t)}encoder=null;muxer=null;lastNumberOfChannels=null;lastSampleRate=null;async digest(e){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(e.numberOfChannels!==this.lastNumberOfChannels||e.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${e.numberOfChannels} channels at ${e.sampleRate} Hz.`)}else this.lastNumberOfChannels=e.numberOfChannels,this.lastSampleRate=e.sampleRate;this.ensureEncoder(e),d(this.encoder),this.encoder.encode(e),this.encoder.encodeQueueSize>=4&&await new Promise(t=>this.encoder.addEventListener("dequeue",t,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new AudioEncoder({output:(t,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,t,r),error:t=>console.error("Audio encode error:",t)}),this.encoder.configure({codec:tr(this.codecConfig.codec,e.numberOfChannels,e.sampleRate),numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,bitrate:this.codecConfig.bitrate,...sr(this.codecConfig.codec)}),d(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer)}async flush(){this.encoder&&(await this.encoder.flush(),this.encoder.close())}},bt=class extends B{_encoder;constructor(e){super(e.codec),this._encoder=new Te(this,e)}digest(e){if(!(e instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},kt=class extends B{_encoder;_accumulatedFrameCount=0;constructor(e){super(e.codec),this._encoder=new Te(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let t=e.numberOfChannels,r=e.sampleRate,s=e.length,n=new Float32Array(t*s);for(let o=0;o{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},ce=class extends oe{_connectedTrack=null;_codec;constructor(e){if(super(),!Fe.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${Fe.join(", ")}.`);this._codec=e}},Tt=class extends ce{_parser;constructor(e){super(e),this._parser=new ve({codec:e,output:(t,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,t,r),error:t=>console.error("Subtitle parse error:",t)})}digest(e){if(typeof e!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(e),this._connectedTrack.output._muxer.mutex.currentPromise}};var xt=class{_muxer;_writer;_tracks=[];_started=!1;_finalizing=!1;_mutex=new N;constructor(e){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(!(e.format instanceof Y))throw new TypeError("options.format must be an OutputFormat.");if(!(e.target instanceof G))throw new TypeError("options.target must be a Target.");if(e.target._output)throw new Error("Target is already used for another output.");e.target._output=this,this._writer=e.target._createWriter(),this._muxer=e.format._createMuxer(this)}addVideoTrack(e,t={}){if(!(e instanceof U))throw new TypeError("source must be a VideoSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");if(typeof t.rotation=="number"&&![0,90,180,270].includes(t.rotation))throw new TypeError(`Invalid video rotation: ${t.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(t.rotation)&&(t.rotation.length!==9||t.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${t.rotation.join()}`);if(t.frameRate!==void 0&&(!Number.isInteger(t.frameRate)||t.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${t.frameRate}. Must be a positive integer.`);this._addTrack("video",e,t)}addAudioTrack(e,t={}){if(!(e instanceof B))throw new TypeError("source must be an AudioSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",e,t)}addSubtitleTrack(e,t={}){if(!(e instanceof ce))throw new TypeError("source must be a SubtitleSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",e,t)}_addTrack(e,t,r){if(this._started)throw new Error("Cannot add track after output has started.");if(t._connectedTrack)throw new Error("Source is already used for a track.");let s={id:this._tracks.length+1,output:this,type:e,source:t,metadata:r};this._muxer.beforeTrackAdd(s),this._tracks.push(s),t._connectedTrack=s}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let e=await this._mutex.acquire();await this._muxer.start();for(let t of this._tracks)t.source._start();e()}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 e=await this._mutex.acquire(),t=this._tracks.map(r=>r.source._flush());await Promise.all(t),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),e()}};var xe=class{_sizePromise=null;_getSize(){return this._sizePromise??=this._retrieveSize()}},Ct=class extends xe{constructor(t){super();this.buffer=t}async _read(t,r){return new Uint8Array(this.buffer,t,r-t)}async _retrieveSize(){return this.buffer.byteLength}},St=class extends xe{constructor(t){super();this.blob=t}async _read(t,r){let n=await this.blob.slice(t,r).arrayBuffer();return new Uint8Array(n)}async _retrieveSize(){return this.blob.size}};var ue=class{input;constructor(e){this.input=e}};var Be=class{_backing;constructor(e){this._backing=e}isVideoTrack(){return this instanceof Ce}isAudioTrack(){return this instanceof Se}computeDuration(){return this._backing.computeDuration()}},Ce=class extends Be{_backing;constructor(e){super(e),this._backing=e}getCodec(){return this._backing.getCodec()}getWidth(){return this._backing.getWidth()}getHeight(){return this._backing.getHeight()}getRotation(){return this._backing.getRotation()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},Se=class extends Be{_backing;constructor(e){super(e),this._backing=e}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 me=class{constructor(e,t=1/0){this.source=e;this.maxStorableBytes=t}loadedSegments=[];loadingSegments=[];sourceSizePromise=null;nextAge=0;totalStoredBytes=0;async loadRange(e,t){t=Math.min(t,await this.source._getSize());let r=this.loadingSegments.find(o=>o.start<=e&&o.end>=t);if(r){await r.promise;return}if(this.loadedSegments.some(o=>o.start<=e&&o.end>=t))return;let n=this.source._read(e,t),a={start:e,end:t,promise:n};this.loadingSegments.push(a);let c=await n;zt(this.loadingSegments,a),this.insertIntoLoadedSegments(e,c)}insertIntoLoadedSegments(e,t){let r={start:e,end:e+t.byteLength,bytes:t,view:new DataView(t.buffer),age:this.nextAge++},s=I(this.loadedSegments,e,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 c=0;cn.start),s=null;if(r!==-1)for(let n=r;ne)break;if(t<=a.end){s=a;break}}if(!s)throw new Error(`No segment loaded for range [${e}, ${t}).`);return s.age=this.nextAge++,{view:s.view,offset:s.bytes.byteOffset+e-s.start}}forgetRange(e,t){if(t<=e)return;let r=I(this.loadedSegments,e,n=>n.start);if(r===-1)return;let s=this.loadedSegments[r];s.start!==e||s.end!==t||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=s.bytes.byteLength)}};var Z=class{constructor(e){this.reader=e}pos=0;readRange(e,t){let{view:r,offset:s}=this.reader.getViewAndOffset(e,t);return new Uint8Array(r.buffer,s,t-e)}readU8(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,e.getUint8(t)}readU16(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,e.getUint16(t,!1)}readU24(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=e.getUint16(t,!1),s=e.getUint8(t+2);return r*256+s}readS32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getUint32(t,!1)}readI32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU64(){let e=this.readU32(),t=this.readU32();return e*4294967296+t}readF64(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,e.getFloat64(t,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(e){let{view:t,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+e);this.pos+=e;let s="";for(let n=0;nr.computeDuration()));return Math.max(0,...t)}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 t=await Promise.all(this.tracks.map(s=>s.inputTrack.getCodecMimeType())),r=[...new Set(t)];e+=`; codecs="${r.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&rr.presentationTimestamp-s.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let t=this.isobmffReader.readBoxHeader();d(t.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+t.totalSize),this.isobmffReader.pos=e,this.traverseBox();let r=z(this.fragments,e,n=>n.moofOffset);d(r!==-1);let s=this.fragments[r];d(s.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+t.totalSize);for(let[n,a]of s.trackData){if(a.startTimestampIsFinal)continue;let c=this.tracks.find(l=>l.id===n);this.isobmffReader.pos=0;let o=null,u=null,m=I(c.fragments,e-1,l=>l.moofOffset);for(m!==-1&&(o=c.fragments[m],u=o,this.isobmffReader.pos=o.moofOffset+o.moofSize);this.isobmffReader.posb.moofOffset);if(h===-1){this.isobmffReader.pos=l;let b=await this.readFragment();o&&(o.nextFragment=b),o=b}else{let b=this.fragments[h];o&&(o.nextFragment=b),o=b}}this.isobmffReader.pos=l+p.totalSize}o&&o.trackData.has(n)&&(u=o)}if(u){let l=u.trackData.get(n);d(l.startTimestampIsFinal),mr(a,l.endTimestamp)}a.startTimestampIsFinal=!0}return s}readContiguousBoxes(e){let t=this.isobmffReader.pos;for(;this.isobmffReader.pos-tm.every((l,p)=>l===o[p]));u===-1?s.rotation=0:s.rotation=90*u}break;case"mdhd":{let s=this.currentTrack;d(s);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3,n===0?(this.isobmffReader.pos+=8,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU32()):n===1&&(this.isobmffReader.pos+=16,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let s=this.currentTrack;d(s),this.isobmffReader.pos+=8;let n=this.isobmffReader.readAscii(4);n==="vide"?s.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:n==="soun"&&(s.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let s=this.currentTrack;d(s),s.sampleTableOffset=e,this.readContiguousBoxes(t.contentSize)}break;case"stsd":{let s=this.currentTrack;if(d(s),s.info===null||s.sampleTable)break;let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=this.isobmffReader.readU32();for(let c=0;c0){if(u===1)this.isobmffReader.pos+=4*4;else if(u===2){this.isobmffReader.pos+=4,l=this.isobmffReader.readF64(),m=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let p=this.isobmffReader.readU32(),h=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}s.info.numberOfChannels=m,s.info.sampleRate=l,this.readContiguousBoxes(e+o.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let s=this.currentTrack;d(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"hvcC":{let s=this.currentTrack;d(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"colr":{let s=this.currentTrack;if(d(s&&s.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let a=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),o=this.isobmffReader.readU16(),u=!!(this.isobmffReader.readU8()&128);s.info.colorSpace={primaries:Ft[a],transfer:Mt[c],matrix:Vt[o],fullRange:u}}break;case"wave":t.totalSize>8&&this.readContiguousBoxes(t.contentSize);break;case"esds":{let s=this.currentTrack;d(s&&s.info),this.isobmffReader.pos+=4;let n=this.isobmffReader.readU8();d(n===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let a=this.isobmffReader.readU8(),c=(a&128)!==0,o=(a&64)!==0,u=(a&32)!==0;if(c&&(this.isobmffReader.pos+=2),o){let b=this.isobmffReader.readU8();this.isobmffReader.pos+=b}u&&(this.isobmffReader.pos+=2);let m=this.isobmffReader.readU8();d(m===4),this.isobmffReader.readIsomVariableInteger();let l=this.isobmffReader.readU8();d(l===64),this.isobmffReader.pos+=12;let p=this.isobmffReader.readU8();d(p===5);let h=this.isobmffReader.readIsomVariableInteger();s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+h)}break;case"stts":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),a=0,c=0;for(let o=0;ow.id===n);if(!a)break;a.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),o=(c&48)>>4,u=(c&12)>>2,m=c&3,l=this.isobmffReader,p=[l.readU8.bind(l),l.readU16.bind(l),l.readU24.bind(l),l.readU32.bind(l)],h=p[o],b=p[u],k=p[m],g=this.isobmffReader.readU32();for(let w=0;wn.moofOffset);this.fragments.splice(s+1,0,this.currentFragment);for(let[,n]of this.currentFragment.trackData){let a=n.samples[0],c=A(n.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,a.byteOffset),this.currentFragment.dataEnd=Math.max(this.currentFragment.dataEnd,c.byteOffset+c.byteSize)}this.currentFragment=null}break;case"traf":if(d(this.currentFragment),this.readContiguousBoxes(t.contentSize),this.currentTrack){let s=this.currentFragment.trackData.get(this.currentTrack.id);if(s){let n=I(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(n+1,0,this.currentFragment);let{currentFragmentState:a}=this.currentTrack;d(a),a.startTimestamp!==null&&(mr(s,a.startTimestamp),s.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{d(this.currentFragment),this.isobmffReader.pos+=1;let s=this.isobmffReader.readU24(),n=!!(s&1),a=!!(s&2),c=!!(s&8),o=!!(s&16),u=!!(s&32),m=!!(s&65536),l=!!(s&131072),p=this.isobmffReader.readU32(),h=this.tracks.find(k=>k.id===p);if(!h)break;let b=this.fragmentTrackDefaults.find(k=>k.trackId===p);this.currentTrack=h,h.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:b?.defaultSampleDescriptionIndex??null,defaultSampleDuration:b?.defaultSampleDuration??null,defaultSampleSize:b?.defaultSampleSize??null,defaultSampleFlags:b?.defaultSampleFlags??null,startTimestamp:null},n?h.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():l&&(h.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),a&&(h.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(h.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),o&&(h.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),u&&(h.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),m&&(h.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let s=this.currentTrack;if(!s)break;d(s.currentFragmentState);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=n===0?this.isobmffReader.readU32():this.isobmffReader.readU64();s.currentFragmentState.startTimestamp=a}break;case"trun":{let s=this.currentTrack;if(!s)break;if(d(this.currentFragment),d(s.currentFragmentState),this.currentFragment.trackData.has(s.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let n=this.isobmffReader.readU8(),a=this.isobmffReader.readU24(),c=!!(a&1),o=!!(a&4),u=!!(a&256),m=!!(a&512),l=!!(a&1024),p=!!(a&2048),h=this.isobmffReader.readU32(),b=s.currentFragmentState.baseDataOffset;c&&(b+=this.isobmffReader.readI32());let k=null;o&&(k=this.isobmffReader.readU32());let g=b;if(h===0){this.currentFragment.implicitBaseDataOffset=g;break}let w=0,v={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(s.id,v);for(let E=0;E({presentationTimestamp:E.presentationTimestamp,sampleIndex:F})).sort((E,F)=>E.presentationTimestamp-F.presentationTimestamp);let _=v.samples[v.presentationTimestamps[0].sampleIndex],H=v.samples[A(v.presentationTimestamps).sampleIndex];v.startTimestamp=_.presentationTimestamp,v.endTimestamp=H.presentationTimestamp+H.duration,this.currentFragment.implicitBaseDataOffset=g}break}this.isobmffReader.pos=r}},We=class{constructor(e){this.internalTrack=e}chunkToSampleIndex=new WeakMap;sampleIndexToChunk=new Map;chunkToFragmentLocation=new WeakMap;fragmentLocationToChunk=new Map;getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let t=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return t?t/1e6:0}async getFirstChunk(e){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let t=this.internalTrack.fragments[0];return{fragmentIndex:t?0:-1,sampleIndex:t?0:-1,correctSampleFound:!!t}},0,1/0,e):this.fetchChunkForSampleIndex(0,e)}async getChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,t);{let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=ur(s,r);return this.fetchChunkForSampleIndex(n,t)}}async getNextChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(e);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],c=z(this.internalTrack.fragments,s.fragment.moofOffset,o=>o.moofOffset);return d(c!==-1),this.performFragmentedLookup(()=>{if(s.sampleIndex+1l.moofOffset);return d(m!==-1),{fragmentIndex:m,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:c,sampleIndex:-1,correctSampleFound:!1}}},a.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,t)}async getKeyChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,t);let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=ur(s,r),a=n===-1?-1:Ci(s,n);return this.fetchChunkForSampleIndex(a,t)}async getNextKeyChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(e);if(a===void 0)throw new Error("Chunk was not created from this track.");let c=a.fragment.trackData.get(this.internalTrack.id),o=c.samples[a.sampleIndex],u=z(this.internalTrack.fragments,a.fragment.moofOffset,m=>m.moofOffset);return d(u!==-1),this.performFragmentedLookup(()=>{let m=c.samples.findIndex((l,p)=>l.isKeyFrame&&p>a.sampleIndex);if(m!==-1)return{fragmentIndex:u,sampleIndex:m,correctSampleFound:!0};{let l=a.fragment;for(;l.nextFragment;){l=l.nextFragment;let p=l.trackData.get(this.internalTrack.id);if(p){let h=z(this.internalTrack.fragments,l.moofOffset,k=>k.moofOffset);d(h!==-1);let b=p.samples.findIndex(k=>k.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:h,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},o.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Si(s,r);return this.fetchChunkForSampleIndex(n,t)}async fetchChunkForSampleIndex(e,t){if(e===-1)return null;let r=this.sampleIndexToChunk.get(e)?.deref();if(r)return r;let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=xi(s,e);if(!n)return null;let a;t.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 c=1e6*n.presentationTimestamp/this.internalTrack.timescale,o=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(a,c,o,n.isKeyFrame);return this.chunkToSampleIndex.set(u,e),this.sampleIndexToChunk.set(e,new WeakRef(u)),u}async fetchChunkInFragment(e,t,r){if(t===-1)return null;let s=`${e.moofOffset}:${t}`,n=this.fragmentLocationToChunk.get(s)?.deref();if(n)return n;let c=e.trackData.get(this.internalTrack.id).samples[t];d(c);let o;r.metadataOnly?o=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(e.dataStart,e.dataEnd),o=this.internalTrack.demuxer.chunkReader.readRange(c.byteOffset,c.byteOffset+c.byteSize));let u=1e6*c.presentationTimestamp/this.internalTrack.timescale,m=1e6*c.duration/this.internalTrack.timescale,l=this.createChunk(o,u,m,c.isKeyFrame);return this.chunkToFragmentLocation.set(l,{fragment:e,sampleIndex:t}),this.fragmentLocationToChunk.set(s,new WeakRef(l)),l}findSampleInFragmentsForTimestamp(e){let t=I(this.internalTrack.fragments,e,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=I(a.presentationTimestamps,e,o=>o.presentationTimestamp);d(c!==-1),r=a.presentationTimestamps[c].sampleIndex,s=en.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=a.presentationTimestamps.findLastIndex(u=>a.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=e);if(c===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=a.presentationTimestamps[c].sampleIndex,s=ew.timestamp);g!==-1&&(k=this.internalTrack.fragmentLookupTable[g])}if(c===-1)m.pos=k?.moofOffset??0;else{let g=this.internalTrack.fragments[c];!k||g.moofOffset>=g.moofOffset?(m.pos=g.moofOffset+g.moofSize,p=g):m.pos=k.moofOffset}for(;m.posr)break;if(p.nextFragment){m.pos=p.nextFragment.moofOffset+p.nextFragment.moofSize,p=p.nextFragment;continue}}await m.reader.loadRange(m.pos,m.pos+16);let g=m.pos,w=m.readBoxHeader();if(w.name==="moof"){let v=z(n.fragments,g,_=>_.moofOffset);if(v===-1){m.pos=g;let _=await n.readFragment();p&&(p.nextFragment=_),p=_;let{fragmentIndex:H,sampleIndex:E,correctSampleFound:F}=e();if(F){let J=this.internalTrack.fragments[H];return this.fetchChunkInFragment(J,E,s)}H!==-1&&(h=H,b=E)}else{let _=n.fragments[v];p&&(p.nextFragment=_),p=_}}m.pos=g+w.totalSize}if(h!==-1){let g=this.internalTrack.fragments[h];return this.fetchChunkInFragment(g,b,s)}return null}finally{a()}}},wt=class extends We{internalTrack;constructor(e){super(e),this.internalTrack=e}async getCodec(){return this.internalTrack.info.codec}async getWidth(){return this.internalTrack.info.width}async getHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:er(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(e,t,r,s){return new EncodedVideoChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},yt=class extends We{internalTrack;constructor(e){super(e),this.internalTrack=e}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:rr(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(e,t,r,s){return new EncodedAudioChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},ur=(i,e)=>{let t=I(i.presentationTimestamps,e,r=>r.presentationTimestamp);return t===-1?-1:i.presentationTimestamps[t].sampleIndex},xi=(i,e)=>{let t=I(i.sampleTimingEntries,e,k=>k.startIndex),r=i.sampleTimingEntries[t];if(!r||r.startIndex+r.count<=e)return null;let n=r.startDecodeTimestamp+(e-r.startIndex)*r.delta,a=I(i.sampleCompositionTimeOffsets,e,k=>k.startIndex),c=i.sampleCompositionTimeOffsets[a];c&&(n+=c.offset);let o=i.sampleSizes[Math.min(e,i.sampleSizes.length-1)],u=I(i.sampleToChunk,e,k=>k.startSampleIndex),m=i.sampleToChunk[u];d(m);let l=m.startChunkIndex+Math.floor((e-m.startSampleIndex)/m.samplesPerChunk),p=i.chunkOffsets[l],h=0,b=p;if(i.sampleSizes.length===1)b+=o*(e-m.startSampleIndex),h+=o*m.samplesPerChunk;else{let k=m.startSampleIndex+(l-m.startChunkIndex)*m.samplesPerChunk;for(let g=k;gk)!==-1:!0}},Ci=(i,e)=>{if(!i.keySampleIndices)return e;let t=I(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t]??-1},Si=(i,e)=>{if(!i.keySampleIndices)return e+1;let t=I(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t+1]??-1},mr=(i,e)=>{i.startTimestamp+=e,i.endTimestamp+=e;for(let t of i.samples)t.presentationTimestamp+=e;for(let t of i.presentationTimestamps)t.presentationTimestamp+=e};var He=class extends ue{};var Le=class{},vt=class extends Le{async _canReadInput(e){if(await e._mainReader.source._getSize()<8)return!1;let r=new Z(e._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(e){return new Ne(e)}},It=class extends Le{async _canReadInput(){return!1}_createDemuxer(e){return new He(e)}},Ke=new vt,wi=Ke,yi=Ke,At=new It,dr=At,vi=At,Ii=[Ke,dr];var Rt=class{_source;_formats;_mainReader;_demuxerPromise=null;_format=null;constructor(e){this._formats=e.formats,this._source=e.source,this._mainReader=new me(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let e of this._formats)if(await e._canReadInput(this))return this._format=e,e._createDemuxer(this);throw new Error("Input has an unrecognizable format.")})()}async getFormat(){return await this._getDemuxer(),d(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(t=>t.isVideoTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(t=>t.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(t=>t.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(t=>t.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var $e=class{async*chunks(e,t=1/0){let r=[],{promise:s,resolve:n}=q(),{promise:a,resolve:c}=q(),o=!1,u=[],m=()=>Math.max(2,u.length);(async()=>{let l=e??await this.getFirstChunk();for(;l&&!o&&!(l.timestamp/1e6>=t);){if(r.length>m()){({promise:a,resolve:c}=q()),await a;continue}r.push(l),n(),{promise:s,resolve:n}=q(),l=await this.getNextChunk(l)}o=!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();c()}else if(!o)await s;else break}finally{o=!0,c()}}},Qe=class{async getKeyMediaFrame(e){let t=null,r=await this.createDecoder(a=>t=a),n=await this.createChunkDrain().getKeyChunk(e);return n?(r.decode(n),await r.flush(),r.close(),t):null}async getMediaFrame(e){let t=null,r=await this.createDecoder(o=>{o.timestamp/1e6<=e?(t?.close(),t=o):o.close()}),s=this.createChunkDrain(),n=await s.getKeyChunk(e);if(!n)return null;let a=await s.getChunk(e);d(a),r.decode(n);let c=n;for(;c!==a;){let o=await s.getNextChunk(c);d(o),c=o,r.decode(o),r.decodeQueueSize>=10&&await new Promise(u=>r.addEventListener("dequeue",u,{once:!0}))}return await r.flush(),r.close(),t}async*mediaFrames(e=0,t=1/0){let r=[],s=!1,n=null,{promise:a,resolve:c}=q(),o=!1,u=await this.createDecoder(h=>{let b=h.timestamp/1e6;if(b>=t&&(o=!0),o){h.close();return}n&&(b>e?(r.push(n),s=!0):n.close()),b>=e&&(r.push(h),s=!0),n=s?null:h,r.length>0&&(c(),{promise:a,resolve:c}=q())}),m=this.createChunkDrain(),l=await m.getKeyChunk(e)??await m.getFirstChunk();if(!l)return;let p=!1;(async()=>{let h=l,b=1/0;if(t<1/0){let g=await m.getChunk(t),w=g?g.type==="key"&&g.timestamp/1e6===t?g:await m.getNextKeyChunk(g):null;w&&(b=w.timestamp/1e6)}let k=m.chunks(l,b);for(await k.next();h&&!o;){u.decode(h),u.decodeQueueSize>=10&&await new Promise(w=>u.addEventListener("dequeue",w,{once:!0}));let g=await k.next();if(g.done)break;h=g.value}await k.return(),await u.flush(),u.close(),!s&&n&&r.push(n),p=!0,c()})();try{for(;;)if(r.length>0)yield r.shift();else if(!p)await a;else break}finally{o=!0}}},je=class extends $e{constructor(t){super();this.videoTrack=t}getFirstChunk(t={}){return this.videoTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.videoTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.videoTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.videoTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.videoTrack._backing.getNextKeyChunk(t,r)}},Ot=class extends Qe{constructor(t){super();this.videoTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.videoTrack.getDecoderConfig());let r=new VideoDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new je(this.videoTrack)}getKeyFrame(t){return this.getKeyMediaFrame(t)}getFrame(t){return this.getMediaFrame(t)}frames(t=0,r=1/0){return this.mediaFrames(t,r)}},qe=class extends $e{constructor(t){super();this.audioTrack=t}getFirstChunk(t={}){return this.audioTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.audioTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.audioTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.audioTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.audioTrack._backing.getNextKeyChunk(t,r)}},Xe=class extends Qe{constructor(t){super();this.audioTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.audioTrack.getDecoderConfig());let r=new AudioDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new qe(this.audioTrack)}getKeyData(t){return this.getKeyMediaFrame(t)}getData(t){return this.getMediaFrame(t)}data(t=0,r=1/0){return this.mediaFrames(t,r)}},_t=class{constructor(e){this.audioTrack=e;this.audioDataDrain=new Xe(e)}audioDataDrain;audioDataToWrappedArrayBuffer(e){if(!e)return null;let t=new AudioBuffer({numberOfChannels:e.numberOfChannels,length:e.numberOfFrames,sampleRate:e.sampleRate});for(let r=0;rt.track===e))return;e:for(;;){let e=null,t=1/0;for(let s of this.trackDatas){if(s.chunkQueue.length===0&&!s.track.source._closed)break e;s.chunkQueue.length>0&&s.chunkQueue[0].timestamp=2&&r++;let o={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Et(t.data,r+0,r+3,o)}createInternalChunk(e,t,r,s,n=null){return{data:e,type:s,timestamp:t,duration:r,additions:n}}writeBlock(e,t){this.segment||(this.createTracks(),this.createSegment());let r=Math.floor(1e3*t.timestamp),s=this.trackDatas.every(l=>{if(l.track.source._closed)return!0;if(e===l)return t.type==="key";let d=l.chunkQueue[0];return d&&d.type==="key"});(!this.currentCluster||s&&r-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(r);let n=r-this.currentClusterMsTimestamp;if(n<0)return;if(n>=ut)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${ut} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${ut} milliseconds.`);let c=new Uint8Array(4),o=new DataView(c.buffer);o.setUint8(0,128|e.track.id),o.setInt16(1,n,!1);let u=Math.floor(1e3*t.duration);if(u===0&&!t.additions){o.setUint8(3,+(t.type==="key")<<7);let l={id:163,data:[c,t.data]};this.writeEBML(l)}else{let l={id:160,data:[{id:161,data:[c,t.data]},t.type==="delta"?{id:251,data:new ke(e.lastWrittenMsTimestamp-r)}:null,t.additions?{id:30113,data:[{id:166,data:[{id:165,data:t.additions},{id:238,data:1}]}]}:null,u>0?{id:155,data:u}:null]};this.writeEBML(l)}this.duration=Math.max(this.duration,r+u),e.lastWrittenMsTimestamp=r,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:cr,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),t=this.writer.getPos();this.writer.seek(this.offsets.get(this.currentCluster)+4),this.writeEBMLVarInt(e,cr),this.writer.seek(t);let r=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(s=>({id:183,data:[{id:247,data:s.track.id},{id:241,data:r}]}))]})}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 t of this.trackDatas)for(;t.chunkQueue.length>0;)this.writeBlock(t,t.chunkQueue.shift());if(!this.format._options.streamable&&this.currentCluster&&this.finalizeCurrentCluster(),m(this.cues),this.writeEBML(this.cues),!this.format._options.streamable){let t=this.writer.getPos(),r=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(r,or),this.segmentDuration.data=new ne(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(t)}e()}};var Y=class{},lt=class extends Y{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.fastStart!==void 0&&![!1,"in-memory","fragmented"].includes(e.fastStart))throw new TypeError('options.fastStart, when provided, must be false, "in-memory", or "fragmented".');super(),this._options=e}_createMuxer(e){return new De(e,this)}},Ue=class extends Y{_options;constructor(e={}){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(e.streamable!==void 0&&typeof e.streamable!="boolean")throw new TypeError("options.streamable, when provided, must be a boolean.");super(),this._options=e}_createMuxer(e){return new ze(e,this)}},ae=class extends Ue{};var oe=class{_connectedTrack=null;_closed=!1;_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)}},N=class extends oe{_connectedTrack=null;_codec;constructor(e){if(super(),!ie.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${ie.join(", ")}.`);this._codec=e}},mt=class extends N{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedVideoChunk))throw new TypeError("chunk must be an EncodedVideoChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedVideoChunk(this._connectedTrack,e,t)}},bi=5,ki=i=>{if(!i||typeof i!="object")throw new TypeError("Codec config must be an object.");if(!ie.includes(i.codec))throw new TypeError(`Invalid video codec '${i.codec}'. Must be one of: ${ie.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'.")},ge=class{constructor(e,t){this.source=e;this.codecConfig=t;ki(t)}encoder=null;muxer=null;lastMultipleOfKeyFrameInterval=-1;lastWidth=null;lastHeight=null;async digest(e){if(this.source._ensureValidDigest(),this.lastWidth!==null&&this.lastHeight!==null){if(e.codedWidth!==this.lastWidth||e.codedHeight!==this.lastHeight)throw new Error(`Video frame size must remain constant. Expected ${this.lastWidth}x${this.lastHeight}, got ${e.codedWidth}x${e.codedHeight}.`)}else this.lastWidth=e.codedWidth,this.lastHeight=e.codedHeight;this.ensureEncoder(e),m(this.encoder);let t=Math.floor(e.timestamp/1e6/bi);this.encoder.encode(e,{keyFrame:t!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=t,this.encoder.encodeQueueSize>=4&&await new Promise(r=>this.encoder.addEventListener("dequeue",r,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new VideoEncoder({output:(t,r)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,t,r),error:t=>console.error("Video encode error:",t)}),this.encoder.configure({codec:Jt(this.codecConfig.codec,e.codedWidth,e.codedHeight,this.codecConfig.bitrate),width:e.codedWidth,height:e.codedHeight,bitrate:this.codecConfig.bitrate,framerate:this.source._connectedTrack?.metadata.frameRate,latencyMode:this.codecConfig.latencyMode,...ir(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())}},dt=class extends N{_encoder;constructor(e){super(e.codec),this._encoder=new ge(this,e)}digest(e){if(!(e instanceof VideoFrame))throw new TypeError("videoFrame must be a VideoFrame.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},ft=class extends N{_encoder;_canvas;constructor(e,t){if(!(e instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(t.codec),this._encoder=new ge(this,t),this._canvas=e}digest(e,t=0){if(!Number.isFinite(e)||e<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(t)||t<0)throw new TypeError("duration must be a non-negative number.");let r=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*e),duration:Math.round(1e6*t),alpha:"discard"}),s=this._encoder.digest(r);return r.close(),s}_flush(){return this._encoder.flush()}},pt=class extends N{_encoder;_abortController=null;_track;_offsetTimestamps=!0;constructor(e,t){if(!(e instanceof MediaStreamTrack)||e.kind!=="video")throw new TypeError("track must be a video MediaStreamTrack.");t={...t,latencyMode:"realtime"},super(t.codec),this._encoder=new ge(this,t),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),t=new WritableStream({write:r=>{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},W=class extends oe{_connectedTrack=null;_codec;constructor(e){if(super(),!se.includes(e))throw new TypeError(`Invalid audio codec '${e}'. Must be one of: ${se.join(", ")}.`);this._codec=e}},ht=class extends W{constructor(e){super(e)}digest(e,t){if(!(e instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedAudioChunk.");return this._ensureValidDigest(),this._connectedTrack.output._muxer.addEncodedAudioChunk(this._connectedTrack,e,t)}},gi=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.")},Te=class{constructor(e,t){this.source=e;this.codecConfig=t;gi(t)}encoder=null;muxer=null;lastNumberOfChannels=null;lastSampleRate=null;async digest(e){if(this.source._ensureValidDigest(),this.lastNumberOfChannels!==null&&this.lastSampleRate!==null){if(e.numberOfChannels!==this.lastNumberOfChannels||e.sampleRate!==this.lastSampleRate)throw new Error(`Audio parameters must remain constant. Expected ${this.lastNumberOfChannels} channels at ${this.lastSampleRate} Hz, got ${e.numberOfChannels} channels at ${e.sampleRate} Hz.`)}else this.lastNumberOfChannels=e.numberOfChannels,this.lastSampleRate=e.sampleRate;this.ensureEncoder(e),m(this.encoder),this.encoder.encode(e),this.encoder.encodeQueueSize>=4&&await new Promise(t=>this.encoder.addEventListener("dequeue",t,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new AudioEncoder({output:(t,r)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,t,r),error:t=>console.error("Audio encode error:",t)}),this.encoder.configure({codec:tr(this.codecConfig.codec,e.numberOfChannels,e.sampleRate),numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,bitrate:this.codecConfig.bitrate,...sr(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())}},bt=class extends W{_encoder;constructor(e){super(e.codec),this._encoder=new Te(this,e)}digest(e){if(!(e instanceof AudioData))throw new TypeError("audioData must be an AudioData.");return this._encoder.digest(e)}_flush(){return this._encoder.flush()}},kt=class extends W{_encoder;_accumulatedFrameCount=0;constructor(e){super(e.codec),this._encoder=new Te(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let t=e.numberOfChannels,r=e.sampleRate,s=e.length,n=new Float32Array(t*s);for(let o=0;o{this._encoder.digest(r),r.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Pipe error:",r)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},ce=class extends oe{_connectedTrack=null;_codec;constructor(e){if(super(),!Fe.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${Fe.join(", ")}.`);this._codec=e}},Tt=class extends ce{_parser;constructor(e){super(e),this._parser=new ve({codec:e,output:(t,r)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,t,r),error:t=>console.error("Subtitle parse error:",t)})}digest(e){if(typeof e!="string")throw new TypeError("text must be a string.");return this._ensureValidDigest(),this._parser.parse(e),this._connectedTrack.output._muxer.mutex.currentPromise}};var xt=class{_muxer;_writer;_tracks=[];_started=!1;_finalizing=!1;_mutex=new H;constructor(e){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(!(e.format instanceof Y))throw new TypeError("options.format must be an OutputFormat.");if(!(e.target instanceof G))throw new TypeError("options.target must be a Target.");if(e.target._output)throw new Error("Target is already used for another output.");e.target._output=this,this._writer=e.target._createWriter(),this._muxer=e.format._createMuxer(this)}addVideoTrack(e,t={}){if(!(e instanceof N))throw new TypeError("source must be a VideoSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");if(typeof t.rotation=="number"&&![0,90,180,270].includes(t.rotation))throw new TypeError(`Invalid video rotation: ${t.rotation}. Has to be 0, 90, 180 or 270.`);if(Array.isArray(t.rotation)&&(t.rotation.length!==9||t.rotation.some(r=>!Number.isFinite(r))))throw new TypeError(`Invalid video transformation matrix: ${t.rotation.join()}`);if(t.frameRate!==void 0&&(!Number.isInteger(t.frameRate)||t.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${t.frameRate}. Must be a positive integer.`);this._addTrack("video",e,t)}addAudioTrack(e,t={}){if(!(e instanceof W))throw new TypeError("source must be an AudioSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("audio",e,t)}addSubtitleTrack(e,t={}){if(!(e instanceof ce))throw new TypeError("source must be a SubtitleSource.");if(!t||typeof t!="object")throw new TypeError("metadata must be an object.");this._addTrack("subtitle",e,t)}_addTrack(e,t,r){if(this._started)throw new Error("Cannot add track after output has started.");if(t._connectedTrack)throw new Error("Source is already used for a track.");let s={id:this._tracks.length+1,output:this,type:e,source:t,metadata:r};this._muxer.beforeTrackAdd(s),this._tracks.push(s),t._connectedTrack=s}async start(){if(this._started)throw new Error("Output already started.");this._started=!0,this._writer.start();let e=await this._mutex.acquire();await this._muxer.start();for(let t of this._tracks)t.source._start();e()}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 e=await this._mutex.acquire(),t=this._tracks.map(r=>r.source._flush());await Promise.all(t),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),e()}};var xe=class{_sizePromise=null;_getSize(){return this._sizePromise??=this._retrieveSize()}},Ct=class extends xe{constructor(t){super();this.buffer=t}async _read(t,r){return new Uint8Array(this.buffer,t,r-t)}async _retrieveSize(){return this.buffer.byteLength}},St=class extends xe{constructor(t){super();this.blob=t}async _read(t,r){let n=await this.blob.slice(t,r).arrayBuffer();return new Uint8Array(n)}async _retrieveSize(){return this.blob.size}};var ue=class{input;constructor(e){this.input=e}};var Be=class{_backing;constructor(e){this._backing=e}isVideoTrack(){return this instanceof Ce}isAudioTrack(){return this instanceof Se}computeDuration(){return this._backing.computeDuration()}},Ce=class extends Be{_backing;constructor(e){super(e),this._backing=e}getCodec(){return this._backing.getCodec()}getWidth(){return this._backing.getWidth()}getHeight(){return this._backing.getHeight()}getRotation(){return this._backing.getRotation()}getDecoderConfig(){return this._backing.getDecoderConfig()}async getCodecMimeType(){return(await this.getDecoderConfig()).codec}},Se=class extends Be{_backing;constructor(e){super(e),this._backing=e}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 le=class{constructor(e,t=1/0){this.source=e;this.maxStorableBytes=t}loadedSegments=[];loadingSegments=[];sourceSizePromise=null;nextAge=0;totalStoredBytes=0;async loadRange(e,t){t=Math.min(t,await this.source._getSize());let r=this.loadingSegments.find(o=>o.start<=e&&o.end>=t);if(r){await r.promise;return}if(this.loadedSegments.some(o=>o.start<=e&&o.end>=t))return;let n=this.source._read(e,t),a={start:e,end:t,promise:n};this.loadingSegments.push(a);let c=await n;zt(this.loadingSegments,a),this.insertIntoLoadedSegments(e,c)}insertIntoLoadedSegments(e,t){let r={start:e,end:e+t.byteLength,bytes:t,view:new DataView(t.buffer),age:this.nextAge++},s=A(this.loadedSegments,e,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 c=0;cn.start),s=null;if(r!==-1)for(let n=r;ne)break;if(t<=a.end){s=a;break}}if(!s)throw new Error(`No segment loaded for range [${e}, ${t}).`);return s.age=this.nextAge++,{view:s.view,offset:s.bytes.byteOffset+e-s.start}}forgetRange(e,t){if(t<=e)return;let r=A(this.loadedSegments,e,n=>n.start);if(r===-1)return;let s=this.loadedSegments[r];s.start!==e||s.end!==t||(this.loadedSegments.splice(r,1),this.totalStoredBytes-=s.bytes.byteLength)}};var Z=class{constructor(e){this.reader=e}pos=0;readRange(e,t){let{view:r,offset:s}=this.reader.getViewAndOffset(e,t);return new Uint8Array(r.buffer,s,t-e)}readU8(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+1);return this.pos++,e.getUint8(t)}readU16(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+2);return this.pos+=2,e.getUint16(t,!1)}readU24(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+3);this.pos+=3;let r=e.getUint16(t,!1),s=e.getUint8(t+2);return r*256+s}readS32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getUint32(t,!1)}readI32(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+4);return this.pos+=4,e.getInt32(t,!1)}readU64(){let e=this.readU32(),t=this.readU32();return e*4294967296+t}readF64(){let{view:e,offset:t}=this.reader.getViewAndOffset(this.pos,this.pos+8);return this.pos+=8,e.getFloat64(t,!1)}readFixed_16_16(){return this.readS32()/65536}readFixed_2_30(){return this.readS32()/1073741824}readAscii(e){let{view:t,offset:r}=this.reader.getViewAndOffset(this.pos,this.pos+e);this.pos+=e;let s="";for(let n=0;nr.computeDuration()));return Math.max(0,...t)}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 t=await Promise.all(this.tracks.map(s=>s.inputTrack.getCodecMimeType())),r=[...new Set(t)];e+=`; codecs="${r.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos=0&&rr.presentationTimestamp-s.presentationTimestamp),e.sampleTable}async readFragment(){let e=this.isobmffReader.pos;await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let t=this.isobmffReader.readBoxHeader();m(t.name==="moof"),await this.isobmffReader.reader.loadRange(e,e+t.totalSize),this.isobmffReader.pos=e,this.traverseBox();let r=U(this.fragments,e,n=>n.moofOffset);m(r!==-1);let s=this.fragments[r];m(s.moofOffset===e),this.isobmffReader.reader.forgetRange(e,e+t.totalSize);for(let[n,a]of s.trackData){if(a.startTimestampIsFinal)continue;let c=this.tracks.find(d=>d.id===n);this.isobmffReader.pos=0;let o=null,u=null,l=A(c.fragments,e-1,d=>d.moofOffset);for(l!==-1&&(o=c.fragments[l],u=o,this.isobmffReader.pos=o.moofOffset+o.moofSize);this.isobmffReader.posb.moofOffset);if(h===-1){this.isobmffReader.pos=d;let b=await this.readFragment();o&&(o.nextFragment=b),o=b}else{let b=this.fragments[h];o&&(o.nextFragment=b),o=b}}this.isobmffReader.pos=d+p.totalSize}o&&o.trackData.has(n)&&(u=o)}if(u){let d=u.trackData.get(n);m(d.startTimestampIsFinal),lr(a,d.endTimestamp)}a.startTimestampIsFinal=!0}return s}readContiguousBoxes(e){let t=this.isobmffReader.pos;for(;this.isobmffReader.pos-tl.every((d,p)=>d===o[p]));u===-1?s.rotation=0:s.rotation=90*u}break;case"mdhd":{let s=this.currentTrack;m(s);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3,n===0?(this.isobmffReader.pos+=8,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU32()):n===1&&(this.isobmffReader.pos+=16,s.timescale=this.isobmffReader.readU32(),s.durationInTimescale=this.isobmffReader.readU64())}break;case"hdlr":{let s=this.currentTrack;m(s),this.isobmffReader.pos+=8;let n=this.isobmffReader.readAscii(4);n==="vide"?s.info={type:"video",width:-1,height:-1,codec:null,codecDescription:null,colorSpace:null}:n==="soun"&&(s.info={type:"audio",numberOfChannels:-1,sampleRate:-1,codec:null,codecDescription:null})}break;case"stbl":{let s=this.currentTrack;m(s),s.sampleTableOffset=e,this.readContiguousBoxes(t.contentSize)}break;case"stsd":{let s=this.currentTrack;if(m(s),s.info===null||s.sampleTable)break;let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=this.isobmffReader.readU32();for(let c=0;c0){if(u===1)this.isobmffReader.pos+=4*4;else if(u===2){this.isobmffReader.pos+=4,d=this.isobmffReader.readF64(),l=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let p=this.isobmffReader.readU32(),h=this.isobmffReader.readU32(),b=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}s.info.numberOfChannels=l,s.info.sampleRate=d,this.readContiguousBoxes(e+o.totalSize-this.isobmffReader.pos)}}}break;case"avcC":{let s=this.currentTrack;m(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"hvcC":{let s=this.currentTrack;m(s&&s.info),s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+t.contentSize)}break;case"colr":{let s=this.currentTrack;if(m(s&&s.info?.type==="video"),this.isobmffReader.readAscii(4)!=="nclx")break;let a=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),o=this.isobmffReader.readU16(),u=!!(this.isobmffReader.readU8()&128);s.info.colorSpace={primaries:Ft[a],transfer:Mt[c],matrix:Vt[o],fullRange:u}}break;case"wave":t.totalSize>8&&this.readContiguousBoxes(t.contentSize);break;case"esds":{let s=this.currentTrack;m(s&&s.info),this.isobmffReader.pos+=4;let n=this.isobmffReader.readU8();m(n===3),this.isobmffReader.readIsomVariableInteger(),this.isobmffReader.pos+=2;let a=this.isobmffReader.readU8(),c=(a&128)!==0,o=(a&64)!==0,u=(a&32)!==0;if(c&&(this.isobmffReader.pos+=2),o){let b=this.isobmffReader.readU8();this.isobmffReader.pos+=b}u&&(this.isobmffReader.pos+=2);let l=this.isobmffReader.readU8();m(l===4),this.isobmffReader.readIsomVariableInteger();let d=this.isobmffReader.readU8();m(d===64),this.isobmffReader.pos+=12;let p=this.isobmffReader.readU8();m(p===5);let h=this.isobmffReader.readIsomVariableInteger();s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+h)}break;case"stts":{let s=this.currentTrack;if(m(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),a=0,c=0;for(let o=0;ow.id===n);if(!a)break;a.fragmentLookupTable=[];let c=this.isobmffReader.readU32(),o=(c&48)>>4,u=(c&12)>>2,l=c&3,d=this.isobmffReader,p=[d.readU8.bind(d),d.readU16.bind(d),d.readU24.bind(d),d.readU32.bind(d)],h=p[o],b=p[u],k=p[l],g=this.isobmffReader.readU32();for(let w=0;wn.moofOffset);this.fragments.splice(s+1,0,this.currentFragment);for(let[,n]of this.currentFragment.trackData){let a=n.samples[0],c=R(n.samples);this.currentFragment.dataStart=Math.min(this.currentFragment.dataStart,a.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(t.contentSize),this.currentTrack){let s=this.currentFragment.trackData.get(this.currentTrack.id);if(s){let n=A(this.currentTrack.fragments,this.currentFragment.moofOffset,c=>c.moofOffset);this.currentTrack.fragments.splice(n+1,0,this.currentFragment);let{currentFragmentState:a}=this.currentTrack;m(a),a.startTimestamp!==null&&(lr(s,a.startTimestamp),s.startTimestampIsFinal=!0)}this.currentTrack.currentFragmentState=null,this.currentTrack=null}break;case"tfhd":{m(this.currentFragment),this.isobmffReader.pos+=1;let s=this.isobmffReader.readU24(),n=!!(s&1),a=!!(s&2),c=!!(s&8),o=!!(s&16),u=!!(s&32),l=!!(s&65536),d=!!(s&131072),p=this.isobmffReader.readU32(),h=this.tracks.find(k=>k.id===p);if(!h)break;let b=this.fragmentTrackDefaults.find(k=>k.trackId===p);this.currentTrack=h,h.currentFragmentState={baseDataOffset:this.currentFragment.implicitBaseDataOffset,sampleDescriptionIndex:b?.defaultSampleDescriptionIndex??null,defaultSampleDuration:b?.defaultSampleDuration??null,defaultSampleSize:b?.defaultSampleSize??null,defaultSampleFlags:b?.defaultSampleFlags??null,startTimestamp:null},n?h.currentFragmentState.baseDataOffset=this.isobmffReader.readU64():d&&(h.currentFragmentState.baseDataOffset=this.currentFragment.moofOffset),a&&(h.currentFragmentState.sampleDescriptionIndex=this.isobmffReader.readU32()),c&&(h.currentFragmentState.defaultSampleDuration=this.isobmffReader.readU32()),o&&(h.currentFragmentState.defaultSampleSize=this.isobmffReader.readU32()),u&&(h.currentFragmentState.defaultSampleFlags=this.isobmffReader.readU32()),l&&(h.currentFragmentState.defaultSampleDuration=0)}break;case"tfdt":{let s=this.currentTrack;if(!s)break;m(s.currentFragmentState);let n=this.isobmffReader.readU8();this.isobmffReader.pos+=3;let a=n===0?this.isobmffReader.readU32():this.isobmffReader.readU64();s.currentFragmentState.startTimestamp=a}break;case"trun":{let s=this.currentTrack;if(!s)break;if(m(this.currentFragment),m(s.currentFragmentState),this.currentFragment.trackData.has(s.id))throw new Error("Can't have two trun boxes for the same track in one fragment.");let n=this.isobmffReader.readU8(),a=this.isobmffReader.readU24(),c=!!(a&1),o=!!(a&4),u=!!(a&256),l=!!(a&512),d=!!(a&1024),p=!!(a&2048),h=this.isobmffReader.readU32(),b=s.currentFragmentState.baseDataOffset;c&&(b+=this.isobmffReader.readI32());let k=null;o&&(k=this.isobmffReader.readU32());let g=b;if(h===0){this.currentFragment.implicitBaseDataOffset=g;break}let w=0,y={startTimestamp:0,endTimestamp:0,samples:[],presentationTimestamps:[],startTimestampIsFinal:!1};this.currentFragment.trackData.set(s.id,y);for(let E=0;E({presentationTimestamp:E.presentationTimestamp,sampleIndex:F})).sort((E,F)=>E.presentationTimestamp-F.presentationTimestamp);let v=y.samples[y.presentationTimestamps[0].sampleIndex],P=y.samples[R(y.presentationTimestamps).sampleIndex];y.startTimestamp=v.presentationTimestamp,y.endTimestamp=P.presentationTimestamp+P.duration,this.currentFragment.implicitBaseDataOffset=g}break}this.isobmffReader.pos=r}},We=class{constructor(e){this.internalTrack=e}chunkToSampleIndex=new WeakMap;sampleIndexToChunk=new Map;chunkToFragmentLocation=new WeakMap;fragmentLocationToChunk=new Map;getCodec(){throw new Error("Not implemented on base class.")}async computeDuration(){let t=(await this.getChunk(1/0,{metadataOnly:!0}))?.timestamp;return t?t/1e6:0}async getFirstChunk(e){return this.internalTrack.demuxer.isFragmented?this.performFragmentedLookup(()=>{let t=this.internalTrack.fragments[0];return{fragmentIndex:t?0:-1,sampleIndex:t?0:-1,correctSampleFound:!!t}},0,1/0,e):this.fetchChunkForSampleIndex(0,e)}async getChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findSampleInFragmentsForTimestamp(r),r,r,t);{let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=ur(s,r);return this.fetchChunkForSampleIndex(n,t)}}async getNextChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let s=this.chunkToFragmentLocation.get(e);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],c=U(this.internalTrack.fragments,s.fragment.moofOffset,o=>o.moofOffset);return m(c!==-1),this.performFragmentedLookup(()=>{if(s.sampleIndex+1d.moofOffset);return m(l!==-1),{fragmentIndex:l,sampleIndex:0,correctSampleFound:!0}}return{fragmentIndex:c,sampleIndex:-1,correctSampleFound:!1}}},a.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(r+1,t)}async getKeyChunk(e,t){let r=e*this.internalTrack.timescale;if(this.internalTrack.demuxer.isFragmented)return this.performFragmentedLookup(()=>this.findKeySampleInFragmentsForTimestamp(r),r,r,t);let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=ur(s,r),a=n===-1?-1:Ci(s,n);return this.fetchChunkForSampleIndex(a,t)}async getNextKeyChunk(e,t){if(this.internalTrack.demuxer.isFragmented){let a=this.chunkToFragmentLocation.get(e);if(a===void 0)throw new Error("Chunk was not created from this track.");let c=a.fragment.trackData.get(this.internalTrack.id),o=c.samples[a.sampleIndex],u=U(this.internalTrack.fragments,a.fragment.moofOffset,l=>l.moofOffset);return m(u!==-1),this.performFragmentedLookup(()=>{let l=c.samples.findIndex((d,p)=>d.isKeyFrame&&p>a.sampleIndex);if(l!==-1)return{fragmentIndex:u,sampleIndex:l,correctSampleFound:!0};{let d=a.fragment;for(;d.nextFragment;){d=d.nextFragment;let p=d.trackData.get(this.internalTrack.id);if(p){let h=U(this.internalTrack.fragments,d.moofOffset,k=>k.moofOffset);m(h!==-1);let b=p.samples.findIndex(k=>k.isKeyFrame);if(b===-1)throw new Error("Not supported: Fragment does not contain key sample.");return{fragmentIndex:h,sampleIndex:b,correctSampleFound:!0}}}return{fragmentIndex:u,sampleIndex:-1,correctSampleFound:!1}}},o.presentationTimestamp,1/0,t)}let r=this.chunkToSampleIndex.get(e);if(r===void 0)throw new Error("Chunk was not created from this track.");let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=Si(s,r);return this.fetchChunkForSampleIndex(n,t)}async fetchChunkForSampleIndex(e,t){if(e===-1)return null;let r=this.sampleIndexToChunk.get(e)?.deref();if(r)return r;let s=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),n=xi(s,e);if(!n)return null;let a;t.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 c=1e6*n.presentationTimestamp/this.internalTrack.timescale,o=1e6*n.duration/this.internalTrack.timescale,u=this.createChunk(a,c,o,n.isKeyFrame);return this.chunkToSampleIndex.set(u,e),this.sampleIndexToChunk.set(e,new WeakRef(u)),u}async fetchChunkInFragment(e,t,r){if(t===-1)return null;let s=`${e.moofOffset}:${t}`,n=this.fragmentLocationToChunk.get(s)?.deref();if(n)return n;let c=e.trackData.get(this.internalTrack.id).samples[t];m(c);let o;r.metadataOnly?o=new Uint8Array(0):(await this.internalTrack.demuxer.chunkReader.reader.loadRange(e.dataStart,e.dataEnd),o=this.internalTrack.demuxer.chunkReader.readRange(c.byteOffset,c.byteOffset+c.byteSize));let u=1e6*c.presentationTimestamp/this.internalTrack.timescale,l=1e6*c.duration/this.internalTrack.timescale,d=this.createChunk(o,u,l,c.isKeyFrame);return this.chunkToFragmentLocation.set(d,{fragment:e,sampleIndex:t}),this.fragmentLocationToChunk.set(s,new WeakRef(d)),d}findSampleInFragmentsForTimestamp(e){let t=A(this.internalTrack.fragments,e,n=>n.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=A(a.presentationTimestamps,e,o=>o.presentationTimestamp);m(c!==-1),r=a.presentationTimestamps[c].sampleIndex,s=en.trackData.get(this.internalTrack.id).startTimestamp),r=-1,s=!1;if(t!==-1){let a=this.internalTrack.fragments[t].trackData.get(this.internalTrack.id),c=a.presentationTimestamps.findLastIndex(u=>a.samples[u.sampleIndex].isKeyFrame&&u.presentationTimestamp<=e);if(c===-1)throw new Error("Not supported: Fragment does not begin with a key sample.");r=a.presentationTimestamps[c].sampleIndex,s=ew.timestamp);g!==-1&&(k=this.internalTrack.fragmentLookupTable[g])}if(c===-1)l.pos=k?.moofOffset??0;else{let g=this.internalTrack.fragments[c];!k||g.moofOffset>=g.moofOffset?(l.pos=g.moofOffset+g.moofSize,p=g):l.pos=k.moofOffset}for(;l.posr)break;if(p.nextFragment){l.pos=p.nextFragment.moofOffset+p.nextFragment.moofSize,p=p.nextFragment;continue}}await l.reader.loadRange(l.pos,l.pos+16);let g=l.pos,w=l.readBoxHeader();if(w.name==="moof"){let y=U(n.fragments,g,v=>v.moofOffset);if(y===-1){l.pos=g;let v=await n.readFragment();p&&(p.nextFragment=v),p=v;let{fragmentIndex:P,sampleIndex:E,correctSampleFound:F}=e();if(F){let J=this.internalTrack.fragments[P];return this.fetchChunkInFragment(J,E,s)}P!==-1&&(h=P,b=E)}else{let v=n.fragments[y];p&&(p.nextFragment=v),p=v}}l.pos=g+w.totalSize}if(h!==-1){let g=this.internalTrack.fragments[h];return this.fetchChunkInFragment(g,b,s)}return null}finally{a()}}},wt=class extends We{internalTrack;constructor(e){super(e),this.internalTrack=e}async getCodec(){return this.internalTrack.info.codec}async getWidth(){return this.internalTrack.info.width}async getHeight(){return this.internalTrack.info.height}async getRotation(){return this.internalTrack.rotation}async getDecoderConfig(){return{codec:er(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(e,t,r,s){return new EncodedVideoChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},yt=class extends We{internalTrack;constructor(e){super(e),this.internalTrack=e}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:rr(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(e,t,r,s){return new EncodedAudioChunk({data:e,timestamp:t,duration:r,type:s?"key":"delta"})}},ur=(i,e)=>{let t=A(i.presentationTimestamps,e,r=>r.presentationTimestamp);return t===-1?-1:i.presentationTimestamps[t].sampleIndex},xi=(i,e)=>{let t=A(i.sampleTimingEntries,e,k=>k.startIndex),r=i.sampleTimingEntries[t];if(!r||r.startIndex+r.count<=e)return null;let n=r.startDecodeTimestamp+(e-r.startIndex)*r.delta,a=A(i.sampleCompositionTimeOffsets,e,k=>k.startIndex),c=i.sampleCompositionTimeOffsets[a];c&&(n+=c.offset);let o=i.sampleSizes[Math.min(e,i.sampleSizes.length-1)],u=A(i.sampleToChunk,e,k=>k.startSampleIndex),l=i.sampleToChunk[u];m(l);let d=l.startChunkIndex+Math.floor((e-l.startSampleIndex)/l.samplesPerChunk),p=i.chunkOffsets[d],h=0,b=p;if(i.sampleSizes.length===1)b+=o*(e-l.startSampleIndex),h+=o*l.samplesPerChunk;else{let k=l.startSampleIndex+(d-l.startChunkIndex)*l.samplesPerChunk;for(let g=k;gk)!==-1:!0}},Ci=(i,e)=>{if(!i.keySampleIndices)return e;let t=A(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t]??-1},Si=(i,e)=>{if(!i.keySampleIndices)return e+1;let t=A(i.keySampleIndices,e,r=>r);return i.keySampleIndices[t+1]??-1},lr=(i,e)=>{i.startTimestamp+=e,i.endTimestamp+=e;for(let t of i.samples)t.presentationTimestamp+=e;for(let t of i.presentationTimestamps)t.presentationTimestamp+=e};var He=class extends ue{};var Le=class{},vt=class extends Le{async _canReadInput(e){if(await e._mainReader.source._getSize()<8)return!1;let r=new Z(e._mainReader);return r.pos=4,r.readAscii(4)==="ftyp"}_createDemuxer(e){return new Ne(e)}},It=class extends Le{async _canReadInput(){return!1}_createDemuxer(e){return new He(e)}},Ke=new vt,wi=Ke,yi=Ke,At=new It,mr=At,vi=At,Ii=[Ke,mr];var Rt=class{_source;_formats;_mainReader;_demuxerPromise=null;_format=null;constructor(e){this._formats=e.formats,this._source=e.source,this._mainReader=new le(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{await this._mainReader.loadRange(0,4096);for(let e of this._formats)if(await e._canReadInput(this))return this._format=e,e._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(t=>t.isVideoTrack())}async getPrimaryVideoTrack(){return(await this.getTracks()).find(t=>t.isVideoTrack())??null}async getAudioTracks(){return(await this.getTracks()).filter(t=>t.isAudioTrack())}async getPrimaryAudioTrack(){return(await this.getTracks()).find(t=>t.isAudioTrack())??null}async getMimeType(){return(await this._getDemuxer()).getMimeType()}};var Qe=class{async*chunks(e,t=1/0){let r=[],{promise:s,resolve:n}=B(),{promise:a,resolve:c}=B(),o=!1,u=[],l=()=>Math.max(2,u.length);(async()=>{let d=e??await this.getFirstChunk();for(;d&&!o&&!(d.timestamp/1e6>=t);){if(r.length>l()){({promise:a,resolve:c}=B()),await a;continue}r.push(d),n(),{promise:s,resolve:n}=B(),d=await this.getNextChunk(d)}o=!0,n()})();try{for(;;)if(r.length>0){yield r.shift();let d=performance.now();for(u.push(d);u.length>0&&d-u[0]>=1e3;)u.shift();c()}else if(!o)await s;else break}finally{o=!0,c()}}},$e=class{async getKeyMediaFrame(e){let t=null,r=await this.createDecoder(a=>t=a),n=await this.createChunkDrain().getKeyChunk(e);return n?(r.decode(n),await r.flush(),r.close(),t):null}async getMediaFrame(e){let t=null,r=await this.createDecoder(o=>{o.timestamp/1e6<=e?(t?.close(),t=o):o.close()}),s=this.createChunkDrain(),n=await s.getKeyChunk(e);if(!n)return null;let a=await s.getChunk(e);m(a),r.decode(n);let c=n;for(;c!==a;){let o=await s.getNextChunk(c);m(o),c=o,r.decode(o),r.decodeQueueSize>=10&&await new Promise(u=>r.addEventListener("dequeue",u,{once:!0}))}return await r.flush(),r.close(),t}async*mediaFrames(e=0,t=1/0){let r=[],s=!1,n=null,{promise:a,resolve:c}=B(),{promise:o,resolve:u}=B(),l=!1,d=8,p=await this.createDecoder(g=>{u();let w=g.timestamp/1e6;if(w>=t&&(l=!0),l){g.close();return}n&&(w>e?(r.push(n),s=!0):n.close()),w>=e&&(r.push(g),s=!0),n=s?null:g,r.length>0&&(c(),{promise:a,resolve:c}=B())}),h=this.createChunkDrain(),b=await h.getKeyChunk(e)??await h.getFirstChunk();if(!b)return;let k=!1;(async()=>{let g=b,w=1/0;if(t<1/0){let v=await h.getChunk(t),P=v?v.type==="key"&&v.timestamp/1e6===t?v:await h.getNextKeyChunk(v):null;P&&(w=P.timestamp/1e6)}let y=h.chunks(b,w);for(await y.next();g&&!l;){if(r.length+p.decodeQueueSize>d){({promise:o,resolve:u}=B()),await o;continue}p.decode(g);let v=await y.next();if(v.done)break;g=v.value}await y.return(),await p.flush(),p.close(),!s&&n&&r.push(n),k=!0,c()})();try{for(;;)if(r.length>0)yield r.shift(),u();else if(!k)await a;else break}finally{l=!0,u();for(let g of r)g.close()}}},je=class extends Qe{constructor(t){super();this.videoTrack=t}getFirstChunk(t={}){return this.videoTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.videoTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.videoTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.videoTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.videoTrack._backing.getNextKeyChunk(t,r)}},Ot=class extends $e{constructor(t){super();this.videoTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.videoTrack.getDecoderConfig());let r=new VideoDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new je(this.videoTrack)}getKeyFrame(t){return this.getKeyMediaFrame(t)}getFrame(t){return this.getMediaFrame(t)}frames(t=0,r=1/0){return this.mediaFrames(t,r)}},qe=class extends Qe{constructor(t){super();this.audioTrack=t}getFirstChunk(t={}){return this.audioTrack._backing.getFirstChunk(t)}getChunk(t,r={}){return this.audioTrack._backing.getChunk(t,r)}getNextChunk(t,r={}){return this.audioTrack._backing.getNextChunk(t,r)}getKeyChunk(t,r={}){return this.audioTrack._backing.getKeyChunk(t,r)}getNextKeyChunk(t,r={}){return this.audioTrack._backing.getNextKeyChunk(t,r)}},Xe=class extends $e{constructor(t){super();this.audioTrack=t}decoderConfig=null;async createDecoder(t){this.decoderConfig||(this.decoderConfig=await this.audioTrack.getDecoderConfig());let r=new AudioDecoder({output:t,error:s=>console.error(s)});return r.configure(this.decoderConfig),r}createChunkDrain(){return new qe(this.audioTrack)}getKeyData(t){return this.getKeyMediaFrame(t)}getData(t){return this.getMediaFrame(t)}data(t=0,r=1/0){return this.mediaFrames(t,r)}},_t=class{constructor(e){this.audioTrack=e;this.audioDataDrain=new Xe(e)}audioDataDrain;audioDataToWrappedArrayBuffer(e){if(!e)return null;let t=new AudioBuffer({numberOfChannels:e.numberOfChannels,length:e.numberOfFrames,sampleRate:e.sampleRate});for(let s=0;s { + onQueueDequeue(); const frameTimestamp = frame.timestamp / 1e6; if (frameTimestamp >= endTimestamp) { ended = true; @@ -6077,10 +6080,12 @@ var BaseMediaFrameDrain = class { const chunks = chunkDrain.chunks(keyChunk, chunksEndTimestamp); await chunks.next(); while (currentChunk && !ended) { - decoder.decode(currentChunk); - if (decoder.decodeQueueSize >= 10) { - await new Promise((resolve) => decoder.addEventListener("dequeue", resolve, { once: true })); + if (frameQueue.length + decoder.decodeQueueSize > MAX_QUEUE_SIZE) { + ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers()); + await queueDequeue; + continue; } + decoder.decode(currentChunk); const chunkResult = await chunks.next(); if (chunkResult.done) { break; @@ -6100,6 +6105,7 @@ var BaseMediaFrameDrain = class { while (true) { if (frameQueue.length > 0) { yield frameQueue.shift(); + onQueueDequeue(); } else if (!decoderIsFlushed) { await queueNotEmpty; } else { @@ -6108,6 +6114,10 @@ var BaseMediaFrameDrain = class { } } finally { ended = true; + onQueueDequeue(); + for (const frame of frameQueue) { + frame.close(); + } } } }; @@ -6233,9 +6243,11 @@ var AudioBufferDrain = class { data.copyTo(dataBytes, { planeIndex: i }); audioBuffer.copyToChannel(dataBytes, i); } + const sampleDuration = 1 / data.sampleRate; return { buffer: audioBuffer, - timestamp: data.timestamp / 1e6 + // Rounding the timestamp based on the sample duration removes audio playback artifacts + timestamp: Math.round(data.timestamp / 1e6 / sampleDuration) * sampleDuration }; } async getBuffer(timestamp) { diff --git a/src/isobmff/isobmff-demuxer.ts b/src/isobmff/isobmff-demuxer.ts index 17694e0..f41053e 100644 --- a/src/isobmff/isobmff-demuxer.ts +++ b/src/isobmff/isobmff-demuxer.ts @@ -1572,8 +1572,8 @@ abstract class IsobmffTrackBacking { + onQueueDequeue(); const frameTimestamp = frame.timestamp / 1e6; if (frameTimestamp >= endTimestamp) { @@ -216,15 +220,14 @@ abstract class BaseMediaFrameDrain< await chunks.next(); while (currentChunk && !ended) { - // TODO: Some sort of queue size limit for the frames? Right now this code relies on the pace at which - // the consumer calls .close() + if (frameQueue.length + decoder.decodeQueueSize > MAX_QUEUE_SIZE) { + ({ promise: queueDequeue, resolve: onQueueDequeue } = promiseWithResolvers()); + await queueDequeue; + continue; + } decoder.decode(currentChunk); - if (decoder.decodeQueueSize >= 10) { - await new Promise(resolve => decoder.addEventListener('dequeue', resolve, { once: true })); - } - const chunkResult = await chunks.next(); if (chunkResult.done) { break; @@ -250,6 +253,7 @@ abstract class BaseMediaFrameDrain< while (true) { if (frameQueue.length > 0) { yield frameQueue.shift()!; + onQueueDequeue(); } else if (!decoderIsFlushed) { await queueNotEmpty; } else { @@ -258,6 +262,11 @@ abstract class BaseMediaFrameDrain< } } finally { ended = true; + onQueueDequeue(); + + for (const frame of frameQueue) { + frame.close(); + } } } } @@ -419,9 +428,12 @@ export class AudioBufferDrain { audioBuffer.copyToChannel(dataBytes, i); } + const sampleDuration = 1 / data.sampleRate; + return { buffer: audioBuffer, - timestamp: data.timestamp / 1e6, + // Rounding the timestamp based on the sample duration removes audio playback artifacts + timestamp: Math.round(data.timestamp / 1e6 / sampleDuration) * sampleDuration, }; }