Files
mediabunny/dist/metamuxer.min.js
T

11 lines
91 KiB
JavaScript

"use strict";var Metamuxer=(()=>{var rt=Object.defineProperty;var ir=Object.getOwnPropertyDescriptor;var sr=Object.getOwnPropertyNames;var nr=Object.prototype.hasOwnProperty;var or=(r,e)=>{for(var t in e)rt(r,t,{get:e[t],enumerable:!0})},ar=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of sr(e))!nr.call(r,s)&&s!==t&&rt(r,s,{get:()=>e[s],enumerable:!(i=ir(e,s))||i.enumerable});return r};var cr=r=>ar(rt({},"__esModule",{value:!0}),r);var Ti={};or(Ti,{ALL_FORMATS:()=>rr,AUDIO_CODECS:()=>j,ArrayBufferSource:()=>$e,ArrayBufferTarget:()=>te,AudioBufferSource:()=>Ne,AudioDataSource:()=>We,AudioSource:()=>R,BlobSource:()=>je,CanvasSource:()=>Ue,EncodedAudioChunkSource:()=>Fe,EncodedVideoChunkDrain:()=>Te,EncodedVideoChunkSource:()=>ze,ISOBMFF:()=>ge,Input:()=>et,MATROSKA:()=>Je,MKV:()=>gt,MOV:()=>er,MP4:()=>Jt,MediaSource:()=>q,MediaStreamAudioTrackSource:()=>He,MediaStreamVideoTrackSource:()=>De,MkvOutputFormat:()=>fe,Mp4OutputFormat:()=>Pe,Output:()=>Qe,OutputFormat:()=>z,SUBTITLE_CODECS:()=>de,Source:()=>ie,StreamTarget:()=>Ee,SubtitleSource:()=>X,Target:()=>P,TextSubtitleSource:()=>Le,VIDEO_CODECS:()=>$,VideoFrameDrain:()=>tt,VideoFrameSource:()=>Be,VideoSource:()=>V,WEBM:()=>tr,WebMOutputFormat:()=>K});function d(r){if(!r)throw new Error("Assertion failed.")}var v=r=>r&&r[r.length-1],U=r=>r>=0&&r<2**32,D=(r,e,t)=>{let i=0;for(let s=e;s<t;s++){let n=Math.floor(s/8),o=r[n],a=7-(s&7),c=(o&1<<a)>>a;i<<=1,i|=c}return i},Tt=(r,e,t,i)=>{for(let s=e;s<t;s++){let n=Math.floor(s/8),o=r[n],a=7-(s&7);o&=~(1<<a),o|=(i&1<<t-s-1)>>t-s-1<<a,r[n]=o}},F=r=>r instanceof ArrayBuffer?new Uint8Array(r):new Uint8Array(r.buffer,r.byteOffset,r.byteLength),_=new TextEncoder,it=r=>Object.fromEntries(Object.entries(r).map(([e,t])=>[t,e])),W={bt709:1,bt470bg:5,smpte170m:6},xt=it(W),N={bt709:1,smpte170m:6,"iec61966-2-1":13},Ct=it(N),H={rgb:0,bt709:1,bt470bg:5,smpte170m:6},wt=it(H),xe=r=>!!r&&!!r.primaries&&!!r.transfer&&!!r.matrix&&r.fullRange!==void 0,st=r=>r instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&r instanceof SharedArrayBuffer||ArrayBuffer.isView(r)&&!(r instanceof DataView),Y=class{currentPromise=Promise.resolve();async acquire(){let e,t=new Promise(s=>{e=s}),i=this.currentPromise;return this.currentPromise=t,await i,e}},M=r=>{let e=r*(Math.PI/180),t=Math.cos(e),i=Math.sin(e);return[t,i,0,-i,t,0,0,0,1]},nt=M(0),St=r=>[...r].map(e=>e.toString(16).padStart(2,"0")).join(""),yt=r=>(r=r>>1&1431655765|(r&1431655765)<<1,r=r>>2&858993459|(r&858993459)<<2,r=r>>4&252645135|(r&252645135)<<4,r=r>>8&16711935|(r&16711935)<<8,r=r>>16&65535|(r&65535)<<16,r>>>0),vt=(r,e,t)=>{let i=0,s=r.length-1,n=-1;for(;i<=s;){let o=i+s>>1,a=t(r[o]);a===e?(n=o,s=o-1):a<e?i=o+1:s=o-1}return n},E=(r,e,t)=>{let i=-1,s=0,n=r.length-1;for(;s<=n;){let o=s+(n-s+1)/2|0;t(r[o])<=e?(i=o,s=o+1):n=o-1}return i},L=()=>{let r,e;return{promise:new Promise((i,s)=>{r=i,e=s}),resolve:r,reject:e}},_t=(r,e)=>{let t=r.indexOf(e);t!==-1&&r.splice(t,1)};var oe=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}.\d{3})/g,ur=/^WEBVTT(.|\n)*?\n{2}/,Z=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,Ce=class{options;preambleText=null;preambleEmitted=!1;constructor(e){this.options=e}parse(e){e=e.replaceAll(`\r
`,`
`).replaceAll("\r",`
`),oe.lastIndex=0;let t;if(!this.preambleText){if(!ur.test(e)){let s=new Error("WebVTT preamble incorrect.");throw this.options.error(s),s}t=oe.exec(e);let i=e.slice(0,t?.index??e.length).trimEnd();if(!i){let s=new Error("No WebVTT preamble provided.");throw this.options.error(s),s}this.preambleText=i,t&&(e=e.slice(t.index),oe.lastIndex=0)}for(;t=oe.exec(e);){let i=e.slice(0,t.index),s=t[1],n=t.index+t[0].length,o=e.indexOf(`
`,n)+1,a=e.slice(n,o).trim(),c=e.indexOf(`
`,n);c===-1&&(c=e.length);let u=we(t[2]),f=we(t[3])-u,g=e.slice(o,c).trim();e=e.slice(c).trimStart(),oe.lastIndex=0;let x={timestamp:u/1e3,duration:f/1e3,text:g,identifier:s,settings:a,notes:i},C={};this.preambleEmitted||(C.config={description:this.preambleText},this.preambleEmitted=!0),this.options.output(x,C)}}},dr=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,we=r=>{let e=dr.exec(r);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])},Se=r=>{let e=Math.floor(r/36e5),t=Math.floor(r%(60*60*1e3)/(60*1e3)),i=Math.floor(r%(60*1e3)/1e3),s=r%1e3;return e.toString().padStart(2,"0")+":"+t.toString().padStart(2,"0")+":"+i.toString().padStart(2,"0")+"."+s.toString().padStart(3,"0")};var ae=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<e.length;t++)this.helperView.setUint8(t%8,e.charCodeAt(t)),t%8===7&&this.writer.write(this.helper);e.length%8!==0&&this.writer.write(this.helper.subarray(0,e.length%8))}writeBox(e){if(this.offsets.set(e,this.writer.getPos()),e.contents&&!e.children)this.writeBoxHeader(e,e.size??e.contents.byteLength+8),this.writer.write(e.contents);else{let t=this.writer.getPos();if(this.writeBoxHeader(e,0),e.contents&&this.writer.write(e.contents),e.children)for(let n of e.children)n&&this.writeBox(n);let i=this.writer.getPos(),s=e.size??i-t;this.writer.seek(t),this.writeBoxHeader(e,s),this.writer.seek(i)}}writeBoxHeader(e,t){this.writeU32(e.largeSize?1:t),this.writeAscii(e.type),e.largeSize&&this.writeU64(t)}measureBoxHeader(e){return 8+(e.largeSize?8:0)}patchBox(e){let t=this.offsets.get(e);d(t!==void 0);let i=this.writer.getPos();this.writer.seek(t),this.writeBox(e),this.writer.seek(i)}measureBox(e){if(e.contents&&!e.children)return this.measureBoxHeader(e)+e.contents.byteLength;{let t=this.measureBoxHeader(e);if(e.contents&&(t+=e.contents.byteLength),e.children)for(let i of e.children)i&&(t+=this.measureBox(i));return t}}},h=new Uint8Array(8),O=new DataView(h.buffer),w=r=>[(r%256+256)%256],p=r=>(O.setUint16(0,r,!1),[h[0],h[1]]),lr=r=>(O.setInt16(0,r,!1),[h[0],h[1]]),Et=r=>(O.setUint32(0,r,!1),[h[1],h[2],h[3]]),m=r=>(O.setUint32(0,r,!1),[h[0],h[1],h[2],h[3]]),It=r=>(O.setInt32(0,r,!1),[h[0],h[1],h[2],h[3]]),Q=r=>(O.setUint32(0,Math.floor(r/2**32),!1),O.setUint32(4,r,!1),[h[0],h[1],h[2],h[3],h[4],h[5],h[6],h[7]]),ct=r=>(O.setInt16(0,2**8*r,!1),[h[0],h[1]]),I=r=>(O.setInt32(0,2**16*r,!1),[h[0],h[1],h[2],h[3]]),ot=r=>(O.setInt32(0,2**30*r,!1),[h[0],h[1],h[2],h[3]]),at=(r,e)=>{let t=[],i=r;do{let s=i&127;i>>=7,t.length>0&&(s|=128),t.push(s),e!==void 0&&e--}while(i>0||e);return t.reverse()},y=(r,e=!1)=>{let t=Array(r.length).fill(null).map((i,s)=>r.charCodeAt(s));return e&&t.push(0),t},ut=r=>{let e=null;for(let t of r)(!e||t.timestamp>e.timestamp)&&(e=t);return e},Ot=r=>[I(r[0]),I(r[1]),ot(r[2]),I(r[3]),I(r[4]),ot(r[5]),I(r[6]),I(r[7]),ot(r[8])],b=(r,e,t)=>({type:r,contents:e&&new Uint8Array(e.flat(10)),children:t}),T=(r,e,t,i,s)=>b(r,[w(e),Et(t),i??[]],s),Vt=r=>r.fragmented?b("ftyp",[y("iso5"),m(512),y("iso5"),y("iso6"),y("mp41")]):b("ftyp",[y("isom"),m(512),y("isom"),r.holdsAvc?y("avc1"):[],y("mp41")]),ve=r=>({type:"mdat",largeSize:r}),Rt=r=>({type:"free",size:r}),ce=(r,e,t=!1)=>b("moov",void 0,[mr(e,r),...r.map(i=>fr(i,e)),t?jr(r):null]),mr=(r,e)=>{let t=A(Math.max(0,...e.filter(o=>o.samples.length>0).map(o=>{let a=ut(o.samples);return a.timestamp+a.duration})),ye),i=Math.max(0,...e.map(o=>o.track.id))+1,s=!U(r)||!U(t),n=s?Q:m;return T("mvhd",+s,0,[n(r),n(r),m(ye),n(t),I(1),ct(1),Array(10).fill(0),Ot(nt),Array(24).fill(0),m(i)])},fr=(r,e)=>b("trak",void 0,[hr(r,e),pr(r,e)]),hr=(r,e)=>{let t=ut(r.samples),i=A(t?t.timestamp+t.duration:0,ye),s=!U(e)||!U(i),n=s?Q:m,o;if(r.type==="video"){let a=r.track.metadata.rotation;o=a===void 0||typeof a=="number"?M(a??0):a}else o=nt;return T("tkhd",+s,3,[n(e),n(e),m(r.track.id),m(0),n(i),Array(8).fill(0),p(0),p(r.track.id),ct(r.type==="audio"?1:0),p(0),Ot(o),I(r.type==="video"?r.info.width:0),I(r.type==="video"?r.info.height:0)])},pr=(r,e)=>b("mdia",void 0,[br(r,e),Tr(r),xr(r)]),br=(r,e)=>{let t=ut(r.samples),i=A(t?t.timestamp+t.duration:0,r.timescale),s=!U(e)||!U(i),n=s?Q:m;return T("mdhd",+s,0,[n(e),n(e),m(r.timescale),n(i),p(21956),p(0)])},kr={video:"vide",audio:"soun",subtitle:"text"},gr={video:"VideoHandler",audio:"SoundHandler",subtitle:"TextHandler"},Tr=r=>T("hdlr",0,0,[y("mhlr"),y(kr[r.type]),m(0),m(0),m(0),y(gr[r.type],!0)]),xr=r=>b("minf",void 0,[yr[r.type](),vr(),Er(r)]),Cr=()=>T("vmhd",0,1,[p(0),p(0),p(0),p(0)]),wr=()=>T("smhd",0,0,[p(0),p(0)]),Sr=()=>T("nmhd",0,0),yr={video:Cr,audio:wr,subtitle:Sr},vr=()=>b("dinf",void 0,[_r()]),_r=()=>T("dref",0,0,[m(1)],[Ar()]),Ar=()=>T("url ",0,1),Er=r=>{let e=r.compositionTimeOffsetTable.length>1||r.compositionTimeOffsetTable.some(t=>t.sampleCompositionTimeOffset!==0);return b("stbl",void 0,[Ir(r),Wr(r),Nr(r),Hr(r),Lr(r),Qr(r),e?$r(r):null])},Ir=r=>{let e;return r.type==="video"?e=Or(ti[r.track.source._codec],r):r.type==="audio"?e=zr(ii[r.track.source._codec],r):r.type==="subtitle"&&(e=Dr(ni[r.track.source._codec],r)),d(e),T("stsd",0,0,[m(1)],[e])},Or=(r,e)=>b(r,[Array(6).fill(0),p(1),p(0),p(0),Array(12).fill(0),p(e.info.width),p(e.info.height),m(4718592),m(4718592),m(0),p(1),Array(32).fill(0),p(24),lr(65535)],[ri[e.track.source._codec](e),xe(e.info.decoderConfig.colorSpace)?Vr(e):null]),Vr=r=>b("colr",[y("nclx"),p(W[r.info.decoderConfig.colorSpace.primaries]),p(N[r.info.decoderConfig.colorSpace.transfer]),p(H[r.info.decoderConfig.colorSpace.matrix]),w((r.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Rr=r=>r.info.decoderConfig&&b("avcC",[...F(r.info.decoderConfig.description)]),Mr=r=>r.info.decoderConfig&&b("hvcC",[...F(r.info.decoderConfig.description)]),At=r=>{if(!r.info.decoderConfig)return null;let e=r.info.decoderConfig;d(e.colorSpace);let t=e.codec.split("."),i=Number(t[1]),s=Number(t[2]),a=(Number(t[3])<<4)+(0<<1)+Number(e.colorSpace.fullRange);return T("vpcC",1,0,[w(i),w(s),w(a),w(2),w(2),w(2),p(0)])},Pr=()=>b("av1C",[129,0,0,0]),zr=(r,e)=>b(r,[Array(6).fill(0),p(1),p(0),p(0),m(0),p(e.info.numberOfChannels),p(16),p(0),p(0),I(e.info.sampleRate)],[si[e.track.source._codec](e)]),Br=r=>{let t=[...F(r.info.decoderConfig.description??new ArrayBuffer(0))];return t=[...w(64),...w(21),...Et(0),...m(0),...m(0),...w(5),...at(t.length),...t],t=[...p(1),...w(0),...w(4),...at(t.length),...t,...w(6),...w(1),...w(2)],t=[...w(3),...at(t.length),...t],T("esds",0,0,t)},Ur=r=>{let e=3840,t=0,i=r.info.decoderConfig?.description;if(i){d(i.byteLength>=18);let s=ArrayBuffer.isView(i)?new DataView(i.buffer,i.byteOffset,i.byteLength):new DataView(i);e=s.getUint16(10,!0),t=s.getInt16(14,!0)}return b("dOps",[w(0),w(r.info.numberOfChannels),p(e),m(r.info.sampleRate),ct(t),w(0)])},Dr=(r,e)=>b(r,[Array(6).fill(0),p(1)],[oi[e.track.source._codec](e)]),Fr=r=>b("vttC",[..._.encode(r.info.config.description)]);var Wr=r=>T("stts",0,0,[m(r.timeToSampleTable.length),r.timeToSampleTable.map(e=>[m(e.sampleCount),m(e.sampleDelta)])]),Nr=r=>{if(r.samples.every(t=>t.type==="key"))return null;let e=[...r.samples.entries()].filter(([,t])=>t.type==="key");return T("stss",0,0,[m(e.length),e.map(([t])=>m(t+1))])},Hr=r=>T("stsc",0,0,[m(r.compactlyCodedChunkTable.length),r.compactlyCodedChunkTable.map(e=>[m(e.firstChunk),m(e.samplesPerChunk),m(1)])]),Lr=r=>T("stsz",0,0,[m(0),m(r.samples.length),r.samples.map(e=>m(e.size))]),Qr=r=>r.finalizedChunks.length>0&&v(r.finalizedChunks).offset>=2**32?T("co64",0,0,[m(r.finalizedChunks.length),r.finalizedChunks.map(e=>Q(e.offset))]):T("stco",0,0,[m(r.finalizedChunks.length),r.finalizedChunks.map(e=>m(e.offset))]),$r=r=>T("ctts",0,0,[m(r.compositionTimeOffsetTable.length),r.compositionTimeOffsetTable.map(e=>[m(e.sampleCount),m(e.sampleCompositionTimeOffset)])]),jr=r=>b("mvex",void 0,r.map(Kr)),Kr=r=>T("trex",0,0,[m(r.track.id),m(1),m(0),m(0),m(0)]),dt=(r,e)=>b("moof",void 0,[qr(r),...e.map(Xr)]),qr=r=>T("mfhd",0,0,[m(r)]),Mt=r=>{let e=0,t=0,i=0,s=0,n=r.type==="delta";return t|=+n,n?e|=1:e|=2,e<<24|t<<16|i<<8|s},Xr=r=>b("traf",void 0,[Gr(r),Yr(r),Zr(r)]),Gr=r=>{d(r.currentChunk);let e=0;e|=8,e|=16,e|=32,e|=131072;let t=r.currentChunk.samples[1]??r.currentChunk.samples[0],i={duration:t.timescaleUnitsToNextSample,size:t.size,flags:Mt(t)};return T("tfhd",0,e,[m(r.track.id),m(i.duration),m(i.size),m(i.flags)])},Yr=r=>(d(r.currentChunk),T("tfdt",1,0,[Q(A(r.currentChunk.startTimestamp,r.timescale))])),Zr=r=>{d(r.currentChunk);let e=r.currentChunk.samples.map(k=>k.timescaleUnitsToNextSample),t=r.currentChunk.samples.map(k=>k.size),i=r.currentChunk.samples.map(Mt),s=r.currentChunk.samples.map(k=>A(k.timestamp-k.decodeTimestamp,r.timescale)),n=new Set(e),o=new Set(t),a=new Set(i),c=new Set(s),u=a.size===2&&i[0]!==i[1],l=n.size>1,f=o.size>1,g=!u&&a.size>1,x=c.size>1||[...c].some(k=>k!==0),C=0;return C|=1,C|=4*+u,C|=256*+l,C|=512*+f,C|=1024*+g,C|=2048*+x,T("trun",1,C,[m(r.currentChunk.samples.length),m(r.currentChunk.offset-r.currentChunk.moofOffset||0),u?m(i[0]):[],r.currentChunk.samples.map((k,S)=>[l?m(e[S]):[],f?m(t[S]):[],g?m(i[S]):[],x?It(s[S]):[]])])},Pt=r=>b("mfra",void 0,[...r.map(Jr),ei()]),Jr=(r,e)=>T("tfra",1,0,[m(r.track.id),m(63),m(r.finalizedChunks.length),r.finalizedChunks.map(i=>[Q(A(i.startTimestamp,r.timescale)),Q(i.moofOffset),m(e+1),m(1),m(1)])]),ei=()=>T("mfro",0,0,[m(0)]),zt=()=>b("vtte"),Bt=(r,e,t,i,s)=>b("vttc",void 0,[s!==null?b("vsid",[It(s)]):null,t!==null?b("iden",[..._.encode(t)]):null,e!==null?b("ctim",[..._.encode(Se(e))]):null,i!==null?b("sttg",[..._.encode(i)]):null,b("payl",[..._.encode(r)])]),Ut=r=>b("vtta",[..._.encode(r)]),ti={avc:"avc1",hevc:"hvc1",vp8:"vp08",vp9:"vp09",av1:"av01"},ri={avc:Rr,hevc:Mr,vp8:At,vp9:At,av1:Pr},ii={aac:"mp4a",opus:"Opus"},si={aac:Br,opus:Ur},ni={webvtt:"wvtt"},oi={webvtt:Fr};var J=class{output;mutex=new Y;constructor(e){this.output=e}beforeTrackAdd(e){}onTrackClose(e){}trackTimestampInfo=new WeakMap;validateAndNormalizeTimestamp(e,t,i){let s=t/1e6,n=this.trackTimestampInfo.get(e);if(!n){if(!i)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(s<n.lastKeyFrameTimestamp)throw new Error(`Timestamp cannot be smaller than last key frame's timestamp (got ${s}s, last key frame at ${n.lastKeyFrameTimestamp}s).`);if(i){if(s<n.maxTimestamp)throw new Error(`Key frame timestamps cannot be smaller than any timestamp that came before (got ${s}s, max timestamp was ${n.maxTimestamp}s).`);n.lastKeyFrameTimestamp=s}return n.maxTimestamp=Math.max(n.maxTimestamp,s),s}};var ue=class{ensureMonotonicity=!1;start(){}},ee=class extends ue{pos=0;target;buffer=new ArrayBuffer(2**16);bytes=new Uint8Array(this.buffer);maxPos=0;constructor(e){super(),this.target=e}ensureSize(e){let t=this.buffer.byteLength;for(;t<e;)t*=2;if(t===this.buffer.byteLength)return;let i=new ArrayBuffer(t),s=new Uint8Array(i);s.set(this.bytes,0),this.buffer=i,this.bytes=s}write(e){this.ensureSize(this.pos+e.byteLength),this.bytes.set(e,this.pos),this.pos+=e.byteLength,this.maxPos=Math.max(this.maxPos,this.pos)}seek(e){this.pos=e}getPos(){return this.pos}async flush(){}async finalize(){this.ensureSize(this.pos),this.target.buffer=this.buffer.slice(0,Math.max(this.maxPos,this.pos))}getSlice(e,t){return this.bytes.slice(e,t)}},_e=class extends ue{pos=0;target;sections=[];lastFlushEnd=0;writer=null;constructor(e){super(),this.target=e}start(){this.writer=this.target._writable.getWriter()}write(e){this.sections.push({data:e.slice(),start:this.pos}),this.pos+=e.byteLength}seek(e){this.pos=e}getPos(){return this.pos}async flush(){if(d(this.writer),this.sections.length===0)return;let e=[],t=[...this.sections].sort((i,s)=>i.start-s.start);e.push({start:t[0].start,size:t[0].data.byteLength});for(let i=1;i<t.length;i++){let s=e[e.length-1],n=t[i];n.start<=s.start+s.size?s.size=Math.max(s.size,n.start+n.data.byteLength-s.start):e.push({start:n.start,size:n.data.byteLength})}for(let i of e){i.data=new Uint8Array(i.size);for(let s of this.sections)i.start<=s.start&&s.start<i.start+i.size&&i.data.set(s.data,s.start-i.start);if(this.ensureMonotonicity&&i.start!==this.lastFlushEnd)throw new Error("Internal error: Monotonicity violation.");this.writer.desiredSize!==null&&this.writer.desiredSize<=0&&await this.writer.ready,this.writer.write({type:"write",data:i.data,position:i.start}),this.lastFlushEnd=i.start+i.data.byteLength}this.sections.length=0}finalize(){return d(this.writer),this.writer.close()}},ai=2**24,ci=2,Ae=class extends ue{pos=0;target;chunkSize;chunks=[];lastFlushEnd=0;writer=null;flushedChunkQueue=[];constructor(e){if(super(),this.target=e,this.chunkSize=e._options?.chunkSize??ai,!Number.isInteger(this.chunkSize)||this.chunkSize<2**10)throw new Error("Invalid StreamTarget options: chunkSize must be an integer not smaller than 1024.")}start(){this.writer=this.target._writable.getWriter()}write(e){this.writeDataIntoChunks(e,this.pos),this.queueChunksForFlush(),this.pos+=e.byteLength}seek(e){this.pos=e}getPos(){return this.pos}writeDataIntoChunks(e,t){let i=this.chunks.findIndex(c=>c.start<=t&&t<c.start+this.chunkSize);i===-1&&(i=this.createChunk(t));let s=this.chunks[i],n=t-s.start,o=e.subarray(0,Math.min(this.chunkSize-n,e.byteLength));s.data.set(o,n);let a={start:n,end:n+o.byteLength};if(this.insertSectionIntoChunk(s,a),s.written[0].start===0&&s.written[0].end===this.chunkSize&&(s.shouldFlush=!0),this.chunks.length>ci){for(let c=0;c<this.chunks.length-1;c++)this.chunks[c].shouldFlush=!0;this.queueChunksForFlush()}o.byteLength<e.byteLength&&this.writeDataIntoChunks(e.subarray(o.byteLength),t+o.byteLength)}insertSectionIntoChunk(e,t){let i=0,s=e.written.length-1,n=-1;for(;i<=s;){let o=Math.floor(i+(s-i+1)/2);e.written[o].start<=t.start?(i=o+1,n=o):s=o-1}for(e.written.splice(n+1,0,t),(n===-1||e.written[n].end<t.start)&&n++;n<e.written.length-1&&e.written[n].end>=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 i={start:Math.floor(e/this.chunkSize)*this.chunkSize,data:new Uint8Array(this.chunkSize),written:[],shouldFlush:!1};return this.chunks.push(i),this.chunks.sort((s,n)=>s.start-n.start),this.chunks.indexOf(i)}queueChunksForFlush(e=!1){d(this.writer);for(let t=0;t<this.chunks.length;t++){let i=this.chunks[t];if(!(!i.shouldFlush&&!e)){for(let s of i.written){if(this.ensureMonotonicity&&i.start+s.start!==this.lastFlushEnd)throw new Error("Internal error: Monotonicity violation.");this.flushedChunkQueue.push({type:"write",data:i.data.subarray(s.start,s.end),position:i.start+s.start}),this.lastFlushEnd=i.start+s.end}this.chunks.splice(t--,1)}}}async flush(){if(d(this.writer),this.flushedChunkQueue.length!==0){for(let e of this.flushedChunkQueue)this.writer.desiredSize!==null&&this.writer.desiredSize<=0&&await this.writer.ready,this.writer.write(e);this.flushedChunkQueue.length=0}}async finalize(){return d(this.writer),this.queueChunksForFlush(!0),await this.flush(),this.writer.close()}};var P=class{_output=null},te=class extends P{buffer=null;_createWriter(){return new ee(this)}},Ee=class extends P{_writable;_options;constructor(e,t={}){if(super(),!(e instanceof WritableStream))throw new TypeError("StreamTarget requires a WritableStream instance.");if(t!=null&&typeof t!="object")throw new TypeError("StreamTarget options, when provided, must be an object.");if(t.chunked!==void 0&&typeof t.chunked!="boolean")throw new TypeError("options.chunked, when provided, must be a boolean.");if(t.chunkSize!==void 0&&(!Number.isInteger(t.chunkSize)||t.chunkSize<=0))throw new TypeError("options.chunkSize, when provided, must be a positive integer.");this._writable=e,this._options=t}_createWriter(){return this._options.chunked?new Ae(this):new _e(this)}};var $=["avc","hevc","vp8","vp9","av1"],j=["aac","opus"],de=["webvtt"],Dt=[{maxMacroblocks:99,maxBitrate:64e3,level:10},{maxMacroblocks:396,maxBitrate:192e3,level:11},{maxMacroblocks:396,maxBitrate:384e3,level:12},{maxMacroblocks:396,maxBitrate:768e3,level:13},{maxMacroblocks:396,maxBitrate:2e6,level:20},{maxMacroblocks:792,maxBitrate:4e6,level:21},{maxMacroblocks:1620,maxBitrate:4e6,level:22},{maxMacroblocks:1620,maxBitrate:1e7,level:30},{maxMacroblocks:3600,maxBitrate:14e6,level:31},{maxMacroblocks:5120,maxBitrate:2e7,level:32},{maxMacroblocks:8192,maxBitrate:2e7,level:40},{maxMacroblocks:8192,maxBitrate:5e7,level:41},{maxMacroblocks:8704,maxBitrate:5e7,level:42},{maxMacroblocks:22080,maxBitrate:135e6,level:50},{maxMacroblocks:36864,maxBitrate:24e7,level:51},{maxMacroblocks:36864,maxBitrate:24e7,level:52},{maxMacroblocks:139264,maxBitrate:24e7,level:60},{maxMacroblocks:139264,maxBitrate:48e7,level:61},{maxMacroblocks:139264,maxBitrate:8e8,level:62}],Ft=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:35651584,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:35651584,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:35651584,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:35651584,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:186}],Wt=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:35651584,maxBitrate:18e7,level:60},{maxPictureSize:35651584,maxBitrate:24e7,level:61},{maxPictureSize:35651584,maxBitrate:48e7,level:62}],Nt=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:35651584,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:35651584,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:35651584,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:35651584,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:35651584,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:35651584,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:19}],Ht=(r,e,t,i)=>{if(r==="avc"){let n=Math.ceil(e/16)*Math.ceil(t/16),o=Dt.find(f=>n<=f.maxMacroblocks&&i<=f.maxBitrate)??v(Dt),a=o?o.level:0,c="64".padStart(2,"0"),u="00",l=a.toString(16).padStart(2,"0");return`avc1.${c}${u}${l}`}else if(r==="hevc"){let s="",o="6",a=e*t,c=Ft.find(l=>a<=l.maxPictureSize&&i<=l.maxBitrate)??v(Ft);return`hev1.${s}1.${o}.${c.tier}${c.level}.B0`}else{if(r==="vp8")return"vp8";if(r==="vp9"){let s="00",n=e*t,o=Wt.find(c=>n<=c.maxPictureSize&&i<=c.maxBitrate)??v(Wt);return`vp09.${s}.${o.level}.08`}else if(r==="av1"){let n=e*t,o=Nt.find(c=>n<=c.maxPictureSize&&i<=c.maxBitrate)??v(Nt);return`av01.0.${o.level.toString().padStart(2,"0")}${o.tier}.08`}}throw new TypeError(`Unhandled codec '${r}'.`)},Lt=(r,e)=>{if(r==="avc"){if(!e||e.byteLength<4)throw new TypeError("AVC description must be at least 4 bytes long.");return`avc1.${St(e.subarray(1,4))}`}else if(r==="hevc"){if(!e)throw new TypeError("HEVC description must be provided.");let t=new DataView(e.buffer,e.byteOffset,e.byteLength),i="hev1.",s=e[1]>>6&3,n=e[1]&31;i+=["","A","B","C"][s]+n,i+=".";let o=yt(t.getUint32(2));i+=o.toString(16),i+=".";let a=e[1]>>5&1,c=e[12];i+=a===0?"L":"H",i+=c,i+=".";let u=[];for(let l=0;l<6;l++){let f=e[l+13];u.push(f)}for(;u[u.length-1]===0;)u.pop();return i+=u.map(l=>l.toString(16)).join("."),i}throw new TypeError(`Unhandled codec '${r}'.`)},Qt=(r,e,t)=>{if(r==="aac")return e>=2&&t<=24e3?"mp4a.40.29":t<=24e3?"mp4a.40.5":"mp4a.40.2";if(r==="opus")return"opus";if(r==="vorbis")return"vorbis";throw new TypeError(`Unhandled codec '${r}'.`)},$t=(r,e)=>{if(r==="aac"){if(!e||e.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");return`mp4a.40.${e[0]>>3}`}else{if(r==="opus")return"opus";if(r==="vorbis")return"vorbis"}throw new TypeError(`Unhandled codec '${r}'.`)},jt=r=>r==="avc"?{avc:{format:"avc"}}:r==="hevc"?{hevc:{format:"hevc"}}:{},Kt=r=>r==="aac"?{aac:{format:"aac"}}:r==="opus"?{opus:{format:"opus"}}:{},Ie=r=>{if(!r)throw new TypeError("Video chunk metadata must be provided.");if(typeof r!="object")throw new TypeError("Video chunk metadata must be an object.");if(!r.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if(typeof r.decoderConfig!="object")throw new TypeError("Video chunk metadata decoder configuration must be an object.");if(typeof r.decoderConfig.codec!="string")throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(r.decoderConfig.codedWidth)||r.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(r.decoderConfig.codedHeight)||r.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(r.decoderConfig.description!==void 0&&!st(r.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(r.decoderConfig.colorSpace!==void 0){let{colorSpace:e}=r.decoderConfig;if(typeof e!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");let t=Object.keys(W);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 i=Object.keys(N);if(e.transfer!=null&&!i.includes(e.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${i.join(", ")}.`);let s=Object.keys(H);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((r.decoderConfig.codec.startsWith("avc1")||r.decoderConfig.codec.startsWith("avc3"))&&!r.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((r.decoderConfig.codec.startsWith("hev1")||r.decoderConfig.codec.startsWith("hvc1"))&&!r.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((r.decoderConfig.codec==="vp8"||r.decoderConfig.codec.startsWith("vp09"))&&r.decoderConfig.colorSpace===void 0)throw new TypeError("Video chunk metadata decoder configuration for VP8/VP9 must include a colorSpace.")},Oe=r=>{if(!r)throw new TypeError("Audio chunk metadata must be provided.");if(typeof r!="object")throw new TypeError("Audio chunk metadata must be an object.");if(!r.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if(typeof r.decoderConfig!="object")throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if(typeof r.decoderConfig.codec!="string")throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!Number.isInteger(r.decoderConfig.sampleRate)||r.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(r.decoderConfig.numberOfChannels)||r.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(r.decoderConfig.description!==void 0&&!st(r.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(r.decoderConfig.codec.startsWith("mp4a")&&!r.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(r.decoderConfig.codec==="opus"&&r.decoderConfig.description&&r.decoderConfig.description.byteLength<18)throw new TypeError("Invalid decoder description provided for Opus; must be at least 18 bytes long.")},Ve=r=>{if(!r)throw new TypeError("Subtitle metadata must be provided.");if(typeof r!="object")throw new TypeError("Subtitle metadata must be an object.");if(!r.config)throw new TypeError("Subtitle metadata must include a config object.");if(typeof r.config!="object")throw new TypeError("Subtitle metadata config must be an object.");if(typeof r.config.description!="string")throw new TypeError("Subtitle metadata config description must be a string.")};var ye=1e3,ui=2082844800,A=(r,e,t=!0)=>{let i=r*e;return t?Math.round(i):i},Re=class extends J{timestampsMustStartAtZero=!0;writer;boxWriter;fastStart;auxTarget=new te;auxWriter=this.auxTarget._createWriter();auxBoxWriter=new ae(this.auxWriter);ftypSize=null;mdat=null;trackDatas=[];creationTime=Math.floor(Date.now()/1e3)+ui;finalizedChunks=[];nextFragmentNumber=1;constructor(e,t){super(e),this.writer=e._writer,this.boxWriter=new ae(this.writer);let i=this.writer instanceof ee?"in-memory":!1;this.fastStart=t._options.fastStart??i,(this.fastStart==="in-memory"||this.fastStart==="fragmented")&&(this.writer.ensureMonotonicity=!0)}async start(){let e=await this.mutex.acquire(),t=this.output._tracks.some(i=>i.type==="video"&&i.source._codec==="avc");this.boxWriter.writeBox(Vt({holdsAvc:t,fragmented:this.fastStart==="fragmented"})),this.ftypSize=this.writer.getPos(),this.fastStart==="in-memory"?this.mdat=ve(!1):this.fastStart==="fragmented"||(this.mdat=ve(!0),this.boxWriter.writeBox(this.mdat)),await this.writer.flush(),e()}getVideoTrackData(e,t){let i=this.trackDatas.find(n=>n.track===e);if(i)return i;Ie(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,o)=>n.track.id-o.track.id),s}getAudioTrackData(e,t){let i=this.trackDatas.find(n=>n.track===e);if(i)return i;Oe(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,o)=>n.track.id-o.track.id),s}getSubtitleTrackData(e,t){let i=this.trackDatas.find(n=>n.track===e);if(i)return i;Ve(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,o)=>n.track.id-o.track.id),this.validateAndNormalizeTimestamp(e,0,!0),s}async addEncodedVideoChunk(e,t,i){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,i),o=new Uint8Array(t.byteLength);t.copyTo(o);let a=this.validateAndNormalizeTimestamp(n.track,t.timestamp,t.type==="key"),c=this.createSampleForTrack(n,o,a,(t.duration??0)/1e6,t.type);await this.registerSample(n,c)}finally{s()}}async addEncodedAudioChunk(e,t,i){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,i),o=new Uint8Array(t.byteLength);t.copyTo(o);let a=t.type,c=this.validateAndNormalizeTimestamp(n.track,t.timestamp,a==="key"),u=this.createSampleForTrack(n,o,c,(t.duration??0)/1e6,a);await this.registerSample(n,u)}finally{s()}}async addSubtitleCue(e,t,i){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,i);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 i=new Set([]);for(let u of e.cueQueue)d(u.timestamp<=t),d(e.lastCueEndTimestamp<=u.timestamp+u.duration),i.add(Math.max(u.timestamp,e.lastCueEndTimestamp)),i.add(u.timestamp+u.duration);let s=[...i].sort((u,l)=>u-l),n=s[0],o=s[1]??n;if(t<o)break;if(e.lastCueEndTimestamp<n){this.auxWriter.seek(0);let u=zt();this.auxBoxWriter.writeBox(u);let l=this.auxWriter.getSlice(0,this.auxWriter.getPos()),f=this.createSampleForTrack(e,l,e.lastCueEndTimestamp,n-e.lastCueEndTimestamp,"key");await this.registerSample(e,f),e.lastCueEndTimestamp=n}this.auxWriter.seek(0);for(let u=0;u<e.cueQueue.length;u++){let l=e.cueQueue[u];if(l.timestamp>=o)break;Z.lastIndex=0;let f=Z.test(l.text),g=l.timestamp+l.duration,x=e.cueToSourceId.get(l);if(x===void 0&&o<g&&(x=e.nextSourceId++,e.cueToSourceId.set(l,x)),l.notes){let k=Ut(l.notes);this.auxBoxWriter.writeBox(k)}let C=Bt(l.text,f?n:null,l.identifier??null,l.settings??null,x??null);this.auxBoxWriter.writeBox(C),g===o&&e.cueQueue.splice(u--,1)}let a=this.auxWriter.getSlice(0,this.auxWriter.getPos()),c=this.createSampleForTrack(e,a,n,o-n,"key");await this.registerSample(e,c),e.lastCueEndTimestamp=o}}createSampleForTrack(e,t,i,s,n){return{timestamp:i,decodeTimestamp:i,duration:s,data:t,size:t.byteLength,type:n,timescaleUnitsToNextSample:A(s,e.timescale)}}processTimestamps(e){if(e.timestampProcessingQueue.length===0)return;let t=e.timestampProcessingQueue.map(i=>i.timestamp).sort((i,s)=>i-s);for(let i=0;i<e.timestampProcessingQueue.length;i++){let s=e.timestampProcessingQueue[i];s.decodeTimestamp=t[i];let n=A(s.timestamp-s.decodeTimestamp,e.timescale),o=A(s.duration,e.timescale);if(e.lastTimescaleUnits!==null){d(e.lastSample);let a=A(s.decodeTimestamp,e.timescale,!1),c=Math.round(a-e.lastTimescaleUnits);if(e.lastTimescaleUnits+=c,e.lastSample.timescaleUnitsToNextSample=c,this.fastStart!=="fragmented"){let u=v(e.timeToSampleTable);if(d(u),u.sampleCount===1){u.sampleDelta=c;let f=e.timeToSampleTable[e.timeToSampleTable.length-2];f&&f.sampleDelta===c&&(f.sampleCount++,e.timeToSampleTable.pop(),u=f)}else u.sampleDelta!==c&&(u.sampleCount--,e.timeToSampleTable.push(u={sampleCount:1,sampleDelta:c}));u.sampleDelta===o?u.sampleCount++:e.timeToSampleTable.push({sampleCount:1,sampleDelta:o});let l=v(e.compositionTimeOffsetTable);d(l),l.sampleCompositionTimeOffset===n?l.sampleCount++:e.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:n})}}else e.lastTimescaleUnits=0,this.fastStart!=="fragmented"&&(e.timeToSampleTable.push({sampleCount:1,sampleDelta:o}),e.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:n}));e.lastSample=s}e.timestampProcessingQueue.length=0}async registerSample(e,t){this.fastStart==="fragmented"?(e.sampleQueue.push(t),await this.interleaveSamples()):await this.addSampleToTrack(e,t)}async addSampleToTrack(e,t){t.type==="key"&&this.processTimestamps(e),this.fastStart!=="fragmented"&&e.samples.push(t);let i=!1;if(!e.currentChunk)i=!0;else{let s=t.timestamp-e.currentChunk.startTimestamp;if(this.fastStart==="fragmented"){let n=this.trackDatas.every(o=>{if(e===o)return t.type==="key";let a=o.sampleQueue[0];return a&&a.type==="key"});s>=1&&n&&(i=!0,await this.finalizeFragment())}else i=s>=.5}i&&(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||v(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].timestamp<t&&(e=s,t=s.sampleQueue[0].timestamp)}if(!e)break;let i=e.sampleQueue.shift();await this.addSampleToTrack(e,i)}}async finalizeFragment(e=!0){d(this.fastStart==="fragmented");let t=this.nextFragmentNumber++;if(t===1){let a=ce(this.trackDatas,this.creationTime,!0);this.boxWriter.writeBox(a)}let i=this.writer.getPos(),s=dt(t,this.trackDatas);this.boxWriter.writeBox(s);{let a=ve(!1),c=0;for(let l of this.trackDatas){d(l.currentChunk);for(let f of l.currentChunk.samples)c+=f.size}let u=this.boxWriter.measureBox(a)+c;u>=2**32&&(a.largeSize=!0,u=this.boxWriter.measureBox(a)+c),a.size=u,this.boxWriter.writeBox(a)}for(let a of this.trackDatas){a.currentChunk.offset=this.writer.getPos(),a.currentChunk.moofOffset=i;for(let c of a.currentChunk.samples)this.writer.write(c.data),c.data=null}let n=this.writer.getPos();this.writer.seek(this.boxWriter.offsets.get(s));let o=dt(t,this.trackDatas);this.boxWriter.writeBox(o),this.writer.seek(n);for(let a of this.trackDatas)a.finalizedChunks.push(a.currentChunk),this.finalizedChunks.push(a.currentChunk),a.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 i=this.trackDatas.find(s=>s.track===e);i&&await this.processWebVTTCues(i,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 i of t.sampleQueue)await this.addSampleToTrack(t,i);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=ce(this.trackDatas,this.creationTime),o=this.boxWriter.measureBox(n);t=this.boxWriter.measureBox(this.mdat);let a=this.writer.getPos()+o+t;for(let c of this.finalizedChunks){c.offset=a;for(let{data:u}of c.samples)d(u),a+=u.byteLength,t+=u.byteLength}if(a<2**32)break;t>=2**32&&(this.mdat.largeSize=!0)}let i=ce(this.trackDatas,this.creationTime);this.boxWriter.writeBox(i),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(),i=Pt(this.trackDatas);this.boxWriter.writeBox(i);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 i=this.writer.getPos()-t;this.mdat.size=i,this.mdat.largeSize=i>=2**32,this.boxWriter.patchBox(this.mdat);let s=ce(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(Rt(n))}else this.boxWriter.writeBox(s)}e()}};var le=class{value;constructor(e){this.value=e}},re=class{value;constructor(e){this.value=e}},me=class{value;constructor(e){this.value=e}};var lt=r=>r<256?1:r<65536?2:r<1<<24?3:r<2**32?4:r<2**40?5:6,mt=r=>r>=-64&&r<64?1:r>=-8192&&r<8192?2:r>=-(1<<20)&&r<1<<20?3:r>=-(1<<27)&&r<1<<27?4:r>=-(2**34)&&r<2**34?5:6,qt=r=>{if(r<127)return 1;if(r<16383)return 2;if(r<(1<<21)-1)return 3;if(r<(1<<28)-1)return 4;if(r<2**35-1)return 5;if(r<2**42-1)return 6;throw new Error("EBML VINT size not supported "+r)};var ft=2**15,Xt="https://github.com/Vanilagy/webm-muxer",Gt=6,Yt=5,di={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"},li={video:1,audio:2,subtitle:17},Me=class extends J{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=lt(e)){let i=0;switch(t){case 6:this.helperView.setUint8(i++,e/2**40|0);case 5:this.helperView.setUint8(i++,e/2**32|0);case 4:this.helperView.setUint8(i++,e>>24);case 3:this.helperView.setUint8(i++,e>>16);case 2:this.helperView.setUint8(i++,e>>8);case 1:this.helperView.setUint8(i++,e);break;default:throw new Error("Bad UINT size "+t)}this.writer.write(this.helper.subarray(0,i))}writeSignedInt(e,t=mt(e)){e<0&&(e+=2**(t*8)),this.writeUnsignedInt(e,t)}writeEBMLVarInt(e,t=qt(e)){let i=0;switch(t){case 1:this.helperView.setUint8(i++,128|e);break;case 2:this.helperView.setUint8(i++,64|e>>8),this.helperView.setUint8(i++,e);break;case 3:this.helperView.setUint8(i++,32|e>>16),this.helperView.setUint8(i++,e>>8),this.helperView.setUint8(i++,e);break;case 4:this.helperView.setUint8(i++,16|e>>24),this.helperView.setUint8(i++,e>>16),this.helperView.setUint8(i++,e>>8),this.helperView.setUint8(i++,e);break;case 5:this.helperView.setUint8(i++,8|e/2**32&7),this.helperView.setUint8(i++,e>>24),this.helperView.setUint8(i++,e>>16),this.helperView.setUint8(i++,e>>8),this.helperView.setUint8(i++,e);break;case 6:this.helperView.setUint8(i++,4|e/2**40&3),this.helperView.setUint8(i++,e/2**32|0),this.helperView.setUint8(i++,e>>24),this.helperView.setUint8(i++,e>>16),this.helperView.setUint8(i++,e>>8),this.helperView.setUint8(i++,e);break;default:throw new Error("Bad EBML VINT size "+t)}this.writer.write(this.helper.subarray(0,i))}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(),i=e.size===-1?1:e.size??4;e.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+i);let s=this.writer.getPos();if(this.dataOffsets.set(e,s),this.writeEBML(e.data),e.size!==-1){let n=this.writer.getPos()-s,o=this.writer.getPos();this.writer.seek(t),this.writeEBMLVarInt(n,i),this.writer.seek(o)}}else if(typeof e.data=="number"){let t=e.size??lt(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 le)this.writeEBMLVarInt(4),this.writeFloat32(e.data.value);else if(e.data instanceof re)this.writeEBMLVarInt(8),this.writeFloat64(e.data.value);else if(e.data instanceof me){let t=e.size??mt(e.data.value);this.writeEBMLVarInt(t),this.writeSignedInt(e.data.value,t)}}}beforeTrackAdd(e){if(this.format instanceof K)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 K?"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]),i=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:i},{id:21420,size:5,data:0}]}]};this.seekHead=s}createSegmentInfo(){let e={id:17545,data:new re(0)};this.segmentDuration=e;let t={id:357149030,data:[{id:2807729,data:1e6},{id:19840,data:Xt},{id:22337,data:Xt},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:li[t.type]},{id:134,data:di[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:F(e.info.decoderConfig.description)}:null,e.track.metadata.frameRate?{id:2352003,data:1e9/e.track.metadata.frameRate}:null],i=e.info.decoderConfig.colorSpace,s={id:224,data:[{id:176,data:e.info.width},{id:186,data:e.info.height},xe(i)?{id:21936,data:[{id:21937,data:H[i.matrix]},{id:21946,data:N[i.transfer]},{id:21947,data:W[i.primaries]},{id:21945,data:i.fullRange?2:1}]}:null]};return t.push(s),t}audioSpecificTrackInfo(e){return[e.info.decoderConfig.description?{id:25506,data:F(e.info.decoderConfig.description)}:null,{id:225,data:[{id:181,data:new le(e.info.sampleRate)},{id:159,data:e.info.numberOfChannels}]}]}subtitleSpecificTrackInfo(e){return[{id:25506,data:_.encode(e.info.config.description)}]}createSegment(){let e={id:408125543,size:this.format._options.streamable?-1:Gt,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 i=this.trackDatas.find(n=>n.track===e);if(i)return i;Ie(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,o)=>n.track.id-o.track.id),s}getAudioTrackData(e,t){let i=this.trackDatas.find(n=>n.track===e);if(i)return i;Oe(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,o)=>n.track.id-o.track.id),s}getSubtitleTrackData(e,t){let i=this.trackDatas.find(n=>n.track===e);if(i)return i;Ve(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,o)=>n.track.id-o.track.id),s}async addEncodedVideoChunk(e,t,i){let s=await this.mutex.acquire();try{let n=this.getVideoTrackData(e,i),o=new Uint8Array(t.byteLength);t.copyTo(o);let a=t.type==="key",c=this.validateAndNormalizeTimestamp(n.track,t.timestamp,a),u=this.createInternalChunk(o,c,(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,i){let s=await this.mutex.acquire();try{let n=this.getAudioTrackData(e,i),o=new Uint8Array(t.byteLength);t.copyTo(o);let a=t.type,c=a==="key",u=this.validateAndNormalizeTimestamp(n.track,t.timestamp,c),l=this.createInternalChunk(o,u,(t.duration??0)/1e6,a);n.chunkQueue.push(l),await this.interleaveChunks()}finally{s()}}async addSubtitleCue(e,t,i){let s=await this.mutex.acquire();try{let n=this.getSubtitleTrackData(e,i),o=this.validateAndNormalizeTimestamp(n.track,1e6*t.timestamp,!0),a=t.text,c=Math.floor(o*1e3);Z.lastIndex=0,a=a.replace(Z,g=>{let C=we(g.slice(1,-1))-c;return`<${Se(C)}>`});let u=_.encode(a),l=`${t.settings??""}
${t.identifier??""}
${t.notes??""}`,f=this.createInternalChunk(u,o,t.duration,"key",l.trim()?_.encode(l):null);n.chunkQueue.push(f),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<t&&(e=s,t=s.chunkQueue[0].timestamp)}if(!e)break;let i=e.chunkQueue.shift();this.writeBlock(e,i)}await this.writer.flush()}fixVP9ColorSpace(e,t){if(t.type!=="key"||!e.info.decoderConfig.colorSpace||!e.info.decoderConfig.colorSpace.matrix)return;let i=0;if(D(t.data,0,2)!==2)return;i+=2;let s=(D(t.data,i+1,i+2)<<1)+D(t.data,i+0,i+1);i+=2,s===3&&i++;let n=D(t.data,i+0,i+1);if(i++,n)return;let o=D(t.data,i+0,i+1);if(i++,o!==0)return;i+=2;let a=D(t.data,i+0,i+24);if(i+=24,a!==4817730)return;s>=2&&i++;let c={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[e.info.decoderConfig.colorSpace.matrix];Tt(t.data,i+0,i+3,c)}createInternalChunk(e,t,i,s,n=null){return{data:e,type:s,timestamp:t,duration:i,additions:n}}writeBlock(e,t){this.segment||(this.createTracks(),this.createSegment());let i=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 f=l.chunkQueue[0];return f&&f.type==="key"});(!this.currentCluster||s&&i-this.currentClusterMsTimestamp>=1e3)&&this.createNewCluster(i);let n=i-this.currentClusterMsTimestamp;if(n<0)return;if(n>=ft)throw new Error(`Current Matroska cluster exceeded its maximum allowed length of ${ft} milliseconds. In order to produce a correct WebM file, you must pass in a key frame at least every ${ft} milliseconds.`);let a=new Uint8Array(4),c=new DataView(a.buffer);c.setUint8(0,128|e.track.id),c.setInt16(1,n,!1);let u=Math.floor(1e3*t.duration);if(u===0&&!t.additions){c.setUint8(3,+(t.type==="key")<<7);let l={id:163,data:[a,t.data]};this.writeEBML(l)}else{let l={id:160,data:[{id:161,data:[a,t.data]},t.type==="delta"?{id:251,data:new me(e.lastWrittenMsTimestamp-i)}: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,i+u),e.lastWrittenMsTimestamp=i,this.trackDatasInCurrentCluster.add(e)}createNewCluster(e){this.currentCluster&&!this.format._options.streamable&&this.finalizeCurrentCluster(),this.currentCluster={id:524531317,size:this.format._options.streamable?-1:Yt,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,Yt),this.writer.seek(t);let i=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:i}]}))]})}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(),i=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.offsets.get(this.segment)+4),this.writeEBMLVarInt(i,Gt),this.segmentDuration.data=new re(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 z=class{},Pe=class extends z{_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 Re(e,this)}},fe=class extends z{_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 Me(e,this)}},K=class extends fe{};var q=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)}},V=class extends q{_connectedTrack=null;_codec;constructor(e){if(super(),!$.includes(e))throw new TypeError(`Invalid video codec '${e}'. Must be one of: ${$.join(", ")}.`);this._codec=e}},ze=class extends V{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)}},mi=5,fi=r=>{if(!r||typeof r!="object")throw new TypeError("Codec config must be an object.");if(!$.includes(r.codec))throw new TypeError(`Invalid video codec '${r.codec}'. Must be one of: ${$.join(", ")}.`);if(!Number.isInteger(r.bitrate)||r.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.");if(r.latencyMode!==void 0&&!["quality","realtime"].includes(r.latencyMode))throw new TypeError("config.latencyMode, when provided, must be 'quality' or 'realtime'.")},he=class{constructor(e,t){this.source=e;this.codecConfig=t;fi(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/mi);this.encoder.encode(e,{keyFrame:t!==this.lastMultipleOfKeyFrameInterval}),this.lastMultipleOfKeyFrameInterval=t,this.encoder.encodeQueueSize>=4&&await new Promise(i=>this.encoder.addEventListener("dequeue",i,{once:!0})),await this.muxer.mutex.currentPromise}ensureEncoder(e){this.encoder||(this.encoder=new VideoEncoder({output:(t,i)=>void this.muxer.addEncodedVideoChunk(this.source._connectedTrack,t,i),error:t=>console.error("Video encode error:",t)}),this.encoder.configure({codec:Ht(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,...jt(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())}},Be=class extends V{_encoder;constructor(e){super(e.codec),this._encoder=new he(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()}},Ue=class extends V{_encoder;_canvas;constructor(e,t){if(!(e instanceof HTMLCanvasElement))throw new TypeError("canvas must be an HTMLCanvasElement.");super(t.codec),this._encoder=new he(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 i=new VideoFrame(this._canvas,{timestamp:Math.round(1e6*e),duration:Math.round(1e6*t),alpha:"discard"}),s=this._encoder.digest(i);return i.close(),s}_flush(){return this._encoder.flush()}},De=class extends V{_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 he(this,t),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),t=new WritableStream({write:i=>{this._encoder.digest(i),i.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(i=>{i instanceof DOMException&&i.name==="AbortError"||console.error("Pipe error:",i)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},R=class extends q{_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}},Fe=class extends R{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)}},hi=r=>{if(!r||typeof r!="object")throw new TypeError("Codec config must be an object.");if(!j.includes(r.codec))throw new TypeError(`Invalid audio codec '${r.codec}'. Must be one of: ${j.join(", ")}.`);if(!Number.isInteger(r.bitrate)||r.bitrate<=0)throw new TypeError("config.bitrate must be a positive integer.")},pe=class{constructor(e,t){this.source=e;this.codecConfig=t;hi(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,i)=>void this.muxer.addEncodedAudioChunk(this.source._connectedTrack,t,i),error:t=>console.error("Audio encode error:",t)}),this.encoder.configure({codec:Qt(this.codecConfig.codec,e.numberOfChannels,e.sampleRate),numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,bitrate:this.codecConfig.bitrate,...Kt(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())}},We=class extends R{_encoder;constructor(e){super(e.codec),this._encoder=new pe(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()}},Ne=class extends R{_encoder;_accumulatedFrameCount=0;constructor(e){super(e.codec),this._encoder=new pe(this,e)}digest(e){if(!(e instanceof AudioBuffer))throw new TypeError("audioBuffer must be an AudioBuffer.");let t=e.numberOfChannels,i=e.sampleRate,s=e.length,n=new Float32Array(t*s);for(let c=0;c<t;c++){let u=e.getChannelData(c);n.set(u,c*s)}let o=new AudioData({format:"f32-planar",sampleRate:i,numberOfFrames:s,numberOfChannels:t,timestamp:Math.round(1e6*this._accumulatedFrameCount/i),data:n}),a=this._encoder.digest(o);return o.close(),this._accumulatedFrameCount+=s,a}_flush(){return this._encoder.flush()}},He=class extends R{_encoder;_abortController=null;_track;_offsetTimestamps=!0;constructor(e,t){if(!(e instanceof MediaStreamTrack)||e.kind!=="audio")throw new TypeError("track must be an audio MediaStreamTrack.");super(t.codec),this._encoder=new pe(this,t),this._track=e}_start(){this._abortController=new AbortController;let e=new MediaStreamTrackProcessor({track:this._track}),t=new WritableStream({write:i=>{this._encoder.digest(i),i.close()}});e.readable.pipeTo(t,{signal:this._abortController.signal}).catch(i=>{i instanceof DOMException&&i.name==="AbortError"||console.error("Pipe error:",i)})}async _flush(){this._abortController&&(this._abortController.abort(),this._abortController=null),await this._encoder.flush()}},X=class extends q{_connectedTrack=null;_codec;constructor(e){if(super(),!de.includes(e))throw new TypeError(`Invalid subtitle codec '${e}'. Must be one of: ${de.join(", ")}.`);this._codec=e}},Le=class extends X{_parser;constructor(e){super(e),this._parser=new Ce({codec:e,output:(t,i)=>this._connectedTrack?.output._muxer.addSubtitleCue(this._connectedTrack,t,i),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 Qe=class{_muxer;_writer;_tracks=[];_started=!1;_finalizing=!1;_mutex=new Y;constructor(e){if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(!(e.format instanceof z))throw new TypeError("options.format must be an OutputFormat.");if(!(e.target instanceof P))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 V))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(i=>!Number.isFinite(i))))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 R))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 X))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,i){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:i};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(i=>i.source._flush());await Promise.all(t),await this._muxer.finalize(),await this._writer.flush(),await this._writer.finalize(),e()}};var ie=class{_sizePromise=null;_getSize(){return this._sizePromise??=this._retrieveSize()}},$e=class extends ie{constructor(t){super();this.buffer=t}async _read(t,i){return new Uint8Array(this.buffer,t,i-t)}async _retrieveSize(){return this.buffer.byteLength}},je=class extends ie{constructor(t){super();this.blob=t}async _read(t,i){let n=await this.blob.slice(t,i).arrayBuffer();return new Uint8Array(n)}async _retrieveSize(){return this.blob.size}};var se=class{input;constructor(e){this.input=e}};var Ke=class{_backing;constructor(e){this._backing=e}isVideoTrack(){return this instanceof be}isAudioTrack(){return this instanceof ke}getDuration(){return this._backing.getDuration()}},be=class extends Ke{_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}},ke=class extends Ke{_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 qe=4096,ne=class{constructor(e,t=1/0){this.source=e;this.maxStorableBytes=t}loadedSegments=[];loadingSegments=[];sourceSizePromise=null;nextAge=0;totalStoredBytes=0;async loadRange(e,t){let i=Math.floor(e/qe)*qe,s=Math.ceil(t/qe)*qe;s=Math.min(s,await this.source._getSize());let n=this.loadingSegments.find(l=>l.start<=i&&l.end>=s);if(n){await n.promise;return}if(this.loadedSegments.some(l=>l.start<=i&&l.end>=s))return;let a=this.source._read(i,s),c={start:i,end:s,promise:a};this.loadingSegments.push(c);let u=await a;_t(this.loadingSegments,c),this.insertIntoLoadedSegments(i,u)}insertIntoLoadedSegments(e,t){let i={start:e,end:e+t.byteLength,bytes:t,view:new DataView(t.buffer),age:this.nextAge++},s=E(this.loadedSegments,e,n=>n.start);(s===-1||this.loadedSegments[s].start<i.start)&&s++,this.loadedSegments.splice(s,0,i),this.totalStoredBytes+=t.byteLength;for(let n=s+1;n<this.loadedSegments.length;n++){let o=this.loadedSegments[n];if(o.start>=i.end)break;i.start<=o.start&&o.end<=i.end&&(this.loadedSegments.splice(n,1),n--)}for(;this.totalStoredBytes>this.maxStorableBytes&&this.loadedSegments.length>1;){let n=null,o=-1;for(let a=0;a<this.loadedSegments.length;a++){let c=this.loadedSegments[a];(!n||c.age<n.age)&&(n=c,o=a)}d(n),this.totalStoredBytes-=n.bytes.byteLength,this.loadedSegments.splice(o,1)}}getViewAndOffset(e,t){let i=E(this.loadedSegments,e,n=>n.start),s=null;if(i!==-1)for(let n=i;n<this.loadedSegments.length;n++){let o=this.loadedSegments[n];if(o.start>e)break;if(t<=o.end){s=o;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}}};var G=class{constructor(e){this.reader=e}pos=0;readRange(e,t){let{view:i,offset:s}=this.reader.getViewAndOffset(e,t);return new Uint8Array(i.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 i=e.getUint16(t,!1),s=e.getUint8(t+2);return i*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:i}=this.reader.getViewAndOffset(this.pos,this.pos+e);this.pos+=e;let s="";for(let n=0;n<e;n++)s+=String.fromCharCode(t.getUint8(i+n));return s}readIsomVariableInteger(){let e=0;for(let t=0;t<4;t++){e<<=7;let i=this.readU8();if(e|=i&127,!(i&128))break}return e}readBoxHeader(){let e=this.readU32(),t=this.readAscii(4),i=8;return e===1&&(e=this.readU64(),i=16),{name:t,totalSize:e,headerSize:i,contentSize:e-i}}};var pi=[M(0),M(90),M(180),M(270)],Xe=class extends se{isobmffReader;currentTrack=null;tracks=[];metadataPromise=null;movieTimescale=-1;movieDurationInTimescale=-1;chunkReader;constructor(e){super(e),this.isobmffReader=new G(e._mainReader),this.chunkReader=new G(new ne(e._source,64*2**20))}async getDuration(){if(await this.readMetadata(),this.movieDurationInTimescale===-1)throw new Error("Could not read movie duration.");return this.movieDurationInTimescale/this.movieTimescale}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())),i=[...new Set(t)];e+=`; codecs="${i.join(", ")}"`}return e}readMetadata(){return this.metadataPromise??=(async()=>{let e=await this.isobmffReader.reader.source._getSize();for(;this.isobmffReader.pos<e;){await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+16);let t=this.isobmffReader.pos,i=this.isobmffReader.readBoxHeader();if(i.name==="moov"){await this.isobmffReader.reader.loadRange(this.isobmffReader.pos,this.isobmffReader.pos+i.contentSize),this.readContiguousBoxes(i.contentSize);return}this.isobmffReader.pos=t+i.totalSize}})()}getSampleTableForTrack(e){if(e.sampleTable)return e.sampleTable;let t={sampleTimingEntries:[],sampleCompositionTimeOffsets:[],sampleSizes:[],keySampleIndices:null,chunkOffsets:[],sampleToChunk:[],presentationTimestamps:[]};e.sampleTable=t,this.isobmffReader.pos=e.sampleTableOffset,this.currentTrack=e,this.traverseBox(),this.currentTrack=null;for(let i of t.sampleTimingEntries)for(let s=0;s<i.count;s++)t.presentationTimestamps.push({presentationTimestamp:i.startDecodeTimestamp+s*i.delta,sampleIndex:i.startIndex+s});for(let i of t.sampleCompositionTimeOffsets)for(let s=0;s<i.count;s++){let n=i.startIndex+s,o=t.presentationTimestamps[n];o&&(o.presentationTimestamp+=i.offset)}return t.presentationTimestamps.sort((i,s)=>i.presentationTimestamp-s.presentationTimestamp),e.sampleTable}readContiguousBoxes(e){let t=this.isobmffReader.pos;for(;this.isobmffReader.pos-t<e;)this.traverseBox()}traverseBox(){let e=this.isobmffReader.pos,t=this.isobmffReader.readBoxHeader(),i=e+t.totalSize;switch(t.name){case"mdia":case"minf":case"dinf":this.readContiguousBoxes(t.contentSize);break;case"mvhd":{let s=this.isobmffReader.readU8();this.isobmffReader.pos+=3,s===1?(this.isobmffReader.pos+=16,this.movieTimescale=this.isobmffReader.readU32(),this.movieDurationInTimescale=this.isobmffReader.readU64()):(this.isobmffReader.pos+=8,this.movieTimescale=this.isobmffReader.readU32(),this.movieDurationInTimescale=this.isobmffReader.readU32())}break;case"trak":{let s={id:-1,demuxer:this,inputTrack:null,info:null,timescale:-1,durationInTimescale:-1,rotation:0,sampleTableOffset:-1,sampleTable:null};if(this.currentTrack=s,this.readContiguousBoxes(t.contentSize),s.id!==-1&&s.timescale!==-1&&s.info!==null){if(s.info.type==="video"&&s.info.codec!==null){let n=s;s.inputTrack=new be(new ht(n)),this.tracks.push(s)}else if(s.info.type==="audio"&&s.info.codec!==null){let n=s;s.inputTrack=new ke(new pt(n)),this.tracks.push(s)}}this.currentTrack=null}break;case"tkhd":{let s=this.currentTrack;d(s);let n=this.isobmffReader.readU8();if(!((this.isobmffReader.readU24()&1)!==0))break;if(n===0)this.isobmffReader.pos+=8,s.id=this.isobmffReader.readU32(),this.isobmffReader.pos+=8;else if(n===1)this.isobmffReader.pos+=16,s.id=this.isobmffReader.readU32(),this.isobmffReader.pos+=12;else throw new Error(`Incorrect track header version ${n}.`);this.isobmffReader.pos+=2*4+2+2+2+2;let c=[];c.push(this.isobmffReader.readFixed_16_16(),this.isobmffReader.readFixed_16_16()),this.isobmffReader.pos+=4,c.push(this.isobmffReader.readFixed_16_16(),this.isobmffReader.readFixed_16_16());let u=pi.findIndex(l=>l.every((f,g)=>f===c[g]));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 o=this.isobmffReader.readU32();for(let a=0;a<o;a++){let c=this.isobmffReader.readBoxHeader();if(s.info.type==="video"){if(c.name==="avc1")s.info.codec="avc";else if(c.name==="hvc1"||c.name==="hev1")s.info.codec="hevc";else{console.warn(`Unsupported video sample entry type ${c.name}.`);break}this.isobmffReader.pos+=6*1+2+2+2+3*4,s.info.width=this.isobmffReader.readU16(),s.info.height=this.isobmffReader.readU16(),this.isobmffReader.pos+=50,this.readContiguousBoxes(e+c.totalSize-this.isobmffReader.pos)}else{if(c.name==="mp4a")s.info.codec="aac";else if(c.name.toLowerCase()==="opus")s.info.codec="opus";else{console.warn(`Unsupported audio sample entry type ${c.name}.`);break}this.isobmffReader.pos+=6*1+2;let u=this.isobmffReader.readU16();this.isobmffReader.pos+=3*2;let l=this.isobmffReader.readU16();this.isobmffReader.pos+=6;let f=this.isobmffReader.readU32()/65536;if(n===0&&u>0){if(u===1)this.isobmffReader.pos+=4*4;else if(u===2){this.isobmffReader.pos+=4,f=this.isobmffReader.readF64(),l=this.isobmffReader.readU32(),this.isobmffReader.pos+=4;let g=this.isobmffReader.readU32(),x=this.isobmffReader.readU32(),C=this.isobmffReader.readU32(),k=this.isobmffReader.readU32()}}s.info.numberOfChannels=l,s.info.sampleRate=f,this.readContiguousBoxes(e+c.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 o=this.isobmffReader.readU16(),a=this.isobmffReader.readU16(),c=this.isobmffReader.readU16(),u=!!(this.isobmffReader.readU8()&128);s.info.colorSpace={primaries:xt[o],transfer:Ct[a],matrix:wt[c],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 o=this.isobmffReader.readU8(),a=(o&128)!==0,c=(o&64)!==0,u=(o&32)!==0;if(a&&(this.isobmffReader.pos+=2),c){let C=this.isobmffReader.readU8();this.isobmffReader.pos+=C}u&&(this.isobmffReader.pos+=2);let l=this.isobmffReader.readU8();d(l===4),this.isobmffReader.readIsomVariableInteger();let f=this.isobmffReader.readU8();d(f===64),this.isobmffReader.pos+=12;let g=this.isobmffReader.readU8();d(g===5);let x=this.isobmffReader.readIsomVariableInteger();s.info.codecDescription=this.isobmffReader.readRange(this.isobmffReader.pos,this.isobmffReader.pos+x)}break;case"stts":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),o=0,a=0;for(let c=0;c<n;c++){let u=this.isobmffReader.readU32(),l=this.isobmffReader.readU32();s.sampleTable.sampleTimingEntries.push({startIndex:o,startDecodeTimestamp:a,count:u,delta:l}),o+=u,a+=u*l}}break;case"ctts":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),o=0;for(let a=0;a<n;a++){let c=this.isobmffReader.readU32(),u=this.isobmffReader.readI32();s.sampleTable.sampleCompositionTimeOffsets.push({startIndex:o,count:c,offset:u}),o+=c}}break;case"stsz":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32(),o=this.isobmffReader.readU32();if(n===0)for(let a=0;a<o;a++){let c=this.isobmffReader.readU32();s.sampleTable.sampleSizes.push(c)}else s.sampleTable.sampleSizes.push(n)}break;case"stz2":throw new Error("Unsupported.");case"stss":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4,s.sampleTable.keySampleIndices=[];let n=this.isobmffReader.readU32();for(let o=0;o<n;o++){let a=this.isobmffReader.readU32()-1;s.sampleTable.keySampleIndices.push(a)}}break;case"stsc":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32();for(let a=0;a<n;a++){let c=this.isobmffReader.readU32()-1,u=this.isobmffReader.readU32(),l=this.isobmffReader.readU32();s.sampleTable.sampleToChunk.push({startSampleIndex:-1,startChunkIndex:c,samplesPerChunk:u,sampleDescriptionIndex:l})}let o=0;for(let a=0;a<s.sampleTable.sampleToChunk.length;a++)if(s.sampleTable.sampleToChunk[a].startSampleIndex=o,a<s.sampleTable.sampleToChunk.length-1){let u=s.sampleTable.sampleToChunk[a+1].startChunkIndex-s.sampleTable.sampleToChunk[a].startChunkIndex;o+=u*s.sampleTable.sampleToChunk[a].samplesPerChunk}}break;case"stco":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32();for(let o=0;o<n;o++){let a=this.isobmffReader.readU32();s.sampleTable.chunkOffsets.push(a)}}break;case"co64":{let s=this.currentTrack;if(d(s),!s.sampleTable)break;this.isobmffReader.pos+=4;let n=this.isobmffReader.readU32();for(let o=0;o<n;o++){let a=this.isobmffReader.readU64();s.sampleTable.chunkOffsets.push(a)}}break}this.isobmffReader.pos=i}},Ge=class{constructor(e){this.internalTrack=e}chunkToSampleIndex=new WeakMap;sampleIndexToChunk=new Map;getCodec(){throw new Error("Not implemented on base class.")}async getDuration(){return this.internalTrack.durationInTimescale/this.internalTrack.timescale}},ht=class extends Ge{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:Lt(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}}async fetchChunkForSampleIndex(e){if(e===-1)return null;let t=this.sampleIndexToChunk.get(e)?.deref();if(t)return t;let i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=bi(i,e);if(!s)return null;await this.internalTrack.demuxer.chunkReader.reader.loadRange(s.chunkOffset,s.chunkOffset+s.chunkSize);let n=this.internalTrack.demuxer.chunkReader.readRange(s.sampleOffset,s.sampleOffset+s.sampleSize),o=new EncodedVideoChunk({data:n,timestamp:1e6*s.presentationTimestamp/this.internalTrack.timescale,duration:1e6*s.duration/this.internalTrack.timescale,type:s.isKeyFrame?"key":"delta"});return this.chunkToSampleIndex.set(o,e),this.sampleIndexToChunk.set(e,new WeakRef(o)),o}async getFirstChunk(){return this.fetchChunkForSampleIndex(0)}async getChunk(e){let t=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),i=Zt(t,e*this.internalTrack.timescale);return this.fetchChunkForSampleIndex(i)}async getNextChunk(e){let t=this.chunkToSampleIndex.get(e);if(t===void 0)throw new Error("Chunk was not created from this track.");return this.fetchChunkForSampleIndex(t+1)}async getKeyChunk(e){let t=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),i=Zt(t,e*this.internalTrack.timescale),s=i===-1?-1:ki(t,i);return this.fetchChunkForSampleIndex(s)}async getNextKeyChunk(e){let t=this.chunkToSampleIndex.get(e);if(t===void 0)throw new Error("Chunk was not created from this track.");let i=this.internalTrack.demuxer.getSampleTableForTrack(this.internalTrack),s=gi(i,t);return this.fetchChunkForSampleIndex(s)}},pt=class extends Ge{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:$t(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}}},Zt=(r,e)=>{let t=E(r.presentationTimestamps,e,i=>i.presentationTimestamp);return t===-1?-1:r.presentationTimestamps[t].sampleIndex},bi=(r,e)=>{let t=E(r.sampleTimingEntries,e,k=>k.startIndex),i=r.sampleTimingEntries[t];if(!i||i.startIndex+i.count<=e)return null;let n=i.startDecodeTimestamp+(e-i.startIndex)*i.delta,o=E(r.sampleCompositionTimeOffsets,e,k=>k.startIndex),a=r.sampleCompositionTimeOffsets[o];a&&(n+=a.offset);let c=r.sampleSizes[Math.min(e,r.sampleSizes.length-1)],u=E(r.sampleToChunk,e,k=>k.startSampleIndex),l=r.sampleToChunk[u];d(l);let f=l.startChunkIndex+Math.floor((e-l.startSampleIndex)/l.samplesPerChunk),g=r.chunkOffsets[f],x=0,C=g;if(r.sampleSizes.length===1)C+=c*(e-l.startSampleIndex),x+=c*l.samplesPerChunk;else{let k=l.startSampleIndex+(f-l.startChunkIndex)*l.samplesPerChunk;for(let S=k;S<k+l.samplesPerChunk;S++){let B=r.sampleSizes[S];S<e&&(C+=B),x+=B}}return{presentationTimestamp:n,duration:i.delta,sampleOffset:C,sampleSize:c,chunkOffset:g,chunkSize:x,isKeyFrame:r.keySampleIndices?vt(r.keySampleIndices,e,k=>k)!==-1:!0}},ki=(r,e)=>{if(!r.keySampleIndices)return e;let t=E(r.keySampleIndices,e,i=>i);return r.keySampleIndices[t]??-1},gi=(r,e)=>{if(!r.keySampleIndices)return e+1;let t=E(r.keySampleIndices,e,i=>i);return r.keySampleIndices[t+1]??-1};var Ye=class extends se{};var Ze=class{},bt=class extends Ze{async _canReadInput(e){if(await e._mainReader.source._getSize()<8)return!1;await e._mainReader.loadRange(4,8);let i=new G(e._mainReader);return i.pos=4,i.readAscii(4)==="ftyp"}_createDemuxer(e){return new Xe(e)}},kt=class extends Ze{async _canReadInput(){return!1}_createDemuxer(e){return new Ye(e)}},ge=new bt,Jt=ge,er=ge,Je=new kt,gt=Je,tr=Je,rr=[ge,gt];var et=class{_source;_formats;_mainReader;_demuxerPromise=null;_format=null;constructor(e){this._formats=e.formats,this._source=e.source,this._mainReader=new ne(e.source)}_getDemuxer(){return this._demuxerPromise??=(async()=>{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 getDuration(){return(await this._getDemuxer()).getDuration()}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 Te=class{constructor(e){this.videoTrack=e}getFirstChunk(){return this.videoTrack._backing.getFirstChunk()}getChunk(e){return this.videoTrack._backing.getChunk(e)}getNextChunk(e){return this.videoTrack._backing.getNextChunk(e)}getKeyChunk(e){return this.videoTrack._backing.getKeyChunk(e)}getNextKeyChunk(e){return this.videoTrack._backing.getNextKeyChunk(e)}async*chunks(e,t=1/0){let i=[],{promise:s,resolve:n}=L(),{promise:o,resolve:a}=L(),c=!1,u=[],l=()=>Math.max(2,u.length);(async()=>{let f=e??await this.getFirstChunk();for(;f&&!c&&!(f.timestamp/1e6>=t);){if(i.length>l()){({promise:o,resolve:a}=L()),await o;continue}i.push(f),n(),{promise:s,resolve:n}=L(),f=await this.getNextChunk(f)}c=!0,n()})();try{for(;;)if(i.length>0){yield i.shift();let f=performance.now();for(u.push(f);u.length>0&&f-u[0]>=1e3;)u.shift();a()}else if(!c)await s;else break}finally{c=!0,a()}}},tt=class{constructor(e){this.videoTrack=e}decoderConfig=null;async createDecoder(e){this.decoderConfig||(this.decoderConfig=await this.videoTrack.getDecoderConfig());let t=new VideoDecoder({output:e,error:i=>console.error(i)});return t.configure(this.decoderConfig),t}async getKeyFrame(e){let t=null,i=await this.createDecoder(n=>t=n),s=await this.videoTrack._backing.getKeyChunk(e);return s?(i.decode(s),await i.flush(),i.close(),t):null}async getFrame(e){let t=null,i=await this.createDecoder(a=>{a.timestamp/1e6<=e?(t?.close(),t=a):a.close()}),s=await this.videoTrack._backing.getKeyChunk(e);if(!s)return null;let n=await this.videoTrack._backing.getChunk(e);d(n),i.decode(s);let o=s;for(;o!==n;){let a=await this.videoTrack._backing.getNextChunk(o);d(a),o=a,i.decode(a),i.decodeQueueSize>=10&&await new Promise(c=>i.addEventListener("dequeue",c,{once:!0}))}return await i.flush(),i.close(),t}async*frames(e=0,t=1/0){let i=[],s=!1,n=null,{promise:o,resolve:a}=L(),c=!1,u=await this.createDecoder(g=>{let x=g.timestamp/1e6;if(x>=t&&(c=!0),c){g.close();return}n&&(x>e?(i.push(n),s=!0):n.close()),x>=e&&(i.push(g),s=!0),n=s?null:g,i.length>0&&(a(),{promise:o,resolve:a}=L())}),l=await this.videoTrack._backing.getKeyChunk(e)??await this.videoTrack._backing.getFirstChunk();if(!l)return;let f=!1;(async()=>{let g=l,x=1/0;if(t<1/0){let S=await this.videoTrack._backing.getChunk(t),B=S?S.type==="key"&&S.timestamp/1e6===t?S:await this.videoTrack._backing.getNextKeyChunk(S):null;B&&(x=B.timestamp/1e6)}let k=new Te(this.videoTrack).chunks(l,x);for(await k.next();g&&!c;){u.decode(g),u.decodeQueueSize>=10&&await new Promise(B=>u.addEventListener("dequeue",B,{once:!0}));let S=await k.next();if(S.done)break;g=S.value}await k.return(),await u.flush(),u.close(),!s&&n&&i.push(n),f=!0,a()})();try{for(;;)if(i.length>0)yield i.shift();else if(!f)await o;else break}finally{c=!0}}};return cr(Ti);})();
if (typeof module === "object" && typeof module.exports === "object") Object.assign(module.exports, Metamuxer)