@mediafox/core 1.2.2 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -36,6 +36,10 @@ export declare class Compositor {
36
36
  private lastFrameTime;
37
37
  private previewOptions;
38
38
  private disposed;
39
+ private renderBuffers;
40
+ private lastTimeUpdateEmit;
41
+ private timeUpdateThrottleMs;
42
+ private renderPending;
39
43
  /**
40
44
  * Creates a new Compositor instance.
41
45
  * @param options - Configuration options for the compositor
@@ -1 +1 @@
1
- {"version":3,"file":"compositor.d.ts","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compositor.d.ts","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"source-pool.d.ts","sourceRoot":"","sources":["../../src/compositor/source-pool.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAc,MAAM,SAAS,CAAC;AAuIrF,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAK;gBAEP,YAAY,CAAC,EAAE,YAAY;IAIvC,OAAO,CAAC,UAAU;IAIZ,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8ChG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwBlE,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoCtG,OAAO,CAAC,WAAW;IA0BnB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAInD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAUjC,aAAa,IAAI,gBAAgB,EAAE;IAInC,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;CAOhB"}
1
+ {"version":3,"file":"source-pool.d.ts","sourceRoot":"","sources":["../../src/compositor/source-pool.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAc,MAAM,SAAS,CAAC;AAiLrF,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAK;gBAEP,YAAY,CAAC,EAAE,YAAY;IAIvC,OAAO,CAAC,UAAU;IAIZ,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiEhG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwBlE,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoCtG,OAAO,CAAC,WAAW;IA0BnB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAInD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI9B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAUjC,aAAa,IAAI,gBAAgB,EAAE;IAInC,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;CAOhB"}
@@ -3,11 +3,13 @@ export declare class EventEmitter<EventMap extends Record<string, unknown>> impl
3
3
  private events;
4
4
  private maxListeners;
5
5
  private captureRejections;
6
+ private emitCache;
6
7
  constructor(options?: EventEmitterOptions);
7
8
  on<K extends keyof EventMap>(event: K, listener: (data: EventMap[K]) => void): UnsubscribeFn;
8
9
  once<K extends keyof EventMap>(event: K, listener: (data: EventMap[K]) => void): UnsubscribeFn;
9
10
  off<K extends keyof EventMap>(event: K, listener?: (data: EventMap[K]) => void): void;
10
11
  emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void;
12
+ private handlePromiseRejection;
11
13
  removeAllListeners<K extends keyof EventMap>(event?: K): void;
12
14
  setMaxListeners(n: number): void;
13
15
  getMaxListeners(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,iBAAiB,CAAC,QAAQ,CAAC;IACxG,OAAO,CAAC,MAAM,CAAiF;IAC/F,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAU;gBAEvB,OAAO,GAAE,mBAAwB;IAK7C,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa;IAwB5F,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa;IAS9F,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAYrF,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IA2BjE,kBAAkB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAQ7D,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC,eAAe,IAAI,MAAM;IAIzB,SAAS,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAKjF,aAAa,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAKzD,UAAU,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC;CAGpC"}
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,iBAAiB,CAAC,QAAQ,CAAC;IACxG,OAAO,CAAC,MAAM,CAAiF;IAC/F,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAU;IAEnC,OAAO,CAAC,SAAS,CAAuD;gBAE5D,OAAO,GAAE,mBAAwB;IAK7C,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa;IAwB5F,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa;IAS9F,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAYrF,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IA+BjE,OAAO,CAAC,sBAAsB;IAW9B,kBAAkB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAQ7D,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC,eAAe,IAAI,MAAM;IAIzB,SAAS,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAKjF,aAAa,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAKzD,UAAU,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC;CAGpC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- class H{events=new Map;maxListeners;captureRejections;constructor($={}){this.maxListeners=$.maxListeners??10,this.captureRejections=$.captureRejections??!1}on($,A){if(!this.events.has($))this.events.set($,new Set);let O=this.events.get($);if(!O)return()=>{};if(O.size>=this.maxListeners)console.warn(`MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ${O.size} ${String($)} listeners added. Use emitter.setMaxListeners() to increase limit`);let J=A;return O.add(J),()=>{O.delete(J)}}once($,A){let O=(J)=>{this.off($,O),A(J)};return this.on($,O)}off($,A){let O=this.events.get($);if(!O)return;if(A){let J=A;O.delete(J)}else O.clear()}emit($,A){let O=this.events.get($);if(!O||O.size===0)return;for(let J of O)try{let Q=J(A);if(this.captureRejections&&_$(Q))Q.catch((Z)=>{if(this.events.has("error"))this.emit("error",Z);else throw Z})}catch(Q){if(this.captureRejections&&this.events.has("error"))this.emit("error",Q);else throw Q}}removeAllListeners($){if($)this.events.delete($);else this.events.clear()}setMaxListeners($){this.maxListeners=$}getMaxListeners(){return this.maxListeners}listeners($){let A=this.events.get($);return A?Array.from(A):[]}listenerCount($){let A=this.events.get($);return A?A.size:0}eventNames(){return Array.from(this.events.keys())}}function _$($){if(!$||typeof $!=="object"&&typeof $!=="function")return!1;let A=$;return typeof A.then==="function"&&typeof A.catch==="function"}import{ALL_FORMATS as D$,BlobSource as M$,BufferSource as E$,CanvasSink as S$,FilePathSource as F$,Input as R$,ReadableStreamSource as P$,UrlSource as W$}from"mediabunny";class V${id;type="video";duration;width;height;data;disposed=!1;cacheSize=30;constructor($,A,O,J,Q){this.id=$,this.data=A,this.duration=O,this.width=J,this.height=Q}async getFrameAt($){if(this.disposed)return null;let A=Math.floor($*1000),O=this.data.frameCache.get(A);if(O)return O.canvas;try{let J=await this.data.canvasSink.getCanvas($);if(!J)return null;if(this.data.frameCache.size>=this.cacheSize){let Q=this.data.frameCache.keys().next().value;if(Q!==void 0)this.data.frameCache.delete(Q)}return this.data.frameCache.set(A,J),J.canvas}catch{return null}}clearCache(){this.data.frameCache.clear()}dispose(){if(this.disposed)return;this.disposed=!0,this.data.frameCache.clear(),this.data.input.dispose()}}class G${id;type="image";duration=1/0;width;height;data;disposed=!1;constructor($,A){this.id=$,this.data=A,this.width=A.image.width,this.height=A.image.height}async getFrameAt($){if(this.disposed)return null;return this.data.image}dispose(){if(this.disposed)return;if(this.disposed=!0,"close"in this.data.image)this.data.image.close()}}class X${id;type="audio";duration;width=0;height=0;data;disposed=!1;constructor($,A,O){this.id=$,this.data=A,this.duration=O}async getFrameAt($){return null}dispose(){if(this.disposed)return;this.disposed=!0,this.data.input.dispose()}}class f{sources=new Map;audioContext=null;nextId=0;constructor($){this.audioContext=$??null}generateId(){return`source_${this.nextId++}`}async loadVideo($,A={}){let O=A.id??this.generateId(),J=await this.createInput($),Q=await J.getVideoTracks();if(Q.length===0)throw J.dispose(),Error("Source has no video track");let Z=Q[0];if(!await Z.canDecode())throw J.dispose(),Error(`Cannot decode video track with codec: ${Z.codec}`);let K=new S$(Z,{poolSize:2}),G=await Z.computeDuration(),V=new V$(O,{input:J,videoTrack:Z,canvasSink:K,frameCache:new Map},G,Z.displayWidth,Z.displayHeight);return this.sources.set(O,V),V}async loadImage($){let A=this.generateId(),O;if(typeof $!=="string")O=await createImageBitmap($);else O=await new Promise((Q,Z)=>{let j=new Image;j.onload=()=>Q(j),j.onerror=()=>Z(Error(`Failed to load image: ${$}`)),j.crossOrigin="anonymous",j.src=$});let J=new G$(A,{image:O});return this.sources.set(A,J),J}async loadAudio($,A={}){let O=A.id??this.generateId();if(!this.audioContext)this.audioContext=new AudioContext;let J=await this.createInput($),Q=await J.getAudioTracks();if(Q.length===0)throw J.dispose(),Error("Source has no audio track");let Z=Q[0],j=await Z.computeDuration(),K=new X$(O,{input:J,audioTrack:Z,audioContext:this.audioContext},j);return this.sources.set(O,K),K}createInput($){let A;if($ instanceof File||$ instanceof Blob)A=new M$($);else if($ instanceof ArrayBuffer||$ instanceof Uint8Array)A=new E$($);else if(typeof $==="string"||$ instanceof URL){let O=$ instanceof URL?$.href:$;if(typeof window>"u"&&!O.startsWith("http"))A=new F$(O);else A=new W$(O)}else if(typeof ReadableStream<"u"&&$ instanceof ReadableStream)A=new P$($);else throw Error("Unsupported source type");return new R$({source:A,formats:D$})}getSource($){return this.sources.get($)}hasSource($){return this.sources.has($)}unloadSource($){let A=this.sources.get($);if(A)return A.dispose(),this.sources.delete($),!0;return!1}getAllSources(){return Array.from(this.sources.values())}clear(){for(let $ of this.sources.values())$.dispose();this.sources.clear()}dispose(){if(this.clear(),this.audioContext&&this.audioContext.state!=="closed")this.audioContext.close();this.audioContext=null}}class r{canvas;ctx=null;width;height;backgroundColor;sourcePool;emitter;state;animationFrameId=null;lastFrameTime=0;previewOptions=null;disposed=!1;constructor($){if(this.canvas=$.canvas,this.width=$.width??(this.canvas.width||1920),this.height=$.height??(this.canvas.height||1080),this.backgroundColor=$.backgroundColor??"#000000",this.sourcePool=new f,this.emitter=new H({maxListeners:50}),this.state={playing:!1,currentTime:0,duration:0,seeking:!1},this.canvas.width=this.width,this.canvas.height=this.height,this.ctx=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),!this.ctx)throw Error("Failed to get 2D context for compositor canvas");this.clear()}async loadSource($,A){this.checkDisposed();let O=await this.sourcePool.loadVideo($,A);return this.emitter.emit("sourceloaded",{id:O.id,source:O}),O}async loadImage($){this.checkDisposed();let A=await this.sourcePool.loadImage($);return this.emitter.emit("sourceloaded",{id:A.id,source:A}),A}async loadAudio($,A){this.checkDisposed();let O=await this.sourcePool.loadAudio($,A);return this.emitter.emit("sourceloaded",{id:O.id,source:O}),O}unloadSource($){let A=this.sourcePool.unloadSource($);if(A)this.emitter.emit("sourceunloaded",{id:$});return A}getSource($){return this.sourcePool.getSource($)}getAllSources(){return this.sourcePool.getAllSources()}async render($){if(this.checkDisposed(),!this.ctx)return!1;let A=[...$.layers].sort((Q,Z)=>(Q.zIndex??0)-(Z.zIndex??0)),O=[],J=A.filter((Q)=>Q.visible!==!1).map(async(Q)=>{let Z=Q.sourceTime??$.time,j=await Q.source.getFrameAt(Z);if(j)O.push({layer:Q,image:j})});await Promise.all(J),O.sort((Q,Z)=>(Q.layer.zIndex??0)-(Z.layer.zIndex??0)),this.ctx.fillStyle=this.backgroundColor,this.ctx.fillRect(0,0,this.width,this.height);for(let{layer:Q,image:Z}of O)this.renderLayer(Z,Q);return!0}renderLayer($,A){if(!this.ctx)return;let O=A.transform??{},J=A.source.width??this.width,Q=A.source.height??this.height,Z=O.width??J,j=O.height??Q,K=O.x??0,G=O.y??0,V=O.rotation??0,X=O.scaleX??1,U=O.scaleY??1,z=O.opacity??1,N=O.anchorX??0.5,Y=O.anchorY??0.5;if(this.ctx.save(),this.ctx.globalAlpha=z,this.ctx.translate(K+Z*N,G+j*Y),V!==0)this.ctx.rotate(V*Math.PI/180);if(X!==1||U!==1)this.ctx.scale(X,U);this.ctx.drawImage($,-Z*N,-j*Y,Z,j),this.ctx.restore()}clear(){if(!this.ctx)return;this.ctx.fillStyle=this.backgroundColor,this.ctx.fillRect(0,0,this.width,this.height)}preview($){this.checkDisposed(),this.previewOptions=$,this.state.duration=$.duration,this.emitter.emit("compositionchange",void 0)}async play(){if(this.checkDisposed(),this.state.playing)return;if(!this.previewOptions)throw Error("No preview configured. Call preview() first.");this.state.playing=!0,this.lastFrameTime=performance.now(),this.emitter.emit("play",void 0),this.startRenderLoop()}pause(){if(this.checkDisposed(),!this.state.playing)return;this.state.playing=!1,this.stopRenderLoop(),this.emitter.emit("pause",void 0)}async seek($){if(this.checkDisposed(),!this.previewOptions)return;let A=Math.max(0,Math.min($,this.state.duration));this.state.seeking=!0,this.emitter.emit("seeking",{time:A}),this.state.currentTime=A;let O=this.previewOptions.getComposition(A);await this.render(O),this.state.seeking=!1,this.emitter.emit("seeked",{time:A}),this.emitter.emit("timeupdate",{currentTime:A})}startRenderLoop(){if(this.animationFrameId!==null)return;let $=async()=>{if(!this.state.playing||!this.previewOptions)return;let A=performance.now(),O=(A-this.lastFrameTime)/1000;if(this.lastFrameTime=A,this.state.currentTime+=O,this.state.currentTime>=this.state.duration)if(this.previewOptions.loop)this.state.currentTime=0;else{this.state.currentTime=this.state.duration,this.pause(),this.emitter.emit("ended",void 0);return}let J=this.previewOptions.getComposition(this.state.currentTime);if(await this.render(J),this.emitter.emit("timeupdate",{currentTime:this.state.currentTime}),this.state.playing)this.animationFrameId=requestAnimationFrame(()=>$())};this.animationFrameId=requestAnimationFrame(()=>$())}stopRenderLoop(){if(this.animationFrameId!==null)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null}async exportFrame($,A={}){if(this.checkDisposed(),!this.previewOptions)return null;let O=this.previewOptions.getComposition($);if(await this.render(O),"toBlob"in this.canvas)return new Promise((J)=>{this.canvas.toBlob((Q)=>J(Q),`image/${A.format??"png"}`,A.quality)});else return this.canvas.convertToBlob({type:`image/${A.format??"png"}`,quality:A.quality})}get currentTime(){return this.state.currentTime}get duration(){return this.state.duration}get playing(){return this.state.playing}get paused(){return!this.state.playing}get seeking(){return this.state.seeking}getWidth(){return this.width}getHeight(){return this.height}resize($,A){this.checkDisposed(),this.width=$,this.height=A,this.canvas.width=$,this.canvas.height=A,this.clear()}on($,A){return this.emitter.on($,A)}once($,A){return this.emitter.once($,A)}off($,A){this.emitter.off($,A)}checkDisposed(){if(this.disposed)throw Error("Compositor has been disposed")}dispose(){if(this.disposed)return;this.disposed=!0,this.stopRenderLoop(),this.sourcePool.dispose(),this.emitter.removeAllListeners(),this.ctx=null,this.previewOptions=null}}import{CanvasSink as H$,VideoSampleSink as C$}from"mediabunny";class M{canvas;ctx=null;isInitialized=!1;rotation=0;constructor($){this.canvas=$.canvas,this.rotation=$.rotation??0,this.initialize()}initialize(){try{if(this.ctx=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),!this.ctx)return!1;return this.ctx.imageSmoothingEnabled=!0,this.ctx.imageSmoothingQuality="high",this.isInitialized=!0,!0}catch{return!1}}isReady(){return this.isInitialized&&this.ctx!==null}render($){if(!this.isReady()||!this.ctx)return!1;try{let{width:A,height:O}=$;if(A===0||O===0)return!1;let J=this.canvas.width,Q=this.canvas.height;if(J===0||Q===0)return!1;let Z=this.rotation===90||this.rotation===270,j=Z?O:A,K=Z?A:O,G=Math.min(J/j,Q/K),V=Math.round(j*G),X=Math.round(K*G),U=Math.round((J-V)/2),z=Math.round((Q-X)/2);if(this.ctx.fillStyle="black",this.ctx.fillRect(0,0,J,Q),this.ctx.save(),this.ctx.translate(U+V/2,z+X/2),this.rotation!==0)this.ctx.rotate(this.rotation*Math.PI/180);if(Z)this.ctx.drawImage($,0,0,A,O,-X/2,-V/2,X,V);else this.ctx.drawImage($,0,0,A,O,-V/2,-X/2,V,X);return this.ctx.restore(),!0}catch{return!1}}clear(){if(!this.isReady()||!this.ctx)return;this.ctx.fillStyle="black",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height)}setRotation($){this.rotation=$}getRotation(){return this.rotation}dispose(){this.ctx=null,this.isInitialized=!1}}class e{resources;isInitialized=!1;canvas;textureWidth=0;textureHeight=0;options;boundHandleContextLost=null;boundHandleContextRestored=null;rotation=0;vertexShaderSource=`
1
+ class f{events=new Map;maxListeners;captureRejections;emitCache=[];constructor($={}){this.maxListeners=$.maxListeners??10,this.captureRejections=$.captureRejections??!1}on($,A){if(!this.events.has($))this.events.set($,new Set);let J=this.events.get($);if(!J)return()=>{};if(J.size>=this.maxListeners)console.warn(`MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ${J.size} ${String($)} listeners added. Use emitter.setMaxListeners() to increase limit`);let K=A;return J.add(K),()=>{J.delete(K)}}once($,A){let J=(K)=>{this.off($,J),A(K)};return this.on($,J)}off($,A){let J=this.events.get($);if(!J)return;if(A){let K=A;J.delete(K)}else J.clear()}emit($,A){let J=this.events.get($);if(!J||J.size===0)return;let K=this.emitCache;K.length=0;for(let Q of J)K.push(Q);for(let Q=0;Q<K.length;Q++){let Z=K[Q];try{let O=Z(A);if(this.captureRejections&&N$(O))this.handlePromiseRejection(O)}catch(O){if(this.captureRejections&&this.events.has("error"))this.emit("error",O);else throw O}}}handlePromiseRejection($){$.catch((A)=>{if(this.events.has("error"))this.emit("error",A);else throw A})}removeAllListeners($){if($)this.events.delete($);else this.events.clear()}setMaxListeners($){this.maxListeners=$}getMaxListeners(){return this.maxListeners}listeners($){let A=this.events.get($);return A?Array.from(A):[]}listenerCount($){let A=this.events.get($);return A?A.size:0}eventNames(){return Array.from(this.events.keys())}}function N$($){if(!$||typeof $!=="object"&&typeof $!=="function")return!1;let A=$;return typeof A.then==="function"&&typeof A.catch==="function"}import{ALL_FORMATS as z$,BlobSource as L$,BufferSource as _$,CanvasSink as D$,FilePathSource as q$,Input as E$,ReadableStreamSource as M$,UrlSource as F$}from"mediabunny";class Q${cache=new Map;maxSize;constructor($){this.maxSize=$}get($){let A=this.cache.get($);if(A!==void 0)this.cache.delete($),this.cache.set($,A);return A}set($,A){if(this.cache.has($))this.cache.delete($);else if(this.cache.size>=this.maxSize){let J=this.cache.keys().next().value;if(J!==void 0)this.cache.delete(J)}this.cache.set($,A)}clear(){this.cache.clear()}get size(){return this.cache.size}}class Z${id;type="video";duration;width;height;data;disposed=!1;constructor($,A,J,K,Q){this.id=$,this.data=A,this.duration=J,this.width=K,this.height=Q}async getFrameAt($){if(this.disposed)return null;let A=this.data.frameIntervalMs,J=Math.floor($*1000/A)*A,K=this.data.frameCache.get(J);if(K)return K.canvas;try{let Q=await this.data.canvasSink.getCanvas($);if(!Q)return null;return this.data.frameCache.set(J,Q),Q.canvas}catch{return null}}clearCache(){this.data.frameCache.clear()}dispose(){if(this.disposed)return;this.disposed=!0,this.data.frameCache.clear(),this.data.input.dispose()}}class O${id;type="image";duration=1/0;width;height;data;disposed=!1;constructor($,A){this.id=$,this.data=A,this.width=A.image.width,this.height=A.image.height}async getFrameAt($){if(this.disposed)return null;return this.data.image}dispose(){if(this.disposed)return;if(this.disposed=!0,"close"in this.data.image)this.data.image.close()}}class j${id;type="audio";duration;width=0;height=0;data;disposed=!1;constructor($,A,J){this.id=$,this.data=A,this.duration=J}async getFrameAt($){return null}dispose(){if(this.disposed)return;this.disposed=!0,this.data.input.dispose()}}class x{sources=new Map;audioContext=null;nextId=0;constructor($){this.audioContext=$??null}generateId(){return`source_${this.nextId++}`}async loadVideo($,A={}){let J=A.id??this.generateId(),K=await this.createInput($),Q=await K.getVideoTracks();if(Q.length===0)throw K.dispose(),Error("Source has no video track");let Z=Q[0];if(!await Z.canDecode())throw K.dispose(),Error(`Cannot decode video track with codec: ${Z.codec}`);let j=new D$(Z,{poolSize:4}),G=await Z.computeDuration(),V=30;try{let _=await Z.computePacketStats(100);if(_.averagePacketRate>0)V=_.averagePacketRate}catch{}let X=1000/V,Y=Z.displayWidth*Z.displayHeight,U=Y>2073600?15:Y>921600?30:60,D=new Z$(J,{input:K,videoTrack:Z,canvasSink:j,frameCache:new Q$(U),frameIntervalMs:X},G,Z.displayWidth,Z.displayHeight);return this.sources.set(J,D),D}async loadImage($){let A=this.generateId(),J;if(typeof $!=="string")J=await createImageBitmap($);else J=await new Promise((Q,Z)=>{let O=new Image;O.onload=()=>Q(O),O.onerror=()=>Z(Error(`Failed to load image: ${$}`)),O.crossOrigin="anonymous",O.src=$});let K=new O$(A,{image:J});return this.sources.set(A,K),K}async loadAudio($,A={}){let J=A.id??this.generateId();if(!this.audioContext)this.audioContext=new AudioContext;let K=await this.createInput($),Q=await K.getAudioTracks();if(Q.length===0)throw K.dispose(),Error("Source has no audio track");let Z=Q[0],O=await Z.computeDuration(),j=new j$(J,{input:K,audioTrack:Z,audioContext:this.audioContext},O);return this.sources.set(J,j),j}createInput($){let A;if($ instanceof File||$ instanceof Blob)A=new L$($);else if($ instanceof ArrayBuffer||$ instanceof Uint8Array)A=new _$($);else if(typeof $==="string"||$ instanceof URL){let J=$ instanceof URL?$.href:$;if(typeof window>"u"&&!J.startsWith("http"))A=new q$(J);else A=new F$(J)}else if(typeof ReadableStream<"u"&&$ instanceof ReadableStream)A=new M$($);else throw Error("Unsupported source type");return new E$({source:A,formats:z$})}getSource($){return this.sources.get($)}hasSource($){return this.sources.has($)}unloadSource($){let A=this.sources.get($);if(A)return A.dispose(),this.sources.delete($),!0;return!1}getAllSources(){return Array.from(this.sources.values())}clear(){for(let $ of this.sources.values())$.dispose();this.sources.clear()}dispose(){if(this.clear(),this.audioContext&&this.audioContext.state!=="closed")this.audioContext.close();this.audioContext=null}}class n{canvas;ctx=null;width;height;backgroundColor;sourcePool;emitter;state;animationFrameId=null;lastFrameTime=0;previewOptions=null;disposed=!1;renderBuffers={frameData:[],visibleLayers:[]};lastTimeUpdateEmit=0;timeUpdateThrottleMs=100;renderPending=!1;constructor($){if(this.canvas=$.canvas,this.width=$.width??(this.canvas.width||1920),this.height=$.height??(this.canvas.height||1080),this.backgroundColor=$.backgroundColor??"#000000",this.sourcePool=new x,this.emitter=new f({maxListeners:50}),this.state={playing:!1,currentTime:0,duration:0,seeking:!1},this.canvas.width=this.width,this.canvas.height=this.height,this.ctx=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),!this.ctx)throw Error("Failed to get 2D context for compositor canvas");this.clear()}async loadSource($,A){this.checkDisposed();let J=await this.sourcePool.loadVideo($,A);return this.emitter.emit("sourceloaded",{id:J.id,source:J}),J}async loadImage($){this.checkDisposed();let A=await this.sourcePool.loadImage($);return this.emitter.emit("sourceloaded",{id:A.id,source:A}),A}async loadAudio($,A){this.checkDisposed();let J=await this.sourcePool.loadAudio($,A);return this.emitter.emit("sourceloaded",{id:J.id,source:J}),J}unloadSource($){let A=this.sourcePool.unloadSource($);if(A)this.emitter.emit("sourceunloaded",{id:$});return A}getSource($){return this.sourcePool.getSource($)}getAllSources(){return this.sourcePool.getAllSources()}async render($){if(this.checkDisposed(),!this.ctx)return!1;let{frameData:A,visibleLayers:J}=this.renderBuffers;A.length=0,J.length=0;for(let Q=0;Q<$.layers.length;Q++){let Z=$.layers[Q];if(Z.visible!==!1)J.push(Z)}J.sort((Q,Z)=>(Q.zIndex??0)-(Z.zIndex??0));let K=[];for(let Q=0;Q<J.length;Q++){let Z=J[Q],O=Q;K.push((async()=>{let j=Z.sourceTime??$.time,G=await Z.source.getFrameAt(j);if(G)A[O]={layer:Z,image:G}})())}await Promise.all(K),this.ctx.fillStyle=this.backgroundColor,this.ctx.fillRect(0,0,this.width,this.height);for(let Q=0;Q<A.length;Q++){let Z=A[Q];if(Z)this.renderLayer(Z.image,Z.layer)}return!0}renderLayer($,A){if(!this.ctx)return;let J=A.transform,K=A.source.width??this.width,Q=A.source.height??this.height;if(!J){this.ctx.drawImage($,0,0,K,Q);return}let Z=J.width??K,O=J.height??Q,j=J.x??0,G=J.y??0,V=J.rotation??0,X=J.scaleX??1,Y=J.scaleY??1,U=J.opacity??1,D=U!==1;if(!D&&!(V!==0||X!==1||Y!==1)){this.ctx.drawImage($,j,G,Z,O);return}let E=J.anchorX??0.5,M=J.anchorY??0.5;if(this.ctx.save(),D)this.ctx.globalAlpha=U;if(this.ctx.translate(j+Z*E,G+O*M),V!==0)this.ctx.rotate(V*Math.PI/180);if(X!==1||Y!==1)this.ctx.scale(X,Y);this.ctx.drawImage($,-Z*E,-O*M,Z,O),this.ctx.restore()}clear(){if(!this.ctx)return;this.ctx.fillStyle=this.backgroundColor,this.ctx.fillRect(0,0,this.width,this.height)}preview($){this.checkDisposed(),this.previewOptions=$,this.state.duration=$.duration,this.emitter.emit("compositionchange",void 0)}async play(){if(this.checkDisposed(),this.state.playing)return;if(!this.previewOptions)throw Error("No preview configured. Call preview() first.");this.state.playing=!0,this.lastFrameTime=performance.now(),this.emitter.emit("play",void 0),this.startRenderLoop()}pause(){if(this.checkDisposed(),!this.state.playing)return;this.state.playing=!1,this.stopRenderLoop(),this.emitter.emit("pause",void 0)}async seek($){if(this.checkDisposed(),!this.previewOptions)return;let A=Math.max(0,Math.min($,this.state.duration));this.state.seeking=!0,this.emitter.emit("seeking",{time:A}),this.state.currentTime=A;let J=this.previewOptions.getComposition(A);await this.render(J),this.state.seeking=!1,this.emitter.emit("seeked",{time:A}),this.emitter.emit("timeupdate",{currentTime:A})}startRenderLoop(){if(this.animationFrameId!==null)return;let $=()=>{if(!this.state.playing||!this.previewOptions)return;this.animationFrameId=requestAnimationFrame($);let A=performance.now(),J=(A-this.lastFrameTime)/1000;if(this.lastFrameTime=A,this.state.currentTime+=J,this.state.currentTime>=this.state.duration)if(this.previewOptions.loop)this.state.currentTime=0;else{this.state.currentTime=this.state.duration,this.pause(),this.emitter.emit("ended",void 0);return}if(this.renderPending)return;this.renderPending=!0;let K=this.previewOptions.getComposition(this.state.currentTime);if(this.render(K).catch(()=>{}).finally(()=>{this.renderPending=!1}),A-this.lastTimeUpdateEmit>=this.timeUpdateThrottleMs)this.lastTimeUpdateEmit=A,this.emitter.emit("timeupdate",{currentTime:this.state.currentTime})};this.animationFrameId=requestAnimationFrame($)}stopRenderLoop(){if(this.animationFrameId!==null)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null}async exportFrame($,A={}){if(this.checkDisposed(),!this.previewOptions)return null;let J=this.previewOptions.getComposition($);if(await this.render(J),"toBlob"in this.canvas)return new Promise((K)=>{this.canvas.toBlob((Q)=>K(Q),`image/${A.format??"png"}`,A.quality)});else return this.canvas.convertToBlob({type:`image/${A.format??"png"}`,quality:A.quality})}get currentTime(){return this.state.currentTime}get duration(){return this.state.duration}get playing(){return this.state.playing}get paused(){return!this.state.playing}get seeking(){return this.state.seeking}getWidth(){return this.width}getHeight(){return this.height}resize($,A){this.checkDisposed(),this.width=$,this.height=A,this.canvas.width=$,this.canvas.height=A,this.clear()}on($,A){return this.emitter.on($,A)}once($,A){return this.emitter.once($,A)}off($,A){this.emitter.off($,A)}checkDisposed(){if(this.disposed)throw Error("Compositor has been disposed")}dispose(){if(this.disposed)return;this.disposed=!0,this.stopRenderLoop(),this.sourcePool.dispose(),this.emitter.removeAllListeners(),this.ctx=null,this.previewOptions=null}}import{CanvasSink as S$,VideoSampleSink as R$}from"mediabunny";class H{canvas;ctx=null;isInitialized=!1;rotation=0;constructor($){this.canvas=$.canvas,this.rotation=$.rotation??0,this.initialize()}initialize(){try{if(this.ctx=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),!this.ctx)return!1;return this.ctx.imageSmoothingEnabled=!0,this.ctx.imageSmoothingQuality="high",this.isInitialized=!0,!0}catch{return!1}}isReady(){return this.isInitialized&&this.ctx!==null}render($){if(!this.isReady()||!this.ctx)return!1;try{let{width:A,height:J}=$;if(A===0||J===0)return!1;let K=this.canvas.width,Q=this.canvas.height;if(K===0||Q===0)return!1;let Z=this.rotation===90||this.rotation===270,O=Z?J:A,j=Z?A:J,G=Math.min(K/O,Q/j),V=Math.round(O*G),X=Math.round(j*G),Y=Math.round((K-V)/2),U=Math.round((Q-X)/2);if(this.ctx.fillStyle="black",this.ctx.fillRect(0,0,K,Q),this.ctx.save(),this.ctx.translate(Y+V/2,U+X/2),this.rotation!==0)this.ctx.rotate(this.rotation*Math.PI/180);if(Z)this.ctx.drawImage($,0,0,A,J,-X/2,-V/2,X,V);else this.ctx.drawImage($,0,0,A,J,-V/2,-X/2,V,X);return this.ctx.restore(),!0}catch{return!1}}clear(){if(!this.isReady()||!this.ctx)return;this.ctx.fillStyle="black",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height)}setRotation($){this.rotation=$}getRotation(){return this.rotation}dispose(){this.ctx=null,this.isInitialized=!1}}class s{resources;isInitialized=!1;canvas;textureWidth=0;textureHeight=0;options;boundHandleContextLost=null;boundHandleContextRestored=null;rotation=0;positionsArray=new Float32Array(8);vertexShaderSource=`
2
2
  attribute vec2 a_position;
3
3
  attribute vec2 a_texCoord;
4
4
  varying vec2 v_texCoord;
@@ -16,7 +16,7 @@ class H{events=new Map;maxListeners;captureRejections;constructor($={}){this.max
16
16
  vec4 color = texture2D(u_texture, v_texCoord);
17
17
  gl_FragColor = color;
18
18
  }
19
- `;constructor($){this.canvas=$.canvas,this.options=$,this.rotation=$.rotation??0,this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.initialize()}initialize(){try{let $={alpha:this.options.alpha??!1,antialias:this.options.antialias??!1,depth:!1,stencil:!1,preserveDrawingBuffer:this.options.preserveDrawingBuffer??!1,powerPreference:this.options.powerPreference??"high-performance"},A=this.canvas.getContext("webgl",$);if(!A&&"getContext"in this.canvas)A=this.canvas.getContext("experimental-webgl",$);if(!A)return!1;this.resources.gl=A;let O=this.createShader(A,A.VERTEX_SHADER,this.vertexShaderSource),J=this.createShader(A,A.FRAGMENT_SHADER,this.fragmentShaderSource);if(!O||!J)throw Error("Failed to create shaders");let Q=A.createProgram();if(!Q)throw Error("Failed to create program");if(A.attachShader(Q,O),A.attachShader(Q,J),A.linkProgram(Q),!A.getProgramParameter(Q,A.LINK_STATUS)){let j=A.getProgramInfoLog(Q);throw Error(`Failed to link program: ${j}`)}this.resources.program=Q,this.resources.positionLocation=A.getAttribLocation(Q,"a_position"),this.resources.texCoordLocation=A.getAttribLocation(Q,"a_texCoord"),this.resources.textureLocation=A.getUniformLocation(Q,"u_texture"),this.setupQuadBuffers(A);let Z=A.createTexture();if(!Z)throw Error("Failed to create texture");if(A.bindTexture(A.TEXTURE_2D,Z),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),this.resources.texture=Z,A.disable(A.DEPTH_TEST),A.disable(A.CULL_FACE),A.disable(A.BLEND),"addEventListener"in this.canvas)this.boundHandleContextLost=this.handleContextLost.bind(this),this.boundHandleContextRestored=this.handleContextRestored.bind(this),this.canvas.addEventListener("webglcontextlost",this.boundHandleContextLost,!1),this.canvas.addEventListener("webglcontextrestored",this.boundHandleContextRestored,!1);return this.isInitialized=!0,!0}catch{return this.cleanup(),!1}}createShader($,A,O){let J=$.createShader(A);if(!J)return null;if($.shaderSource(J,O),$.compileShader(J),!$.getShaderParameter(J,$.COMPILE_STATUS))return $.deleteShader(J),null;return J}setupQuadBuffers($){let A=new Float32Array([-1,-1,1,-1,-1,1,1,1]),O=new Float32Array([0,1,1,1,0,0,1,0]),J=$.createBuffer();$.bindBuffer($.ARRAY_BUFFER,J),$.bufferData($.ARRAY_BUFFER,A,$.STATIC_DRAW),this.resources.vertexBuffer=J;let Q=$.createBuffer();$.bindBuffer($.ARRAY_BUFFER,Q),$.bufferData($.ARRAY_BUFFER,O,$.STATIC_DRAW),this.resources.texCoordBuffer=Q}isReady(){return this.isInitialized&&this.resources.gl!==null}render($){if(!this.isInitialized||!this.resources.gl)return!1;let A=this.resources.gl;try{let{width:O,height:J}=$;if(O===0||J===0)return!1;let Q=this.canvas.width,Z=this.canvas.height;if(Q===0||Z===0)return!1;if(A.viewport(0,0,Q,Z),A.bindTexture(A.TEXTURE_2D,this.resources.texture),O!==this.textureWidth||J!==this.textureHeight)A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,$),this.textureWidth=O,this.textureHeight=J;else A.texSubImage2D(A.TEXTURE_2D,0,0,0,A.RGBA,A.UNSIGNED_BYTE,$);A.clearColor(0,0,0,1),A.clear(A.COLOR_BUFFER_BIT);let j=this.rotation===90||this.rotation===270,K=j?this.textureHeight:this.textureWidth,G=j?this.textureWidth:this.textureHeight,V=Math.min(Q/K,Z/G),X=Math.round(K*V),U=Math.round(G*V),z=Math.round((Q-X)/2),N=Math.round((Z-U)/2),Y=z/Q*2-1,q=(z+X)/Q*2-1,_=1-N/Z*2,D=1-(N+U)/Z*2,x=(Y+q)/2,v=(_+D)/2,k=(q-Y)/2,h=(_-D)/2,C=this.rotation*Math.PI/180,T=Math.cos(C),b=Math.sin(C),E=j?h:k,S=j?k:h,P=[[-E,-S],[E,-S],[-E,S],[E,S]],F=[];for(let[w,g]of P){let R=w*T-g*b+x,W=w*b+g*T+v;F.push(R,W)}let a=new Float32Array(F);return A.bindBuffer(A.ARRAY_BUFFER,this.resources.vertexBuffer),A.bufferData(A.ARRAY_BUFFER,a,A.DYNAMIC_DRAW),A.useProgram(this.resources.program),A.bindBuffer(A.ARRAY_BUFFER,this.resources.vertexBuffer),A.enableVertexAttribArray(this.resources.positionLocation),A.vertexAttribPointer(this.resources.positionLocation,2,A.FLOAT,!1,0,0),A.bindBuffer(A.ARRAY_BUFFER,this.resources.texCoordBuffer),A.enableVertexAttribArray(this.resources.texCoordLocation),A.vertexAttribPointer(this.resources.texCoordLocation,2,A.FLOAT,!1,0,0),A.uniform1i(this.resources.textureLocation,0),A.drawArrays(A.TRIANGLE_STRIP,0,4),!0}catch{return!1}}clear(){if(!this.resources.gl)return;let $=this.resources.gl;$.clearColor(0,0,0,1),$.clear($.COLOR_BUFFER_BIT)}handleContextLost($){$.preventDefault(),this.isInitialized=!1}handleContextRestored(){this.initialize()}cleanup(){let $=this.resources.gl;if(!$)return;if(this.resources.texture)$.deleteTexture(this.resources.texture);if(this.resources.vertexBuffer)$.deleteBuffer(this.resources.vertexBuffer);if(this.resources.texCoordBuffer)$.deleteBuffer(this.resources.texCoordBuffer);if(this.resources.program)$.deleteProgram(this.resources.program);this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.isInitialized=!1}setRotation($){this.rotation=$}getRotation(){return this.rotation}dispose(){if(this.resources.gl){let $=this.resources.gl.getExtension("WEBGL_lose_context");if($)try{$.loseContext()}catch{}}if(this.cleanup(),"removeEventListener"in this.canvas){if(this.boundHandleContextLost)this.canvas.removeEventListener("webglcontextlost",this.boundHandleContextLost),this.boundHandleContextLost=null;if(this.boundHandleContextRestored)this.canvas.removeEventListener("webglcontextrestored",this.boundHandleContextRestored),this.boundHandleContextRestored=null}}}class $${canvas;device=null;context=null;pipeline=null;texture=null;sampler=null;bindGroup=null;vertexBuffer=null;isInitialized=!1;textureWidth=0;textureHeight=0;powerPreference;rotation=0;vertexShaderSource=`
19
+ `;constructor($){this.canvas=$.canvas,this.options=$,this.rotation=$.rotation??0,this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.initialize()}initialize(){try{let $={alpha:this.options.alpha??!1,antialias:this.options.antialias??!1,depth:!1,stencil:!1,preserveDrawingBuffer:this.options.preserveDrawingBuffer??!1,powerPreference:this.options.powerPreference??"high-performance"},A=this.canvas.getContext("webgl",$);if(!A&&"getContext"in this.canvas)A=this.canvas.getContext("experimental-webgl",$);if(!A)return!1;this.resources.gl=A;let J=this.createShader(A,A.VERTEX_SHADER,this.vertexShaderSource),K=this.createShader(A,A.FRAGMENT_SHADER,this.fragmentShaderSource);if(!J||!K)throw Error("Failed to create shaders");let Q=A.createProgram();if(!Q)throw Error("Failed to create program");if(A.attachShader(Q,J),A.attachShader(Q,K),A.linkProgram(Q),!A.getProgramParameter(Q,A.LINK_STATUS)){let O=A.getProgramInfoLog(Q);throw Error(`Failed to link program: ${O}`)}this.resources.program=Q,this.resources.positionLocation=A.getAttribLocation(Q,"a_position"),this.resources.texCoordLocation=A.getAttribLocation(Q,"a_texCoord"),this.resources.textureLocation=A.getUniformLocation(Q,"u_texture"),this.setupQuadBuffers(A);let Z=A.createTexture();if(!Z)throw Error("Failed to create texture");if(A.bindTexture(A.TEXTURE_2D,Z),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),this.resources.texture=Z,A.disable(A.DEPTH_TEST),A.disable(A.CULL_FACE),A.disable(A.BLEND),"addEventListener"in this.canvas)this.boundHandleContextLost=this.handleContextLost.bind(this),this.boundHandleContextRestored=this.handleContextRestored.bind(this),this.canvas.addEventListener("webglcontextlost",this.boundHandleContextLost,!1),this.canvas.addEventListener("webglcontextrestored",this.boundHandleContextRestored,!1);return this.isInitialized=!0,!0}catch{return this.cleanup(),!1}}createShader($,A,J){let K=$.createShader(A);if(!K)return null;if($.shaderSource(K,J),$.compileShader(K),!$.getShaderParameter(K,$.COMPILE_STATUS))return $.deleteShader(K),null;return K}setupQuadBuffers($){let A=new Float32Array([-1,-1,1,-1,-1,1,1,1]),J=new Float32Array([0,1,1,1,0,0,1,0]),K=$.createBuffer();$.bindBuffer($.ARRAY_BUFFER,K),$.bufferData($.ARRAY_BUFFER,A,$.STATIC_DRAW),this.resources.vertexBuffer=K;let Q=$.createBuffer();$.bindBuffer($.ARRAY_BUFFER,Q),$.bufferData($.ARRAY_BUFFER,J,$.STATIC_DRAW),this.resources.texCoordBuffer=Q}isReady(){return this.isInitialized&&this.resources.gl!==null}render($){if(!this.isInitialized||!this.resources.gl)return!1;let A=this.resources.gl;try{let{width:J,height:K}=$;if(J===0||K===0)return!1;let Q=this.canvas.width,Z=this.canvas.height;if(Q===0||Z===0)return!1;if(A.viewport(0,0,Q,Z),A.bindTexture(A.TEXTURE_2D,this.resources.texture),J!==this.textureWidth||K!==this.textureHeight)A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,$),this.textureWidth=J,this.textureHeight=K;else A.texSubImage2D(A.TEXTURE_2D,0,0,0,A.RGBA,A.UNSIGNED_BYTE,$);A.clearColor(0,0,0,1),A.clear(A.COLOR_BUFFER_BIT);let O=this.rotation===90||this.rotation===270,j=O?this.textureHeight:this.textureWidth,G=O?this.textureWidth:this.textureHeight,V=Math.min(Q/j,Z/G),X=Math.round(j*V),Y=Math.round(G*V),U=Math.round((Q-X)/2),D=Math.round((Z-Y)/2),_=U/Q*2-1,E=(U+X)/Q*2-1,M=1-D/Z*2,P=1-(D+Y)/Z*2,C=(_+E)/2,T=(M+P)/2,b=(E-_)/2,w=(M-P)/2,I=this.rotation*Math.PI/180,F=Math.cos(I),S=Math.sin(I),N=O?w:b,z=O?b:w,B=this.positionsArray;return B[0]=-N*F- -z*S+C,B[1]=-N*S+-z*F+T,B[2]=N*F- -z*S+C,B[3]=N*S+-z*F+T,B[4]=-N*F-z*S+C,B[5]=-N*S+z*F+T,B[6]=N*F-z*S+C,B[7]=N*S+z*F+T,A.bindBuffer(A.ARRAY_BUFFER,this.resources.vertexBuffer),A.bufferData(A.ARRAY_BUFFER,B,A.DYNAMIC_DRAW),A.useProgram(this.resources.program),A.bindBuffer(A.ARRAY_BUFFER,this.resources.vertexBuffer),A.enableVertexAttribArray(this.resources.positionLocation),A.vertexAttribPointer(this.resources.positionLocation,2,A.FLOAT,!1,0,0),A.bindBuffer(A.ARRAY_BUFFER,this.resources.texCoordBuffer),A.enableVertexAttribArray(this.resources.texCoordLocation),A.vertexAttribPointer(this.resources.texCoordLocation,2,A.FLOAT,!1,0,0),A.uniform1i(this.resources.textureLocation,0),A.drawArrays(A.TRIANGLE_STRIP,0,4),!0}catch{return!1}}clear(){if(!this.resources.gl)return;let $=this.resources.gl;$.clearColor(0,0,0,1),$.clear($.COLOR_BUFFER_BIT)}handleContextLost($){$.preventDefault(),this.isInitialized=!1}handleContextRestored(){this.initialize()}cleanup(){let $=this.resources.gl;if(!$)return;if(this.resources.texture)$.deleteTexture(this.resources.texture);if(this.resources.vertexBuffer)$.deleteBuffer(this.resources.vertexBuffer);if(this.resources.texCoordBuffer)$.deleteBuffer(this.resources.texCoordBuffer);if(this.resources.program)$.deleteProgram(this.resources.program);this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.isInitialized=!1}setRotation($){this.rotation=$}getRotation(){return this.rotation}dispose(){if(this.resources.gl){let $=this.resources.gl.getExtension("WEBGL_lose_context");if($)try{$.loseContext()}catch{}}if(this.cleanup(),"removeEventListener"in this.canvas){if(this.boundHandleContextLost)this.canvas.removeEventListener("webglcontextlost",this.boundHandleContextLost),this.boundHandleContextLost=null;if(this.boundHandleContextRestored)this.canvas.removeEventListener("webglcontextrestored",this.boundHandleContextRestored),this.boundHandleContextRestored=null}}}class i{canvas;device=null;context=null;pipeline=null;texture=null;sampler=null;bindGroup=null;vertexBuffer=null;isInitialized=!1;textureWidth=0;textureHeight=0;powerPreference;rotation=0;quadArray=new Float32Array(16);vertexShaderSource=`
20
20
  struct VSOut {
21
21
  @builtin(position) pos : vec4f,
22
22
  @location(0) uv : vec2f,
@@ -37,4 +37,4 @@ class H{events=new Map;maxListeners;captureRejections;constructor($={}){this.max
37
37
  fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
38
38
  return textureSample(texture_view, texture_sampler, uv);
39
39
  }
40
- `;constructor($){this.canvas=$.canvas,this.powerPreference=$.powerPreference||"high-performance",this.rotation=$.rotation??0,this.initialize().catch((A)=>{console.error("WebGPU initialization failed:",A)})}async initialize(){try{let $=navigator;if(!$.gpu)return console.log("WebGPU not available in navigator"),!1;let A=await $.gpu.requestAdapter({powerPreference:this.powerPreference});if(!A)return console.log("WebGPU adapter not available"),!1;if(this.device=await A.requestDevice(),!this.device)return console.log("WebGPU device not available"),!1;if("getContext"in this.canvas)this.context=this.canvas.getContext("webgpu");if(!this.context)return console.log("WebGPU context not available on canvas"),!1;let O=$.gpu.getPreferredCanvasFormat();return this.context.configure({device:this.device,format:O,usage:GPUTextureUsage.RENDER_ATTACHMENT,alphaMode:"opaque"}),await this.createRenderPipeline(),this.createVertexBuffer(),this.isInitialized=!0,console.log("WebGPU renderer initialized successfully"),!0}catch($){return console.error("WebGPU initialization error:",$),!1}}async createRenderPipeline(){if(!this.device)return;let $=navigator;if(!$.gpu)return;let A=this.device.createShaderModule({code:this.vertexShaderSource}),O=this.device.createShaderModule({code:this.fragmentShaderSource});this.pipeline=this.device.createRenderPipeline({layout:"auto",vertex:{module:A,entryPoint:"vs_main",buffers:[{arrayStride:16,attributes:[{shaderLocation:0,offset:0,format:"float32x2"},{shaderLocation:1,offset:8,format:"float32x2"}]}]},fragment:{module:O,entryPoint:"fs_main",targets:[{format:$.gpu.getPreferredCanvasFormat()}]},primitive:{topology:"triangle-strip"}})}createVertexBuffer(){if(!this.device)return;this.vertexBuffer=this.device.createBuffer({size:64,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}createTexture($,A){if(!this.device)return;if(this.texture)this.texture.destroy();if(this.texture=this.device.createTexture({size:{width:$,height:A},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),!this.sampler)this.sampler=this.device.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"});this.createBindGroup()}createBindGroup(){if(!this.device||!this.texture||!this.sampler||!this.pipeline)return;this.bindGroup=this.device.createBindGroup({layout:this.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:this.sampler},{binding:1,resource:this.texture.createView()}]})}isReady(){return this.isInitialized&&this.device!==null&&this.context!==null&&this.pipeline!==null}render($){if(!this.isReady()||!this.device||!this.context||!this.pipeline)return!1;try{let{width:A,height:O}=$;if(A===0||O===0)return console.warn(`WebGPU: Source canvas has zero dimensions (${A}x${O})`),!1;let J=this.canvas.width,Q=this.canvas.height;if(J===0||Q===0)return console.warn(`WebGPU: Output canvas has zero dimensions (${J}x${Q})`),!1;if(A!==this.textureWidth||O!==this.textureHeight)this.createTexture(A,O),this.textureWidth=A,this.textureHeight=O;if(!this.texture)return!1;try{this.device.queue.copyExternalImageToTexture({source:$},{texture:this.texture},{width:A,height:O})}catch{let R=$.getContext("2d");if(!R)return!1;let W=R.getImageData(0,0,A,O),t=new Uint8Array(W.data.buffer);this.device.queue.writeTexture({texture:this.texture,origin:{x:0,y:0,z:0}},t,{bytesPerRow:A*4,rowsPerImage:O},{width:A,height:O,depthOrArrayLayers:1})}let Z=this.device.createCommandEncoder(),j=this.context.getCurrentTexture().createView(),K=Z.beginRenderPass({colorAttachments:[{view:j,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});if(K.setPipeline(this.pipeline),this.bindGroup)K.setBindGroup(0,this.bindGroup);let G=this.rotation===90||this.rotation===270,V=G?this.textureHeight:this.textureWidth,X=G?this.textureWidth:this.textureHeight,U=Math.min(J/V,Q/X),z=Math.round(V*U),N=Math.round(X*U),Y=Math.round((J-z)/2),q=Math.round((Q-N)/2),_=Y/J*2-1,D=(Y+z)/J*2-1,x=1-q/Q*2,v=1-(q+N)/Q*2,k=(_+D)/2,h=(x+v)/2,C=(D-_)/2,T=(x-v)/2,b=this.rotation*Math.PI/180,E=Math.cos(b),S=Math.sin(b),P=G?T:C,F=G?C:T,a=[[-P,-F,0,1],[P,-F,1,1],[-P,F,0,0],[P,F,1,0]],w=[];for(let[R,W,t,N$]of a){let L$=R*E-W*S+k,q$=R*S+W*E+h;w.push(L$,q$,t,N$)}let g=new Float32Array(w);if(this.vertexBuffer)this.device.queue.writeBuffer(this.vertexBuffer,0,g),K.setVertexBuffer(0,this.vertexBuffer);return K.draw(4,1,0,0),K.end(),this.device.queue.submit([Z.finish()]),!0}catch{return!1}}clear(){if(!this.isReady()||!this.device||!this.context)return;try{let $=this.device.createCommandEncoder(),A=this.context.getCurrentTexture().createView();$.beginRenderPass({colorAttachments:[{view:A,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([$.finish()])}catch{}}setRotation($){this.rotation=$}getRotation(){return this.rotation}dispose(){try{if(this.texture)this.texture.destroy(),this.texture=null;if(this.vertexBuffer)this.vertexBuffer.destroy(),this.vertexBuffer=null;this.device=null,this.context=null,this.pipeline=null,this.sampler=null,this.bindGroup=null,this.isInitialized=!1}catch{}}}class L{canvas;powerPreference;constructor($){this.canvas=$.canvas,this.powerPreference=$.powerPreference||"high-performance"}async createRenderer($){try{switch($){case"webgpu":return await this.createWebGPURenderer();case"webgl":return this.createWebGLRenderer();case"canvas2d":return this.createCanvas2DRenderer();default:return null}}catch{return null}}async createRendererWithFallback($){let A=[$];if($!=="webgl")A.push("webgl");if($!=="canvas2d")A.push("canvas2d");for(let J of A){let Q=await this.createRenderer(J);if(Q?.isReady())return{renderer:Q,actualType:J};if(Q)Q.dispose()}return{renderer:this.createCanvas2DRenderer(),actualType:"canvas2d"}}async createWebGPURenderer(){if(!navigator.gpu)return null;if(!("getContext"in this.canvas))return console.log("WebGPU requires HTMLCanvasElement, not OffscreenCanvas"),null;let A=new $$({canvas:this.canvas,powerPreference:this.powerPreference}),O=1000,J=performance.now();if(await(async()=>{while(!A.isReady()){if(performance.now()-J>O)return console.log("WebGPU renderer initialization timed out"),!1;if("requestIdleCallback"in window)await new Promise((j)=>requestIdleCallback(()=>j(void 0)));else await new Promise((j)=>requestAnimationFrame(()=>j(void 0)))}return!0})())return console.log("WebGPU renderer initialized successfully"),A;return A.isReady()?A:null}createWebGLRenderer(){try{let $=new e({canvas:this.canvas,powerPreference:this.powerPreference,preserveDrawingBuffer:!1,antialias:!1,alpha:!1});return $.isReady()?$:null}catch{return null}}createCanvas2DRenderer(){return new M({canvas:this.canvas})}static getSupportedRenderers(){let $=[];if(navigator.gpu)$.push("webgpu");try{let O=document.createElement("canvas");if(O.getContext("webgl")||O.getContext("experimental-webgl"))$.push("webgl")}catch{}return $.push("canvas2d"),$}static getRendererDisplayName($){switch($){case"canvas2d":return"Canvas 2D";case"webgl":return"WebGL";case"webgpu":return"WebGPU";default:return"Unknown"}}static isRendererSupported($){if($==="canvas2d")return!0;return L.getSupportedRenderers().includes($)}}var A$=new WeakMap;function U$($,A){A$.set($,A)}function T$($){let A=A$.get($);if(A)A$.delete($);return A}class p{canvas=null;canvasSink=null;sampleSink=null;options;frameIterator=null;currentFrame=null;nextFrame=null;disposed=!1;renderingId=0;renderer=null;rendererType="canvas2d";onRendererChange;onRendererFallback;onRotationChange;initPromise=null;resizeObserver=null;lastObservedWidth=0;lastObservedHeight=0;videoAspectRatio=null;debug=!1;pluginManager=null;overlayCanvas=null;overlayCtx=null;lastOverlayTime=0;rotation=0;sourceWidth=0;sourceHeight=0;constructor($={}){if(this.options={poolSize:$.poolSize??2,rendererType:$.rendererType??"webgpu",...$},this.rendererType=this.options.rendererType??"webgpu",this.debug=$.debug??!1,this.initPromise=null,$.canvas){if(this.canvas=$.canvas,this.options.width!==void 0)$.canvas.width=this.options.width;if(this.options.height!==void 0)$.canvas.height=this.options.height;this.initPromise=this.initializeRenderer($.canvas,this.rendererType).catch((A)=>{if(this.debug)console.error("Failed to initialize renderer:",A)}),this.setupResizeObserver($.canvas)}}setupResizeObserver($){if(!("getBoundingClientRect"in $)||typeof ResizeObserver>"u")return;if(this.options.width!==void 0||this.options.height!==void 0)return;this.cleanupResizeObserver();let A=$;this.resizeObserver=new ResizeObserver((O)=>{if(this.disposed||!this.resizeObserver)return;for(let J of O){let{width:Q,height:Z}=this.getCanvasDimensionsFromEntry(J,A);if(Q!==this.lastObservedWidth||Z!==this.lastObservedHeight){if(this.lastObservedWidth=Q,this.lastObservedHeight=Z,A.width!==Q||A.height!==Z){if(A.width=Q,A.height=Z,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}}}});try{this.resizeObserver.observe(A,{box:"device-pixel-content-box"})}catch{try{this.resizeObserver.observe(A,{box:"content-box"})}catch{this.resizeObserver.observe(A)}}requestAnimationFrame(()=>{if(this.disposed||!this.resizeObserver)return;let{width:O,height:J}=this.getCanvasDimensionsFromCanvas(A);if(this.lastObservedWidth=O,this.lastObservedHeight=J,A.width!==O||A.height!==J){if(A.width=O,A.height=J,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}})}getCanvasDimensionsFromEntry($,A){let O=0,J=0,Q=window.devicePixelRatio||1;if($.devicePixelContentBoxSize?.length)O=$.devicePixelContentBoxSize[0].inlineSize,J=$.devicePixelContentBoxSize[0].blockSize;else if($.contentBoxSize?.length)O=Math.round($.contentBoxSize[0].inlineSize*Q),J=Math.round($.contentBoxSize[0].blockSize*Q);else if($.contentRect)O=Math.round($.contentRect.width*Q),J=Math.round($.contentRect.height*Q);if(O===0||J===0)return this.getCanvasDimensionsFromCanvas(A);return{width:Math.max(1,O),height:Math.max(1,J)}}getCanvasDimensionsFromCanvas($){let A=0,O=0,J=window.devicePixelRatio||1,Q=$.getBoundingClientRect();if(A=Math.round(Q.width*J),O=Math.round(Q.height*J),A===0||O===0)A=Math.round($.clientWidth*J)||A,O=Math.round($.clientHeight*J)||O;if(A===0||O===0)console.warn("Canvas has zero dimensions after all fallbacks, using 1x1");return{width:Math.max(1,A),height:Math.max(1,O)}}cleanupResizeObserver(){if(this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null,this.lastObservedWidth=0,this.lastObservedHeight=0}retryUntilCanvasReady($,A,O=60){let J=0,Q=()=>{if(J++,$.canvas.width>0&&$.canvas.height>0)A();else if(J<O)requestAnimationFrame(Q);else{if(this.debug)console.warn("Canvas dimensions timeout, forcing action");A()}};requestAnimationFrame(Q)}updateCanvasAspectRatio(){if(!this.canvas||!this.videoAspectRatio||!("style"in this.canvas))return;this.canvas.style.aspectRatio=this.videoAspectRatio}updateCanvasBackingBuffer($){let{width:A,height:O}=this.getCanvasDimensionsFromCanvas($);if($.width!==A||$.height!==O)return $.width=A,$.height=O,!0;return!1}async initializeRenderer($,A){if(this.debug)console.log(`Initializing renderer: ${A}`);let J=await new L({canvas:$}).createRendererWithFallback(A);if(this.debug)console.log(`Renderer factory result: ${J.actualType}`);if(!J.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${J.actualType}) not ready`);throw J.renderer.dispose(),Error(`Failed to initialize renderer: ${J.actualType}`)}if(this.renderer=J.renderer,this.rendererType=J.actualType,this.debug)console.log(`Initialized renderer: ${this.rendererType}`);if(J.actualType!==A){if(this.onRendererFallback)this.onRendererFallback(A,J.actualType)}if(this.onRendererChange){if(this.debug)console.log(`Emitting renderer change: ${this.rendererType}`);this.onRendererChange(this.rendererType)}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Rendering initial frame with ${this.rendererType}`);if(this.currentFrame.canvas.width===0||this.currentFrame.canvas.height===0){if(this.debug)console.log("Initial frame has zero dimensions, scheduling render when ready...");this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame&&this.debug)console.log(`Canvas ready (${this.currentFrame.canvas.width}x${this.currentFrame.canvas.height}), rendering initial frame`);if(this.currentFrame)this.renderFrame(this.currentFrame)})}else this.renderFrame(this.currentFrame)}}async setCanvas($){if(this.cleanupOverlayCanvas(),this.canvas=$,this.renderer)this.renderer.dispose(),this.renderer=null;if(this.options.width!==void 0)$.width=this.options.width;if(this.options.height!==void 0)$.height=this.options.height;this.setupResizeObserver($);try{await this.initializeRenderer($,this.rendererType)}catch(A){if(this.debug)console.error("Failed to initialize renderer:",A);if(!this.renderer){if(this.renderer=new M({canvas:$}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}async setVideoTrack($){if(await this.disposeVideoResources(),$.codec===null)throw Error("Unsupported video codec");if(!await $.canDecode())throw Error(`Cannot decode video track with codec: ${$.codec}`);let O=T$($);if(this.sourceWidth=$.displayWidth,this.sourceHeight=$.displayHeight,!this.videoAspectRatio&&$.displayWidth&&$.displayHeight){let J=(K,G)=>G===0?K:J(G,K%G),Q=J($.displayWidth,$.displayHeight),Z=$.displayWidth/Q,j=$.displayHeight/Q;this.videoAspectRatio=`${Z}/${j}`,this.updateCanvasAspectRatio()}if(this.notifyRotationChange(),this.initPromise)try{await this.initPromise}catch(J){if(this.debug)console.error("Renderer initialization failed:",J)}if(!this.renderer){if(this.debug)console.warn("Renderer not ready, creating Canvas2D fallback");if(this.canvas){if(this.renderer=new M({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}if(this.canvas){if(this.options.width!==void 0||this.options.height!==void 0){let J=this.options.width??$.displayWidth,Q=this.options.height??$.displayHeight;if(this.canvas.width!==J||this.canvas.height!==Q)this.canvas.width=J,this.canvas.height=Q,this.updateCanvasAspectRatio()}else if(!this.resizeObserver){if(this.canvas.width===0||this.canvas.height===0)this.canvas.width=$.displayWidth,this.canvas.height=$.displayHeight,this.updateCanvasAspectRatio()}}if(O?.canvasSink)this.canvasSink=O.canvasSink;else this.canvasSink=new H$($,{rotation:this.options.rotation,poolSize:this.options.poolSize});if(this.sampleSink=new C$($),this.disposed=!1,O?.firstFrame){if(this.currentFrame=O.firstFrame,this.currentFrame.canvas.width>0&&this.currentFrame.canvas.height>0)this.renderFrame(this.currentFrame);else this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame)this.renderFrame(this.currentFrame)},30);this.frameIterator=this.canvasSink.canvases(0),this.frameIterator.next().then(()=>{this.fetchNextFrame()})}else try{await this.seek(0)}catch(J){if(this.debug)console.error("Initial seek failed:",J)}requestAnimationFrame(()=>{if(this.resizeObserver&&this.canvas&&"getBoundingClientRect"in this.canvas)this.updateCanvasBackingBuffer(this.canvas);if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}async seek($){if(!this.canvasSink)return;this.renderingId++;let A=this.renderingId;if(this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}let O=this.canvasSink.canvases($);this.frameIterator=O;try{let J=await O.next(),Q=await O.next();if(A!==this.renderingId)return;let Z=J.value??null,j=Q.value??null;if(Z)if(this.currentFrame=Z,Z.canvas.width>0&&Z.canvas.height>0)this.renderFrame(Z);else this.retryUntilCanvasReady(Z,()=>this.renderFrame(Z),30);if(this.nextFrame=j,!this.nextFrame)this.fetchNextFrame()}catch{}}updateFrame($){if(this.disposed)return{frameUpdated:!1,isStarving:!1};if(!this.nextFrame){if(this.frameIterator)this.fetchNextFrame();return{frameUpdated:!1,isStarving:!0}}if(this.nextFrame.timestamp<=$){if(this.currentFrame=this.nextFrame,this.nextFrame=null,this.renderFrame(this.currentFrame),this.frameIterator)this.fetchNextFrame();return{frameUpdated:!0,isStarving:!1}}return{frameUpdated:!1,isStarving:!1}}async fetchNextFrame(){let $=this.frameIterator;if(!$||this.disposed)return;let A=this.renderingId;try{let J=(await $.next()).value??null;if(!J||A!==this.renderingId||this.disposed)return;this.nextFrame=J}catch{}}renderFrame($){if(this.currentFrame=$,!this.renderer||!this.canvas){if(this.initPromise)this.initPromise.then(()=>{if(this.currentFrame===$&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log("Rendering frame after renderer initialization");this.renderFrameWithPlugins($)}});return}if(!this.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${this.rendererType}) not ready, skipping frame`);return}this.renderFrameWithPlugins($)}renderFrameWithPlugins($){if(!this.renderer||!this.canvas)return;let A=$.timestamp;if(this.pluginManager){if(this.pluginManager.executeBeforeRender($,A)?.skip)return}let O=$;if(this.pluginManager)O=this.pluginManager.executeTransformFrame($);if(!this.renderer.render(O.canvas)){if(this.debug)console.warn(`Failed to render frame with ${this.rendererType} (canvas: ${O.canvas.width}x${O.canvas.height})`);if(O.canvas.width===0||O.canvas.height===0)this.retryUntilCanvasReady(O,()=>{if(this.currentFrame===$&&this.renderer&&this.renderer.isReady()){if(!this.renderer.render(O.canvas)&&this.debug)console.warn("Retry render also failed")}},1);return}if(this.executeOverlays(A),this.pluginManager)this.pluginManager.executeAfterRender(this.canvas)}executeOverlays($){if(!this.pluginManager||!this.canvas)return;this.lastOverlayTime=$;let A={width:this.canvas.width,height:this.canvas.height};if(this.rendererType==="canvas2d"){let O=this.canvas.getContext("2d");if(!O)return;this.pluginManager.executeOverlays(O,$,A)}else{if(this.ensureOverlayCanvas(),!this.overlayCanvas||!this.overlayCtx)return;this.overlayCtx.clearRect(0,0,this.overlayCanvas.width,this.overlayCanvas.height),this.pluginManager.executeOverlays(this.overlayCtx,$,A)}}refreshOverlays(){if(!this.canvas)return;if(this.rendererType==="canvas2d"){if(this.currentFrame&&this.renderer?.isReady())this.renderer.render(this.currentFrame.canvas),this.executeOverlays(this.lastOverlayTime)}else if(this.overlayCanvas&&this.overlayCtx){if(this.overlayCtx.clearRect(0,0,this.overlayCanvas.width,this.overlayCanvas.height),this.pluginManager){let $={width:this.canvas.width,height:this.canvas.height};this.pluginManager.executeOverlays(this.overlayCtx,this.lastOverlayTime,$)}}}ensureOverlayCanvas(){if(!this.canvas||!(this.canvas instanceof HTMLCanvasElement))return;if(!this.overlayCanvas){this.overlayCanvas=document.createElement("canvas"),this.overlayCanvas.style.position="absolute",this.overlayCanvas.style.top="0",this.overlayCanvas.style.left="0",this.overlayCanvas.style.width="100%",this.overlayCanvas.style.height="100%",this.overlayCanvas.style.pointerEvents="none",this.overlayCanvas.style.zIndex="1",this.overlayCtx=this.overlayCanvas.getContext("2d");let $=this.canvas.parentElement;if($){if(getComputedStyle($).position==="static")$.style.position="relative";$.insertBefore(this.overlayCanvas,this.canvas.nextSibling)}}if(this.overlayCanvas.width!==this.canvas.width||this.overlayCanvas.height!==this.canvas.height)this.overlayCanvas.width=this.canvas.width,this.overlayCanvas.height=this.canvas.height}cleanupOverlayCanvas(){if(this.overlayCanvas)this.overlayCanvas.remove(),this.overlayCanvas=null,this.overlayCtx=null}async getFrameAt($){if(!this.canvasSink)return null;return this.canvasSink.getCanvas($)}async getSampleAt($){if(!this.sampleSink)return null;return this.sampleSink.getSample($)}async extractFrames($,A,O=1){if(!this.canvasSink)return[];let J=[],Q=[];for(let Z=$;Z<=A;Z+=O)Q.push(Z);for await(let Z of this.canvasSink.canvasesAtTimestamps(Q))if(Z)J.push(Z);return J}async screenshot($,A={}){if(!this.canvas)return null;if($!==void 0&&this.canvasSink){let O=await this.canvasSink.getCanvas($);if(O)this.renderFrame(O)}if("toBlob"in this.canvas)return new Promise((O)=>{this.canvas.toBlob((J)=>O(J),`image/${A.format??"png"}`,A.quality)});else return this.canvas.convertToBlob({type:`image/${A.format??"png"}`,quality:A.quality})}getCurrentFrame(){return this.currentFrame}getNextFrame(){return this.nextFrame}getRendererType(){return this.rendererType}getCanvas(){return this.canvas}updateCanvasDimensions(){if(!this.canvas||!("getBoundingClientRect"in this.canvas))return;let $=this.canvas;if(this.updateCanvasBackingBuffer($)&&this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}async switchRenderer($){if(!this.canvas)throw Error("Cannot switch renderer: No canvas set");let A=this.rendererType;if($===A)return;if(this.debug)console.warn(`Switching renderer from ${A} to ${$}. This will recreate the canvas element.`);if(this.canvas instanceof HTMLCanvasElement){let O=this.canvas,J=O.parentElement;if(!J)throw Error("Cannot switch renderer: Canvas has no parent element");let Q=document.createElement("canvas");if(Q.width=O.width,Q.height=O.height,Q.className=O.className,Q.id=O.id,Q.style.cssText=O.style.cssText,Array.from(O.attributes).forEach((Z)=>{if(Z.name!=="id"&&Z.name!=="class"&&Z.name!=="style")Q.setAttribute(Z.name,Z.value)}),this.renderer)this.renderer.dispose(),this.renderer=null;J.replaceChild(Q,O),this.canvas=Q;try{await this.initializeRenderer(Q,$)}catch(Z){if(this.debug)console.error(`Failed to switch to ${$}:`,Z);if(!this.renderer){if(this.renderer=new M({canvas:Q}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}else{if(this.debug)console.warn("Runtime switching for OffscreenCanvas may not work if context is already set");if(this.renderer)this.renderer.dispose(),this.renderer=null;try{await this.initializeRenderer(this.canvas,$)}catch(O){if(this.debug)console.error(`Failed to switch to ${$}:`,O);if(!this.renderer){if(this.renderer=new M({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Re-rendering after switch to ${this.rendererType}`);queueMicrotask(()=>{if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}}setRendererChangeCallback($){if(this.onRendererChange=$,this.renderer&&this.rendererType){if(this.debug)console.log(`Renderer already initialized as ${this.rendererType}, emitting change event`);$(this.rendererType)}}setRendererFallbackCallback($){this.onRendererFallback=$}setRotationChangeCallback($){this.onRotationChange=$}setRotation($){if(this.rotation===$)return;if(this.rotation=$,this.renderer)this.renderer.setRotation($);if(this.notifyRotationChange(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}getRotation(){return this.rotation}getDisplaySize(){let $=this.rotation===90||this.rotation===270;return{width:$?this.sourceHeight:this.sourceWidth,height:$?this.sourceWidth:this.sourceHeight}}notifyRotationChange(){if(this.onRotationChange&&this.sourceWidth>0&&this.sourceHeight>0)this.onRotationChange(this.rotation,this.getDisplaySize())}setPluginManager($){this.pluginManager=$}static getSupportedRenderers(){return L.getSupportedRenderers()}async clearIterators(){if(this.renderingId++,this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}this.currentFrame=null,this.nextFrame=null}async disposeVideoResources(){if(this.disposed=!0,this.renderingId++,this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.videoAspectRatio=null}dispose(){if(this.disposed=!0,this.renderingId++,this.frameIterator)this.frameIterator.return(),this.frameIterator=null;if(this.renderer)this.renderer.dispose(),this.renderer=null;this.cleanupResizeObserver(),this.cleanupOverlayCanvas(),this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.onRendererChange=void 0,this.onRendererFallback=void 0}}var I=2,u="[MediaFox]";function b$($){I=$}function w$($,...A){if(I<=0)console.debug(`${u} ${$}`,...A)}function f$($,...A){if(I<=1)console.info(`${u} ${$}`,...A)}function I$($,...A){if(I<=2)console.warn(`${u} ${$}`,...A)}function y$($,...A){if(I<=3)console.error(`${u} ${$}`,...A)}var y={setLevel:b$,debug:w$,info:f$,warn:I$,error:y$};class O${deps;constructor($){this.deps=$}async load($,A={}){try{let O=await this.deps.pluginManager.executeBeforeLoad($);if(O?.cancel)return;if(O?.data!==void 0)$=O.data;await this.deps.playbackController.reset(),this.deps.sourceManager.disposeCurrent();let J=this.deps.state.getState();if(!A.replacePlaylist)this.deps.state.setState({...J,state:"loading",currentTime:A.startTime??0,playing:!1,paused:!0,ended:!1,seeking:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,buffered:[],canPlay:!1,canPlayThrough:!1});else this.deps.state.reset(),this.deps.state.updateLoadingState();this.deps.emit("loadstart",void 0);let Q=A.playlistItemId?this.deps.sourceManager.promoteQueuedSource(A.playlistItemId):null;if(!Q)Q=await this.deps.sourceManager.createSource($);let Z=Q.input;if(!Z)throw Error("Failed to create input from source");await this.deps.trackManager.initialize(Z);let[j,K,G,V]=await Promise.all([Z.computeDuration(),Z.getFormat(),Z.getMimeType(),Z.getMetadataTags()]),X={duration:j,format:K.name,mimeType:G,metadata:V,hasVideo:this.deps.trackManager.hasVideo(),hasAudio:this.deps.trackManager.hasAudio(),hasSubtitles:this.deps.trackManager.hasSubtitles()};this.deps.state.updateDuration(j),this.deps.state.updateMediaInfo(X),this.deps.state.updateTracks(this.deps.trackManager.getVideoTracks(),this.deps.trackManager.getAudioTracks(),this.deps.trackManager.getSubtitleTracks()),this.deps.playbackController.setDuration(j);let U=Q.prefetchedData,z=U?.videoTrack??this.deps.trackManager.getPrimaryVideoTrack(),N=U?.audioTrack??this.deps.trackManager.getPrimaryAudioTrack();if(z&&U?.canvasSink&&U?.firstFrame)U$(z,{canvasSink:U.canvasSink,firstFrame:U.firstFrame});let Y="",q=!1,_=!1;if(z||N){let D=await this.deps.trackSwitcher.setupInitialTracks(z,N);Y+=D.warningMessage,q=D.videoSupported,_=D.audioSupported}if(!q&&!_){if(!Y)Y="No audio or video track found.";throw Error(Y)}if(Y&&(q||_))this.deps.emit("warning",{type:"codec-warning",message:Y.trim(),error:void 0});if(this.deps.state.updateReadyState(!0,!0),this.deps.emit("loadedmetadata",X),this.deps.emit("loadeddata",void 0),this.deps.emit("canplay",void 0),this.deps.emit("canplaythrough",void 0),this.updateCurrentPlaylistItemDuration(j),await this.deps.pluginManager.executeAfterLoad(X),A.autoplay)await this.play();if(A.startTime!==void 0)await this.seek(A.startTime)}catch(O){throw this.handleError(O),O}}async play(){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");if((await this.deps.pluginManager.executeBeforePlay())?.cancel)return;await this.deps.playbackController.play(),this.deps.state.updatePlaybackState(!0),this.deps.emit("play",void 0),this.deps.emit("playing",void 0),this.deps.pluginManager.executeAfterPlay()}catch($){throw this.handleError($),$}}async pause(){if((await this.deps.pluginManager.executeBeforePause())?.cancel)return;this.deps.playbackController.pause(),this.deps.state.updatePlaybackState(!1),this.deps.emit("pause",void 0),this.deps.pluginManager.executeAfterPause()}async seek($){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");let O=await this.deps.pluginManager.executeBeforeSeek($);if(O?.cancel)return;if(O?.data!==void 0)$=O.data;this.deps.state.updateSeekingState(!0),this.deps.emit("seeking",{currentTime:$}),await this.deps.playbackController.seek($),this.deps.state.updateSeekingState(!1),this.deps.state.updateTime(this.deps.playbackController.getCurrentTime()),this.deps.emit("seeked",{currentTime:this.deps.playbackController.getCurrentTime()}),this.deps.pluginManager.executeAfterSeek(this.deps.playbackController.getCurrentTime())}catch(A){throw this.deps.state.updateSeekingState(!1),this.handleError(A),A}}async stop(){try{if((await this.deps.pluginManager.executeBeforeStop())?.cancel)return;await this.pause(),await this.seek(0),this.deps.pluginManager.executeAfterStop()}catch($){throw this.handleError($),$}}handleError($){if(this.deps.pluginManager.executeOnError($))return;this.deps.state.updateError($),this.deps.emit("error",$),y.error("Player error:",$)}updateCurrentPlaylistItemDuration($){let A=this.deps.state.getState(),O=A.currentPlaylistIndex;if(O!==null&&A.playlist.length>0){let J=[...A.playlist],Q=J[O];if(Q)J[O]={...Q,duration:$},this.deps.state.updatePlaylist(J,O)}}}class J${store;constructor($){this.store=$}getState(){return this.store.getState()}subscribe($){return this.store.subscribe($)}setState($){this.store.setState($)}reset(){this.store.reset()}applyInitial($,A,O){this.store.setState({volume:$,muted:A,playbackRate:O})}updateLoadingState(){this.store.updateLoadingState()}updateReadyState($,A){this.store.updateReadyState($,A)}updatePlaybackState($){this.store.updatePlaybackState($)}updateSeekingState($){this.store.updateSeekingState($)}updateWaitingState($){this.store.updateWaitingState($)}updateEndedState($){this.store.updateEndedState($)}updateTime($){this.store.updateTime($)}updateDuration($){this.store.updateDuration($)}updateVolume($,A){this.store.updateVolume($,A)}updatePlaybackRate($){this.store.updatePlaybackRate($)}updateMediaInfo($){this.store.updateMediaInfo($)}updateTracks($,A,O){this.store.updateTracks($,A,O)}updateSelectedTracks($,A){this.store.updateSelectedTracks($,A)}updateError($){this.store.updateError($)}updateRendererType($){this.store.updateRendererType($)}updatePlaylist($,A=null){this.store.updatePlaylist($,A)}}class Q${chains=new Map;async run($,A){let O=this.chains.get($)??Promise.resolve(),J,Q=new Promise((Z)=>{J=Z});this.chains.set($,O.then(()=>Q));try{return await O,await A()}finally{J?.()}}}class Z${deps;locks=new Q$;constructor($){this.deps=$}async setupInitialTracks($,A){let O=!1,J=!1,Q="";if($)try{if(O=await this.locks.run("video",async()=>{if($.codec!==null&&await $.canDecode())return await this.deps.playbackController.trySetVideoTrack($);return!1}),!O)Q+="Unsupported video codec. "}catch(Z){Q+="Failed to set up video track. ",y.warn("Video track error:",Z)}if(A)try{if(J=await this.locks.run("audio",async()=>{if(A.codec!==null&&await A.canDecode())return await this.deps.playbackController.trySetAudioTrack(A);return!1}),!J)Q+="Unsupported audio codec. "}catch(Z){Q+="Failed to set up audio track. ",y.warn("Audio track error:",Z)}if(!O&&!J&&!Q)Q="No audio or video track found.";return{videoSupported:O,audioSupported:J,warningMessage:Q}}async selectVideoTrack($,A){if(!$.selectVideoTrack(A))throw Error(`Invalid video track ID: ${A}`);let O=$.getSelectedVideoTrack();if(!O){await this.deps.playbackController.setVideoTrack(null);return}if(!await this.locks.run("video",async()=>{if(O.codec!==null&&await O.canDecode())return await this.deps.playbackController.trySetVideoTrack(O);return!1}))this.deps.emit("warning",{type:"video-codec-unsupported",message:"Video codec not supported.",error:void 0}),await this.deps.playbackController.setVideoTrack(null)}async selectAudioTrack($,A){if(!$.selectAudioTrack(A))throw Error(`Invalid audio track ID: ${A}`);let O=$.getSelectedAudioTrack();if(!O){await this.deps.playbackController.setAudioTrack(null);return}if(!await this.locks.run("audio",async()=>{if(O.codec!==null&&await O.canDecode())return await this.deps.playbackController.trySetAudioTrack(O);return!1}))this.deps.emit("warning",{type:"audio-codec-unsupported",message:"Audio codec not supported. Continuing without audio.",error:void 0}),await this.deps.playbackController.setAudioTrack(null)}}import{AudioBufferSink as x$,AudioSampleSink as v$}from"mediabunny";class m{audioContext;gainNode=null;outputNode=null;bufferSink=null;sampleSink=null;bufferIterator=null;queuedNodes=new Set;startContextTime=0;startMediaTime=0;pauseTime=0;playing=!1;volume=1;muted=!1;disposed=!1;playbackId=0;playbackRate=1;pluginManager=null;constructor($={}){if($.audioContext)this.audioContext=$.audioContext;else{let A=window,O=A.AudioContext||A.webkitAudioContext;this.audioContext=new O}this.volume=$.volume??1,this.muted=$.muted??!1,this.setupAudioGraph()}setupAudioGraph(){if(this.gainNode=this.audioContext.createGain(),this.pluginManager){let $=this.pluginManager.executeOnAudioNode(this.audioContext,this.gainNode);this.outputNode=$}else this.outputNode=this.gainNode;this.outputNode.connect(this.audioContext.destination),this.updateGain()}setPluginManager($){this.pluginManager=$,this.rebuildAudioGraph()}rebuildAudioGraph(){if(!this.gainNode)return;if(this.outputNode?.disconnect(),this.pluginManager){let $=this.pluginManager.executeOnAudioNode(this.audioContext,this.gainNode);this.outputNode=$}else this.outputNode=this.gainNode;this.outputNode.connect(this.audioContext.destination)}async setAudioTrack($){if(this.dispose(),$.codec===null)throw Error("Unsupported audio codec");if(!await $.canDecode())throw Error(`Cannot decode audio track with codec: ${$.codec}`);this.bufferSink=new x$($),this.sampleSink=new v$($),this.disposed=!1}async play($=this.pauseTime){if(this.playing||!this.bufferSink)return;if(this.audioContext.state==="suspended")await this.audioContext.resume();this.playbackId++;let A=this.playbackId;this.playing=!0,this.startContextTime=this.audioContext.currentTime,this.startMediaTime=$,this.pauseTime=$,this.bufferIterator=this.bufferSink.buffers($),this.scheduleAudioBuffers(A)}async scheduleAudioBuffers($){let A=this.bufferIterator;if(!A||!this.gainNode)return;try{for await(let{buffer:O,timestamp:J}of A){if($!==this.playbackId||this.disposed||!this.playing)break;let Q=this.audioContext.createBufferSource();Q.buffer=O,Q.connect(this.gainNode),Q.playbackRate.value=this.playbackRate,Q.playbackRate.setValueAtTime(this.playbackRate,this.audioContext.currentTime);let Z=this.startContextTime+(J-this.startMediaTime)/this.playbackRate;if(Z>=this.audioContext.currentTime)Q.start(Z);else{let j=Math.max(0,(this.audioContext.currentTime-Z)*this.playbackRate);if(j<O.duration)Q.start(this.audioContext.currentTime,j);else continue}if(this.queuedNodes.add(Q),Q.onended=()=>{this.queuedNodes.delete(Q)},J-this.getCurrentTime()>=1)await this.waitForCatchup(J)}}catch{}}async waitForCatchup($){return new Promise((A)=>{let O=setInterval(()=>{if($-this.getCurrentTime()<1||!this.playing)clearInterval(O),A()},100)})}pause(){if(!this.playing)return;let $=this.getCurrentTime();if(this.playing=!1,this.pauseTime=$,this.stopQueuedNodes(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null}stop(){this.pause(),this.pauseTime=0,this.startContextTime=0,this.startMediaTime=0}async seek($){let A=this.playing;if(A)this.pause();if(this.pauseTime=$,A)await this.play($)}getCurrentTime(){if(this.playing){let $=this.audioContext.currentTime-this.startContextTime;return this.startMediaTime+$*this.playbackRate}return this.pauseTime}setVolume($){this.volume=Math.max(0,Math.min(1,$)),this.updateGain()}setMuted($){this.muted=$,this.updateGain()}updateGain(){if(!this.gainNode)return;let $=this.muted?0:this.volume;this.gainNode.gain.value=$*$}getVolume(){return this.volume}isMuted(){return this.muted}isPlaying(){return this.playing}setPlaybackRate($){let A=Math.max(0.25,Math.min(4,$));if(this.playbackRate===A)return;let O=this.playing,J=this.getCurrentTime();if(this.playbackRate=A,O)this.pause(),this.pauseTime=J,this.play(J)}getAudioContext(){return this.audioContext}async getBufferAt($){if(!this.bufferSink)return null;return this.bufferSink.getBuffer($)}async getSampleAt($){if(!this.sampleSink)return null;return this.sampleSink.getSample($)}stopQueuedNodes(){for(let $ of this.queuedNodes)try{$.stop()}catch{}this.queuedNodes.clear()}async clearIterators(){if(this.playbackId++,this.stop(),this.bufferIterator){try{await this.bufferIterator.return()}catch{}this.bufferIterator=null}}dispose(){if(this.disposed=!0,this.playbackId++,this.stop(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null;this.bufferSink=null,this.sampleSink=null}destroy(){if(this.dispose(),this.gainNode)this.gainNode.disconnect(),this.gainNode=null;if(this.audioContext.state!=="closed")this.audioContext.close()}}var k$=100,h$=250;class c{videoRenderer;audioManager;playing=!1;currentTime=0;duration=0;playbackRate=1;animationFrameId=null;lastFrameTime=0;syncIntervalId=null;renderIntervalId=null;isWaiting=!1;onTimeUpdate;onEnded;onWaiting;onPlaying;constructor($={}){this.videoRenderer=new p({canvas:$.canvas,rendererType:$.rendererType}),this.audioManager=new m({audioContext:$.audioContext,volume:$.volume,muted:$.muted}),this.playbackRate=$.playbackRate??1}async setVideoTrack($){if(!$){this.videoRenderer.dispose();return}await this.videoRenderer.setVideoTrack($);let A=await $.computeDuration();this.duration=Math.max(this.duration,A)}async trySetVideoTrack($){try{return await this.setVideoTrack($),!0}catch{return!1}}async setAudioTrack($){let A=this.playing,O=this.getCurrentTime();if(!$){this.audioManager.dispose();return}let J=await $.computeDuration(),Q=Math.max(0,Math.min(O,J));if(await this.audioManager.setAudioTrack($),await this.audioManager.seek(Q),A)await this.audioManager.play(Q);this.currentTime=Q,this.duration=Math.max(this.duration,J)}async trySetAudioTrack($){try{return await this.setAudioTrack($),!0}catch{return!1}}async setCanvas($){await this.videoRenderer.setCanvas($)}async play(){if(this.playing)return;if(this.playing=!0,this.lastFrameTime=performance.now(),this.currentTime>=this.duration)this.currentTime=0,await this.videoRenderer.seek(0);await this.audioManager.play(this.currentTime),this.startRenderLoop(),this.startSyncInterval()}pause(){if(!this.playing)return;if(this.playing=!1,this.isWaiting=!1,this.audioManager.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime()}async seek($){let A=Math.max(0,Math.min($,this.duration));if(this.currentTime=A,await this.videoRenderer.seek(A),await this.audioManager.seek(A),this.onTimeUpdate)this.onTimeUpdate(this.currentTime)}startRenderLoop(){if(this.animationFrameId!==null||this.renderIntervalId!==null)return;let $=(A=!0)=>{if(!this.playing)return;if(this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime();else{let J=performance.now(),Q=(J-this.lastFrameTime)/1000;this.lastFrameTime=J,this.currentTime+=Q*this.playbackRate}if(this.currentTime>=this.duration){this.handleEnded();return}let{isStarving:O}=this.videoRenderer.updateFrame(this.currentTime);if(O&&!this.isWaiting){if(this.isWaiting=!0,this.onWaiting)this.onWaiting()}else if(!O&&this.isWaiting){if(this.isWaiting=!1,this.onPlaying)this.onPlaying()}if(A)this.animationFrameId=requestAnimationFrame(()=>$())};if(this.animationFrameId=requestAnimationFrame(()=>$()),this.renderIntervalId===null)this.renderIntervalId=window.setInterval(()=>$(!1),k$)}stopRenderLoop(){if(this.animationFrameId!==null)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null;if(this.renderIntervalId!==null)clearInterval(this.renderIntervalId),this.renderIntervalId=null}startSyncInterval(){if(this.syncIntervalId!==null)return;this.syncIntervalId=window.setInterval(()=>{if(this.playing&&this.onTimeUpdate)this.onTimeUpdate(this.currentTime)},h$)}stopSyncInterval(){if(this.syncIntervalId!==null)clearInterval(this.syncIntervalId),this.syncIntervalId=null}handleEnded(){if(this.pause(),this.currentTime=this.duration,this.onEnded)this.onEnded()}getCurrentTime(){if(this.playing&&this.audioManager.isPlaying())return this.audioManager.getCurrentTime();return this.currentTime}getDuration(){return this.duration}setDuration($){this.duration=$}isPlaying(){return this.playing}setVolume($){this.audioManager.setVolume($)}getVolume(){return this.audioManager.getVolume()}setMuted($){this.audioManager.setMuted($)}isMuted(){return this.audioManager.isMuted()}setPlaybackRate($){let A=Math.max(0.25,Math.min(4,$));if(this.playbackRate===A)return;this.playbackRate=A,this.audioManager.setPlaybackRate(A),this.lastFrameTime=performance.now()}getPlaybackRate(){return this.playbackRate}setTimeUpdateCallback($){this.onTimeUpdate=$}setEndedCallback($){this.onEnded=$}setWaitingCallback($){this.onWaiting=$}setPlayingCallback($){this.onPlaying=$}isBuffering(){return this.isWaiting}async screenshot($){return this.videoRenderer.screenshot(this.currentTime,$)}getVideoRenderer(){return this.videoRenderer}getAudioManager(){return this.audioManager}async switchRenderer($){await this.videoRenderer.switchRenderer($)}getRendererType(){return this.videoRenderer.getRendererType()}updateCanvasDimensions(){this.videoRenderer.updateCanvasDimensions()}setRendererChangeCallback($){this.videoRenderer.setRendererChangeCallback($)}setRendererFallbackCallback($){this.videoRenderer.setRendererFallbackCallback($)}setRotationChangeCallback($){this.videoRenderer.setRotationChangeCallback($)}setRotation($){this.videoRenderer.setRotation($)}getRotation(){return this.videoRenderer.getRotation()}getDisplaySize(){return this.videoRenderer.getDisplaySize()}setPluginManager($){this.videoRenderer.setPluginManager($),this.audioManager.setPluginManager($)}getCanvas(){return this.videoRenderer.getCanvas()}refreshOverlays(){this.videoRenderer.refreshOverlays()}rebuildAudioGraph(){this.audioManager.rebuildAudioGraph()}async reset(){this.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.currentTime=0,this.duration=0,await Promise.all([this.videoRenderer.clearIterators(),this.audioManager.clearIterators()]),this.playbackRate=1,this.lastFrameTime=0}dispose(){this.pause(),this.videoRenderer.dispose(),this.audioManager.dispose(),this.onTimeUpdate=void 0,this.onEnded=void 0,this.onWaiting=void 0,this.onPlaying=void 0}destroy(){this.dispose(),this.audioManager.destroy()}}function l(){return crypto?.randomUUID?.()??Date.now().toString(36)+Math.random().toString(36).substr(2)}class j${store;emitter;switchSource;sourceManager;constructor($,A,O,J){this.store=$,this.emitter=A,this.switchSource=O,this.sourceManager=J}async loadPlaylist($,A={}){let O=$.map((J)=>{if(J&&typeof J==="object"&&"mediaSource"in J)return{id:l(),mediaSource:J.mediaSource,title:J.title,poster:J.poster,savedPosition:null,duration:null};else return{id:l(),mediaSource:J,savedPosition:null,duration:null}});if(this.store.updatePlaylist(O,O.length>0?0:null),this.emitter.emit("playlistchange",{playlist:O}),O.length>0&&this.switchSource){let J=O[0];if(A.startTime!==void 0)J.savedPosition=A.startTime;await this.switchSource(J,A.autoplay??!1)}}addToPlaylist($,A){let O=this.createPlaylistItem($);this.store.addToPlaylist(O,A),this.emitter.emit("playlistadd",{item:O,index:A??this.store.getState().playlist.length-1})}async removeFromPlaylist($){let A=this.store.getState(),O=A.currentPlaylistIndex,J=A.playing;this.store.removeFromPlaylist($),this.emitter.emit("playlistremove",{index:$}),this.sourceManager?.disposeQueued(A.playlist[$]?.id||"");let Q=this.store.getState(),Z=Q.currentPlaylistIndex;if(Q.playlist.length===0)this.sourceManager?.disposeAll(),this.emitter.emit("playlistchange",{playlist:Q.playlist}),this.emitter.emit("playlistend",void 0);if(O===$&&Z!==null&&Z!==O&&this.switchSource){let j=Q.playlist[Z];try{await this.switchSource(j,J)}catch(K){this.emitter.emit("playlistitemerror",{index:Z,error:K})}}}clearPlaylist(){this.store.clearPlaylist(),this.emitter.emit("playlistchange",{playlist:[]}),this.emitter.emit("playlistend",void 0),this.sourceManager?.disposeAll()}async next(){let $=this.store.getState(),A=$.currentPlaylistIndex??0,O=$.playlist,J=$.playlistMode,Q=null;if(J==="repeat-one")Q=A;else if(J==="sequential"||J==="repeat")if(A<O.length-1)Q=A+1;else if(J==="repeat")Q=0;else{this.emitter.emit("playlistend",void 0);return}else if(A<O.length-1)Q=A+1;if(Q!==null)await this.switchTo(Q)}async prev(){let A=this.store.getState().currentPlaylistIndex??0;if(A>0)await this.switchTo(A-1)}async jumpTo($){let O=this.store.getState().playlist;if($>=0&&$<O.length)await this.switchTo($);else if($>=O.length)this.emitter.emit("playlistend",void 0)}setMode($){let A=["sequential","manual","repeat","repeat-one",null];if(!A.includes($))throw Error(`Invalid playlist mode: ${$}. Valid modes: ${A.filter((O)=>O!==null).join(", ")}, null`);this.store.updatePlaylistMode($)}async switchTo($){let A=this.store.getState(),O=A.currentPlaylistIndex,J=A.playing,Q=[...A.playlist];if(O!==null&&O!==$){let K=Q[O];Q[O]={...K,savedPosition:A.currentTime}}this.store.updatePlaylist(Q,$);let Z=Q[$];if(this.emitter.emit("playlistitemchange",{index:$,item:Z,previousIndex:O??void 0}),this.switchSource)await this.switchSource(Z,J);if(A.playlistMode==="sequential"&&$<Q.length-1){let K=Q[$+1];this.sourceManager?.preloadSource(K.mediaSource,K.id)}}createPlaylistItem($){if($&&typeof $==="object"&&"mediaSource"in $)return{id:l(),mediaSource:$.mediaSource,title:$.title,poster:$.poster,savedPosition:null,duration:null};else return{id:l(),mediaSource:$,savedPosition:null,duration:null}}get playlist(){return this.store.getState().playlist}get currentIndex(){return this.store.getState().currentPlaylistIndex}get currentItem(){let $=this.currentIndex;return $!==null?this.playlist[$]:null}get mode(){return this.store.getState().playlistMode}dispose(){if(this.sourceManager)this.sourceManager=void 0;this.switchSource=void 0}}function Y$($,A,O,J){let Q=A.name;return{player:$,getState(){return $.getState()},subscribe(Z){let j=$.subscribe(Z),K=()=>j.unsubscribe();return O.stateUnsubscribes.push(K),K},getPluginState(){return O.pluginState},setPluginState(Z){O.pluginState=Z},on(Z,j){$.on(Z,j);let K=O.eventListeners.get(Z);if(!K)K=new Set,O.eventListeners.set(Z,K);K.add(j)},off(Z,j){$.off(Z,j);let K=O.eventListeners.get(Z);if(K)K.delete(j)},getCanvas(){return $.getRenderTarget()},getPlugin(Z){return J().get(Z)?.plugin},hasPlugin(Z){return J().has(Z)},log(...Z){console.log(`[MediaFox:${Q}]`,...Z)},warn(...Z){console.warn(`[MediaFox:${Q}]`,...Z)},error(...Z){console.error(`[MediaFox:${Q}]`,...Z)}}}class K${player;plugins=new Map;overlays=[];overlaysSorted=!1;registrationCounter=0;constructor($){this.player=$}async install($){let{name:A}=$;if(this.plugins.has(A))throw Error(`Plugin "${A}" is already installed`);if($.dependencies){for(let J of $.dependencies)if(!this.plugins.has(J))throw Error(`Plugin "${A}" requires plugin "${J}" to be installed first`)}let O={plugin:$,context:null,eventListeners:new Map,stateUnsubscribes:[],pluginState:void 0};O.context=Y$(this.player,$,O,()=>this.plugins),this.plugins.set(A,O);try{await $.install(O.context)}catch(J){throw this.plugins.delete(A),J}if($.hooks?.render?.onOverlay)this.overlays.push({pluginName:A,zIndex:$.hooks.render.onOverlay.zIndex??0,registrationOrder:this.registrationCounter++,render:$.hooks.render.onOverlay}),this.overlaysSorted=!1,this.player.refreshOverlays()}async uninstall($){let A=this.plugins.get($);if(!A)throw Error(`Plugin "${$}" is not installed`);try{await A.plugin.uninstall?.()}catch(J){console.error(`Error uninstalling plugin "${$}":`,J)}for(let[J,Q]of A.eventListeners)for(let Z of Q)this.player.off(J,Z);for(let J of A.stateUnsubscribes)J();let O=this.overlays.some((J)=>J.pluginName===$);if(this.overlays=this.overlays.filter((J)=>J.pluginName!==$),this.plugins.delete($),O)this.player.refreshOverlays()}has($){return this.plugins.has($)}get size(){return this.plugins.size}async executeBeforeLoad($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.lifecycle?.beforeLoad;if(!O)continue;try{let J=await O.call(A.plugin,$);if(J?.cancel)return J;if(J?.data!==void 0)$=J.data}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in beforeLoad hook:`,J)}}return{data:$}}async executeAfterLoad($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.lifecycle?.afterLoad;if(!O)continue;try{await O.call(A.plugin,$)}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in afterLoad hook:`,J)}}}async executeBeforePlay(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.beforePlay;if(!A)continue;try{let O=await A.call($.plugin);if(O?.cancel)return O}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in beforePlay hook:`,O)}}return}executeAfterPlay(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.afterPlay;if(!A)continue;try{A.call($.plugin)}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in afterPlay hook:`,O)}}}async executeBeforePause(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.beforePause;if(!A)continue;try{let O=await A.call($.plugin);if(O?.cancel)return O}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in beforePause hook:`,O)}}return}executeAfterPause(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.afterPause;if(!A)continue;try{A.call($.plugin)}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in afterPause hook:`,O)}}}async executeBeforeSeek($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.lifecycle?.beforeSeek;if(!O)continue;try{let J=await O.call(A.plugin,$);if(J?.cancel)return J;if(J?.data!==void 0)$=J.data}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in beforeSeek hook:`,J)}}return{data:$}}executeAfterSeek($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.lifecycle?.afterSeek;if(!O)continue;try{O.call(A.plugin,$)}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in afterSeek hook:`,J)}}}async executeBeforeStop(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.beforeStop;if(!A)continue;try{let O=await A.call($.plugin);if(O?.cancel)return O}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in beforeStop hook:`,O)}}return}executeAfterStop(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.afterStop;if(!A)continue;try{A.call($.plugin)}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in afterStop hook:`,O)}}}executeOnError($){let A=!1;for(let[,O]of this.plugins){let J=O.plugin.hooks?.lifecycle?.onError;if(!J)continue;try{if(J.call(O.plugin,$)?.handled)A=!0}catch(Q){console.error(`[MediaFox:${O.plugin.name}] Error in onError hook:`,Q)}}return A}executeOnEnded(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.onEnded;if(!A)continue;try{A.call($.plugin)}catch(O){console.error(`[MediaFox:${$.plugin.name}] Error in onEnded hook:`,O)}}}executeBeforeRender($,A){for(let[,O]of this.plugins){let J=O.plugin.hooks?.render?.beforeRender;if(!J)continue;try{let Q=J.call(O.plugin,$,A);if(Q?.skip)return Q}catch(Q){console.error(`[MediaFox:${O.plugin.name}] Error in beforeRender hook:`,Q)}}return}executeTransformFrame($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.render?.transformFrame;if(!O)continue;try{let J=O.call(A.plugin,$);if(J)$=J}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in transformFrame hook:`,J)}}return $}executeAfterRender($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.render?.afterRender;if(!O)continue;try{O.call(A.plugin,$)}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in afterRender hook:`,J)}}}executeOverlays($,A,O){if(this.overlays.length===0)return;if(!this.overlaysSorted)this.overlays.sort((J,Q)=>{if(J.zIndex!==Q.zIndex)return J.zIndex-Q.zIndex;return J.registrationOrder-Q.registrationOrder}),this.overlaysSorted=!0;for(let J of this.overlays)try{J.render?.render($,A,O)}catch(Q){console.error(`[MediaFox:${J.pluginName}] Error in onOverlay hook:`,Q)}}executeBeforeStateUpdate($){for(let[,A]of this.plugins){let O=A.plugin.hooks?.state?.beforeStateUpdate;if(!O)continue;try{let J=O.call(A.plugin,$);if(J===null)return null;if(J!==void 0)$=J}catch(J){console.error(`[MediaFox:${A.plugin.name}] Error in beforeStateUpdate hook:`,J)}}return $}executeOnStateChange($,A){for(let[,O]of this.plugins){let J=O.plugin.hooks?.state?.onStateChange;if(!J)continue;try{J.call(O.plugin,$,A)}catch(Q){console.error(`[MediaFox:${O.plugin.name}] Error in onStateChange hook:`,Q)}}}executeBeforeEvent($,A){for(let[,O]of this.plugins){let J=O.plugin.hooks?.event?.beforeEvent;if(!J)continue;try{let Q=J.call(O.plugin,$,A);if(Q?.cancel)return Q;if(Q?.data!==void 0)A=Q.data}catch(Q){console.error(`[MediaFox:${O.plugin.name}] Error in beforeEvent hook:`,Q)}}return{data:A}}executeAfterEvent($,A){for(let[,O]of this.plugins){let J=O.plugin.hooks?.event?.afterEvent;if(!J)continue;try{J.call(O.plugin,$,A)}catch(Q){console.error(`[MediaFox:${O.plugin.name}] Error in afterEvent hook:`,Q)}}}executeOnAudioNode($,A){let O=A;for(let[,J]of this.plugins){let Q=J.plugin.hooks?.audio?.onAudioNode;if(!Q)continue;try{let Z=Q.call(J.plugin,$,A);if(Z)O=Z}catch(Z){console.error(`[MediaFox:${J.plugin.name}] Error in onAudioNode hook:`,Z)}}return O}async dispose(){let $=Array.from(this.plugins.keys()).reverse();for(let A of $)try{await this.uninstall(A)}catch(O){console.error(`Error disposing plugin "${A}":`,O)}}}import{ALL_FORMATS as g$,BlobSource as p$,BufferSource as u$,CanvasSink as m$,FilePathSource as c$,Input as l$,ReadableStreamSource as d$,UrlSource as o$}from"mediabunny";class d{currentSource=null;queuedSources=new Map;options;constructor($={}){this.options={maxCacheSize:$.maxCacheSize??16777216,crossOrigin:$.crossOrigin,requestInit:$.requestInit}}async createSource($,A){if(this.currentSource&&!A)this.disposeCurrent();let O,J;if($ instanceof File||$ instanceof Blob)O=new p$($,{maxCacheSize:this.options.maxCacheSize}),J="blob";else if($ instanceof ArrayBuffer||$ instanceof Uint8Array)O=new u$($),J="buffer";else if(typeof $==="string"||$ instanceof URL){let j=$ instanceof URL?$.href:$;if(typeof window>"u"&&!j.startsWith("http"))O=new c$(j,{maxCacheSize:this.options.maxCacheSize}),J="file";else O=new o$(j,{maxCacheSize:this.options.maxCacheSize,requestInit:this.options.requestInit}),J="url"}else if(typeof ReadableStream<"u"&&$ instanceof ReadableStream)O=new d$($,{maxCacheSize:this.options.maxCacheSize}),J="stream";else throw TypeError("Unsupported media source type");let Q=new l$({source:O,formats:g$}),Z={source:O,input:Q,type:J,originalSource:$};if(A)this.queuedSources.set(A,Z);else this.currentSource=Z;return Z}getCurrentSource(){return this.currentSource}getQueuedSource($){return this.queuedSources.get($)||null}async preloadSource($,A){if(this.queuedSources.has(A))return;let O=await this.createSource($,A);if(O.input)try{let J=await this.prefetchTrackData(O.input);O.prefetchedData=J}catch{}}async prefetchTrackData($){let A=await $.getVideoTracks(),O=await $.getAudioTracks(),J=A.length>0?A[0]:null,Q=O.length>0?O[0]:null,Z=null,j=null,K=0;if(J){if(J.codec!==null&&await J.canDecode()){Z=new m$(J,{poolSize:2});let G=Z.canvases(0);j=(await G.next()).value??null,await G.return(),K=await J.computeDuration()}}if(!K&&Q)K=await Q.computeDuration();return{videoTrack:J,audioTrack:Q,canvasSink:Z,firstFrame:j,duration:K}}promoteQueuedSource($){let A=this.queuedSources.get($);if(!A)return null;if(this.queuedSources.delete($),this.currentSource)this.currentSource.input?.dispose();return this.currentSource=A,A}getOriginalSource(){return this.currentSource?.originalSource??null}disposeCurrent(){if(this.currentSource)this.currentSource.input?.dispose(),this.currentSource=null}disposeQueued($){let A=this.queuedSources.get($);if(A)A.input?.dispose(),this.queuedSources.delete($)}disposeAll(){this.disposeCurrent(),this.queuedSources.forEach(($,A)=>{this.disposeQueued(A)}),this.queuedSources.clear()}dispose(){this.disposeAll()}static isStreamingSource($){return $ instanceof ReadableStream||typeof $==="string"&&$.startsWith("http")}static isLocalSource($){return $ instanceof File||$ instanceof Blob||$ instanceof ArrayBuffer||$ instanceof Uint8Array||typeof $==="string"&&!$.startsWith("http")}static getSourceType($){if($ instanceof File)return"file";if($ instanceof Blob)return"blob";if($ instanceof ArrayBuffer||$ instanceof Uint8Array)return"buffer";if($ instanceof ReadableStream)return"stream";if(typeof $==="string"||$ instanceof URL)return($ instanceof URL?$.href:$).startsWith("http")?"url":"file";return"unknown"}static async fromFetch($,A){let O=await fetch($,A);if(!O.ok)throw Error(`Failed to fetch: ${O.status} ${O.statusText}`);return O.blob()}static fromStreamingFetch($,A){return new ReadableStream({async start(O){let J=await fetch($,A);if(!J.ok){O.error(Error(`Failed to fetch: ${J.status} ${J.statusText}`));return}let Q=J.body?.getReader();if(!Q){O.error(Error("Response body is not readable"));return}try{while(!0){let{done:Z,value:j}=await Q.read();if(Z)break;O.enqueue(j)}O.close()}catch(Z){O.error(Z)}}})}}function o($,A){if(Object.is($,A))return!0;if(typeof $!==typeof A)return!1;if($===null||A===null)return $===A;if(Array.isArray($)&&Array.isArray(A)){if($.length!==A.length)return!1;for(let O=0;O<$.length;O++)if(!o($[O],A[O]))return!1;return!0}if(z$($)&&z$(A)){let O=Object.keys($),J=Object.keys(A);if(O.length!==J.length)return!1;for(let Q of O){if(!Object.hasOwn(A,Q))return!1;if(!o($[Q],A[Q]))return!1}return!0}return!1}function z$($){return typeof $==="object"&&$!==null&&$.constructor===Object}class s{state;previousState;listeners=new Set;updateScheduled=!1;pendingUpdates={};pluginManager=null;constructor(){this.state=this.getInitialState(),this.previousState={...this.state}}setPluginManager($){this.pluginManager=$}getInitialState(){let A=L.getSupportedRenderers()[0]||"canvas2d";return{state:"idle",currentTime:0,duration:0,buffered:[],volume:1,muted:!1,playbackRate:1,playing:!1,paused:!0,ended:!1,seeking:!1,waiting:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,canPlay:!1,canPlayThrough:!1,isLive:!1,rendererType:A,playlist:[],currentPlaylistIndex:null,playlistMode:null,rotation:0,displaySize:{width:0,height:0}}}getState(){return Object.freeze({...this.state})}setState($){if(this.pluginManager){let A=this.pluginManager.executeBeforeStateUpdate($);if(A===null)return;$=A}if(Object.assign(this.pendingUpdates,$),!this.updateScheduled)this.updateScheduled=!0,queueMicrotask(()=>this.flushUpdates())}flushUpdates(){if(Object.keys(this.pendingUpdates).length===0){this.updateScheduled=!1;return}this.previousState={...this.state},this.state={...this.state,...this.pendingUpdates},this.pendingUpdates={},this.updateScheduled=!1;let $=Object.keys(this.pendingUpdates);if(($.length?$:Object.keys(this.state)).some((J)=>!o(this.state[J],this.previousState[J]))){if(this.notifyListeners(),this.pluginManager)this.pluginManager.executeOnStateChange(this.state,this.previousState)}}subscribe($){return this.listeners.add($),$(this.getState()),()=>{this.listeners.delete($)}}reset(){this.state=this.getInitialState(),this.pendingUpdates={},this.updateScheduled=!1,this.notifyListeners()}notifyListeners(){let $=this.getState();this.listeners.forEach((A)=>{try{A($)}catch(O){console.error("Error in state listener:",O)}})}updatePlaybackState($){let A=$?"playing":"paused";this.setState({state:A,playing:$,paused:!$,ended:!1})}updateTime($){this.setState({currentTime:$})}updateDuration($){this.setState({duration:$})}updateBuffered($){this.setState({buffered:$})}updateVolume($,A){this.setState({volume:$,muted:A})}updatePlaybackRate($){this.setState({playbackRate:$})}updateMediaInfo($){this.setState({mediaInfo:$})}updateTracks($,A,O){let J={};if($)J.videoTracks=$;if(A)J.audioTracks=A;if(O)J.subtitleTracks=O;this.setState(J)}updateSelectedTracks($,A){switch($){case"video":this.setState({selectedVideoTrack:A});break;case"audio":this.setState({selectedAudioTrack:A});break;case"subtitle":this.setState({selectedSubtitleTrack:A});break}}updateError($){this.setState({error:$,state:$?"error":this.state.state})}updateSeekingState($){this.setState({seeking:$})}updateWaitingState($){this.setState({waiting:$})}updateReadyState($,A){this.setState({canPlay:$,canPlayThrough:A,state:$?"ready":this.state.state})}updateEndedState($){this.setState({ended:$,playing:!1,paused:!0,state:$?"ended":this.state.state})}updateLoadingState(){this.setState({state:"loading",playing:!1,paused:!0,ended:!1,error:null})}updateRendererType($){this.setState({rendererType:$})}updateRotation($,A){this.setState({rotation:$,displaySize:A})}updatePlaylist($,A=null){this.setState({playlist:$,currentPlaylistIndex:A})}updateCurrentPlaylistIndex($){this.setState({currentPlaylistIndex:$})}updatePlaylistMode($){this.setState({playlistMode:$})}addToPlaylist($,A){let O=this.state.playlist,J,Q=this.state.currentPlaylistIndex;if(A!==void 0&&A>=0&&A<=O.length){if(J=[...O.slice(0,A),$,...O.slice(A)],Q!==null&&Q>=A)Q+=1}else J=[...O,$];this.setState({playlist:J,currentPlaylistIndex:Q})}removeFromPlaylist($){let A=this.state.playlist;if($<0||$>=A.length)return;let O=A.filter((Q,Z)=>Z!==$),J=this.state.currentPlaylistIndex;if(J===$)J=O.length>0?0:null;else if(J!==null&&J>$)J-=1;if(O.length===0)this.setState({playlist:O,currentPlaylistIndex:null,state:"idle",currentTime:0,duration:0,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null});else this.setState({playlist:O,currentPlaylistIndex:J})}clearPlaylist(){this.setState({playlist:[],currentPlaylistIndex:null,state:"idle",currentTime:0,duration:0,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null})}}class n{input=null;videoTracks=new Map;audioTracks=new Map;videoTrackInfos=[];audioTrackInfos=[];subtitleTrackInfos=[];subtitleProviders=new Map;subtitleTrackResolvers=new Map;selectedVideoTrack=null;selectedAudioTrack=null;selectedSubtitleTrack=null;onTrackChange;async initialize($){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.input=$,await this.loadTracks()}async loadTracks(){if(!this.input)return;let $=await this.input.getVideoTracks();this.videoTrackInfos=await Promise.all($.map(async(O)=>{let J=`video-${O.id}`;this.videoTracks.set(J,O);let Q=0,Z=0;try{let K=await O.computePacketStats(100);Q=K.averagePacketRate,Z=K.averageBitrate}catch{}return{id:J,codec:O.codec,language:O.languageCode,name:O.name,width:O.codedWidth,height:O.codedHeight,frameRate:Q,bitrate:Z,rotation:O.rotation,selected:!1,decodable:await O.canDecode()}}));let A=await this.input.getAudioTracks();if(this.audioTrackInfos=await Promise.all(A.map(async(O)=>{let J=`audio-${O.id}`;this.audioTracks.set(J,O);let Q=0;try{Q=(await O.computePacketStats(100)).averageBitrate}catch{}return{id:J,codec:O.codec,language:O.languageCode,name:O.name,channels:O.numberOfChannels,sampleRate:O.sampleRate,bitrate:Q,selected:!1,decodable:await O.canDecode()}})),this.videoTrackInfos.length>0){let O=this.videoTrackInfos.find((J)=>J.decodable);if(O)this.selectVideoTrack(O.id)}if(this.audioTrackInfos.length>0){let O=this.audioTrackInfos.find((J)=>J.decodable);if(O)this.selectAudioTrack(O.id)}}getVideoTracks(){return[...this.videoTrackInfos]}getAudioTracks(){return[...this.audioTrackInfos]}getSubtitleTracks(){return[...this.subtitleTrackInfos]}getSelectedVideoTrack(){if(!this.selectedVideoTrack)return null;return this.videoTracks.get(this.selectedVideoTrack)??null}getSelectedAudioTrack(){if(!this.selectedAudioTrack)return null;return this.audioTracks.get(this.selectedAudioTrack)??null}getSelectedVideoTrackInfo(){if(!this.selectedVideoTrack)return null;return this.videoTrackInfos.find(($)=>$.id===this.selectedVideoTrack)??null}getSelectedAudioTrackInfo(){if(!this.selectedAudioTrack)return null;return this.audioTrackInfos.find(($)=>$.id===this.selectedAudioTrack)??null}getSelectedSubtitleTrackInfo(){if(!this.selectedSubtitleTrack)return null;return this.subtitleTrackInfos.find(($)=>$.id===this.selectedSubtitleTrack)??null}selectVideoTrack($){if($===this.selectedVideoTrack)return!0;if($&&!this.videoTracks.has($))return!1;let A=this.selectedVideoTrack;if(this.videoTrackInfos.forEach((O)=>{O.selected=O.id===$}),this.selectedVideoTrack=$,this.onTrackChange)this.onTrackChange({type:"video",previousTrackId:A,newTrackId:$});return!0}selectAudioTrack($){if($===this.selectedAudioTrack)return!0;if($&&!this.audioTracks.has($))return!1;let A=this.selectedAudioTrack;if(this.audioTrackInfos.forEach((O)=>{O.selected=O.id===$}),this.selectedAudioTrack=$,this.onTrackChange)this.onTrackChange({type:"audio",previousTrackId:A,newTrackId:$});return!0}selectSubtitleTrack($){if($===this.selectedSubtitleTrack)return!0;if($&&!this.subtitleTrackResolvers.has($))return!1;let A=this.selectedSubtitleTrack;if(this.subtitleTrackInfos.forEach((O)=>{O.selected=O.id===$}),this.selectedSubtitleTrack=$,this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:A,newTrackId:$});return!0}registerSubtitleTracks($,A){this.subtitleProviders.set($,A),this.rebuildSubtitleTracks()}unregisterSubtitleTracks($){if(!this.subtitleProviders.delete($))return;this.rebuildSubtitleTracks()}async getSubtitleTrackResource($){if(!$)return null;let A=this.subtitleTrackResolvers.get($);if(!A)return null;return A()}rebuildSubtitleTracks(){let $=this.selectedSubtitleTrack;this.subtitleTrackInfos=[],this.subtitleTrackResolvers.clear();for(let O of this.subtitleProviders.values())for(let J of O){let Q={...J.info,selected:!1};this.subtitleTrackInfos.push(Q),this.subtitleTrackResolvers.set(Q.id,J.resolver)}let A=$;if(!A||!this.subtitleTrackResolvers.has(A))A=this.subtitleTrackInfos[0]?.id??null;if(this.selectedSubtitleTrack=A,this.subtitleTrackInfos.forEach((O)=>{O.selected=O.id===this.selectedSubtitleTrack}),$!==this.selectedSubtitleTrack&&this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:$,newTrackId:this.selectedSubtitleTrack})}setTrackChangeListener($){this.onTrackChange=$}getState(){return{videoTracks:this.getVideoTracks(),audioTracks:this.getAudioTracks(),subtitleTracks:this.getSubtitleTracks(),selectedVideoTrack:this.selectedVideoTrack,selectedAudioTrack:this.selectedAudioTrack,selectedSubtitleTrack:this.selectedSubtitleTrack}}getPrimaryVideoTrack(){if(this.videoTracks.size===0)return null;return this.selectedVideoTrack?this.videoTracks.get(this.selectedVideoTrack)??null:this.videoTracks.values().next().value??null}getPrimaryAudioTrack(){if(this.audioTracks.size===0)return null;return this.selectedAudioTrack?this.audioTracks.get(this.selectedAudioTrack)??null:this.audioTracks.values().next().value??null}hasVideo(){return this.videoTrackInfos.length>0}hasAudio(){return this.audioTrackInfos.length>0}hasSubtitles(){return this.subtitleTrackInfos.length>0}dispose(){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.subtitleTrackInfos=[],this.subtitleProviders.clear(),this.subtitleTrackResolvers.clear(),this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.selectedSubtitleTrack=null,this.input=null,this.onTrackChange=void 0}async replaceAudioTrackByInputId($,A){let O=null;for(let[Q,Z]of this.audioTracks.entries())if(Z.id===$){O=Q;break}if(!O)return;this.audioTracks.set(O,A);let J=this.audioTrackInfos.findIndex((Q)=>Q.id===O);if(J!==-1){let Q=0;try{Q=(await A.computePacketStats(100)).averageBitrate}catch{}this.audioTrackInfos[J]={...this.audioTrackInfos[J],codec:A.codec,channels:A.numberOfChannels,sampleRate:A.sampleRate,bitrate:Q,decodable:await A.canDecode()}}}async replaceVideoTrackByInputId($,A){let O=null;for(let[Q,Z]of this.videoTracks.entries())if(Z.id===$){O=Q;break}if(!O)return;this.videoTracks.set(O,A);let J=this.videoTrackInfos.findIndex((Q)=>Q.id===O);if(J!==-1){let Q=0,Z=0;try{let j=await A.computePacketStats(100);Q=j.averagePacketRate,Z=j.averageBitrate}catch{}this.videoTrackInfos[J]={...this.videoTrackInfos[J],codec:A.codec,width:A.codedWidth,height:A.codedHeight,rotation:A.rotation,frameRate:Q,bitrate:Z,decodable:await A.canDecode()}}}}class i{emitter;store;state;sourceManager;playbackController;trackManager;playlistManager;pluginManager;options;disposed=!1;getCurrentInput=()=>this.sourceManager.getCurrentSource()?.input??null;trackSwitcher;core;constructor($={}){this.options={volume:1,muted:!1,playbackRate:1,autoplay:!1,preload:"metadata",...$},this.emitter=new H({maxListeners:100}),this.store=new s,this.state=new J$(this.store),this.sourceManager=new d({maxCacheSize:$.maxCacheSize,crossOrigin:$.crossOrigin}),this.playbackController=new c({canvas:$.renderTarget,audioContext:$.audioContext,volume:this.options.volume,muted:this.options.muted,playbackRate:this.options.playbackRate,rendererType:this.options.renderer}),this.trackManager=new n,this.playlistManager=new j$(this.store,this.emitter,async(A,O)=>{await this.core.load(A.mediaSource,{startTime:A.savedPosition??0,autoplay:O,playlistItemId:A.id})},this.sourceManager),this.trackSwitcher=new Z$({sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,emit:this.emit.bind(this),store:this.store,getCurrentInput:this.getCurrentInput}),this.pluginManager=new K$(this),this.core=new O$({state:this.state,sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,trackSwitcher:this.trackSwitcher,emit:this.emit.bind(this),pluginManager:this.pluginManager}),this.playbackController.setPluginManager(this.pluginManager),this.store.setPluginManager(this.pluginManager),this.setupInternalListeners(),this.state.applyInitial(this.options.volume??1,this.options.muted??!1,this.options.playbackRate??1),this.state.updateRendererType(this.options.renderer||"webgpu")}setupInternalListeners(){this.playbackController.setTimeUpdateCallback(($)=>{this.state.updateTime($),this.emit("timeupdate",{currentTime:$})}),this.playbackController.setEndedCallback(()=>{this.state.updateEndedState(!0),this.emit("ended",void 0);let $=this.getState();if($.playlist.length>0&&$.currentPlaylistIndex!==null){let{playlistMode:A,currentPlaylistIndex:O}=$;if(A==="repeat-one"){let J=O;queueMicrotask(async()=>{try{await this.seek(0),await this.play()}catch(Q){this.emitter.emit("playlistitemerror",{index:J,error:Q})}})}else if(A==="repeat"){let J=O<$.playlist.length-1?O+1:0;queueMicrotask(async()=>{try{await this.playlistManager.next()}catch(Q){this.emitter.emit("playlistitemerror",{index:J,error:Q})}})}else if(A==="sequential"&&O<$.playlist.length-1){let J=O+1;queueMicrotask(async()=>{try{await this.playlistManager.next()}catch(Q){this.emitter.emit("playlistitemerror",{index:J,error:Q})}})}}}),this.trackManager.setTrackChangeListener(($)=>{this.state.updateSelectedTracks($.type,$.newTrackId),this.emit("trackchange",{type:$.type,trackId:$.newTrackId})}),this.playbackController.setWaitingCallback(()=>{this.state.updateWaitingState(!0),this.emit("waiting",void 0)}),this.playbackController.setPlayingCallback(()=>{if(this.getState().waiting)this.state.updateWaitingState(!1),this.emit("playing",void 0)}),this.playbackController.setRendererChangeCallback(($)=>{this.state.updateRendererType($),this.emit("rendererchange",$)}),this.playbackController.setRendererFallbackCallback(($,A)=>{this.emit("rendererfallback",{from:$,to:A})}),this.playbackController.setRotationChangeCallback(($,A)=>{this.store.updateRotation($,A),this.emit("rotationchange",{rotation:$,displaySize:A})}),this.state.subscribe(($)=>{this.emit("statechange",$)})}async load($,A={}){this.checkDisposed();let O=this.getState();if(O.playlist.length===0||A.replacePlaylist){await this.playlistManager.loadPlaylist([{mediaSource:$}],{autoplay:A.autoplay??this.options.autoplay,startTime:A.startTime});return}else if(O.currentPlaylistIndex!==null&&O.playlist.length>0){let J=O.currentPlaylistIndex,Z={...O.playlist[J],mediaSource:$,savedPosition:0,duration:null},j=[...O.playlist];j[J]=Z,this.store.updatePlaylist(j,J),this.emitter.emit("playlistchange",{playlist:j}),await this.core.load($,{startTime:A.startTime??0,autoplay:A.autoplay??this.options.autoplay});return}await this.core.load($,{autoplay:A.autoplay??this.options.autoplay,startTime:A.startTime})}async play(){return this.checkDisposed(),this.core.play()}pause(){this.checkDisposed(),this.core.pause()}async seek($,A={}){return this.checkDisposed(),this.core.seek($)}async stop(){return this.checkDisposed(),this.core.stop()}get currentTime(){return this.playbackController.getCurrentTime()}set currentTime($){this.seek($)}get duration(){return this.state.getState().duration}get volume(){return this.playbackController.getVolume()}set volume($){this.checkDisposed();let A=Math.max(0,Math.min(1,$));this.playbackController.setVolume(A),this.state.updateVolume(A,this.muted),this.emit("volumechange",{volume:A,muted:this.muted})}get muted(){return this.playbackController.isMuted()}set muted($){this.checkDisposed(),this.playbackController.setMuted($),this.state.updateVolume(this.volume,$),this.emit("volumechange",{volume:this.volume,muted:$})}get playbackRate(){return this.playbackController.getPlaybackRate()}set playbackRate($){this.checkDisposed();let A=Math.max(0.25,Math.min(4,$));this.playbackController.setPlaybackRate(A),this.state.updatePlaybackRate(A),this.emit("ratechange",{playbackRate:A})}get paused(){return!this.playbackController.isPlaying()}get ended(){return this.state.getState().ended}get seeking(){return this.state.getState().seeking}get waiting(){return this.state.getState().waiting}get rotation(){return this.playbackController.getRotation()}set rotation($){this.checkDisposed(),this.playbackController.setRotation($)}get displaySize(){return this.playbackController.getDisplaySize()}getVideoTracks(){return this.trackManager.getVideoTracks()}getAudioTracks(){return this.trackManager.getAudioTracks()}getSubtitleTracks(){return this.trackManager.getSubtitleTracks()}async selectVideoTrack($){this.checkDisposed(),await this.trackSwitcher.selectVideoTrack(this.trackManager,$)}async selectAudioTrack($){this.checkDisposed(),await this.trackSwitcher.selectAudioTrack(this.trackManager,$)}selectSubtitleTrack($){if(this.checkDisposed(),!this.trackManager.selectSubtitleTrack($))throw Error(`Invalid subtitle track ID: ${$}`)}registerSubtitleTracks($,A){this.trackManager.registerSubtitleTracks($,A),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let O=this.state.getState().mediaInfo;if(O)this.state.updateMediaInfo({...O,hasSubtitles:this.trackManager.hasSubtitles()})}unregisterSubtitleTracks($){this.trackManager.unregisterSubtitleTracks($),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let A=this.state.getState().mediaInfo;if(A)this.state.updateMediaInfo({...A,hasSubtitles:this.trackManager.hasSubtitles()})}async getSubtitleTrackResource($){return this.trackManager.getSubtitleTrackResource($)}async screenshot($={}){return this.checkDisposed(),this.playbackController.screenshot($)}async setRenderTarget($){this.checkDisposed(),await this.playbackController.setCanvas($)}getRenderTarget(){return this.playbackController.getCanvas()}refreshOverlays(){this.playbackController.refreshOverlays()}async loadPlaylist($,A){this.checkDisposed(),await this.playlistManager.loadPlaylist($,A)}addToPlaylist($,A){this.checkDisposed(),this.playlistManager.addToPlaylist($,A)}async removeFromPlaylist($){this.checkDisposed(),await this.playlistManager.removeFromPlaylist($)}clearPlaylist(){this.checkDisposed(),this.playlistManager.clearPlaylist()}async next(){this.checkDisposed(),await this.playlistManager.next()}async prev(){this.checkDisposed(),await this.playlistManager.prev()}async jumpTo($){this.checkDisposed(),await this.playlistManager.jumpTo($)}get playlist(){return this.playlistManager.playlist}get playlistIndex(){return this.playlistManager.currentIndex}get nowPlaying(){return this.playlistManager.currentItem}get playlistMode(){return this.playlistManager.mode}set playlistMode($){this.checkDisposed(),this.playlistManager.setMode($)}getRendererType(){return this.playbackController.getRendererType()}async switchRenderer($){this.checkDisposed(),await this.playbackController.switchRenderer($)}updateCanvasDimensions(){this.checkDisposed(),this.playbackController.updateCanvasDimensions()}static getSupportedRenderers(){return L.getSupportedRenderers()}getState(){return this.state.getState()}subscribe($){return{unsubscribe:this.state.subscribe($)}}on($,A){return this.emitter.on($,A)}once($,A){return this.emitter.once($,A)}off($,A){this.emitter.off($,A)}async use($){if(this.checkDisposed(),await this.pluginManager.install($),$.hooks?.audio)this.playbackController.rebuildAudioGraph()}async unuse($){this.checkDisposed(),await this.pluginManager.uninstall($),this.playbackController.rebuildAudioGraph()}emit($,A){let O=this.pluginManager.executeBeforeEvent($,A);if(O?.cancel)return;let J=O?.data??A;this.emitter.emit($,J),this.pluginManager.executeAfterEvent($,J)}checkDisposed(){if(this.disposed)throw Error("Player has been disposed")}dispose(){if(this.disposed)return;this.disposed=!0,this.pluginManager.dispose(),this.playbackController.dispose(),this.trackManager.dispose(),this.playlistManager?.dispose(),this.sourceManager.dispose(),this.state.reset(),this.emitter.removeAllListeners()}destroy(){this.dispose(),this.playbackController.destroy()}}var s$={fromUrl($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromFile($,A={}){return{mediaSource:$,title:A.title||$.name,poster:A.poster}},fromBlob($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromBuffer($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromUint8Array($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromStream($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}}};var B$;((V)=>{V.MEDIA_NOT_SUPPORTED="MEDIA_NOT_SUPPORTED";V.MEDIA_LOAD_FAILED="MEDIA_LOAD_FAILED";V.DECODE_ERROR="DECODE_ERROR";V.NETWORK_ERROR="NETWORK_ERROR";V.PERMISSION_DENIED="PERMISSION_DENIED";V.PLAYBACK_ERROR="PLAYBACK_ERROR";V.TRACK_NOT_FOUND="TRACK_NOT_FOUND";V.INVALID_STATE="INVALID_STATE";V.UNKNOWN_ERROR="UNKNOWN_ERROR"})(B$||={});class B extends Error{code;details;constructor($,A,O){super(A);this.name="MediaFoxError",this.code=$,this.details=O}static mediaNotSupported($="Media format not supported",A){return new B("MEDIA_NOT_SUPPORTED",$,A)}static mediaLoadFailed($="Failed to load media",A){return new B("MEDIA_LOAD_FAILED",$,A)}static decodeError($="Failed to decode media",A){return new B("DECODE_ERROR",$,A)}static networkError($="Network error occurred",A){return new B("NETWORK_ERROR",$,A)}static permissionDenied($="Permission denied",A){return new B("PERMISSION_DENIED",$,A)}static playbackError($="Playback error occurred",A){return new B("PLAYBACK_ERROR",$,A)}static trackNotFound($="Track not found",A){return new B("TRACK_NOT_FOUND",$,A)}static invalidState($="Invalid player state",A){return new B("INVALID_STATE",$,A)}static unknownError($="Unknown error occurred",A){return new B("UNKNOWN_ERROR",$,A)}}function n$($,A){if($ instanceof B)return $;if($ instanceof Error)return new B("UNKNOWN_ERROR",`${A}: ${$.message}`,{originalError:$});return new B("UNKNOWN_ERROR",`${A}: ${String($)}`,{originalError:$})}function i$($,A=!1){let O=Math.abs($),J=Math.floor(O/3600),Q=Math.floor(O%3600/60),Z=Math.floor(O%60),j=Math.floor(O%1*1000),K="";if($<0)K="-";if(J>0)K+=`${J}:${Q.toString().padStart(2,"0")}:${Z.toString().padStart(2,"0")}`;else K+=`${Q}:${Z.toString().padStart(2,"0")}`;if(A)K+=`.${j.toString().padStart(3,"0")}`;return K}function a$($){let A=$.trim().split(":").map(Number);if(A.some(Number.isNaN))throw Error("Invalid time string");let O=0;if(A.length===3)O=A[0]*3600+A[1]*60+A[2];else if(A.length===2)O=A[0]*60+A[1];else if(A.length===1)O=A[0];else throw Error("Invalid time format");return O}function t$($,A){return Math.floor($*A)}function r$($,A){return $/A}function e$($,A,O){return Math.max(A,Math.min(O,$))}function $A($,A){return $.start<A.end&&A.start<$.end}function AA($){if($.length===0)return[];let A=[...$].sort((J,Q)=>J.start-Q.start),O=[A[0]];for(let J=1;J<A.length;J++){let Q=O[O.length-1],Z=A[J];if(Z.start<=Q.end)Q.end=Math.max(Q.end,Z.end);else O.push(Z)}return O}function OA($){return $.reduce((A,O)=>A+(O.end-O.start),0)}function JA($,A){for(let O of $)if(A>=O.start&&A<O.end)return O;return null}var NO="0.1.0",wO=i;export{n$ as wrapError,OA as totalBufferedDuration,t$ as timeToFrame,$A as timeRangesOverlap,a$ as parseTime,AA as mergeTimeRanges,r$ as frameToTime,i$ as formatTime,JA as findBufferedRange,wO as default,e$ as clamp,p as VideoRenderer,NO as VERSION,n as TrackManager,s as Store,f as SourcePool,d as SourceManager,s$ as Source,L as RendererFactory,c as PlaybackController,B as MediaFoxError,i as MediaFox,H as EventEmitter,B$ as ErrorCode,r as Compositor,m as AudioManager};
40
+ `;constructor($){this.canvas=$.canvas,this.powerPreference=$.powerPreference||"high-performance",this.rotation=$.rotation??0,this.initialize().catch((A)=>{console.error("WebGPU initialization failed:",A)})}async initialize(){try{let $=navigator;if(!$.gpu)return console.log("WebGPU not available in navigator"),!1;let A=await $.gpu.requestAdapter({powerPreference:this.powerPreference});if(!A)return console.log("WebGPU adapter not available"),!1;if(this.device=await A.requestDevice(),!this.device)return console.log("WebGPU device not available"),!1;if("getContext"in this.canvas)this.context=this.canvas.getContext("webgpu");if(!this.context)return console.log("WebGPU context not available on canvas"),!1;let J=$.gpu.getPreferredCanvasFormat();return this.context.configure({device:this.device,format:J,usage:GPUTextureUsage.RENDER_ATTACHMENT,alphaMode:"opaque"}),await this.createRenderPipeline(),this.createVertexBuffer(),this.isInitialized=!0,console.log("WebGPU renderer initialized successfully"),!0}catch($){return console.error("WebGPU initialization error:",$),!1}}async createRenderPipeline(){if(!this.device)return;let $=navigator;if(!$.gpu)return;let A=this.device.createShaderModule({code:this.vertexShaderSource}),J=this.device.createShaderModule({code:this.fragmentShaderSource});this.pipeline=this.device.createRenderPipeline({layout:"auto",vertex:{module:A,entryPoint:"vs_main",buffers:[{arrayStride:16,attributes:[{shaderLocation:0,offset:0,format:"float32x2"},{shaderLocation:1,offset:8,format:"float32x2"}]}]},fragment:{module:J,entryPoint:"fs_main",targets:[{format:$.gpu.getPreferredCanvasFormat()}]},primitive:{topology:"triangle-strip"}})}createVertexBuffer(){if(!this.device)return;this.vertexBuffer=this.device.createBuffer({size:64,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}createTexture($,A){if(!this.device)return;if(this.texture)this.texture.destroy();if(this.texture=this.device.createTexture({size:{width:$,height:A},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),!this.sampler)this.sampler=this.device.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"});this.createBindGroup()}createBindGroup(){if(!this.device||!this.texture||!this.sampler||!this.pipeline)return;this.bindGroup=this.device.createBindGroup({layout:this.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:this.sampler},{binding:1,resource:this.texture.createView()}]})}isReady(){return this.isInitialized&&this.device!==null&&this.context!==null&&this.pipeline!==null}render($){if(!this.isReady()||!this.device||!this.context||!this.pipeline)return!1;try{let{width:A,height:J}=$;if(A===0||J===0)return console.warn(`WebGPU: Source canvas has zero dimensions (${A}x${J})`),!1;let K=this.canvas.width,Q=this.canvas.height;if(K===0||Q===0)return console.warn(`WebGPU: Output canvas has zero dimensions (${K}x${Q})`),!1;if(A!==this.textureWidth||J!==this.textureHeight)this.createTexture(A,J),this.textureWidth=A,this.textureHeight=J;if(!this.texture)return!1;try{this.device.queue.copyExternalImageToTexture({source:$},{texture:this.texture},{width:A,height:J})}catch{let K$=$.getContext("2d");if(!K$)return!1;let B$=K$.getImageData(0,0,A,J),U$=new Uint8Array(B$.data.buffer);this.device.queue.writeTexture({texture:this.texture,origin:{x:0,y:0,z:0}},U$,{bytesPerRow:A*4,rowsPerImage:J},{width:A,height:J,depthOrArrayLayers:1})}let Z=this.device.createCommandEncoder(),O=this.context.getCurrentTexture().createView(),j=Z.beginRenderPass({colorAttachments:[{view:O,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});if(j.setPipeline(this.pipeline),this.bindGroup)j.setBindGroup(0,this.bindGroup);let G=this.rotation===90||this.rotation===270,V=G?this.textureHeight:this.textureWidth,X=G?this.textureWidth:this.textureHeight,Y=Math.min(K/V,Q/X),U=Math.round(V*Y),D=Math.round(X*Y),_=Math.round((K-U)/2),E=Math.round((Q-D)/2),M=_/K*2-1,P=(_+U)/K*2-1,C=1-E/Q*2,T=1-(E+D)/Q*2,b=(M+P)/2,w=(C+T)/2,I=(P-M)/2,F=(C-T)/2,S=this.rotation*Math.PI/180,N=Math.cos(S),z=Math.sin(S),B=G?F:I,W=G?I:F,L=this.quadArray;if(L[0]=-B*N- -W*z+b,L[1]=-B*z+-W*N+w,L[2]=0,L[3]=1,L[4]=B*N- -W*z+b,L[5]=B*z+-W*N+w,L[6]=1,L[7]=1,L[8]=-B*N-W*z+b,L[9]=-B*z+W*N+w,L[10]=0,L[11]=0,L[12]=B*N-W*z+b,L[13]=B*z+W*N+w,L[14]=1,L[15]=0,this.vertexBuffer)this.device.queue.writeBuffer(this.vertexBuffer,0,L),j.setVertexBuffer(0,this.vertexBuffer);return j.draw(4,1,0,0),j.end(),this.device.queue.submit([Z.finish()]),!0}catch{return!1}}clear(){if(!this.isReady()||!this.device||!this.context)return;try{let $=this.device.createCommandEncoder(),A=this.context.getCurrentTexture().createView();$.beginRenderPass({colorAttachments:[{view:A,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([$.finish()])}catch{}}setRotation($){this.rotation=$}getRotation(){return this.rotation}dispose(){try{if(this.texture)this.texture.destroy(),this.texture=null;if(this.vertexBuffer)this.vertexBuffer.destroy(),this.vertexBuffer=null;this.device=null,this.context=null,this.pipeline=null,this.sampler=null,this.bindGroup=null,this.isInitialized=!1}catch{}}}class R{canvas;powerPreference;constructor($){this.canvas=$.canvas,this.powerPreference=$.powerPreference||"high-performance"}async createRenderer($){try{switch($){case"webgpu":return await this.createWebGPURenderer();case"webgl":return this.createWebGLRenderer();case"canvas2d":return this.createCanvas2DRenderer();default:return null}}catch{return null}}async createRendererWithFallback($){let A=[$];if($!=="webgl")A.push("webgl");if($!=="canvas2d")A.push("canvas2d");for(let K of A){let Q=await this.createRenderer(K);if(Q?.isReady())return{renderer:Q,actualType:K};if(Q)Q.dispose()}return{renderer:this.createCanvas2DRenderer(),actualType:"canvas2d"}}async createWebGPURenderer(){if(!navigator.gpu)return null;if(!("getContext"in this.canvas))return console.log("WebGPU requires HTMLCanvasElement, not OffscreenCanvas"),null;let A=new i({canvas:this.canvas,powerPreference:this.powerPreference}),J=1000,K=performance.now();if(await(async()=>{while(!A.isReady()){if(performance.now()-K>J)return console.log("WebGPU renderer initialization timed out"),!1;if("requestIdleCallback"in window)await new Promise((O)=>requestIdleCallback(()=>O(void 0)));else await new Promise((O)=>requestAnimationFrame(()=>O(void 0)))}return!0})())return console.log("WebGPU renderer initialized successfully"),A;return A.isReady()?A:null}createWebGLRenderer(){try{let $=new s({canvas:this.canvas,powerPreference:this.powerPreference,preserveDrawingBuffer:!1,antialias:!1,alpha:!1});return $.isReady()?$:null}catch{return null}}createCanvas2DRenderer(){return new H({canvas:this.canvas})}static getSupportedRenderers(){let $=[];if(navigator.gpu)$.push("webgpu");try{let J=document.createElement("canvas");if(J.getContext("webgl")||J.getContext("experimental-webgl"))$.push("webgl")}catch{}return $.push("canvas2d"),$}static getRendererDisplayName($){switch($){case"canvas2d":return"Canvas 2D";case"webgl":return"WebGL";case"webgpu":return"WebGPU";default:return"Unknown"}}static isRendererSupported($){if($==="canvas2d")return!0;return R.getSupportedRenderers().includes($)}}var a=new WeakMap;function V$($,A){a.set($,A)}function P$($){let A=a.get($);if(A)a.delete($);return A}class k{canvas=null;canvasSink=null;sampleSink=null;options;frameIterator=null;currentFrame=null;nextFrame=null;disposed=!1;renderingId=0;renderer=null;rendererType="canvas2d";onRendererChange;onRendererFallback;onRotationChange;initPromise=null;resizeObserver=null;lastObservedWidth=0;lastObservedHeight=0;videoAspectRatio=null;debug=!1;pluginManager=null;overlayCanvas=null;overlayCtx=null;lastOverlayTime=0;rotation=0;sourceWidth=0;sourceHeight=0;updateFrameResult={frameUpdated:!1,isStarving:!1};constructor($={}){if(this.options={poolSize:$.poolSize??2,rendererType:$.rendererType??"webgpu",...$},this.rendererType=this.options.rendererType??"webgpu",this.debug=$.debug??!1,this.initPromise=null,$.canvas){if(this.canvas=$.canvas,this.options.width!==void 0)$.canvas.width=this.options.width;if(this.options.height!==void 0)$.canvas.height=this.options.height;this.initPromise=this.initializeRenderer($.canvas,this.rendererType).catch((A)=>{if(this.debug)console.error("Failed to initialize renderer:",A)}),this.setupResizeObserver($.canvas)}}setupResizeObserver($){if(!("getBoundingClientRect"in $)||typeof ResizeObserver>"u")return;if(this.options.width!==void 0||this.options.height!==void 0)return;this.cleanupResizeObserver();let A=$;this.resizeObserver=new ResizeObserver((J)=>{if(this.disposed||!this.resizeObserver)return;for(let K of J){let{width:Q,height:Z}=this.getCanvasDimensionsFromEntry(K,A);if(Q!==this.lastObservedWidth||Z!==this.lastObservedHeight){if(this.lastObservedWidth=Q,this.lastObservedHeight=Z,A.width!==Q||A.height!==Z){if(A.width=Q,A.height=Z,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}}}});try{this.resizeObserver.observe(A,{box:"device-pixel-content-box"})}catch{try{this.resizeObserver.observe(A,{box:"content-box"})}catch{this.resizeObserver.observe(A)}}requestAnimationFrame(()=>{if(this.disposed||!this.resizeObserver)return;let{width:J,height:K}=this.getCanvasDimensionsFromCanvas(A);if(this.lastObservedWidth=J,this.lastObservedHeight=K,A.width!==J||A.height!==K){if(A.width=J,A.height=K,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}})}getCanvasDimensionsFromEntry($,A){let J=0,K=0,Q=window.devicePixelRatio||1;if($.devicePixelContentBoxSize?.length)J=$.devicePixelContentBoxSize[0].inlineSize,K=$.devicePixelContentBoxSize[0].blockSize;else if($.contentBoxSize?.length)J=Math.round($.contentBoxSize[0].inlineSize*Q),K=Math.round($.contentBoxSize[0].blockSize*Q);else if($.contentRect)J=Math.round($.contentRect.width*Q),K=Math.round($.contentRect.height*Q);if(J===0||K===0)return this.getCanvasDimensionsFromCanvas(A);return{width:Math.max(1,J),height:Math.max(1,K)}}getCanvasDimensionsFromCanvas($){let A=0,J=0,K=window.devicePixelRatio||1,Q=$.getBoundingClientRect();if(A=Math.round(Q.width*K),J=Math.round(Q.height*K),A===0||J===0)A=Math.round($.clientWidth*K)||A,J=Math.round($.clientHeight*K)||J;if(A===0||J===0)console.warn("Canvas has zero dimensions after all fallbacks, using 1x1");return{width:Math.max(1,A),height:Math.max(1,J)}}cleanupResizeObserver(){if(this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null,this.lastObservedWidth=0,this.lastObservedHeight=0}retryUntilCanvasReady($,A,J=60){let K=0,Q=()=>{if(K++,$.canvas.width>0&&$.canvas.height>0)A();else if(K<J)requestAnimationFrame(Q);else{if(this.debug)console.warn("Canvas dimensions timeout, forcing action");A()}};requestAnimationFrame(Q)}updateCanvasAspectRatio(){if(!this.canvas||!this.videoAspectRatio||!("style"in this.canvas))return;this.canvas.style.aspectRatio=this.videoAspectRatio}updateCanvasBackingBuffer($){let{width:A,height:J}=this.getCanvasDimensionsFromCanvas($);if($.width!==A||$.height!==J)return $.width=A,$.height=J,!0;return!1}async initializeRenderer($,A){if(this.debug)console.log(`Initializing renderer: ${A}`);let K=await new R({canvas:$}).createRendererWithFallback(A);if(this.debug)console.log(`Renderer factory result: ${K.actualType}`);if(!K.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${K.actualType}) not ready`);throw K.renderer.dispose(),Error(`Failed to initialize renderer: ${K.actualType}`)}if(this.renderer=K.renderer,this.rendererType=K.actualType,this.debug)console.log(`Initialized renderer: ${this.rendererType}`);if(K.actualType!==A){if(this.onRendererFallback)this.onRendererFallback(A,K.actualType)}if(this.onRendererChange){if(this.debug)console.log(`Emitting renderer change: ${this.rendererType}`);this.onRendererChange(this.rendererType)}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Rendering initial frame with ${this.rendererType}`);if(this.currentFrame.canvas.width===0||this.currentFrame.canvas.height===0){if(this.debug)console.log("Initial frame has zero dimensions, scheduling render when ready...");this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame&&this.debug)console.log(`Canvas ready (${this.currentFrame.canvas.width}x${this.currentFrame.canvas.height}), rendering initial frame`);if(this.currentFrame)this.renderFrame(this.currentFrame)})}else this.renderFrame(this.currentFrame)}}async setCanvas($){if(this.cleanupOverlayCanvas(),this.canvas=$,this.renderer)this.renderer.dispose(),this.renderer=null;if(this.options.width!==void 0)$.width=this.options.width;if(this.options.height!==void 0)$.height=this.options.height;this.setupResizeObserver($);try{await this.initializeRenderer($,this.rendererType)}catch(A){if(this.debug)console.error("Failed to initialize renderer:",A);if(!this.renderer){if(this.renderer=new H({canvas:$}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}async setVideoTrack($){if(await this.disposeVideoResources(),$.codec===null)throw Error("Unsupported video codec");if(!await $.canDecode())throw Error(`Cannot decode video track with codec: ${$.codec}`);let J=P$($);if(this.sourceWidth=$.displayWidth,this.sourceHeight=$.displayHeight,!this.videoAspectRatio&&$.displayWidth&&$.displayHeight){let K=(j,G)=>G===0?j:K(G,j%G),Q=K($.displayWidth,$.displayHeight),Z=$.displayWidth/Q,O=$.displayHeight/Q;this.videoAspectRatio=`${Z}/${O}`,this.updateCanvasAspectRatio()}if(this.notifyRotationChange(),this.initPromise)try{await this.initPromise}catch(K){if(this.debug)console.error("Renderer initialization failed:",K)}if(!this.renderer){if(this.debug)console.warn("Renderer not ready, creating Canvas2D fallback");if(this.canvas){if(this.renderer=new H({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}if(this.canvas){if(this.options.width!==void 0||this.options.height!==void 0){let K=this.options.width??$.displayWidth,Q=this.options.height??$.displayHeight;if(this.canvas.width!==K||this.canvas.height!==Q)this.canvas.width=K,this.canvas.height=Q,this.updateCanvasAspectRatio()}else if(!this.resizeObserver){if(this.canvas.width===0||this.canvas.height===0)this.canvas.width=$.displayWidth,this.canvas.height=$.displayHeight,this.updateCanvasAspectRatio()}}if(J?.canvasSink)this.canvasSink=J.canvasSink;else this.canvasSink=new S$($,{rotation:this.options.rotation,poolSize:this.options.poolSize});if(this.sampleSink=new R$($),this.disposed=!1,J?.firstFrame){if(this.currentFrame=J.firstFrame,this.currentFrame.canvas.width>0&&this.currentFrame.canvas.height>0)this.renderFrame(this.currentFrame);else this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame)this.renderFrame(this.currentFrame)},30);this.frameIterator=this.canvasSink.canvases(0),this.frameIterator.next().then(()=>{this.fetchNextFrame()})}else try{await this.seek(0)}catch(K){if(this.debug)console.error("Initial seek failed:",K)}requestAnimationFrame(()=>{if(this.resizeObserver&&this.canvas&&"getBoundingClientRect"in this.canvas)this.updateCanvasBackingBuffer(this.canvas);if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}async seek($){if(!this.canvasSink)return;this.renderingId++;let A=this.renderingId;if(this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}let J=this.canvasSink.canvases($);this.frameIterator=J;try{let K=await J.next(),Q=await J.next();if(A!==this.renderingId)return;let Z=K.value??null,O=Q.value??null;if(Z)if(this.currentFrame=Z,Z.canvas.width>0&&Z.canvas.height>0)this.renderFrame(Z);else this.retryUntilCanvasReady(Z,()=>this.renderFrame(Z),30);if(this.nextFrame=O,!this.nextFrame)this.fetchNextFrame()}catch{}}updateFrame($){let A=this.updateFrameResult;if(this.disposed)return A.frameUpdated=!1,A.isStarving=!1,A;if(!this.nextFrame){if(this.frameIterator)this.fetchNextFrame();return A.frameUpdated=!1,A.isStarving=!0,A}if(this.nextFrame.timestamp<=$){if(this.currentFrame=this.nextFrame,this.nextFrame=null,this.renderFrame(this.currentFrame),this.frameIterator)this.fetchNextFrame();return A.frameUpdated=!0,A.isStarving=!1,A}return A.frameUpdated=!1,A.isStarving=!1,A}async fetchNextFrame(){let $=this.frameIterator;if(!$||this.disposed)return;let A=this.renderingId;try{let K=(await $.next()).value??null;if(!K||A!==this.renderingId||this.disposed)return;this.nextFrame=K}catch{}}renderFrame($){if(this.currentFrame=$,!this.renderer||!this.canvas){if(this.initPromise)this.initPromise.then(()=>{if(this.currentFrame===$&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log("Rendering frame after renderer initialization");this.renderFrameWithPlugins($)}});return}if(!this.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${this.rendererType}) not ready, skipping frame`);return}this.renderFrameWithPlugins($)}renderFrameWithPlugins($){if(!this.renderer||!this.canvas)return;let A=$.timestamp;if(this.pluginManager){if(this.pluginManager.executeBeforeRender($,A)?.skip)return}let J=$;if(this.pluginManager)J=this.pluginManager.executeTransformFrame($);if(!this.renderer.render(J.canvas)){if(this.debug)console.warn(`Failed to render frame with ${this.rendererType} (canvas: ${J.canvas.width}x${J.canvas.height})`);if(J.canvas.width===0||J.canvas.height===0)this.retryUntilCanvasReady(J,()=>{if(this.currentFrame===$&&this.renderer&&this.renderer.isReady()){if(!this.renderer.render(J.canvas)&&this.debug)console.warn("Retry render also failed")}},1);return}if(this.executeOverlays(A),this.pluginManager)this.pluginManager.executeAfterRender(this.canvas)}executeOverlays($){if(!this.pluginManager||!this.canvas)return;this.lastOverlayTime=$;let A={width:this.canvas.width,height:this.canvas.height};if(this.rendererType==="canvas2d"){let J=this.canvas.getContext("2d");if(!J)return;this.pluginManager.executeOverlays(J,$,A)}else{if(this.ensureOverlayCanvas(),!this.overlayCanvas||!this.overlayCtx)return;this.overlayCtx.clearRect(0,0,this.overlayCanvas.width,this.overlayCanvas.height),this.pluginManager.executeOverlays(this.overlayCtx,$,A)}}refreshOverlays(){if(!this.canvas)return;if(this.rendererType==="canvas2d"){if(this.currentFrame&&this.renderer?.isReady())this.renderer.render(this.currentFrame.canvas),this.executeOverlays(this.lastOverlayTime)}else if(this.overlayCanvas&&this.overlayCtx){if(this.overlayCtx.clearRect(0,0,this.overlayCanvas.width,this.overlayCanvas.height),this.pluginManager){let $={width:this.canvas.width,height:this.canvas.height};this.pluginManager.executeOverlays(this.overlayCtx,this.lastOverlayTime,$)}}}ensureOverlayCanvas(){if(!this.canvas||!(this.canvas instanceof HTMLCanvasElement))return;if(!this.overlayCanvas){this.overlayCanvas=document.createElement("canvas"),this.overlayCanvas.style.position="absolute",this.overlayCanvas.style.top="0",this.overlayCanvas.style.left="0",this.overlayCanvas.style.width="100%",this.overlayCanvas.style.height="100%",this.overlayCanvas.style.pointerEvents="none",this.overlayCanvas.style.zIndex="1",this.overlayCtx=this.overlayCanvas.getContext("2d");let $=this.canvas.parentElement;if($){if(getComputedStyle($).position==="static")$.style.position="relative";$.insertBefore(this.overlayCanvas,this.canvas.nextSibling)}}if(this.overlayCanvas.width!==this.canvas.width||this.overlayCanvas.height!==this.canvas.height)this.overlayCanvas.width=this.canvas.width,this.overlayCanvas.height=this.canvas.height}cleanupOverlayCanvas(){if(this.overlayCanvas)this.overlayCanvas.remove(),this.overlayCanvas=null,this.overlayCtx=null}async getFrameAt($){if(!this.canvasSink)return null;return this.canvasSink.getCanvas($)}async getSampleAt($){if(!this.sampleSink)return null;return this.sampleSink.getSample($)}async extractFrames($,A,J=1){if(!this.canvasSink)return[];let K=[],Q=[];for(let Z=$;Z<=A;Z+=J)Q.push(Z);for await(let Z of this.canvasSink.canvasesAtTimestamps(Q))if(Z)K.push(Z);return K}async screenshot($,A={}){if(!this.canvas)return null;if($!==void 0&&this.canvasSink){let J=await this.canvasSink.getCanvas($);if(J)this.renderFrame(J)}if("toBlob"in this.canvas)return new Promise((J)=>{this.canvas.toBlob((K)=>J(K),`image/${A.format??"png"}`,A.quality)});else return this.canvas.convertToBlob({type:`image/${A.format??"png"}`,quality:A.quality})}getCurrentFrame(){return this.currentFrame}getNextFrame(){return this.nextFrame}getRendererType(){return this.rendererType}getCanvas(){return this.canvas}updateCanvasDimensions(){if(!this.canvas||!("getBoundingClientRect"in this.canvas))return;let $=this.canvas;if(this.updateCanvasBackingBuffer($)&&this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}async switchRenderer($){if(!this.canvas)throw Error("Cannot switch renderer: No canvas set");let A=this.rendererType;if($===A)return;if(this.debug)console.warn(`Switching renderer from ${A} to ${$}. This will recreate the canvas element.`);if(this.canvas instanceof HTMLCanvasElement){let J=this.canvas,K=J.parentElement;if(!K)throw Error("Cannot switch renderer: Canvas has no parent element");let Q=document.createElement("canvas");if(Q.width=J.width,Q.height=J.height,Q.className=J.className,Q.id=J.id,Q.style.cssText=J.style.cssText,Array.from(J.attributes).forEach((Z)=>{if(Z.name!=="id"&&Z.name!=="class"&&Z.name!=="style")Q.setAttribute(Z.name,Z.value)}),this.renderer)this.renderer.dispose(),this.renderer=null;K.replaceChild(Q,J),this.canvas=Q;try{await this.initializeRenderer(Q,$)}catch(Z){if(this.debug)console.error(`Failed to switch to ${$}:`,Z);if(!this.renderer){if(this.renderer=new H({canvas:Q}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}else{if(this.debug)console.warn("Runtime switching for OffscreenCanvas may not work if context is already set");if(this.renderer)this.renderer.dispose(),this.renderer=null;try{await this.initializeRenderer(this.canvas,$)}catch(J){if(this.debug)console.error(`Failed to switch to ${$}:`,J);if(!this.renderer){if(this.renderer=new H({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Re-rendering after switch to ${this.rendererType}`);queueMicrotask(()=>{if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}}setRendererChangeCallback($){if(this.onRendererChange=$,this.renderer&&this.rendererType){if(this.debug)console.log(`Renderer already initialized as ${this.rendererType}, emitting change event`);$(this.rendererType)}}setRendererFallbackCallback($){this.onRendererFallback=$}setRotationChangeCallback($){this.onRotationChange=$}setRotation($){if(this.rotation===$)return;if(this.rotation=$,this.renderer)this.renderer.setRotation($);if(this.notifyRotationChange(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}getRotation(){return this.rotation}getDisplaySize(){let $=this.rotation===90||this.rotation===270;return{width:$?this.sourceHeight:this.sourceWidth,height:$?this.sourceWidth:this.sourceHeight}}notifyRotationChange(){if(this.onRotationChange&&this.sourceWidth>0&&this.sourceHeight>0)this.onRotationChange(this.rotation,this.getDisplaySize())}setPluginManager($){this.pluginManager=$}static getSupportedRenderers(){return R.getSupportedRenderers()}async clearIterators(){if(this.renderingId++,this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}this.currentFrame=null,this.nextFrame=null}async disposeVideoResources(){if(this.disposed=!0,this.renderingId++,this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.videoAspectRatio=null}dispose(){if(this.disposed=!0,this.renderingId++,this.frameIterator)this.frameIterator.return(),this.frameIterator=null;if(this.renderer)this.renderer.dispose(),this.renderer=null;this.cleanupResizeObserver(),this.cleanupOverlayCanvas(),this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.onRendererChange=void 0,this.onRendererFallback=void 0}}var y=2,h="[MediaFox]";function W$($){y=$}function H$($,...A){if(y<=0)console.debug(`${h} ${$}`,...A)}function C$($,...A){if(y<=1)console.info(`${h} ${$}`,...A)}function T$($,...A){if(y<=2)console.warn(`${h} ${$}`,...A)}function b$($,...A){if(y<=3)console.error(`${h} ${$}`,...A)}var v={setLevel:W$,debug:H$,info:C$,warn:T$,error:b$};class t{deps;constructor($){this.deps=$}async load($,A={}){try{let J=await this.deps.pluginManager.executeBeforeLoad($);if(J?.cancel)return;if(J?.data!==void 0)$=J.data;await this.deps.playbackController.reset(),this.deps.sourceManager.disposeCurrent();let K=this.deps.state.getState();if(!A.replacePlaylist)this.deps.state.setState({...K,state:"loading",currentTime:A.startTime??0,playing:!1,paused:!0,ended:!1,seeking:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,buffered:[],canPlay:!1,canPlayThrough:!1});else this.deps.state.reset(),this.deps.state.updateLoadingState();this.deps.emit("loadstart",void 0);let Q=A.playlistItemId?this.deps.sourceManager.promoteQueuedSource(A.playlistItemId):null;if(!Q)Q=await this.deps.sourceManager.createSource($);let Z=Q.input;if(!Z)throw Error("Failed to create input from source");await this.deps.trackManager.initialize(Z);let[O,j,G,V]=await Promise.all([Z.computeDuration(),Z.getFormat(),Z.getMimeType(),Z.getMetadataTags()]),X={duration:O,format:j.name,mimeType:G,metadata:V,hasVideo:this.deps.trackManager.hasVideo(),hasAudio:this.deps.trackManager.hasAudio(),hasSubtitles:this.deps.trackManager.hasSubtitles()};this.deps.state.updateDuration(O),this.deps.state.updateMediaInfo(X),this.deps.state.updateTracks(this.deps.trackManager.getVideoTracks(),this.deps.trackManager.getAudioTracks(),this.deps.trackManager.getSubtitleTracks()),this.deps.playbackController.setDuration(O);let Y=Q.prefetchedData,U=Y?.videoTrack??this.deps.trackManager.getPrimaryVideoTrack(),D=Y?.audioTrack??this.deps.trackManager.getPrimaryAudioTrack();if(U&&Y?.canvasSink&&Y?.firstFrame)V$(U,{canvasSink:Y.canvasSink,firstFrame:Y.firstFrame});let _="",E=!1,M=!1;if(U||D){let P=await this.deps.trackSwitcher.setupInitialTracks(U,D);_+=P.warningMessage,E=P.videoSupported,M=P.audioSupported}if(!E&&!M){if(!_)_="No audio or video track found.";throw Error(_)}if(_&&(E||M))this.deps.emit("warning",{type:"codec-warning",message:_.trim(),error:void 0});if(this.deps.state.updateReadyState(!0,!0),this.deps.emit("loadedmetadata",X),this.deps.emit("loadeddata",void 0),this.deps.emit("canplay",void 0),this.deps.emit("canplaythrough",void 0),this.updateCurrentPlaylistItemDuration(O),await this.deps.pluginManager.executeAfterLoad(X),A.autoplay)await this.play();if(A.startTime!==void 0)await this.seek(A.startTime)}catch(J){throw this.handleError(J),J}}async play(){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");if((await this.deps.pluginManager.executeBeforePlay())?.cancel)return;await this.deps.playbackController.play(),this.deps.state.updatePlaybackState(!0),this.deps.emit("play",void 0),this.deps.emit("playing",void 0),this.deps.pluginManager.executeAfterPlay()}catch($){throw this.handleError($),$}}async pause(){if((await this.deps.pluginManager.executeBeforePause())?.cancel)return;this.deps.playbackController.pause(),this.deps.state.updatePlaybackState(!1),this.deps.emit("pause",void 0),this.deps.pluginManager.executeAfterPause()}async seek($){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");let J=await this.deps.pluginManager.executeBeforeSeek($);if(J?.cancel)return;if(J?.data!==void 0)$=J.data;this.deps.state.updateSeekingState(!0),this.deps.emit("seeking",{currentTime:$}),await this.deps.playbackController.seek($),this.deps.state.updateSeekingState(!1),this.deps.state.updateTime(this.deps.playbackController.getCurrentTime()),this.deps.emit("seeked",{currentTime:this.deps.playbackController.getCurrentTime()}),this.deps.pluginManager.executeAfterSeek(this.deps.playbackController.getCurrentTime())}catch(A){throw this.deps.state.updateSeekingState(!1),this.handleError(A),A}}async stop(){try{if((await this.deps.pluginManager.executeBeforeStop())?.cancel)return;await this.pause(),await this.seek(0),this.deps.pluginManager.executeAfterStop()}catch($){throw this.handleError($),$}}handleError($){if(this.deps.pluginManager.executeOnError($))return;this.deps.state.updateError($),this.deps.emit("error",$),v.error("Player error:",$)}updateCurrentPlaylistItemDuration($){let A=this.deps.state.getState(),J=A.currentPlaylistIndex;if(J!==null&&A.playlist.length>0){let K=[...A.playlist],Q=K[J];if(Q)K[J]={...Q,duration:$},this.deps.state.updatePlaylist(K,J)}}}class r{store;constructor($){this.store=$}getState(){return this.store.getState()}subscribe($){return this.store.subscribe($)}setState($){this.store.setState($)}reset(){this.store.reset()}applyInitial($,A,J){this.store.setState({volume:$,muted:A,playbackRate:J})}updateLoadingState(){this.store.updateLoadingState()}updateReadyState($,A){this.store.updateReadyState($,A)}updatePlaybackState($){this.store.updatePlaybackState($)}updateSeekingState($){this.store.updateSeekingState($)}updateWaitingState($){this.store.updateWaitingState($)}updateEndedState($){this.store.updateEndedState($)}updateTime($){this.store.updateTime($)}updateDuration($){this.store.updateDuration($)}updateVolume($,A){this.store.updateVolume($,A)}updatePlaybackRate($){this.store.updatePlaybackRate($)}updateMediaInfo($){this.store.updateMediaInfo($)}updateTracks($,A,J){this.store.updateTracks($,A,J)}updateSelectedTracks($,A){this.store.updateSelectedTracks($,A)}updateError($){this.store.updateError($)}updateRendererType($){this.store.updateRendererType($)}updatePlaylist($,A=null){this.store.updatePlaylist($,A)}}class e{chains=new Map;async run($,A){let J=this.chains.get($)??Promise.resolve(),K,Q=new Promise((Z)=>{K=Z});this.chains.set($,J.then(()=>Q));try{return await J,await A()}finally{K?.()}}}class $${deps;locks=new e;constructor($){this.deps=$}async setupInitialTracks($,A){let J=!1,K=!1,Q="";if($)try{if(J=await this.locks.run("video",async()=>{if($.codec!==null&&await $.canDecode())return await this.deps.playbackController.trySetVideoTrack($);return!1}),!J)Q+="Unsupported video codec. "}catch(Z){Q+="Failed to set up video track. ",v.warn("Video track error:",Z)}if(A)try{if(K=await this.locks.run("audio",async()=>{if(A.codec!==null&&await A.canDecode())return await this.deps.playbackController.trySetAudioTrack(A);return!1}),!K)Q+="Unsupported audio codec. "}catch(Z){Q+="Failed to set up audio track. ",v.warn("Audio track error:",Z)}if(!J&&!K&&!Q)Q="No audio or video track found.";return{videoSupported:J,audioSupported:K,warningMessage:Q}}async selectVideoTrack($,A){if(!$.selectVideoTrack(A))throw Error(`Invalid video track ID: ${A}`);let J=$.getSelectedVideoTrack();if(!J){await this.deps.playbackController.setVideoTrack(null);return}if(!await this.locks.run("video",async()=>{if(J.codec!==null&&await J.canDecode())return await this.deps.playbackController.trySetVideoTrack(J);return!1}))this.deps.emit("warning",{type:"video-codec-unsupported",message:"Video codec not supported.",error:void 0}),await this.deps.playbackController.setVideoTrack(null)}async selectAudioTrack($,A){if(!$.selectAudioTrack(A))throw Error(`Invalid audio track ID: ${A}`);let J=$.getSelectedAudioTrack();if(!J){await this.deps.playbackController.setAudioTrack(null);return}if(!await this.locks.run("audio",async()=>{if(J.codec!==null&&await J.canDecode())return await this.deps.playbackController.trySetAudioTrack(J);return!1}))this.deps.emit("warning",{type:"audio-codec-unsupported",message:"Audio codec not supported. Continuing without audio.",error:void 0}),await this.deps.playbackController.setAudioTrack(null)}}import{AudioBufferSink as w$,AudioSampleSink as f$}from"mediabunny";class g{audioContext;gainNode=null;outputNode=null;bufferSink=null;sampleSink=null;bufferIterator=null;queuedNodes=new Set;startContextTime=0;startMediaTime=0;pauseTime=0;playing=!1;volume=1;muted=!1;disposed=!1;playbackId=0;playbackRate=1;pluginManager=null;constructor($={}){if($.audioContext)this.audioContext=$.audioContext;else{let A=window,J=A.AudioContext||A.webkitAudioContext;this.audioContext=new J}this.volume=$.volume??1,this.muted=$.muted??!1,this.setupAudioGraph()}setupAudioGraph(){if(this.gainNode=this.audioContext.createGain(),this.pluginManager){let $=this.pluginManager.executeOnAudioNode(this.audioContext,this.gainNode);this.outputNode=$}else this.outputNode=this.gainNode;this.outputNode.connect(this.audioContext.destination),this.updateGain()}setPluginManager($){this.pluginManager=$,this.rebuildAudioGraph()}rebuildAudioGraph(){if(!this.gainNode)return;if(this.outputNode?.disconnect(),this.pluginManager){let $=this.pluginManager.executeOnAudioNode(this.audioContext,this.gainNode);this.outputNode=$}else this.outputNode=this.gainNode;this.outputNode.connect(this.audioContext.destination)}async setAudioTrack($){if(this.dispose(),$.codec===null)throw Error("Unsupported audio codec");if(!await $.canDecode())throw Error(`Cannot decode audio track with codec: ${$.codec}`);this.bufferSink=new w$($),this.sampleSink=new f$($),this.disposed=!1}async play($=this.pauseTime){if(this.playing||!this.bufferSink)return;if(this.audioContext.state==="suspended")await this.audioContext.resume();this.playbackId++;let A=this.playbackId;this.playing=!0,this.startContextTime=this.audioContext.currentTime,this.startMediaTime=$,this.pauseTime=$,this.bufferIterator=this.bufferSink.buffers($),this.scheduleAudioBuffers(A)}async scheduleAudioBuffers($){let A=this.bufferIterator;if(!A||!this.gainNode)return;try{for await(let{buffer:J,timestamp:K}of A){if($!==this.playbackId||this.disposed||!this.playing)break;let Q=this.audioContext.createBufferSource();Q.buffer=J,Q.connect(this.gainNode),Q.playbackRate.value=this.playbackRate,Q.playbackRate.setValueAtTime(this.playbackRate,this.audioContext.currentTime);let Z=this.startContextTime+(K-this.startMediaTime)/this.playbackRate;if(Z>=this.audioContext.currentTime)Q.start(Z);else{let O=Math.max(0,(this.audioContext.currentTime-Z)*this.playbackRate);if(O<J.duration)Q.start(this.audioContext.currentTime,O);else continue}if(this.queuedNodes.add(Q),Q.onended=()=>{this.queuedNodes.delete(Q)},K-this.getCurrentTime()>=1)await this.waitForCatchup(K)}}catch{}}async waitForCatchup($){return new Promise((A)=>{let J=setInterval(()=>{if($-this.getCurrentTime()<1||!this.playing)clearInterval(J),A()},100)})}pause(){if(!this.playing)return;let $=this.getCurrentTime();if(this.playing=!1,this.pauseTime=$,this.stopQueuedNodes(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null}stop(){this.pause(),this.pauseTime=0,this.startContextTime=0,this.startMediaTime=0}async seek($){let A=this.playing;if(A)this.pause();if(this.pauseTime=$,A)await this.play($)}getCurrentTime(){if(this.playing){let $=this.audioContext.currentTime-this.startContextTime;return this.startMediaTime+$*this.playbackRate}return this.pauseTime}setVolume($){this.volume=Math.max(0,Math.min(1,$)),this.updateGain()}setMuted($){this.muted=$,this.updateGain()}updateGain(){if(!this.gainNode)return;let $=this.muted?0:this.volume;this.gainNode.gain.value=$*$}getVolume(){return this.volume}isMuted(){return this.muted}isPlaying(){return this.playing}setPlaybackRate($){let A=Math.max(0.25,Math.min(4,$));if(this.playbackRate===A)return;let J=this.playing,K=this.getCurrentTime();if(this.playbackRate=A,J)this.pause(),this.pauseTime=K,this.play(K)}getAudioContext(){return this.audioContext}async getBufferAt($){if(!this.bufferSink)return null;return this.bufferSink.getBuffer($)}async getSampleAt($){if(!this.sampleSink)return null;return this.sampleSink.getSample($)}stopQueuedNodes(){for(let $ of this.queuedNodes)try{$.stop()}catch{}this.queuedNodes.clear()}async clearIterators(){if(this.playbackId++,this.stop(),this.bufferIterator){try{await this.bufferIterator.return()}catch{}this.bufferIterator=null}}dispose(){if(this.disposed=!0,this.playbackId++,this.stop(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null;this.bufferSink=null,this.sampleSink=null}destroy(){if(this.dispose(),this.gainNode)this.gainNode.disconnect(),this.gainNode=null;if(this.audioContext.state!=="closed")this.audioContext.close()}}var I$=100,x$=250;class p{videoRenderer;audioManager;playing=!1;currentTime=0;duration=0;playbackRate=1;animationFrameId=null;lastFrameTime=0;syncIntervalId=null;renderIntervalId=null;isWaiting=!1;onTimeUpdate;onEnded;onWaiting;onPlaying;constructor($={}){this.videoRenderer=new k({canvas:$.canvas,rendererType:$.rendererType}),this.audioManager=new g({audioContext:$.audioContext,volume:$.volume,muted:$.muted}),this.playbackRate=$.playbackRate??1}async setVideoTrack($){if(!$){this.videoRenderer.dispose();return}await this.videoRenderer.setVideoTrack($);let A=await $.computeDuration();this.duration=Math.max(this.duration,A)}async trySetVideoTrack($){try{return await this.setVideoTrack($),!0}catch{return!1}}async setAudioTrack($){let A=this.playing,J=this.getCurrentTime();if(!$){this.audioManager.dispose();return}let K=await $.computeDuration(),Q=Math.max(0,Math.min(J,K));if(await this.audioManager.setAudioTrack($),await this.audioManager.seek(Q),A)await this.audioManager.play(Q);this.currentTime=Q,this.duration=Math.max(this.duration,K)}async trySetAudioTrack($){try{return await this.setAudioTrack($),!0}catch{return!1}}async setCanvas($){await this.videoRenderer.setCanvas($)}async play(){if(this.playing)return;if(this.playing=!0,this.lastFrameTime=performance.now(),this.currentTime>=this.duration)this.currentTime=0,await this.videoRenderer.seek(0);await this.audioManager.play(this.currentTime),this.startRenderLoop(),this.startSyncInterval()}pause(){if(!this.playing)return;if(this.playing=!1,this.isWaiting=!1,this.audioManager.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime()}async seek($){let A=Math.max(0,Math.min($,this.duration));if(this.currentTime=A,await this.videoRenderer.seek(A),await this.audioManager.seek(A),this.onTimeUpdate)this.onTimeUpdate(this.currentTime)}startRenderLoop(){if(this.animationFrameId!==null||this.renderIntervalId!==null)return;let $=(A=!0)=>{if(!this.playing)return;if(this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime();else{let K=performance.now(),Q=(K-this.lastFrameTime)/1000;this.lastFrameTime=K,this.currentTime+=Q*this.playbackRate}if(this.currentTime>=this.duration){this.handleEnded();return}let{isStarving:J}=this.videoRenderer.updateFrame(this.currentTime);if(J&&!this.isWaiting){if(this.isWaiting=!0,this.onWaiting)this.onWaiting()}else if(!J&&this.isWaiting){if(this.isWaiting=!1,this.onPlaying)this.onPlaying()}if(A)this.animationFrameId=requestAnimationFrame(()=>$())};if(this.animationFrameId=requestAnimationFrame(()=>$()),this.renderIntervalId===null)this.renderIntervalId=window.setInterval(()=>$(!1),I$)}stopRenderLoop(){if(this.animationFrameId!==null)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null;if(this.renderIntervalId!==null)clearInterval(this.renderIntervalId),this.renderIntervalId=null}startSyncInterval(){if(this.syncIntervalId!==null)return;this.syncIntervalId=window.setInterval(()=>{if(this.playing&&this.onTimeUpdate)this.onTimeUpdate(this.currentTime)},x$)}stopSyncInterval(){if(this.syncIntervalId!==null)clearInterval(this.syncIntervalId),this.syncIntervalId=null}handleEnded(){if(this.pause(),this.currentTime=this.duration,this.onEnded)this.onEnded()}getCurrentTime(){if(this.playing&&this.audioManager.isPlaying())return this.audioManager.getCurrentTime();return this.currentTime}getDuration(){return this.duration}setDuration($){this.duration=$}isPlaying(){return this.playing}setVolume($){this.audioManager.setVolume($)}getVolume(){return this.audioManager.getVolume()}setMuted($){this.audioManager.setMuted($)}isMuted(){return this.audioManager.isMuted()}setPlaybackRate($){let A=Math.max(0.25,Math.min(4,$));if(this.playbackRate===A)return;this.playbackRate=A,this.audioManager.setPlaybackRate(A),this.lastFrameTime=performance.now()}getPlaybackRate(){return this.playbackRate}setTimeUpdateCallback($){this.onTimeUpdate=$}setEndedCallback($){this.onEnded=$}setWaitingCallback($){this.onWaiting=$}setPlayingCallback($){this.onPlaying=$}isBuffering(){return this.isWaiting}async screenshot($){return this.videoRenderer.screenshot(this.currentTime,$)}getVideoRenderer(){return this.videoRenderer}getAudioManager(){return this.audioManager}async switchRenderer($){await this.videoRenderer.switchRenderer($)}getRendererType(){return this.videoRenderer.getRendererType()}updateCanvasDimensions(){this.videoRenderer.updateCanvasDimensions()}setRendererChangeCallback($){this.videoRenderer.setRendererChangeCallback($)}setRendererFallbackCallback($){this.videoRenderer.setRendererFallbackCallback($)}setRotationChangeCallback($){this.videoRenderer.setRotationChangeCallback($)}setRotation($){this.videoRenderer.setRotation($)}getRotation(){return this.videoRenderer.getRotation()}getDisplaySize(){return this.videoRenderer.getDisplaySize()}setPluginManager($){this.videoRenderer.setPluginManager($),this.audioManager.setPluginManager($)}getCanvas(){return this.videoRenderer.getCanvas()}refreshOverlays(){this.videoRenderer.refreshOverlays()}rebuildAudioGraph(){this.audioManager.rebuildAudioGraph()}async reset(){this.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.currentTime=0,this.duration=0,await Promise.all([this.videoRenderer.clearIterators(),this.audioManager.clearIterators()]),this.playbackRate=1,this.lastFrameTime=0}dispose(){this.pause(),this.videoRenderer.dispose(),this.audioManager.dispose(),this.onTimeUpdate=void 0,this.onEnded=void 0,this.onWaiting=void 0,this.onPlaying=void 0}destroy(){this.dispose(),this.audioManager.destroy()}}function u(){return crypto?.randomUUID?.()??Date.now().toString(36)+Math.random().toString(36).substr(2)}class A${store;emitter;switchSource;sourceManager;constructor($,A,J,K){this.store=$,this.emitter=A,this.switchSource=J,this.sourceManager=K}async loadPlaylist($,A={}){let J=$.map((K)=>{if(K&&typeof K==="object"&&"mediaSource"in K)return{id:u(),mediaSource:K.mediaSource,title:K.title,poster:K.poster,savedPosition:null,duration:null};else return{id:u(),mediaSource:K,savedPosition:null,duration:null}});if(this.store.updatePlaylist(J,J.length>0?0:null),this.emitter.emit("playlistchange",{playlist:J}),J.length>0&&this.switchSource){let K=J[0];if(A.startTime!==void 0)K.savedPosition=A.startTime;await this.switchSource(K,A.autoplay??!1)}}addToPlaylist($,A){let J=this.createPlaylistItem($);this.store.addToPlaylist(J,A),this.emitter.emit("playlistadd",{item:J,index:A??this.store.getState().playlist.length-1})}async removeFromPlaylist($){let A=this.store.getState(),J=A.currentPlaylistIndex,K=A.playing;this.store.removeFromPlaylist($),this.emitter.emit("playlistremove",{index:$}),this.sourceManager?.disposeQueued(A.playlist[$]?.id||"");let Q=this.store.getState(),Z=Q.currentPlaylistIndex;if(Q.playlist.length===0)this.sourceManager?.disposeAll(),this.emitter.emit("playlistchange",{playlist:Q.playlist}),this.emitter.emit("playlistend",void 0);if(J===$&&Z!==null&&Z!==J&&this.switchSource){let O=Q.playlist[Z];try{await this.switchSource(O,K)}catch(j){this.emitter.emit("playlistitemerror",{index:Z,error:j})}}}clearPlaylist(){this.store.clearPlaylist(),this.emitter.emit("playlistchange",{playlist:[]}),this.emitter.emit("playlistend",void 0),this.sourceManager?.disposeAll()}async next(){let $=this.store.getState(),A=$.currentPlaylistIndex??0,J=$.playlist,K=$.playlistMode,Q=null;if(K==="repeat-one")Q=A;else if(K==="sequential"||K==="repeat")if(A<J.length-1)Q=A+1;else if(K==="repeat")Q=0;else{this.emitter.emit("playlistend",void 0);return}else if(A<J.length-1)Q=A+1;if(Q!==null)await this.switchTo(Q)}async prev(){let A=this.store.getState().currentPlaylistIndex??0;if(A>0)await this.switchTo(A-1)}async jumpTo($){let J=this.store.getState().playlist;if($>=0&&$<J.length)await this.switchTo($);else if($>=J.length)this.emitter.emit("playlistend",void 0)}setMode($){let A=["sequential","manual","repeat","repeat-one",null];if(!A.includes($))throw Error(`Invalid playlist mode: ${$}. Valid modes: ${A.filter((J)=>J!==null).join(", ")}, null`);this.store.updatePlaylistMode($)}async switchTo($){let A=this.store.getState(),J=A.currentPlaylistIndex,K=A.playing,Q=[...A.playlist];if(J!==null&&J!==$){let j=Q[J];Q[J]={...j,savedPosition:A.currentTime}}this.store.updatePlaylist(Q,$);let Z=Q[$];if(this.emitter.emit("playlistitemchange",{index:$,item:Z,previousIndex:J??void 0}),this.switchSource)await this.switchSource(Z,K);if(A.playlistMode==="sequential"&&$<Q.length-1){let j=Q[$+1];this.sourceManager?.preloadSource(j.mediaSource,j.id)}}createPlaylistItem($){if($&&typeof $==="object"&&"mediaSource"in $)return{id:u(),mediaSource:$.mediaSource,title:$.title,poster:$.poster,savedPosition:null,duration:null};else return{id:u(),mediaSource:$,savedPosition:null,duration:null}}get playlist(){return this.store.getState().playlist}get currentIndex(){return this.store.getState().currentPlaylistIndex}get currentItem(){let $=this.currentIndex;return $!==null?this.playlist[$]:null}get mode(){return this.store.getState().playlistMode}dispose(){if(this.sourceManager)this.sourceManager=void 0;this.switchSource=void 0}}function G$($,A,J,K){let Q=A.name;return{player:$,getState(){return $.getState()},subscribe(Z){let O=$.subscribe(Z),j=()=>O.unsubscribe();return J.stateUnsubscribes.push(j),j},getPluginState(){return J.pluginState},setPluginState(Z){J.pluginState=Z},on(Z,O){$.on(Z,O);let j=J.eventListeners.get(Z);if(!j)j=new Set,J.eventListeners.set(Z,j);j.add(O)},off(Z,O){$.off(Z,O);let j=J.eventListeners.get(Z);if(j)j.delete(O)},getCanvas(){return $.getRenderTarget()},getPlugin(Z){return K().get(Z)?.plugin},hasPlugin(Z){return K().has(Z)},log(...Z){console.log(`[MediaFox:${Q}]`,...Z)},warn(...Z){console.warn(`[MediaFox:${Q}]`,...Z)},error(...Z){console.error(`[MediaFox:${Q}]`,...Z)}}}class J${player;plugins=new Map;overlays=[];overlaysSorted=!1;registrationCounter=0;constructor($){this.player=$}async install($){let{name:A}=$;if(this.plugins.has(A))throw Error(`Plugin "${A}" is already installed`);if($.dependencies){for(let K of $.dependencies)if(!this.plugins.has(K))throw Error(`Plugin "${A}" requires plugin "${K}" to be installed first`)}let J={plugin:$,context:null,eventListeners:new Map,stateUnsubscribes:[],pluginState:void 0};J.context=G$(this.player,$,J,()=>this.plugins),this.plugins.set(A,J);try{await $.install(J.context)}catch(K){throw this.plugins.delete(A),K}if($.hooks?.render?.onOverlay)this.overlays.push({pluginName:A,zIndex:$.hooks.render.onOverlay.zIndex??0,registrationOrder:this.registrationCounter++,render:$.hooks.render.onOverlay}),this.overlaysSorted=!1,this.player.refreshOverlays()}async uninstall($){let A=this.plugins.get($);if(!A)throw Error(`Plugin "${$}" is not installed`);try{await A.plugin.uninstall?.()}catch(K){console.error(`Error uninstalling plugin "${$}":`,K)}for(let[K,Q]of A.eventListeners)for(let Z of Q)this.player.off(K,Z);for(let K of A.stateUnsubscribes)K();let J=this.overlays.some((K)=>K.pluginName===$);if(this.overlays=this.overlays.filter((K)=>K.pluginName!==$),this.plugins.delete($),J)this.player.refreshOverlays()}has($){return this.plugins.has($)}get size(){return this.plugins.size}async executeBeforeLoad($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.lifecycle?.beforeLoad;if(!J)continue;try{let K=await J.call(A.plugin,$);if(K?.cancel)return K;if(K?.data!==void 0)$=K.data}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in beforeLoad hook:`,K)}}return{data:$}}async executeAfterLoad($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.lifecycle?.afterLoad;if(!J)continue;try{await J.call(A.plugin,$)}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in afterLoad hook:`,K)}}}async executeBeforePlay(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.beforePlay;if(!A)continue;try{let J=await A.call($.plugin);if(J?.cancel)return J}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in beforePlay hook:`,J)}}return}executeAfterPlay(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.afterPlay;if(!A)continue;try{A.call($.plugin)}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in afterPlay hook:`,J)}}}async executeBeforePause(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.beforePause;if(!A)continue;try{let J=await A.call($.plugin);if(J?.cancel)return J}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in beforePause hook:`,J)}}return}executeAfterPause(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.afterPause;if(!A)continue;try{A.call($.plugin)}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in afterPause hook:`,J)}}}async executeBeforeSeek($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.lifecycle?.beforeSeek;if(!J)continue;try{let K=await J.call(A.plugin,$);if(K?.cancel)return K;if(K?.data!==void 0)$=K.data}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in beforeSeek hook:`,K)}}return{data:$}}executeAfterSeek($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.lifecycle?.afterSeek;if(!J)continue;try{J.call(A.plugin,$)}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in afterSeek hook:`,K)}}}async executeBeforeStop(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.beforeStop;if(!A)continue;try{let J=await A.call($.plugin);if(J?.cancel)return J}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in beforeStop hook:`,J)}}return}executeAfterStop(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.afterStop;if(!A)continue;try{A.call($.plugin)}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in afterStop hook:`,J)}}}executeOnError($){let A=!1;for(let[,J]of this.plugins){let K=J.plugin.hooks?.lifecycle?.onError;if(!K)continue;try{if(K.call(J.plugin,$)?.handled)A=!0}catch(Q){console.error(`[MediaFox:${J.plugin.name}] Error in onError hook:`,Q)}}return A}executeOnEnded(){for(let[,$]of this.plugins){let A=$.plugin.hooks?.lifecycle?.onEnded;if(!A)continue;try{A.call($.plugin)}catch(J){console.error(`[MediaFox:${$.plugin.name}] Error in onEnded hook:`,J)}}}executeBeforeRender($,A){for(let[,J]of this.plugins){let K=J.plugin.hooks?.render?.beforeRender;if(!K)continue;try{let Q=K.call(J.plugin,$,A);if(Q?.skip)return Q}catch(Q){console.error(`[MediaFox:${J.plugin.name}] Error in beforeRender hook:`,Q)}}return}executeTransformFrame($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.render?.transformFrame;if(!J)continue;try{let K=J.call(A.plugin,$);if(K)$=K}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in transformFrame hook:`,K)}}return $}executeAfterRender($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.render?.afterRender;if(!J)continue;try{J.call(A.plugin,$)}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in afterRender hook:`,K)}}}executeOverlays($,A,J){if(this.overlays.length===0)return;if(!this.overlaysSorted)this.overlays.sort((K,Q)=>{if(K.zIndex!==Q.zIndex)return K.zIndex-Q.zIndex;return K.registrationOrder-Q.registrationOrder}),this.overlaysSorted=!0;for(let K of this.overlays)try{K.render?.render($,A,J)}catch(Q){console.error(`[MediaFox:${K.pluginName}] Error in onOverlay hook:`,Q)}}executeBeforeStateUpdate($){for(let[,A]of this.plugins){let J=A.plugin.hooks?.state?.beforeStateUpdate;if(!J)continue;try{let K=J.call(A.plugin,$);if(K===null)return null;if(K!==void 0)$=K}catch(K){console.error(`[MediaFox:${A.plugin.name}] Error in beforeStateUpdate hook:`,K)}}return $}executeOnStateChange($,A){for(let[,J]of this.plugins){let K=J.plugin.hooks?.state?.onStateChange;if(!K)continue;try{K.call(J.plugin,$,A)}catch(Q){console.error(`[MediaFox:${J.plugin.name}] Error in onStateChange hook:`,Q)}}}executeBeforeEvent($,A){for(let[,J]of this.plugins){let K=J.plugin.hooks?.event?.beforeEvent;if(!K)continue;try{let Q=K.call(J.plugin,$,A);if(Q?.cancel)return Q;if(Q?.data!==void 0)A=Q.data}catch(Q){console.error(`[MediaFox:${J.plugin.name}] Error in beforeEvent hook:`,Q)}}return{data:A}}executeAfterEvent($,A){for(let[,J]of this.plugins){let K=J.plugin.hooks?.event?.afterEvent;if(!K)continue;try{K.call(J.plugin,$,A)}catch(Q){console.error(`[MediaFox:${J.plugin.name}] Error in afterEvent hook:`,Q)}}}executeOnAudioNode($,A){let J=A;for(let[,K]of this.plugins){let Q=K.plugin.hooks?.audio?.onAudioNode;if(!Q)continue;try{let Z=Q.call(K.plugin,$,A);if(Z)J=Z}catch(Z){console.error(`[MediaFox:${K.plugin.name}] Error in onAudioNode hook:`,Z)}}return J}async dispose(){let $=Array.from(this.plugins.keys()).reverse();for(let A of $)try{await this.uninstall(A)}catch(J){console.error(`Error disposing plugin "${A}":`,J)}}}import{ALL_FORMATS as y$,BlobSource as v$,BufferSource as k$,CanvasSink as h$,FilePathSource as g$,Input as p$,ReadableStreamSource as u$,UrlSource as m$}from"mediabunny";class m{currentSource=null;queuedSources=new Map;options;constructor($={}){this.options={maxCacheSize:$.maxCacheSize??16777216,crossOrigin:$.crossOrigin,requestInit:$.requestInit}}async createSource($,A){if(this.currentSource&&!A)this.disposeCurrent();let J,K;if($ instanceof File||$ instanceof Blob)J=new v$($,{maxCacheSize:this.options.maxCacheSize}),K="blob";else if($ instanceof ArrayBuffer||$ instanceof Uint8Array)J=new k$($),K="buffer";else if(typeof $==="string"||$ instanceof URL){let O=$ instanceof URL?$.href:$;if(typeof window>"u"&&!O.startsWith("http"))J=new g$(O,{maxCacheSize:this.options.maxCacheSize}),K="file";else J=new m$(O,{maxCacheSize:this.options.maxCacheSize,requestInit:this.options.requestInit}),K="url"}else if(typeof ReadableStream<"u"&&$ instanceof ReadableStream)J=new u$($,{maxCacheSize:this.options.maxCacheSize}),K="stream";else throw TypeError("Unsupported media source type");let Q=new p$({source:J,formats:y$}),Z={source:J,input:Q,type:K,originalSource:$};if(A)this.queuedSources.set(A,Z);else this.currentSource=Z;return Z}getCurrentSource(){return this.currentSource}getQueuedSource($){return this.queuedSources.get($)||null}async preloadSource($,A){if(this.queuedSources.has(A))return;let J=await this.createSource($,A);if(J.input)try{let K=await this.prefetchTrackData(J.input);J.prefetchedData=K}catch{}}async prefetchTrackData($){let A=await $.getVideoTracks(),J=await $.getAudioTracks(),K=A.length>0?A[0]:null,Q=J.length>0?J[0]:null,Z=null,O=null,j=0;if(K){if(K.codec!==null&&await K.canDecode()){Z=new h$(K,{poolSize:2});let G=Z.canvases(0);O=(await G.next()).value??null,await G.return(),j=await K.computeDuration()}}if(!j&&Q)j=await Q.computeDuration();return{videoTrack:K,audioTrack:Q,canvasSink:Z,firstFrame:O,duration:j}}promoteQueuedSource($){let A=this.queuedSources.get($);if(!A)return null;if(this.queuedSources.delete($),this.currentSource)this.currentSource.input?.dispose();return this.currentSource=A,A}getOriginalSource(){return this.currentSource?.originalSource??null}disposeCurrent(){if(this.currentSource)this.currentSource.input?.dispose(),this.currentSource=null}disposeQueued($){let A=this.queuedSources.get($);if(A)A.input?.dispose(),this.queuedSources.delete($)}disposeAll(){this.disposeCurrent(),this.queuedSources.forEach(($,A)=>{this.disposeQueued(A)}),this.queuedSources.clear()}dispose(){this.disposeAll()}static isStreamingSource($){return $ instanceof ReadableStream||typeof $==="string"&&$.startsWith("http")}static isLocalSource($){return $ instanceof File||$ instanceof Blob||$ instanceof ArrayBuffer||$ instanceof Uint8Array||typeof $==="string"&&!$.startsWith("http")}static getSourceType($){if($ instanceof File)return"file";if($ instanceof Blob)return"blob";if($ instanceof ArrayBuffer||$ instanceof Uint8Array)return"buffer";if($ instanceof ReadableStream)return"stream";if(typeof $==="string"||$ instanceof URL)return($ instanceof URL?$.href:$).startsWith("http")?"url":"file";return"unknown"}static async fromFetch($,A){let J=await fetch($,A);if(!J.ok)throw Error(`Failed to fetch: ${J.status} ${J.statusText}`);return J.blob()}static fromStreamingFetch($,A){return new ReadableStream({async start(J){let K=await fetch($,A);if(!K.ok){J.error(Error(`Failed to fetch: ${K.status} ${K.statusText}`));return}let Q=K.body?.getReader();if(!Q){J.error(Error("Response body is not readable"));return}try{while(!0){let{done:Z,value:O}=await Q.read();if(Z)break;J.enqueue(O)}J.close()}catch(Z){J.error(Z)}}})}}function c($,A){if(Object.is($,A))return!0;if(typeof $!==typeof A)return!1;if($===null||A===null)return $===A;if(Array.isArray($)&&Array.isArray(A)){if($.length!==A.length)return!1;for(let J=0;J<$.length;J++)if(!c($[J],A[J]))return!1;return!0}if(X$($)&&X$(A)){let J=Object.keys($),K=Object.keys(A);if(J.length!==K.length)return!1;for(let Q of J){if(!Object.hasOwn(A,Q))return!1;if(!c($[Q],A[Q]))return!1}return!0}return!1}function X$($){return typeof $==="object"&&$!==null&&$.constructor===Object}class l{state;previousState;listeners=new Set;updateScheduled=!1;pendingUpdates={};pendingKeys=[];pluginManager=null;listenerCache=[];constructor(){this.state=this.getInitialState(),this.previousState={...this.state}}setPluginManager($){this.pluginManager=$}getInitialState(){let A=R.getSupportedRenderers()[0]||"canvas2d";return{state:"idle",currentTime:0,duration:0,buffered:[],volume:1,muted:!1,playbackRate:1,playing:!1,paused:!0,ended:!1,seeking:!1,waiting:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,canPlay:!1,canPlayThrough:!1,isLive:!1,rendererType:A,playlist:[],currentPlaylistIndex:null,playlistMode:null,rotation:0,displaySize:{width:0,height:0}}}getState(){return this.state}setState($){if(this.pluginManager){let J=this.pluginManager.executeBeforeStateUpdate($);if(J===null)return;$=J}let A=Object.keys($);for(let J=0;J<A.length;J++){let K=A[J];if(this.pendingUpdates[K]===void 0)this.pendingKeys.push(K);this.setPendingValue(K,$[K])}if(!this.updateScheduled)this.updateScheduled=!0,queueMicrotask(()=>this.flushUpdates())}setPendingValue($,A){this.pendingUpdates[$]=A}flushUpdates(){let $=this.pendingKeys;if($.length===0){this.updateScheduled=!1;return}let A=!1;for(let J=0;J<$.length;J++){let K=$[J];if(!c(this.pendingUpdates[K],this.state[K])){A=!0;break}}for(let J=0;J<$.length;J++){let K=$[J];this.copyStateKey(K)}if(this.pendingUpdates={},this.pendingKeys.length=0,this.updateScheduled=!1,A){if(this.notifyListeners(),this.pluginManager)this.pluginManager.executeOnStateChange(this.state,this.previousState)}}copyStateKey($){if(this.previousState[$]=this.state[$],$ in this.pendingUpdates)this.state[$]=this.pendingUpdates[$]}subscribe($){return this.listeners.add($),$(this.getState()),()=>{this.listeners.delete($)}}reset(){this.state=this.getInitialState(),this.pendingUpdates={},this.pendingKeys.length=0,this.updateScheduled=!1,this.notifyListeners()}notifyListeners(){let $=this.state,A=this.listenerCache;A.length=0;for(let J of this.listeners)A.push(J);for(let J=0;J<A.length;J++)try{A[J]($)}catch(K){console.error("Error in state listener:",K)}}updatePlaybackState($){let A=$?"playing":"paused";this.setState({state:A,playing:$,paused:!$,ended:!1})}updateTime($){this.setState({currentTime:$})}updateDuration($){this.setState({duration:$})}updateBuffered($){this.setState({buffered:$})}updateVolume($,A){this.setState({volume:$,muted:A})}updatePlaybackRate($){this.setState({playbackRate:$})}updateMediaInfo($){this.setState({mediaInfo:$})}updateTracks($,A,J){let K={};if($)K.videoTracks=$;if(A)K.audioTracks=A;if(J)K.subtitleTracks=J;this.setState(K)}updateSelectedTracks($,A){switch($){case"video":this.setState({selectedVideoTrack:A});break;case"audio":this.setState({selectedAudioTrack:A});break;case"subtitle":this.setState({selectedSubtitleTrack:A});break}}updateError($){this.setState({error:$,state:$?"error":this.state.state})}updateSeekingState($){this.setState({seeking:$})}updateWaitingState($){this.setState({waiting:$})}updateReadyState($,A){this.setState({canPlay:$,canPlayThrough:A,state:$?"ready":this.state.state})}updateEndedState($){this.setState({ended:$,playing:!1,paused:!0,state:$?"ended":this.state.state})}updateLoadingState(){this.setState({state:"loading",playing:!1,paused:!0,ended:!1,error:null})}updateRendererType($){this.setState({rendererType:$})}updateRotation($,A){this.setState({rotation:$,displaySize:A})}updatePlaylist($,A=null){this.setState({playlist:$,currentPlaylistIndex:A})}updateCurrentPlaylistIndex($){this.setState({currentPlaylistIndex:$})}updatePlaylistMode($){this.setState({playlistMode:$})}addToPlaylist($,A){let J=this.state.playlist,K,Q=this.state.currentPlaylistIndex;if(A!==void 0&&A>=0&&A<=J.length){if(K=[...J.slice(0,A),$,...J.slice(A)],Q!==null&&Q>=A)Q+=1}else K=[...J,$];this.setState({playlist:K,currentPlaylistIndex:Q})}removeFromPlaylist($){let A=this.state.playlist;if($<0||$>=A.length)return;let J=A.filter((Q,Z)=>Z!==$),K=this.state.currentPlaylistIndex;if(K===$)K=J.length>0?0:null;else if(K!==null&&K>$)K-=1;if(J.length===0)this.setState({playlist:J,currentPlaylistIndex:null,state:"idle",currentTime:0,duration:0,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null});else this.setState({playlist:J,currentPlaylistIndex:K})}clearPlaylist(){this.setState({playlist:[],currentPlaylistIndex:null,state:"idle",currentTime:0,duration:0,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null})}}class d{input=null;videoTracks=new Map;audioTracks=new Map;videoTrackInfos=[];audioTrackInfos=[];subtitleTrackInfos=[];subtitleProviders=new Map;subtitleTrackResolvers=new Map;selectedVideoTrack=null;selectedAudioTrack=null;selectedSubtitleTrack=null;onTrackChange;async initialize($){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.input=$,await this.loadTracks()}async loadTracks(){if(!this.input)return;let $=await this.input.getVideoTracks();this.videoTrackInfos=await Promise.all($.map(async(J)=>{let K=`video-${J.id}`;this.videoTracks.set(K,J);let Q=0,Z=0;try{let j=await J.computePacketStats(100);Q=j.averagePacketRate,Z=j.averageBitrate}catch{}return{id:K,codec:J.codec,language:J.languageCode,name:J.name,width:J.codedWidth,height:J.codedHeight,frameRate:Q,bitrate:Z,rotation:J.rotation,selected:!1,decodable:await J.canDecode()}}));let A=await this.input.getAudioTracks();if(this.audioTrackInfos=await Promise.all(A.map(async(J)=>{let K=`audio-${J.id}`;this.audioTracks.set(K,J);let Q=0;try{Q=(await J.computePacketStats(100)).averageBitrate}catch{}return{id:K,codec:J.codec,language:J.languageCode,name:J.name,channels:J.numberOfChannels,sampleRate:J.sampleRate,bitrate:Q,selected:!1,decodable:await J.canDecode()}})),this.videoTrackInfos.length>0){let J=this.videoTrackInfos.find((K)=>K.decodable);if(J)this.selectVideoTrack(J.id)}if(this.audioTrackInfos.length>0){let J=this.audioTrackInfos.find((K)=>K.decodable);if(J)this.selectAudioTrack(J.id)}}getVideoTracks(){return[...this.videoTrackInfos]}getAudioTracks(){return[...this.audioTrackInfos]}getSubtitleTracks(){return[...this.subtitleTrackInfos]}getSelectedVideoTrack(){if(!this.selectedVideoTrack)return null;return this.videoTracks.get(this.selectedVideoTrack)??null}getSelectedAudioTrack(){if(!this.selectedAudioTrack)return null;return this.audioTracks.get(this.selectedAudioTrack)??null}getSelectedVideoTrackInfo(){if(!this.selectedVideoTrack)return null;return this.videoTrackInfos.find(($)=>$.id===this.selectedVideoTrack)??null}getSelectedAudioTrackInfo(){if(!this.selectedAudioTrack)return null;return this.audioTrackInfos.find(($)=>$.id===this.selectedAudioTrack)??null}getSelectedSubtitleTrackInfo(){if(!this.selectedSubtitleTrack)return null;return this.subtitleTrackInfos.find(($)=>$.id===this.selectedSubtitleTrack)??null}selectVideoTrack($){if($===this.selectedVideoTrack)return!0;if($&&!this.videoTracks.has($))return!1;let A=this.selectedVideoTrack;if(this.videoTrackInfos.forEach((J)=>{J.selected=J.id===$}),this.selectedVideoTrack=$,this.onTrackChange)this.onTrackChange({type:"video",previousTrackId:A,newTrackId:$});return!0}selectAudioTrack($){if($===this.selectedAudioTrack)return!0;if($&&!this.audioTracks.has($))return!1;let A=this.selectedAudioTrack;if(this.audioTrackInfos.forEach((J)=>{J.selected=J.id===$}),this.selectedAudioTrack=$,this.onTrackChange)this.onTrackChange({type:"audio",previousTrackId:A,newTrackId:$});return!0}selectSubtitleTrack($){if($===this.selectedSubtitleTrack)return!0;if($&&!this.subtitleTrackResolvers.has($))return!1;let A=this.selectedSubtitleTrack;if(this.subtitleTrackInfos.forEach((J)=>{J.selected=J.id===$}),this.selectedSubtitleTrack=$,this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:A,newTrackId:$});return!0}registerSubtitleTracks($,A){this.subtitleProviders.set($,A),this.rebuildSubtitleTracks()}unregisterSubtitleTracks($){if(!this.subtitleProviders.delete($))return;this.rebuildSubtitleTracks()}async getSubtitleTrackResource($){if(!$)return null;let A=this.subtitleTrackResolvers.get($);if(!A)return null;return A()}rebuildSubtitleTracks(){let $=this.selectedSubtitleTrack;this.subtitleTrackInfos=[],this.subtitleTrackResolvers.clear();for(let J of this.subtitleProviders.values())for(let K of J){let Q={...K.info,selected:!1};this.subtitleTrackInfos.push(Q),this.subtitleTrackResolvers.set(Q.id,K.resolver)}let A=$;if(!A||!this.subtitleTrackResolvers.has(A))A=this.subtitleTrackInfos[0]?.id??null;if(this.selectedSubtitleTrack=A,this.subtitleTrackInfos.forEach((J)=>{J.selected=J.id===this.selectedSubtitleTrack}),$!==this.selectedSubtitleTrack&&this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:$,newTrackId:this.selectedSubtitleTrack})}setTrackChangeListener($){this.onTrackChange=$}getState(){return{videoTracks:this.getVideoTracks(),audioTracks:this.getAudioTracks(),subtitleTracks:this.getSubtitleTracks(),selectedVideoTrack:this.selectedVideoTrack,selectedAudioTrack:this.selectedAudioTrack,selectedSubtitleTrack:this.selectedSubtitleTrack}}getPrimaryVideoTrack(){if(this.videoTracks.size===0)return null;return this.selectedVideoTrack?this.videoTracks.get(this.selectedVideoTrack)??null:this.videoTracks.values().next().value??null}getPrimaryAudioTrack(){if(this.audioTracks.size===0)return null;return this.selectedAudioTrack?this.audioTracks.get(this.selectedAudioTrack)??null:this.audioTracks.values().next().value??null}hasVideo(){return this.videoTrackInfos.length>0}hasAudio(){return this.audioTrackInfos.length>0}hasSubtitles(){return this.subtitleTrackInfos.length>0}dispose(){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.subtitleTrackInfos=[],this.subtitleProviders.clear(),this.subtitleTrackResolvers.clear(),this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.selectedSubtitleTrack=null,this.input=null,this.onTrackChange=void 0}async replaceAudioTrackByInputId($,A){let J=null;for(let[Q,Z]of this.audioTracks.entries())if(Z.id===$){J=Q;break}if(!J)return;this.audioTracks.set(J,A);let K=this.audioTrackInfos.findIndex((Q)=>Q.id===J);if(K!==-1){let Q=0;try{Q=(await A.computePacketStats(100)).averageBitrate}catch{}this.audioTrackInfos[K]={...this.audioTrackInfos[K],codec:A.codec,channels:A.numberOfChannels,sampleRate:A.sampleRate,bitrate:Q,decodable:await A.canDecode()}}}async replaceVideoTrackByInputId($,A){let J=null;for(let[Q,Z]of this.videoTracks.entries())if(Z.id===$){J=Q;break}if(!J)return;this.videoTracks.set(J,A);let K=this.videoTrackInfos.findIndex((Q)=>Q.id===J);if(K!==-1){let Q=0,Z=0;try{let O=await A.computePacketStats(100);Q=O.averagePacketRate,Z=O.averageBitrate}catch{}this.videoTrackInfos[K]={...this.videoTrackInfos[K],codec:A.codec,width:A.codedWidth,height:A.codedHeight,rotation:A.rotation,frameRate:Q,bitrate:Z,decodable:await A.canDecode()}}}}class o{emitter;store;state;sourceManager;playbackController;trackManager;playlistManager;pluginManager;options;disposed=!1;getCurrentInput=()=>this.sourceManager.getCurrentSource()?.input??null;trackSwitcher;core;constructor($={}){this.options={volume:1,muted:!1,playbackRate:1,autoplay:!1,preload:"metadata",...$},this.emitter=new f({maxListeners:100}),this.store=new l,this.state=new r(this.store),this.sourceManager=new m({maxCacheSize:$.maxCacheSize,crossOrigin:$.crossOrigin}),this.playbackController=new p({canvas:$.renderTarget,audioContext:$.audioContext,volume:this.options.volume,muted:this.options.muted,playbackRate:this.options.playbackRate,rendererType:this.options.renderer}),this.trackManager=new d,this.playlistManager=new A$(this.store,this.emitter,async(A,J)=>{await this.core.load(A.mediaSource,{startTime:A.savedPosition??0,autoplay:J,playlistItemId:A.id})},this.sourceManager),this.trackSwitcher=new $$({sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,emit:this.emit.bind(this),store:this.store,getCurrentInput:this.getCurrentInput}),this.pluginManager=new J$(this),this.core=new t({state:this.state,sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,trackSwitcher:this.trackSwitcher,emit:this.emit.bind(this),pluginManager:this.pluginManager}),this.playbackController.setPluginManager(this.pluginManager),this.store.setPluginManager(this.pluginManager),this.setupInternalListeners(),this.state.applyInitial(this.options.volume??1,this.options.muted??!1,this.options.playbackRate??1),this.state.updateRendererType(this.options.renderer||"webgpu")}setupInternalListeners(){this.playbackController.setTimeUpdateCallback(($)=>{this.state.updateTime($),this.emit("timeupdate",{currentTime:$})}),this.playbackController.setEndedCallback(()=>{this.state.updateEndedState(!0),this.emit("ended",void 0);let $=this.getState();if($.playlist.length>0&&$.currentPlaylistIndex!==null){let{playlistMode:A,currentPlaylistIndex:J}=$;if(A==="repeat-one"){let K=J;queueMicrotask(async()=>{try{await this.seek(0),await this.play()}catch(Q){this.emitter.emit("playlistitemerror",{index:K,error:Q})}})}else if(A==="repeat"){let K=J<$.playlist.length-1?J+1:0;queueMicrotask(async()=>{try{await this.playlistManager.next()}catch(Q){this.emitter.emit("playlistitemerror",{index:K,error:Q})}})}else if(A==="sequential"&&J<$.playlist.length-1){let K=J+1;queueMicrotask(async()=>{try{await this.playlistManager.next()}catch(Q){this.emitter.emit("playlistitemerror",{index:K,error:Q})}})}}}),this.trackManager.setTrackChangeListener(($)=>{this.state.updateSelectedTracks($.type,$.newTrackId),this.emit("trackchange",{type:$.type,trackId:$.newTrackId})}),this.playbackController.setWaitingCallback(()=>{this.state.updateWaitingState(!0),this.emit("waiting",void 0)}),this.playbackController.setPlayingCallback(()=>{if(this.getState().waiting)this.state.updateWaitingState(!1),this.emit("playing",void 0)}),this.playbackController.setRendererChangeCallback(($)=>{this.state.updateRendererType($),this.emit("rendererchange",$)}),this.playbackController.setRendererFallbackCallback(($,A)=>{this.emit("rendererfallback",{from:$,to:A})}),this.playbackController.setRotationChangeCallback(($,A)=>{this.store.updateRotation($,A),this.emit("rotationchange",{rotation:$,displaySize:A})}),this.state.subscribe(($)=>{this.emit("statechange",$)})}async load($,A={}){this.checkDisposed();let J=this.getState();if(J.playlist.length===0||A.replacePlaylist){await this.playlistManager.loadPlaylist([{mediaSource:$}],{autoplay:A.autoplay??this.options.autoplay,startTime:A.startTime});return}else if(J.currentPlaylistIndex!==null&&J.playlist.length>0){let K=J.currentPlaylistIndex,Z={...J.playlist[K],mediaSource:$,savedPosition:0,duration:null},O=[...J.playlist];O[K]=Z,this.store.updatePlaylist(O,K),this.emitter.emit("playlistchange",{playlist:O}),await this.core.load($,{startTime:A.startTime??0,autoplay:A.autoplay??this.options.autoplay});return}await this.core.load($,{autoplay:A.autoplay??this.options.autoplay,startTime:A.startTime})}async play(){return this.checkDisposed(),this.core.play()}pause(){this.checkDisposed(),this.core.pause()}async seek($,A={}){return this.checkDisposed(),this.core.seek($)}async stop(){return this.checkDisposed(),this.core.stop()}get currentTime(){return this.playbackController.getCurrentTime()}set currentTime($){this.seek($)}get duration(){return this.state.getState().duration}get volume(){return this.playbackController.getVolume()}set volume($){this.checkDisposed();let A=Math.max(0,Math.min(1,$));this.playbackController.setVolume(A),this.state.updateVolume(A,this.muted),this.emit("volumechange",{volume:A,muted:this.muted})}get muted(){return this.playbackController.isMuted()}set muted($){this.checkDisposed(),this.playbackController.setMuted($),this.state.updateVolume(this.volume,$),this.emit("volumechange",{volume:this.volume,muted:$})}get playbackRate(){return this.playbackController.getPlaybackRate()}set playbackRate($){this.checkDisposed();let A=Math.max(0.25,Math.min(4,$));this.playbackController.setPlaybackRate(A),this.state.updatePlaybackRate(A),this.emit("ratechange",{playbackRate:A})}get paused(){return!this.playbackController.isPlaying()}get ended(){return this.state.getState().ended}get seeking(){return this.state.getState().seeking}get waiting(){return this.state.getState().waiting}get rotation(){return this.playbackController.getRotation()}set rotation($){this.checkDisposed(),this.playbackController.setRotation($)}get displaySize(){return this.playbackController.getDisplaySize()}getVideoTracks(){return this.trackManager.getVideoTracks()}getAudioTracks(){return this.trackManager.getAudioTracks()}getSubtitleTracks(){return this.trackManager.getSubtitleTracks()}async selectVideoTrack($){this.checkDisposed(),await this.trackSwitcher.selectVideoTrack(this.trackManager,$)}async selectAudioTrack($){this.checkDisposed(),await this.trackSwitcher.selectAudioTrack(this.trackManager,$)}selectSubtitleTrack($){if(this.checkDisposed(),!this.trackManager.selectSubtitleTrack($))throw Error(`Invalid subtitle track ID: ${$}`)}registerSubtitleTracks($,A){this.trackManager.registerSubtitleTracks($,A),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let J=this.state.getState().mediaInfo;if(J)this.state.updateMediaInfo({...J,hasSubtitles:this.trackManager.hasSubtitles()})}unregisterSubtitleTracks($){this.trackManager.unregisterSubtitleTracks($),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let A=this.state.getState().mediaInfo;if(A)this.state.updateMediaInfo({...A,hasSubtitles:this.trackManager.hasSubtitles()})}async getSubtitleTrackResource($){return this.trackManager.getSubtitleTrackResource($)}async screenshot($={}){return this.checkDisposed(),this.playbackController.screenshot($)}async setRenderTarget($){this.checkDisposed(),await this.playbackController.setCanvas($)}getRenderTarget(){return this.playbackController.getCanvas()}refreshOverlays(){this.playbackController.refreshOverlays()}async loadPlaylist($,A){this.checkDisposed(),await this.playlistManager.loadPlaylist($,A)}addToPlaylist($,A){this.checkDisposed(),this.playlistManager.addToPlaylist($,A)}async removeFromPlaylist($){this.checkDisposed(),await this.playlistManager.removeFromPlaylist($)}clearPlaylist(){this.checkDisposed(),this.playlistManager.clearPlaylist()}async next(){this.checkDisposed(),await this.playlistManager.next()}async prev(){this.checkDisposed(),await this.playlistManager.prev()}async jumpTo($){this.checkDisposed(),await this.playlistManager.jumpTo($)}get playlist(){return this.playlistManager.playlist}get playlistIndex(){return this.playlistManager.currentIndex}get nowPlaying(){return this.playlistManager.currentItem}get playlistMode(){return this.playlistManager.mode}set playlistMode($){this.checkDisposed(),this.playlistManager.setMode($)}getRendererType(){return this.playbackController.getRendererType()}async switchRenderer($){this.checkDisposed(),await this.playbackController.switchRenderer($)}updateCanvasDimensions(){this.checkDisposed(),this.playbackController.updateCanvasDimensions()}static getSupportedRenderers(){return R.getSupportedRenderers()}getState(){return this.state.getState()}subscribe($){return{unsubscribe:this.state.subscribe($)}}on($,A){return this.emitter.on($,A)}once($,A){return this.emitter.once($,A)}off($,A){this.emitter.off($,A)}async use($){if(this.checkDisposed(),await this.pluginManager.install($),$.hooks?.audio)this.playbackController.rebuildAudioGraph()}async unuse($){this.checkDisposed(),await this.pluginManager.uninstall($),this.playbackController.rebuildAudioGraph()}emit($,A){let J=this.pluginManager.executeBeforeEvent($,A);if(J?.cancel)return;let K=J?.data??A;this.emitter.emit($,K),this.pluginManager.executeAfterEvent($,K)}checkDisposed(){if(this.disposed)throw Error("Player has been disposed")}dispose(){if(this.disposed)return;this.disposed=!0,this.pluginManager.dispose(),this.playbackController.dispose(),this.trackManager.dispose(),this.playlistManager?.dispose(),this.sourceManager.dispose(),this.state.reset(),this.emitter.removeAllListeners()}destroy(){this.dispose(),this.playbackController.destroy()}}var c$={fromUrl($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromFile($,A={}){return{mediaSource:$,title:A.title||$.name,poster:A.poster}},fromBlob($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromBuffer($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromUint8Array($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}},fromStream($,A={}){return{mediaSource:$,title:A.title,poster:A.poster}}};var Y$;((V)=>{V.MEDIA_NOT_SUPPORTED="MEDIA_NOT_SUPPORTED";V.MEDIA_LOAD_FAILED="MEDIA_LOAD_FAILED";V.DECODE_ERROR="DECODE_ERROR";V.NETWORK_ERROR="NETWORK_ERROR";V.PERMISSION_DENIED="PERMISSION_DENIED";V.PLAYBACK_ERROR="PLAYBACK_ERROR";V.TRACK_NOT_FOUND="TRACK_NOT_FOUND";V.INVALID_STATE="INVALID_STATE";V.UNKNOWN_ERROR="UNKNOWN_ERROR"})(Y$||={});class q extends Error{code;details;constructor($,A,J){super(A);this.name="MediaFoxError",this.code=$,this.details=J}static mediaNotSupported($="Media format not supported",A){return new q("MEDIA_NOT_SUPPORTED",$,A)}static mediaLoadFailed($="Failed to load media",A){return new q("MEDIA_LOAD_FAILED",$,A)}static decodeError($="Failed to decode media",A){return new q("DECODE_ERROR",$,A)}static networkError($="Network error occurred",A){return new q("NETWORK_ERROR",$,A)}static permissionDenied($="Permission denied",A){return new q("PERMISSION_DENIED",$,A)}static playbackError($="Playback error occurred",A){return new q("PLAYBACK_ERROR",$,A)}static trackNotFound($="Track not found",A){return new q("TRACK_NOT_FOUND",$,A)}static invalidState($="Invalid player state",A){return new q("INVALID_STATE",$,A)}static unknownError($="Unknown error occurred",A){return new q("UNKNOWN_ERROR",$,A)}}function l$($,A){if($ instanceof q)return $;if($ instanceof Error)return new q("UNKNOWN_ERROR",`${A}: ${$.message}`,{originalError:$});return new q("UNKNOWN_ERROR",`${A}: ${String($)}`,{originalError:$})}function d$($,A=!1){let J=Math.abs($),K=Math.floor(J/3600),Q=Math.floor(J%3600/60),Z=Math.floor(J%60),O=Math.floor(J%1*1000),j="";if($<0)j="-";if(K>0)j+=`${K}:${Q.toString().padStart(2,"0")}:${Z.toString().padStart(2,"0")}`;else j+=`${Q}:${Z.toString().padStart(2,"0")}`;if(A)j+=`.${O.toString().padStart(3,"0")}`;return j}function o$($){let A=$.trim().split(":").map(Number);if(A.some(Number.isNaN))throw Error("Invalid time string");let J=0;if(A.length===3)J=A[0]*3600+A[1]*60+A[2];else if(A.length===2)J=A[0]*60+A[1];else if(A.length===1)J=A[0];else throw Error("Invalid time format");return J}function n$($,A){return Math.floor($*A)}function s$($,A){return $/A}function i$($,A,J){return Math.max(A,Math.min(J,$))}function a$($,A){return $.start<A.end&&A.start<$.end}function t$($){if($.length===0)return[];let A=[...$].sort((K,Q)=>K.start-Q.start),J=[A[0]];for(let K=1;K<A.length;K++){let Q=J[J.length-1],Z=A[K];if(Z.start<=Q.end)Q.end=Math.max(Q.end,Z.end);else J.push(Z)}return J}function r$($){return $.reduce((A,J)=>A+(J.end-J.start),0)}function e$($,A){for(let J of $)if(A>=J.start&&A<J.end)return J;return null}var Y4="0.1.0",H4=o;export{l$ as wrapError,r$ as totalBufferedDuration,n$ as timeToFrame,a$ as timeRangesOverlap,o$ as parseTime,t$ as mergeTimeRanges,s$ as frameToTime,d$ as formatTime,e$ as findBufferedRange,H4 as default,i$ as clamp,k as VideoRenderer,Y4 as VERSION,d as TrackManager,l as Store,x as SourcePool,m as SourceManager,c$ as Source,R as RendererFactory,p as PlaybackController,q as MediaFoxError,o as MediaFox,f as EventEmitter,Y$ as ErrorCode,n as Compositor,g as AudioManager};
@@ -49,6 +49,7 @@ export declare class VideoRenderer {
49
49
  private rotation;
50
50
  private sourceWidth;
51
51
  private sourceHeight;
52
+ private updateFrameResult;
52
53
  constructor(options?: VideoRendererOptions);
53
54
  private setupResizeObserver;
54
55
  private getCanvasDimensionsFromEntry;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/playback/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/playback/renderer.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export declare class WebGLRenderer implements IRenderer {
17
17
  private boundHandleContextLost;
18
18
  private boundHandleContextRestored;
19
19
  private rotation;
20
+ private positionsArray;
20
21
  private readonly vertexShaderSource;
21
22
  private readonly fragmentShaderSource;
22
23
  constructor(options: WebGLRendererOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"webgl.d.ts","sourceRoot":"","sources":["../../../src/playback/renderers/webgl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAaD,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,sBAAsB,CAAyC;IACvE,OAAO,CAAC,0BAA0B,CAA6B;IAC/D,OAAO,CAAC,QAAQ,CAAe;IAE/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CASjC;IAEF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CASnC;gBAEU,OAAO,EAAE,oBAAoB;IAkBzC,OAAO,CAAC,UAAU;IAgFlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,gBAAgB;IAgBjB,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,OAAO;IA8G5D,KAAK,IAAI,IAAI;IAQpB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,OAAO;IAuBR,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,WAAW,IAAI,QAAQ;IAIvB,OAAO,IAAI,IAAI;CAyBvB"}
1
+ {"version":3,"file":"webgl.d.ts","sourceRoot":"","sources":["../../../src/playback/renderers/webgl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAaD,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,sBAAsB,CAAyC;IACvE,OAAO,CAAC,0BAA0B,CAA6B;IAC/D,OAAO,CAAC,QAAQ,CAAe;IAE/B,OAAO,CAAC,cAAc,CAAuB;IAE7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CASjC;IAEF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CASnC;gBAEU,OAAO,EAAE,oBAAoB;IAkBzC,OAAO,CAAC,UAAU;IAgFlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,gBAAgB;IAgBjB,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,OAAO;IA6G5D,KAAK,IAAI,IAAI;IAQpB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,OAAO;IAuBR,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,WAAW,IAAI,QAAQ;IAIvB,OAAO,IAAI,IAAI;CAyBvB"}
@@ -18,6 +18,7 @@ export declare class WebGPURenderer implements IRenderer {
18
18
  private textureHeight;
19
19
  private powerPreference;
20
20
  private rotation;
21
+ private quadArray;
21
22
  private readonly vertexShaderSource;
22
23
  private readonly fragmentShaderSource;
23
24
  constructor(options: WebGPURendererOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"webgpu.d.ts","sourceRoot":"","sources":["../../../src/playback/renderers/webgpu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC5C,eAAe,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAAC;IACnD,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAe;IAE/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAajC;IAEF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAQnC;gBAEU,OAAO,EAAE,qBAAqB;YAS5B,UAAU;YAoDV,oBAAoB;IAsClC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,eAAe;IAYhB,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,OAAO;IAsI5D,KAAK,IAAI,IAAI;IAuBb,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,WAAW,IAAI,QAAQ;IAIvB,OAAO,IAAI,IAAI;CAoBvB"}
1
+ {"version":3,"file":"webgpu.d.ts","sourceRoot":"","sources":["../../../src/playback/renderers/webgpu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC5C,eAAe,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAAC;IACnD,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAe;IAE/B,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAajC;IAEF,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAQnC;gBAEU,OAAO,EAAE,qBAAqB;YAS5B,UAAU;YAoDV,oBAAoB;IAsClC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,eAAe;IAYhB,OAAO,IAAI,OAAO;IAIlB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,OAAO;IAkJ5D,KAAK,IAAI,IAAI;IAuBb,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIrC,WAAW,IAAI,QAAQ;IAIvB,OAAO,IAAI,IAAI;CAoBvB"}
@@ -7,13 +7,19 @@ export declare class Store implements StateStore {
7
7
  private listeners;
8
8
  private updateScheduled;
9
9
  private pendingUpdates;
10
+ private pendingKeys;
10
11
  private pluginManager;
12
+ private listenerCache;
11
13
  constructor();
12
14
  setPluginManager(pluginManager: PluginManager): void;
13
15
  private getInitialState;
14
16
  getState(): Readonly<PlayerStateData>;
15
17
  setState(updates: Partial<PlayerStateData>): void;
18
+ /** Type-safe helper to set a single pending update value */
19
+ private setPendingValue;
16
20
  private flushUpdates;
21
+ /** Type-safe helper to copy a single key from state to previousState and apply pending update */
22
+ private copyStateKey;
17
23
  subscribe(listener: StateListener): StateUnsubscribe;
18
24
  reset(): void;
19
25
  private notifyListeners;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAET,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,iBAAiB,EACjB,SAAS,EACT,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3E,qBAAa,KAAM,YAAW,UAAU;IACtC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,aAAa,CAA8B;;IAOnD,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAIpD,OAAO,CAAC,eAAe;IAsCvB,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC;IAIrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAgBjD,OAAO,CAAC,YAAY;IA0BpB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB;IAWpD,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,eAAe;IAYvB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAU3C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI;IAI3C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIlD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9C,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIlD,YAAY,CACV,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,cAAc,CAAC,EAAE,iBAAiB,EAAE,GACnC,IAAI;IAQP,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAcxF,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAOtC,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAQjE,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAStC,kBAAkB,IAAI,IAAI;IAU1B,kBAAkB,CAAC,YAAY,EAAE,OAAO,UAAU,EAAE,YAAY,GAAG,IAAI;IAIvE,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIxF,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAI5E,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/C,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI5C,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAiB7D,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAmC7C,aAAa,IAAI,IAAI;CAgBtB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mediafox/core",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "Framework-agnostic media player library powered by MediaBunny",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",