@omnimedia/omnitool 1.1.0-57 → 1.1.0-58

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omnimedia/omnitool",
3
- "version": "1.1.0-57",
3
+ "version": "1.1.0-58",
4
4
  "description": "open source video processing tools",
5
5
  "license": "MIT",
6
6
  "author": "Przemysław Gałęzki",
@@ -10,6 +10,7 @@ const MAX_TILE_WIDTH = 4096
10
10
  export class Waveform {
11
11
  #tiles = new Map<number, WaveformTileData>()
12
12
  #activeRange: WaveformTimeRange = [0, 0]
13
+ #visibleRange: WaveformTimeRange = [0, 0]
13
14
 
14
15
  #zoom
15
16
  #levels
@@ -53,7 +54,7 @@ export class Waveform {
53
54
  }
54
55
 
55
56
  get range() {
56
- return this.#activeRange
57
+ return this.#visibleRange
57
58
  }
58
59
 
59
60
  #computeActiveRange([start, end]: WaveformTimeRange, margin = 1): WaveformTimeRange {
@@ -65,6 +66,8 @@ export class Waveform {
65
66
  }
66
67
 
67
68
  set range(visibleRange: WaveformTimeRange) {
69
+ this.#visibleRange = visibleRange
70
+
68
71
  const [visibleStart, visibleEnd] = visibleRange
69
72
  const visibleSize = visibleEnd - visibleStart
70
73
  const [activeStart, activeEnd] = this.#activeRange
@@ -2412,7 +2412,7 @@ vec4 transition(vec2 uv) {
2412
2412
  vec2 uv = vTextureCoord.xy;
2413
2413
  gl_FragColor = transition(vTextureCoord);
2414
2414
  }
2415
- `;function _a({name:r,renderer:e}){let t=Aa.default.find(c=>c.name===r),n=new ht,o=new $t,i=new Ir({}),s=new Ir({}),a=new go({glProgram:new po({vertex:Ca,fragment:Ia(t.glsl)}),resources:{from:i,to:s,uniforms:{...wi.basics,...wi.custom(t)}}});return n.filters=[a],{render({width:c,height:l,from:d,to:u,progress:f}){return(n.width!==c||n.height!==l)&&(n.setSize({width:c,height:l}),o.source.resize(c,l)),i.resource=d,s.resource=u,i.update(),s.update(),a.resources.uniforms.uniforms.progress=f,e.render({container:n,target:o,clear:!1,width:c,height:l}),o}}}var jn=class{pixi;static async setup(){let e=await Ti({width:1920,height:1080,preference:"webgl",background:"black",preferWebGLVersion:2}),t=new mo;return t.interactive=!0,new this({renderer:e,stage:t})}constructor(e){this.pixi=e}#e=new Map;#t=new Map;async composite(e){let{stage:t,renderer:n}=this.pixi;this.#l(this.#c(e));let{dispose:o}=await this.#r(e,t);n.render(t);let i=new VideoFrame(n.canvas,{timestamp:0,duration:0});return o(),i}async#r(e,t){if(Array.isArray(e)){e.reverse();let n=[];for(let o of e){let i=await this.#r(o,t);n.push(i.dispose)}return{dispose:()=>n.forEach(o=>o())}}switch(e.kind){case"text":return this.#n(e,t);case"image":return this.#o(e,t);case"transition":return this.#i(e,t);case"gap":return this.pixi?.renderer.clear(),{dispose:()=>{}};default:return console.warn("Unknown layer kind",e.kind),{dispose:()=>{}}}}#n(e,t){let n=this.#a(e);return this.#s(n,e.matrix),t.addChild(n),{dispose:()=>{}}}#o(e,t){let n=$t.from(e.frame),o=this.#a(e);return o.texture=n,this.#s(o,e.matrix),t.addChild(o),{dispose:()=>{n.destroy(!0),e.frame.close()}}}#i({from:e,to:t,progress:n,name:o},i){let a=(this.#e.get(o)??(this.#e.set(o,_a({name:"circle",renderer:this.pixi.renderer})),this.#e.get(o))).render({from:e,to:t,progress:n,width:e.displayWidth,height:e.displayHeight}),c=new ht(a);return i.addChild(c),{dispose:()=>c.destroy(!1)}}#s(e,t){if(!t)return;let n=wa(t);e.setFromMatrix(n)}#a(e){let t=this.#t.get(e.id);if(t)return t;switch(e.kind){case"text":{let n=new vr({text:e.content,style:e.style});return n.onmouseenter=()=>console.log("enter text"),this.#t.set(e.id,n).get(e.id)}case"image":{let n=new ht;return n.onmouseenter=()=>console.log("enter"),this.#t.set(e.id,n).get(e.id)}}}#c(e){let t=new Set,n=o=>{if(Array.isArray(o))for(let i of o)n(i);else t.add(o.id)};return n(e),t}#l(e){for(let t of this.#t.keys())e.has(t)||(this.#t.get(t).destroy(!0),this.#t.delete(t))}};var Ea=r=>jr.host(e=>({async world(){r.count++}}));async function ce(r){return r instanceof Blob?new kr(r):new Sr(r)}var $n=class{machina;thread;compositor;static async setup(e){let t=new Hn,n=await jr.thread({label:"OmnitoolDriver",workerUrl:e?.workerUrl??"/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",setupHost:Ea(t)}),o=await jn.setup();return new this(t,n,o)}constructor(e,t,n){this.machina=e,this.thread=t,this.compositor=n}async hello(){return this.thread.work.hello()}async getAudioDuration(e){let n=await new ee({source:await ce(e),formats:ie}).getPrimaryAudioTrack();if(!n)throw new Error("primary audio track not found");return await n.computeDuration()}async getVideoDuration(e){return await(await new ee({source:await ce(e),formats:ie}).getPrimaryVideoTrack())?.computeDuration()}decodeVideo(e){let t=null,{port1:n,port2:o}=new MessageChannel,i=new TransformStream({async transform(s,a){let c=await e.onFrame?.(s)??s;t?.close(),a.enqueue(c),t=c}});return this.thread.work.decodeVideo[yt]({transfer:[i.writable,o]})({source:e.source,cancel:o,video:i.writable,start:e.start,end:e.end}),{readable:i.readable,cancel(){n.postMessage("close"),n.close()}}}decodeAudio(e){let t=new TransformStream,{port1:n,port2:o}=new MessageChannel;return this.thread.work.decodeAudio[yt]({transfer:[t.writable,o]})({source:e.source,cancel:o,audio:t.writable,start:e.start,end:e.end}),{readable:t.readable,cancel(){n.postMessage("close"),n.close()}}}encode({audio:e,video:t,config:n}){let{readable:o,writable:i}=new TransformStream,s=[e,t,i].filter(Er.happy),a=this.thread.work.encode[yt]({transfer:s})({audio:e,video:t,config:n,writable:i});return{readable:o,done:a}}async composite(e){return await this.compositor.composite(e)}};var M;(function(r){r[r.Sequence=0]="Sequence",r[r.Stack=1]="Stack",r[r.Video=2]="Video",r[r.Audio=3]="Audio",r[r.Text=4]="Text",r[r.Gap=5]="Gap",r[r.Spatial=6]="Spatial",r[r.Transition=7]="Transition",r[r.TextStyle=8]="TextStyle"})(M||(M={}));var Kn;(function(r){r[r.Crossfade=0]="Crossfade"})(Kn||(Kn={}));var Xn=class{datafile;duration=0;hasVideo=!1;hasAudio=!1;constructor(e){this.datafile=e}static async analyze(e){let t=new this(e),n=await this.duration(e.url)*1e3;t.duration=n;let{video:o,audio:i}=await this.#e(e.url);return t.hasAudio=i,t.hasVideo=o,t}static async duration(e){let n=await new ee({formats:ie,source:await ce(e)}).computeDuration();return Number(n.toFixed(5))}static async#e(e){let t=new ee({formats:ie,source:await ce(e)});return{audio:!!await t.getPrimaryAudioTrack(),video:!!await t.getPrimaryVideoTrack()}}};var Qn=class{#e=new Fr;async store(e){let t=await Xn.analyze(e),{hash:n}=t.datafile.checksum,{filename:o,bytes:i,url:s,blob:a}=t.datafile;if(this.#e.has(n)){let c=this.#e.require(n);c.filename=o}else this.#e.set(n,{kind:"media",filename:o,bytes:i,url:s,blob:a});return t}require(e){return this.#e.require(e)}};var Yn=class r{videoTrack;options;#e;#t=new Map;#r=[0,0];constructor(e,t){this.videoTrack=e,this.options=t,this.#e=new fr(e,t.canvasSinkOptions)}static async init(e,t){let o=await new ee({formats:ie,source:await ce(e)}).getPrimaryVideoTrack();if(o)return new r(o,{frequency:t.frequency??1,canvasSinkOptions:t.canvasSinkOptions??{width:80,height:50,fit:"fill"},onChange:t.onChange,onPlaceholders:t.onPlaceholders});throw new Error("Source has no video track")}set frequency(e){e!==this.options.frequency&&(this.options.frequency=e,this.#c())}get frequency(){return this.options.frequency}#n([e,t],n=1){let o=t-e;return[e-o*n,t+o*n]}async#o(){let[e,t]=this.#r,n=new Set,o=await this.videoTrack.computeDuration();for(let i=Math.max(0,e);i<=t;i+=this.options.frequency)i>=0&&i<=o&&n.add(i);this.options.onPlaceholders?.([...n])}async#i(){let[e,t]=this.#r,n=new Set,o=await this.videoTrack.computeDuration();for(let c=Math.max(0,e);c<=t;c+=this.options.frequency)c>=0&&c<=o&&n.add(c);let i=[...n].filter(c=>!this.#t.has(c)),s=0;for await(let c of this.#e.canvasesAtTimestamps(i))if(c){let l=i[s++];this.#t.set(l,c)}for(let c of this.#t.keys())n.has(c)||this.#t.delete(c);let a=[...this.#t.entries()].map(([c,l])=>({time:c,canvas:l}));this.options.onChange(a)}set range(e){let[t,n]=e,o=n-t,[i,s]=this.#r,a=i+o,c=s-o,l=t<a,d=n>c;!l&&!d||(this.#r=this.#n(e,2),this.#c())}#s=null;#a=!1;async#c(){if(this.#o(),this.#s){this.#a=!0;return}this.#s=this.#i(),await this.#s,this.#s=null,this.#a&&(this.#a=!1,await this.#c())}getThumbnail(e){return this.#t.get(e)}};function Fa(r,e){let t=typeof window<"u"&&window.devicePixelRatio||1,n=document.createElement("canvas");n.width=e.width*t,n.height=e.height*t,n.style.width=`${e.width}px`,n.style.height=`${e.height}px`;let o=n.getContext("2d");if(!o)return n;o.scale(t,t),o.fillStyle=e.color;let i=e.height/2,s=Math.max(1,e.width),a=r.length/s;for(let c=0;c<s;c++){let l=Math.floor(c*a),d=Math.max(l+1,Math.floor((c+1)*a)),u=0;for(let m=l;m<d&&m<r.length;m++)r[m]>u&&(u=r[m]);let f=u*e.height;o.fillRect(c,i-f/2,1,f)}return n}var ki=[2048,1024,512,256,128,64,32];async function Da(r,e){let t=await r.getAudioDuration(e)??0,n=r.decodeAudio({source:e}).readable,o=ki[ki.length-1],i=[],s=0,a=0,c=0;for await(let u of n){c||=u.sampleRate;let f=u.numberOfFrames,m=new Float32Array(f);u.copyTo(m,{planeIndex:0});for(let p=0;p<m.length;p++){let g=Math.abs(m[p]);g>s&&(s=g),a++,a>=o&&(i.push(s),s=0,a=0)}u.close()}a>0&&i.push(s);let l=new Float32Array(i),d=ki.map(u=>{let f=Math.max(1,Math.round(u/o)),m=f===1?l:Kc(l,f);return{samplesPerPeak:u,peaks:m,peaksPerSecond:c>0?c/u:0}});return{duration:t,levels:d}}function Kc(r,e){let t=new Float32Array(Math.ceil(r.length/e));for(let n=0;n<t.length;n++){let o=0,i=n*e,s=Math.min(i+e,r.length);for(let a=i;a<s;a++)r[a]>o&&(o=r[a]);t[n]=o}return t}var Xc=4096,Zn=class r{#e=new Map;#t=[0,0];#r;#n;#o;#i=!1;color;duration;tileSize;tileHeight;preloadMargin;constructor(e,t,n){this.#n=e,this.duration=t,this.tileSize=n.tileSize??1,this.#r=n.zoom??(n.tileWidth??256)/this.tileSize,this.tileHeight=n.tileHeight??96,this.preloadMargin=n.preloadMargin??2,this.color=n.color??"rgb(3, 148, 129)",this.#o=n.onChange}static async init(e,t,n={}){let{duration:o,levels:i}=await Da(e,t);return new r(i,o,n)}set zoom(e){let t=Math.max(1,e);t!==this.#r&&(this.#r=t,this.#e.clear(),this.#a())}get zoom(){return this.#r}get range(){return this.#t}#s([e,t],n=1){let o=t-e;return[Math.max(0,e-o*n),Math.min(this.duration,t+o*n)]}set range(e){let[t,n]=e,o=n-t,[i,s]=this.#t,a=i+o,c=s-o;t>=a&&n<=c||(this.#t=this.#s(e,this.preloadMargin),this.#a())}#a(){this.#i||(this.#i=!0,queueMicrotask(()=>{this.#i=!1,this.#c()}))}#c(){let[e,t]=this.#t,n=new Set,o=this.#u(),i=Math.max(0,Math.floor(e/this.tileSize)*this.tileSize),s=Math.min(this.duration,t);for(let a=i;a<=s;a+=this.tileSize)n.add(a);for(let a of n)if(!this.#e.has(a)){let c=Math.min(a+this.tileSize,this.duration);this.#e.set(a,this.#l(a,c,o))}for(let a of this.#e.keys())n.has(a)||this.#e.delete(a);this.#m()}#l(e,t,n){let o=this.#d(n,e,t);return{startTime:e,endTime:t,peaks:o,canvas:Fa(o,{width:this.#f(e,t),height:this.tileHeight,color:this.color})}}#u(){return this.#n.find(e=>e.peaksPerSecond>=this.#r)??this.#n[this.#n.length-1]}#d(e,t,n){if(!e.peaksPerSecond)return new Float32Array;let o=Math.max(0,Math.floor(t*e.peaksPerSecond)),i=Math.max(o+1,Math.min(e.peaks.length,Math.ceil(n*e.peaksPerSecond)));return e.peaks.slice(o,i)}#f(e,t){return Math.min(Xc,Math.max(1,Math.ceil((t-e)*this.#r)))}#m(){this.#o&&this.#o([...this.#e.values()].sort((e,t)=>e.startTime-t.startTime))}getTiles(){return this.#e}};var U=r=>r;var qt=r=>r;var Ra=()=>{let r=!1,e=qt(60),t=1e3/e,n=0,o=0,i=xt(),s=null,a=l=>{if(requestAnimationFrame(a),!!r)for(n=l;l-o>=t;)o+=t,s?.(),s=null,i()};async function*c(){for(n=performance.now(),o=n,requestAnimationFrame(a);;)await new Promise(l=>s=l),yield}return{play(){r||(r=!0,n=performance.now(),o=n)},pause(){r=!1},setFPS(l){e=l,t=1e3/e},isPlaying(){return r},ticks:c,onTick:i}},Ma=async(r,e)=>{let t=U(1e3/r.fps),n=r.duration/1e3,o=Math.ceil(n*r.fps);for(let i=0;i<o;i++){let s=U(i*t);await e(s,i)}};function Oa(r){return"duration"in r}function za(r){let e=[],t=new Map(r.timeline.items.map(n=>[n.id,n]));return Si(r.timeline.rootId,t,r.from,{sequence:()=>{},stack:()=>{},video:(n,o,i)=>e.push({item:n,localTime:o,ancestors:i}),text:(n,o,i)=>e.push({item:n,localTime:o,ancestors:i}),audio:(n,o,i)=>e.push({item:n,localTime:o,ancestors:i})}),e}function Ua(r,e,t){let n=Sa;for(let o of e)n=Ba(r,o,n);return Ba(r,t,n)}function Ba(r,e,t){if("spatialId"in e&&e.spatialId){let n=r.get(e.spatialId);if(n?.enabled){let o=Ta(n.transform);return ka(o,t)}}return t}function Si(r,e,t,n,o=[]){let i=e.get(r);if(i)switch(i.kind){case M.Stack:n.stack(i,t,o);for(let s of i.childrenIds)Si(s,e,t,n,[...o,i]);break;case M.Sequence:{n.sequence(i,t,o);let s=U(0);for(let a of i.childrenIds){let c=e.get(a);if(!c||!Oa(c))continue;let l=U(s+c.duration);if(t>=l){s=l;continue}let d=U(Math.max(0,t-s));Si(a,e,d,n,[...o,i]),s=l}break}case M.Video:n.video(i,t,o);break;case M.Text:n.text(i,t,o);break;case M.Audio:n.audio(i,t,o);break}}function pe(r,e){let t=e.items.find(n=>n.id===r);if(!t)return U(0);switch(t.kind){case M.Sequence:{let n=t.childrenIds.map(i=>e.items.find(s=>s.id===i)).filter(Boolean),o=U(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===M.Transition){let a=n[i-1],c=n[i+1];if(a&&c&&a.kind!==M.Transition&&c.kind!==M.Transition){let l=pe(a.id,e),d=pe(c.id,e),u=Math.max(0,Math.min(s.duration,l,d));o=U(o-u)}continue}o=U(o+pe(s.id,e))}return o}case M.Stack:{let n=U(0);for(let o of t.childrenIds){let i=pe(o,e);i>n&&(n=i)}return n}default:return Oa(t)?t.duration:U(0)}}var Pr=r=>r;var Jn=class{resolveMedia;#e=new Map;constructor(e){this.resolveMedia=e}async getSink(e){let t=this.#e.get(e);if(t)return t.sink;let n=new ee({formats:ie,source:await ce(this.resolveMedia(e))}),o=await n.getPrimaryVideoTrack(),s=!!o&&await o.canDecode()&&o?new Ct(o):null;return this.#e.set(e,{input:n,sink:s}),s}};async function Na(r,e,t,n){let[o,i]=await Promise.all([t,n]),s=o.find(l=>l.kind==="image")?.frame,a=i.find(l=>l.kind==="image")?.frame,c=[...o.filter(l=>l.kind!=="image"),...i.filter(l=>l.kind!=="image")];return s&&a?[{id:r.id,kind:"transition",name:"circle",progress:e,from:s,to:a},...c]:c}async function Va(r,e,t,n){let o=Qc(r,e,t);if(!o)return[];let i=[...n,e];return o.isTransitioning?Na(o.transition,o.progress,ft(r,o.outgoing,o.outgoingTime,i),ft(r,o.incoming,o.incomingTime,i)):ft(r,o.item,o.localTime,i)}function Qc(r,e,t){let n=e.childrenIds.map(i=>r.items.get(i)).filter(i=>!!i),o=U(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===M.Transition)continue;let a=o,c=pe(s.id,r.timeline),l=U(a+c),d=n[i+1];if(!(d?.kind===M.Transition)){if(t<l)return{isTransitioning:!1,item:s,localTime:U(t-a)};o=l;continue}let f=d,m=n[i+2];if(!m||m.kind===M.Transition){o=l;continue}let p=pe(m.id,r.timeline),g=Math.max(0,Math.min(f.duration,c,p)),y=U(l-g);if(t<y)return{isTransitioning:!1,item:s,localTime:U(t-a)};if(t<l){let b=U(t-y),x=U(t-a);return{isTransitioning:!0,incoming:m,outgoing:s,outgoingTime:x,incomingTime:b,progress:g>0?b/g:1,transition:f}}o=y,i++}return null}async function ft(r,e,t,n){let o=Ua(r.items,n,e);switch(e.kind){case M.Stack:{let i=[...n,e];return(await Promise.all(e.childrenIds.map(a=>r.items.get(a)).filter(a=>!!a).map(a=>ft(r,a,t,i)))).flat()}case M.Sequence:return Va(r,e,t,n);case M.Video:{if(t<0||t>=e.duration)return[];let i=await r.videoSampler(e,t);return i?[{kind:"image",frame:i,matrix:o,id:e.id}]:[]}case M.Text:{if(t<0||t>=e.duration)return[];let i=e.styleId?r.items.get(e.styleId)?.style:void 0;return[{id:e.id,kind:"text",content:e.content,style:i,matrix:o}]}case M.Gap:return[{id:e.id,kind:"gap"}];default:return[]}}function La(r){return async(e,t)=>{let o=await(await r.getSink(e.mediaHash))?.getSample(t/1e3),i=o?.toVideoFrame();return o?.close(),i??void 0}}function eo(r,e){let t=new Jn(r),n=e??La(t);return{async sample(o,i){let s=new Map(o.items.map(c=>[c.id,c])),a=s.get(o.rootId);return a?ft({videoSampler:n,timeline:o,items:s},a,i,[]):[]}}}var Gt=class{driver;resolveMedia;timeline;#e=-1/0;#t=new Map;#r;constructor(e,t,n){this.driver=e,this.resolveMedia=t,this.timeline=n,this.#r=eo(this.resolveMedia,(o,i)=>{let s=Ha(i),a=this.#t.get(o.id);if(!a){let c=this.resolveMedia(o.mediaHash),l=Ha(U(o.start+o.duration));a=this.#n(c,s,l),this.#t.set(o.id,a)}return a.next(s)})}next(e){if(e<this.#e)throw new Error(`Forward-only cursor regression: ${e}ms < ${this.#e}ms`);return this.#e=e,this.#r.sample(this.timeline,e)}async cancel(){await Promise.all([...this.#t.values()].map(e=>e.cancel())),this.#t.clear()}#n(e,t,n){let o=this.driver.decodeVideo({source:e,start:t/1e6,end:n/1e6}),i=o.readable.getReader(),s=null,a=null,c=!1,l=async()=>{if(c)return null;let{done:d,value:u}=await i.read();if(d)return c=!0,null;let f=new VideoFrame(u);return u.close(),f};return{async next(d){if(s??=await l(),!!s)for(;;){a??=l();let u=await a;if(!u)return new VideoFrame(s);let f=s.timestamp??-1/0,m=u.timestamp??f;if(m<d){s.close(),s=u,a=null;continue}if(Math.abs(m-d)<Math.abs(f-d)){s.close(),s=u,a=null;continue}return new VideoFrame(s)}},async cancel(){let d=a;a=null,s?.close(),s=null,o.cancel(),(await d?.catch(()=>null))?.close()}}}},Ha=r=>Math.round(r*1e3);async function qa(r,e,t){return(await Promise.all(e.map(async({item:o,localTime:i})=>{if(o.kind!==M.Audio)return;let s=await r.getSink(o.mediaHash);if(!s)return;let a=o.start+i,c=Pr((t-a)/1e3),l=s.samples(a/1e3),d=await l.next();if(d.done)return;let u=d.value,f=l.next();return{offset:c,gain:o.gain??1,get currentSample(){return u},timelineTime:()=>Pr(c+u.timestamp),output:()=>({sample:u,timestamp:c+u.timestamp,gain:o.gain??1}),advance:async()=>{let m=await f;return m.done?!1:(u=m.value,f=l.next(),!0)}}}))).filter(o=>!!o)}var to=class{resolveMedia;#e=new Map;constructor(e){this.resolveMedia=e}async getSink(e){let t=this.#e.get(e);if(t)return t.sink;let n=new ee({formats:ie,source:await ce(this.resolveMedia(e))}),o=await n.getPrimaryAudioTrack(),s=!!o&&await o.canDecode()&&o?new mr(o):null;return this.#e.set(e,{input:n,sink:s}),s}};function Ga(r){let e={index:0,stream:r[0],time:r[0].timelineTime()};for(let[t,n]of r.entries()){let o=n.timelineTime();o<e.time&&(e={time:o,stream:n,index:t})}return e}function ro(r){let e=new to(r);return{async*sampleAudio(t,n){let o=za({timeline:t,from:n}),i=await qa(e,o,n);for(;i.length>0;){let{stream:s,index:a}=Ga(i);yield s.output(),await s.advance()||i.splice(a,1)}}}}var no=class{driver;timeline;resolveMedia;audioSampler;seekVisualSampler;playVisualSampler=null;#e=U(0);#t=null;#r=Ra();onTick=this.#r.onTick;audioContext=new AudioContext({sampleRate:48e3});audioGain=this.audioContext.createGain();audioNodes=new Set;#n=null;constructor(e,t,n){this.driver=e,this.timeline=t,this.resolveMedia=n,this.audioGain.connect(this.audioContext.destination),this.audioGain.gain.value=.7**2,this.seekVisualSampler=eo(this.resolveMedia),this.audioSampler=ro(this.resolveMedia),this.#o()}async#o(){for await(let e of this.#r.ticks()){let t=await this.playVisualSampler?.next(this.currentTime)??[];(await this.driver.composite(t)).close(),this.currentTime>=this.duration&&this.pause()}}async seek(e){return this.pause(),this.#e=e,await this.seekVisualSampler.sample(this.timeline,e)}async start(e){if(!this.#r.isPlaying()){this.timeline=e,await this.audioContext.resume(),this.#e=this.currentTime,this.#t=this.audioContext.currentTime,this.#n?.abort(),this.#n=new AbortController;for(let t of this.audioNodes)t.stop();this.audioNodes.clear(),this.playVisualSampler?.cancel(),this.playVisualSampler=new Gt(this.driver,this.resolveMedia,this.timeline),this.#r.play(),this.#i(this.#n.signal,Pr(this.#e/1e3))}}pause(){this.#e=this.currentTime,this.#r.pause(),this.#n?.abort();for(let e of this.audioNodes)e.stop();this.audioNodes.clear(),this.playVisualSampler?.cancel(),this.playVisualSampler=null}get duration(){return pe(this.timeline.rootId,this.timeline)}get currentTime(){if(!this.#r.isPlaying()||this.#t===null)return this.#e;let e=(this.audioContext.currentTime-this.#t)*1e3;return U(this.#e+e)}setFps(e){this.#r.setFPS(e)}async#i(e,t){let n=this.audioContext;if(this.#t!==null)for await(let{sample:o,timestamp:i}of this.audioSampler.sampleAudio(this.timeline,U(t*1e3))){if(e.aborted||!this.#r.isPlaying())return;for(;i-(n.currentTime-this.#t+t)>.75;)await new Promise(c=>setTimeout(c,25));let s=n.createBufferSource();s.buffer=o.toAudioBuffer(),s.connect(this.audioGain),s.onended=()=>this.audioNodes.delete(s),this.audioNodes.add(s);let a=this.#t+i-t;a>=n.currentTime?s.start(a):s.start(n.currentTime,n.currentTime-a)}}};var oo=class{driver;timeline;canvas;playback;constructor(e,t,n){this.driver=e,this.timeline=n,this.playback=new no(e,n,t),this.canvas=e.compositor.pixi.renderer.canvas}async play(){await this.playback.start(this.timeline)}pause(){this.playback.pause()}async seek(e){let t=await this.playback.seek(U(e));(await this.driver.composite(t)).close()}setFPS(e){this.playback.setFps(qt(e))}get duration(){return this.playback.duration}get currentTime(){return this.playback.currentTime}async update(e){this.timeline=e}};var mt=class{state;constructor(e){this.state=e}require(e){return e===void 0?void 0:this.state.timeline.items.find(n=>n.id===e)}get timeline(){return this.state.timeline}getId(){return he.toInteger(he.random())}#e(e){this.state.timeline=e(this.state.timeline)}register(e){this.#e(t=>({...t,items:[...t.items,e]}))}textStyle=e=>{let t={id:this.getId(),kind:M.TextStyle,style:e};return this.register(t),t};spatial=e=>{let t={id:this.getId(),kind:M.Spatial,transform:e,enabled:!0};return this.register(t),t};sequence=(...e)=>{let t={id:this.getId(),kind:M.Sequence,childrenIds:e.map(n=>n.id)};return this.register(t),t};stack=(...e)=>{let t={kind:M.Stack,id:this.getId(),childrenIds:e.map(n=>n.id)};return this.register(t),t};video=(e,t)=>{if(!e.hasVideo)throw new Error(`Video clip error: media "${e.datafile.filename}" has no video track.`);let n={kind:M.Video,id:this.getId(),mediaHash:e.datafile.checksum.hash,start:t?.start??0,duration:t?.duration??e.duration};return this.register(n),n};audio=(e,t)=>{if(!e.hasAudio)throw new Error(`Audio clip error: media "${e.datafile.filename}" has no audio track.`);let n={kind:M.Audio,id:this.getId(),mediaHash:e.datafile.checksum.hash,start:t?.start??0,duration:t?.duration??e.duration,gain:t?.gain??1};return this.register(n),n};text=(e,t)=>{let n={id:this.getId(),content:e,kind:M.Text,duration:t?.duration??2e3};return t?.styles&&(n.styleId=this.textStyle(t.styles).id),this.register(n),n};gap=e=>{let t={id:this.getId(),kind:M.Gap,duration:e};return this.register(t),t};transition={crossfade:e=>{let t={id:this.getId(),kind:M.Transition,effect:Kn.Crossfade,duration:e};return this.register(t),t}};transform=e=>{let t=[e?.position?.[0]??0,e?.position?.[1]??0],n=[e?.scale?.[0]??1,e?.scale?.[1]??1],o=e?.rotation??0;return[t,n,o]};addChildren(e,...t){this.#e(n=>(n.items.find(({id:i})=>i===e.id).childrenIds.push(...t.map(i=>i.id)),n))}set=(e,t)=>{this.#e(n=>({...n,items:n.items.map(o=>o.id===e?{...o,...t}:o)}))}};var io=class{#e;#t;constructor(e={}){this.#e=e.chunkFrames??1024,this.#t=e.clamp??!0}async*mix(e){let t=this.#e,n=null,o=null,i=[],s=0,a=0;for await(let c of e){if(o===null)o=c.planes.length,n=c.sampleRate;else{if(c.planes.length!==o)throw new Error("Channel count changed");if(c.sampleRate!==n)throw new Error("Sample rate changed")}let l=Math.round(c.timestamp*n),d=c.planes[0]?.length??0;for(;s+t<=l;)yield this.#r(i,s,o,n),s+=t;i.push({startFrame:l,endFrame:l+d,data:c.planes}),a=Math.max(a,l+d)}if(o!==null&&n!==null)for(;s<a;)yield this.#r(i,s,o,n),s+=t}#r(e,t,n,o){let i=this.#e,s=new Float32Array(n*i),a=t+i;for(let c=0;c<n;c++){let l=c*i,d=s.subarray(l,l+i);for(let u of e){let f=u.data[c];if(!f)continue;let m=Math.max(t,u.startFrame),p=Math.min(a,u.endFrame);if(m>=p)continue;let g=m-t,y=m-u.startFrame,b=p-m;for(let x=0;x<b;x++)d[g+x]+=f[y+x]}if(this.#t)for(let u=0;u<i;u++){let f=d[u];d[u]=f<-1?-1:f>1?1:f}}for(let c=e.length-1;c>=0;c--)e[c].endFrame<=a&&e.splice(c,1);return{planar:s,sampleRate:o,channels:n,frames:i,startFrame:t}}};var Yc=(r,e,t)=>{if(e===t)return r;let n=t/e,o=Math.max(1,Math.round(r.length*n)),i=new Float32Array(o);for(let s=0;s<o;s++){let a=s/n,c=Math.floor(a),l=Math.min(c+1,r.length-1),d=a-c;i[s]=r[c]*(1-d)+r[l]*d}return i},Wa=(r,e)=>{let t=r.numberOfChannels,n=new Array(t),o=0;for(let i=0;i<t;i++){let s=new Float32Array(r.numberOfFrames);r.copyTo(s,{planeIndex:i,format:"f32-planar"});let a=Yc(s,r.sampleRate,e);n[i]=a,o=a.length}return{data:n,frames:o}};var ja=(r,e)=>{if(e!==1)for(let t of r)for(let n=0;n<t.length;n++)t[n]*=e};function $a({timeline:r,resolveMedia:e}){let t=new io,n=Zc(r,e),o=new TransformStream,i=o.writable.getWriter();async function s(){for await(let a of t.mix(n)){let c=new AudioData({format:"f32-planar",sampleRate:a.sampleRate,numberOfFrames:a.frames,numberOfChannels:a.channels,timestamp:Math.round(a.startFrame/a.sampleRate*1e6),data:new Float32Array(a.planar)});await i.write(c)}await i.close()}return s(),o.readable}async function*Zc(r,e){let t=ro(e);for await(let{sample:n,timestamp:o,gain:i}of t.sampleAudio(r,U(0))){let{data:s}=Wa(n,48e3);ja(s,i),yield{planes:s,sampleRate:48e3,timestamp:o},n.close()}}function Ka({timeline:r,fps:e,driver:t,resolveMedia:n}){let o=new TransformStream,i=o.writable.getWriter(),s=new Gt(t,n,r),a=1/e,c=pe(r.rootId,r);async function l(){await Ma({fps:e,duration:c},async(d,u)=>{let f=await s.next(d),m=await t.composite(f),p=new VideoFrame(m,{timestamp:Math.round(u*a*1e6),duration:Math.round(a*1e6)});await i.write(p),m.close()}),await i.close()}return l(),o.readable}function Xa(r){let e=$a({...r}),t=Ka({...r});return r.driver.encode({video:t,audio:e,config:{audio:{codec:"opus",bitrate:128e3},video:{codec:"vp9",bitrate:1e6}}})}var so=class{driver;resources=new Qn;constructor(e){this.driver=e}load=async e=>Object.fromEntries(await Promise.all(Object.entries(e).map(async([t,n])=>[t,await this.resources.store(await n)])));timeline=e=>{let t=new mt({timeline:{format:"timeline",info:"https://omniclip.app/",version:0,items:[],rootId:0}}),n=e(t);return t.timeline.rootId=n.id,t.timeline};playback=async e=>new oo(this.driver,t=>this.resources.require(t).url,e);render=async(e,t=30)=>Xa({timeline:e,fps:qt(t),driver:this.driver,resolveMedia:n=>this.resources.require(n).url})};var ao=class{data;bytes;hash;nickname;constructor(e,t,n,o){this.data=e,this.bytes=t,this.hash=n,this.nickname=o}static async make(e){let t=new Uint8Array(e),n=new Uint8Array(await crypto.subtle.digest("SHA-256",t)),o=_r.fromBytes(n),i=Ri.sigil.fromBytes(n);return new this(e,n,o,i)}};var co=class{url;bytes;blob;filename;checksum;constructor(e,t,n,o,i){this.url=e,this.bytes=t,this.blob=n,this.filename=o,this.checksum=i}static async make(e,t){let n=await e.arrayBuffer(),o=new Uint8Array(n),i=await ao.make(o),s=t??i.nickname,a=URL.createObjectURL(e);return new this(a,o,e,s,i)}static async load(e){}};async function Ya(r,e,t){let n=t.querySelector(".play"),o=t.querySelector(".stop"),i=t.querySelector(".scrub"),s=t.querySelector(".playhead"),a=t.querySelector(".timecode"),c=t.querySelector(".player-canvas"),l=new mt({timeline:r}),d=await e.playback(r);c.replaceChildren(d.canvas),n.disabled=!1,o.disabled=!1,n.addEventListener("click",()=>d.play()),o.addEventListener("click",()=>d.pause()),i.max=String(Math.ceil(d.duration));let u=!1,f=null,m=!1;d.playback.onTick.on(()=>y(d.currentTime,d.duration));let p=async b=>{if(f=b,!m){for(m=!0;f;){let x=f;f=null,await d.seek(x)}m=!1}},g=(b,x)=>{a.textContent=`${Qa(b)} / ${Qa(x)}`};i.addEventListener("input",async()=>{u=!0;let b=Math.max(0,Math.min(+i.value,d.duration));g(b,d.duration),await p(b)}),i.addEventListener("change",async()=>{u=!1;let b=Math.max(0,Math.min(+i.value,d.duration));await p(b)});let y=(b,x)=>{let T=Math.max(0,Math.min(b,x));u||(i.value=String(Math.round(T)));let k=x?T/x*100:0;s.style.left=`${k}%`,g(T,x)};d.update(l.timeline)}function Qa(r){let e=Math.max(0,r),t=Math.floor(e/1e3),n=Math.floor(t/60),o=t%60,i=Math.floor(e%1e3);return`${n}:${String(o).padStart(2,"0")}.${String(i).padStart(3,"0")}`}async function Ja(r,e,t){let n=t.querySelector(".waveform-canvas"),o=t.querySelector(".width");n.replaceChildren(),n.style.position="relative",n.style.height="96px",n.style.overflow="hidden";let i=await Zn.init(r,e,{tileHeight:96,onChange:()=>s()}),s=()=>{let a=+o.value,c=Za(a,i.duration);i.zoom=c,n.style.width=`${a}px`,n.replaceChildren(...[...i.getTiles().values()].map(l=>(l.canvas.style.position="absolute",l.canvas.style.top="0",l.canvas.style.left=`${l.startTime*Za(a,i.duration)}px`,l.canvas.style.height="100%",l.canvas)))};o.oninput=s,i.range=[0,i.duration]}function Za(r,e){return e>0?r/e:0}async function vi(r,e){let t=new so(r),{videoA:n}=await t.load({videoA:co.make(e)});return{timeline:t.timeline(i=>{let s=i.text("content",{duration:1e3}),a=i.textStyle({fill:"green",fontSize:100});return i.set(s.id,{styleId:a.id}),i.sequence(i.stack(s,i.video(n,{duration:3e3,start:1e3}),i.audio(n,{duration:1e3})),i.gap(500),i.video(n,{duration:7e3,start:5e3}))}),omni:t}}async function ec(r,e){let t=e.querySelector(".range"),n=e.querySelector(".range-view"),o=e.querySelector(".range-size"),i=e.querySelector(".frequency"),s=e.querySelector(".frequency-view"),a=e.querySelector(".filmstrip"),c=1/10,l=.5;a.replaceChildren();let d=await Yn.init(r,{onChange(u){let f=u.sort((m,p)=>m.time-p.time);a.replaceChildren(...f.map(({time:m,canvas:p})=>Jc(m,p.canvas)))},frequency:c,canvasSinkOptions:{width:80,height:50,fit:"fill"}});o.oninput=()=>{l=+o.value;let u=+t.value,f=u+l;d.range=[u,f],n.textContent=`visible time range: [${u}, ${f}]`},t.oninput=()=>{let u=+t.value,f=u+l;d.range=[u,f],n.textContent=`visible time range: [${u}, ${f}]`},i.oninput=()=>{d.frequency=1/+i.value,s.textContent=`frame every ${d.frequency.toFixed(3)} second (${i.value} frames per second)`},d.range=[10,10.5]}function Jc(r,e){let t=document.createElement("div");t.style.position="relative",t.style.display="inline-block",t.style.marginRight="4px",t.appendChild(e);let n=document.createElement("div");return n.textContent=`${r.toFixed(2)}s`,n.style.position="absolute",n.style.top="2px",n.style.right="4px",n.style.fontSize="10px",n.style.color="white",n.style.background="rgba(0,0,0,0.6)",n.style.padding="2px 4px",n.style.borderRadius="4px",n.style.pointerEvents="none",t.appendChild(n),t}function tc(r,e){let t={width:1920,height:1080},n=document.createElement("canvas");n.width=t.width,n.height=t.height;let o=n.getContext("2d");async function i(){let s=r.decodeVideo({source:e,async onFrame(f){let m=await r.composite([{id:0,kind:"image",frame:f},{id:1,kind:"text",content:"omnitool",style:{fontSize:50,fill:"green"}}]);return f.close(),o?.drawImage(m,0,0),m}}),a=r.decodeAudio({source:e}),{readable:c,done:l}=r.encode({video:s.readable,audio:a.readable,config:{audio:{codec:"opus",bitrate:128e3},video:{codec:"vp9",bitrate:1e6}}}),u=await(await window.showSaveFilePicker()).createWritable();await Promise.all([c.pipeTo(u),l])}return{canvas:n,run:i}}var Wt=await $n.setup({workerUrl:new URL("../driver/driver.worker.bundle.min.js",import.meta.url)}),el=document.querySelector("[data-demo='transcode']"),tl=document.querySelector("[data-demo='filmstrip']"),rl=document.querySelector("[data-demo='waveform']"),rc=document.querySelector("[data-demo='playback']"),pt=document.querySelector("[data-demo='export']"),nc=pt.querySelector("[data-action='export']"),lo=null;await Wt.thread.work.hello(),Wt.machina.count===1?console.log("\u2705 driver works"):console.error("\u274C FAIL driver call didn't work");var jt=(r,e)=>{let t=r.querySelector(".progress"),n=r.querySelector(".status");!t||!n||(e==="running"?(t.removeAttribute("value"),n.textContent="running"):e==="done"?(t.value=1,n.textContent="done"):(t.value=0,n.textContent="idle"))},Pi=(r,e)=>{let t=r.querySelector("input[type='file']"),n=r.querySelector("[data-action='run']");n.disabled=!0,t.addEventListener("input",()=>{n.disabled=!t.files?.length}),n.addEventListener("click",async()=>{let o=t.files?.[0];if(o){n.disabled=!0,jt(r,"running");try{await e(o,r),jt(r,"done")}finally{n.disabled=!1}}})};Pi(el,async(r,e)=>{let t=e.querySelector(".demo-preview"),n=tc(Wt,r);t.replaceChildren(n.canvas),await n.run()});Pi(tl,async(r,e)=>{await ec(r,e)});Pi(rl,async(r,e)=>{await Ja(Wt,r,e)});{let r=rc.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;let{timeline:t,omni:n}=await vi(Wt,e);await Ya(t,n,rc)})}{let r=pt.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;jt(pt,"running");let{timeline:t,omni:n}=await vi(Wt,e);lo={timeline:t,omni:n},nc.disabled=!1;let o=pt.querySelector(".demo-preview"),i=await n.playback(t);await i.seek(0),o.replaceChildren(i.canvas),jt(pt,"done")})}nc.addEventListener("click",async()=>{lo&&(jt(pt,"running"),await lo.omni.render(lo.timeline),jt(pt,"done"))});
2415
+ `;function _a({name:r,renderer:e}){let t=Aa.default.find(c=>c.name===r),n=new ht,o=new $t,i=new Ir({}),s=new Ir({}),a=new go({glProgram:new po({vertex:Ca,fragment:Ia(t.glsl)}),resources:{from:i,to:s,uniforms:{...wi.basics,...wi.custom(t)}}});return n.filters=[a],{render({width:c,height:l,from:d,to:u,progress:f}){return(n.width!==c||n.height!==l)&&(n.setSize({width:c,height:l}),o.source.resize(c,l)),i.resource=d,s.resource=u,i.update(),s.update(),a.resources.uniforms.uniforms.progress=f,e.render({container:n,target:o,clear:!1,width:c,height:l}),o}}}var jn=class{pixi;static async setup(){let e=await Ti({width:1920,height:1080,preference:"webgl",background:"black",preferWebGLVersion:2}),t=new mo;return t.interactive=!0,new this({renderer:e,stage:t})}constructor(e){this.pixi=e}#e=new Map;#t=new Map;async composite(e){let{stage:t,renderer:n}=this.pixi;this.#l(this.#c(e));let{dispose:o}=await this.#r(e,t);n.render(t);let i=new VideoFrame(n.canvas,{timestamp:0,duration:0});return o(),i}async#r(e,t){if(Array.isArray(e)){e.reverse();let n=[];for(let o of e){let i=await this.#r(o,t);n.push(i.dispose)}return{dispose:()=>n.forEach(o=>o())}}switch(e.kind){case"text":return this.#n(e,t);case"image":return this.#i(e,t);case"transition":return this.#s(e,t);case"gap":return this.pixi?.renderer.clear(),{dispose:()=>{}};default:return console.warn("Unknown layer kind",e.kind),{dispose:()=>{}}}}#n(e,t){let n=this.#a(e);return this.#o(n,e.matrix),t.addChild(n),{dispose:()=>{}}}#i(e,t){let n=$t.from(e.frame),o=this.#a(e);return o.texture=n,this.#o(o,e.matrix),t.addChild(o),{dispose:()=>{n.destroy(!0),e.frame.close()}}}#s({from:e,to:t,progress:n,name:o},i){let a=(this.#e.get(o)??(this.#e.set(o,_a({name:"circle",renderer:this.pixi.renderer})),this.#e.get(o))).render({from:e,to:t,progress:n,width:e.displayWidth,height:e.displayHeight}),c=new ht(a);return i.addChild(c),{dispose:()=>c.destroy(!1)}}#o(e,t){if(!t)return;let n=wa(t);e.setFromMatrix(n)}#a(e){let t=this.#t.get(e.id);if(t)return t;switch(e.kind){case"text":{let n=new vr({text:e.content,style:e.style});return n.onmouseenter=()=>console.log("enter text"),this.#t.set(e.id,n).get(e.id)}case"image":{let n=new ht;return n.onmouseenter=()=>console.log("enter"),this.#t.set(e.id,n).get(e.id)}}}#c(e){let t=new Set,n=o=>{if(Array.isArray(o))for(let i of o)n(i);else t.add(o.id)};return n(e),t}#l(e){for(let t of this.#t.keys())e.has(t)||(this.#t.get(t).destroy(!0),this.#t.delete(t))}};var Ea=r=>jr.host(e=>({async world(){r.count++}}));async function ce(r){return r instanceof Blob?new kr(r):new Sr(r)}var $n=class{machina;thread;compositor;static async setup(e){let t=new Hn,n=await jr.thread({label:"OmnitoolDriver",workerUrl:e?.workerUrl??"/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",setupHost:Ea(t)}),o=await jn.setup();return new this(t,n,o)}constructor(e,t,n){this.machina=e,this.thread=t,this.compositor=n}async hello(){return this.thread.work.hello()}async getAudioDuration(e){let n=await new ee({source:await ce(e),formats:ie}).getPrimaryAudioTrack();if(!n)throw new Error("primary audio track not found");return await n.computeDuration()}async getVideoDuration(e){return await(await new ee({source:await ce(e),formats:ie}).getPrimaryVideoTrack())?.computeDuration()}decodeVideo(e){let t=null,{port1:n,port2:o}=new MessageChannel,i=new TransformStream({async transform(s,a){let c=await e.onFrame?.(s)??s;t?.close(),a.enqueue(c),t=c}});return this.thread.work.decodeVideo[yt]({transfer:[i.writable,o]})({source:e.source,cancel:o,video:i.writable,start:e.start,end:e.end}),{readable:i.readable,cancel(){n.postMessage("close"),n.close()}}}decodeAudio(e){let t=new TransformStream,{port1:n,port2:o}=new MessageChannel;return this.thread.work.decodeAudio[yt]({transfer:[t.writable,o]})({source:e.source,cancel:o,audio:t.writable,start:e.start,end:e.end}),{readable:t.readable,cancel(){n.postMessage("close"),n.close()}}}encode({audio:e,video:t,config:n}){let{readable:o,writable:i}=new TransformStream,s=[e,t,i].filter(Er.happy),a=this.thread.work.encode[yt]({transfer:s})({audio:e,video:t,config:n,writable:i});return{readable:o,done:a}}async composite(e){return await this.compositor.composite(e)}};var M;(function(r){r[r.Sequence=0]="Sequence",r[r.Stack=1]="Stack",r[r.Video=2]="Video",r[r.Audio=3]="Audio",r[r.Text=4]="Text",r[r.Gap=5]="Gap",r[r.Spatial=6]="Spatial",r[r.Transition=7]="Transition",r[r.TextStyle=8]="TextStyle"})(M||(M={}));var Kn;(function(r){r[r.Crossfade=0]="Crossfade"})(Kn||(Kn={}));var Xn=class{datafile;duration=0;hasVideo=!1;hasAudio=!1;constructor(e){this.datafile=e}static async analyze(e){let t=new this(e),n=await this.duration(e.url)*1e3;t.duration=n;let{video:o,audio:i}=await this.#e(e.url);return t.hasAudio=i,t.hasVideo=o,t}static async duration(e){let n=await new ee({formats:ie,source:await ce(e)}).computeDuration();return Number(n.toFixed(5))}static async#e(e){let t=new ee({formats:ie,source:await ce(e)});return{audio:!!await t.getPrimaryAudioTrack(),video:!!await t.getPrimaryVideoTrack()}}};var Qn=class{#e=new Fr;async store(e){let t=await Xn.analyze(e),{hash:n}=t.datafile.checksum,{filename:o,bytes:i,url:s,blob:a}=t.datafile;if(this.#e.has(n)){let c=this.#e.require(n);c.filename=o}else this.#e.set(n,{kind:"media",filename:o,bytes:i,url:s,blob:a});return t}require(e){return this.#e.require(e)}};var Yn=class r{videoTrack;options;#e;#t=new Map;#r=[0,0];constructor(e,t){this.videoTrack=e,this.options=t,this.#e=new fr(e,t.canvasSinkOptions)}static async init(e,t){let o=await new ee({formats:ie,source:await ce(e)}).getPrimaryVideoTrack();if(o)return new r(o,{frequency:t.frequency??1,canvasSinkOptions:t.canvasSinkOptions??{width:80,height:50,fit:"fill"},onChange:t.onChange,onPlaceholders:t.onPlaceholders});throw new Error("Source has no video track")}set frequency(e){e!==this.options.frequency&&(this.options.frequency=e,this.#c())}get frequency(){return this.options.frequency}#n([e,t],n=1){let o=t-e;return[e-o*n,t+o*n]}async#i(){let[e,t]=this.#r,n=new Set,o=await this.videoTrack.computeDuration();for(let i=Math.max(0,e);i<=t;i+=this.options.frequency)i>=0&&i<=o&&n.add(i);this.options.onPlaceholders?.([...n])}async#s(){let[e,t]=this.#r,n=new Set,o=await this.videoTrack.computeDuration();for(let c=Math.max(0,e);c<=t;c+=this.options.frequency)c>=0&&c<=o&&n.add(c);let i=[...n].filter(c=>!this.#t.has(c)),s=0;for await(let c of this.#e.canvasesAtTimestamps(i))if(c){let l=i[s++];this.#t.set(l,c)}for(let c of this.#t.keys())n.has(c)||this.#t.delete(c);let a=[...this.#t.entries()].map(([c,l])=>({time:c,canvas:l}));this.options.onChange(a)}set range(e){let[t,n]=e,o=n-t,[i,s]=this.#r,a=i+o,c=s-o,l=t<a,d=n>c;!l&&!d||(this.#r=this.#n(e,2),this.#c())}#o=null;#a=!1;async#c(){if(this.#i(),this.#o){this.#a=!0;return}this.#o=this.#s(),await this.#o,this.#o=null,this.#a&&(this.#a=!1,await this.#c())}getThumbnail(e){return this.#t.get(e)}};function Fa(r,e){let t=typeof window<"u"&&window.devicePixelRatio||1,n=document.createElement("canvas");n.width=e.width*t,n.height=e.height*t,n.style.width=`${e.width}px`,n.style.height=`${e.height}px`;let o=n.getContext("2d");if(!o)return n;o.scale(t,t),o.fillStyle=e.color;let i=e.height/2,s=Math.max(1,e.width),a=r.length/s;for(let c=0;c<s;c++){let l=Math.floor(c*a),d=Math.max(l+1,Math.floor((c+1)*a)),u=0;for(let m=l;m<d&&m<r.length;m++)r[m]>u&&(u=r[m]);let f=u*e.height;o.fillRect(c,i-f/2,1,f)}return n}var ki=[2048,1024,512,256,128,64,32];async function Da(r,e){let t=await r.getAudioDuration(e)??0,n=r.decodeAudio({source:e}).readable,o=ki[ki.length-1],i=[],s=0,a=0,c=0;for await(let u of n){c||=u.sampleRate;let f=u.numberOfFrames,m=new Float32Array(f);u.copyTo(m,{planeIndex:0});for(let p=0;p<m.length;p++){let g=Math.abs(m[p]);g>s&&(s=g),a++,a>=o&&(i.push(s),s=0,a=0)}u.close()}a>0&&i.push(s);let l=new Float32Array(i),d=ki.map(u=>{let f=Math.max(1,Math.round(u/o)),m=f===1?l:Kc(l,f);return{samplesPerPeak:u,peaks:m,peaksPerSecond:c>0?c/u:0}});return{duration:t,levels:d}}function Kc(r,e){let t=new Float32Array(Math.ceil(r.length/e));for(let n=0;n<t.length;n++){let o=0,i=n*e,s=Math.min(i+e,r.length);for(let a=i;a<s;a++)r[a]>o&&(o=r[a]);t[n]=o}return t}var Xc=4096,Zn=class r{#e=new Map;#t=[0,0];#r=[0,0];#n;#i;#s;#o=!1;color;duration;tileSize;tileHeight;preloadMargin;constructor(e,t,n){this.#i=e,this.duration=t,this.tileSize=n.tileSize??1,this.#n=n.zoom??(n.tileWidth??256)/this.tileSize,this.tileHeight=n.tileHeight??96,this.preloadMargin=n.preloadMargin??2,this.color=n.color??"rgb(3, 148, 129)",this.#s=n.onChange}static async init(e,t,n={}){let{duration:o,levels:i}=await Da(e,t);return new r(i,o,n)}set zoom(e){let t=Math.max(1,e);t!==this.#n&&(this.#n=t,this.#e.clear(),this.#c())}get zoom(){return this.#n}get range(){return this.#r}#a([e,t],n=1){let o=t-e;return[Math.max(0,e-o*n),Math.min(this.duration,t+o*n)]}set range(e){this.#r=e;let[t,n]=e,o=n-t,[i,s]=this.#t,a=i+o,c=s-o;t>=a&&n<=c||(this.#t=this.#a(e,this.preloadMargin),this.#c())}#c(){this.#o||(this.#o=!0,queueMicrotask(()=>{this.#o=!1,this.#l()}))}#l(){let[e,t]=this.#t,n=new Set,o=this.#d(),i=Math.max(0,Math.floor(e/this.tileSize)*this.tileSize),s=Math.min(this.duration,t);for(let a=i;a<=s;a+=this.tileSize)n.add(a);for(let a of n)if(!this.#e.has(a)){let c=Math.min(a+this.tileSize,this.duration);this.#e.set(a,this.#u(a,c,o))}for(let a of this.#e.keys())n.has(a)||this.#e.delete(a);this.#p()}#u(e,t,n){let o=this.#f(n,e,t);return{startTime:e,endTime:t,peaks:o,canvas:Fa(o,{width:this.#m(e,t),height:this.tileHeight,color:this.color})}}#d(){return this.#i.find(e=>e.peaksPerSecond>=this.#n)??this.#i[this.#i.length-1]}#f(e,t,n){if(!e.peaksPerSecond)return new Float32Array;let o=Math.max(0,Math.floor(t*e.peaksPerSecond)),i=Math.max(o+1,Math.min(e.peaks.length,Math.ceil(n*e.peaksPerSecond)));return e.peaks.slice(o,i)}#m(e,t){return Math.min(Xc,Math.max(1,Math.ceil((t-e)*this.#n)))}#p(){this.#s&&this.#s([...this.#e.values()].sort((e,t)=>e.startTime-t.startTime))}getTiles(){return this.#e}};var U=r=>r;var qt=r=>r;var Ra=()=>{let r=!1,e=qt(60),t=1e3/e,n=0,o=0,i=xt(),s=null,a=l=>{if(requestAnimationFrame(a),!!r)for(n=l;l-o>=t;)o+=t,s?.(),s=null,i()};async function*c(){for(n=performance.now(),o=n,requestAnimationFrame(a);;)await new Promise(l=>s=l),yield}return{play(){r||(r=!0,n=performance.now(),o=n)},pause(){r=!1},setFPS(l){e=l,t=1e3/e},isPlaying(){return r},ticks:c,onTick:i}},Ma=async(r,e)=>{let t=U(1e3/r.fps),n=r.duration/1e3,o=Math.ceil(n*r.fps);for(let i=0;i<o;i++){let s=U(i*t);await e(s,i)}};function Oa(r){return"duration"in r}function za(r){let e=[],t=new Map(r.timeline.items.map(n=>[n.id,n]));return Si(r.timeline.rootId,t,r.from,{sequence:()=>{},stack:()=>{},video:(n,o,i)=>e.push({item:n,localTime:o,ancestors:i}),text:(n,o,i)=>e.push({item:n,localTime:o,ancestors:i}),audio:(n,o,i)=>e.push({item:n,localTime:o,ancestors:i})}),e}function Ua(r,e,t){let n=Sa;for(let o of e)n=Ba(r,o,n);return Ba(r,t,n)}function Ba(r,e,t){if("spatialId"in e&&e.spatialId){let n=r.get(e.spatialId);if(n?.enabled){let o=Ta(n.transform);return ka(o,t)}}return t}function Si(r,e,t,n,o=[]){let i=e.get(r);if(i)switch(i.kind){case M.Stack:n.stack(i,t,o);for(let s of i.childrenIds)Si(s,e,t,n,[...o,i]);break;case M.Sequence:{n.sequence(i,t,o);let s=U(0);for(let a of i.childrenIds){let c=e.get(a);if(!c||!Oa(c))continue;let l=U(s+c.duration);if(t>=l){s=l;continue}let d=U(Math.max(0,t-s));Si(a,e,d,n,[...o,i]),s=l}break}case M.Video:n.video(i,t,o);break;case M.Text:n.text(i,t,o);break;case M.Audio:n.audio(i,t,o);break}}function pe(r,e){let t=e.items.find(n=>n.id===r);if(!t)return U(0);switch(t.kind){case M.Sequence:{let n=t.childrenIds.map(i=>e.items.find(s=>s.id===i)).filter(Boolean),o=U(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===M.Transition){let a=n[i-1],c=n[i+1];if(a&&c&&a.kind!==M.Transition&&c.kind!==M.Transition){let l=pe(a.id,e),d=pe(c.id,e),u=Math.max(0,Math.min(s.duration,l,d));o=U(o-u)}continue}o=U(o+pe(s.id,e))}return o}case M.Stack:{let n=U(0);for(let o of t.childrenIds){let i=pe(o,e);i>n&&(n=i)}return n}default:return Oa(t)?t.duration:U(0)}}var Pr=r=>r;var Jn=class{resolveMedia;#e=new Map;constructor(e){this.resolveMedia=e}async getSink(e){let t=this.#e.get(e);if(t)return t.sink;let n=new ee({formats:ie,source:await ce(this.resolveMedia(e))}),o=await n.getPrimaryVideoTrack(),s=!!o&&await o.canDecode()&&o?new Ct(o):null;return this.#e.set(e,{input:n,sink:s}),s}};async function Na(r,e,t,n){let[o,i]=await Promise.all([t,n]),s=o.find(l=>l.kind==="image")?.frame,a=i.find(l=>l.kind==="image")?.frame,c=[...o.filter(l=>l.kind!=="image"),...i.filter(l=>l.kind!=="image")];return s&&a?[{id:r.id,kind:"transition",name:"circle",progress:e,from:s,to:a},...c]:c}async function Va(r,e,t,n){let o=Qc(r,e,t);if(!o)return[];let i=[...n,e];return o.isTransitioning?Na(o.transition,o.progress,ft(r,o.outgoing,o.outgoingTime,i),ft(r,o.incoming,o.incomingTime,i)):ft(r,o.item,o.localTime,i)}function Qc(r,e,t){let n=e.childrenIds.map(i=>r.items.get(i)).filter(i=>!!i),o=U(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===M.Transition)continue;let a=o,c=pe(s.id,r.timeline),l=U(a+c),d=n[i+1];if(!(d?.kind===M.Transition)){if(t<l)return{isTransitioning:!1,item:s,localTime:U(t-a)};o=l;continue}let f=d,m=n[i+2];if(!m||m.kind===M.Transition){o=l;continue}let p=pe(m.id,r.timeline),g=Math.max(0,Math.min(f.duration,c,p)),y=U(l-g);if(t<y)return{isTransitioning:!1,item:s,localTime:U(t-a)};if(t<l){let b=U(t-y),x=U(t-a);return{isTransitioning:!0,incoming:m,outgoing:s,outgoingTime:x,incomingTime:b,progress:g>0?b/g:1,transition:f}}o=y,i++}return null}async function ft(r,e,t,n){let o=Ua(r.items,n,e);switch(e.kind){case M.Stack:{let i=[...n,e];return(await Promise.all(e.childrenIds.map(a=>r.items.get(a)).filter(a=>!!a).map(a=>ft(r,a,t,i)))).flat()}case M.Sequence:return Va(r,e,t,n);case M.Video:{if(t<0||t>=e.duration)return[];let i=await r.videoSampler(e,t);return i?[{kind:"image",frame:i,matrix:o,id:e.id}]:[]}case M.Text:{if(t<0||t>=e.duration)return[];let i=e.styleId?r.items.get(e.styleId)?.style:void 0;return[{id:e.id,kind:"text",content:e.content,style:i,matrix:o}]}case M.Gap:return[{id:e.id,kind:"gap"}];default:return[]}}function La(r){return async(e,t)=>{let o=await(await r.getSink(e.mediaHash))?.getSample(t/1e3),i=o?.toVideoFrame();return o?.close(),i??void 0}}function eo(r,e){let t=new Jn(r),n=e??La(t);return{async sample(o,i){let s=new Map(o.items.map(c=>[c.id,c])),a=s.get(o.rootId);return a?ft({videoSampler:n,timeline:o,items:s},a,i,[]):[]}}}var Gt=class{driver;resolveMedia;timeline;#e=-1/0;#t=new Map;#r;constructor(e,t,n){this.driver=e,this.resolveMedia=t,this.timeline=n,this.#r=eo(this.resolveMedia,(o,i)=>{let s=Ha(i),a=this.#t.get(o.id);if(!a){let c=this.resolveMedia(o.mediaHash),l=Ha(U(o.start+o.duration));a=this.#n(c,s,l),this.#t.set(o.id,a)}return a.next(s)})}next(e){if(e<this.#e)throw new Error(`Forward-only cursor regression: ${e}ms < ${this.#e}ms`);return this.#e=e,this.#r.sample(this.timeline,e)}async cancel(){await Promise.all([...this.#t.values()].map(e=>e.cancel())),this.#t.clear()}#n(e,t,n){let o=this.driver.decodeVideo({source:e,start:t/1e6,end:n/1e6}),i=o.readable.getReader(),s=null,a=null,c=!1,l=async()=>{if(c)return null;let{done:d,value:u}=await i.read();if(d)return c=!0,null;let f=new VideoFrame(u);return u.close(),f};return{async next(d){if(s??=await l(),!!s)for(;;){a??=l();let u=await a;if(!u)return new VideoFrame(s);let f=s.timestamp??-1/0,m=u.timestamp??f;if(m<d){s.close(),s=u,a=null;continue}if(Math.abs(m-d)<Math.abs(f-d)){s.close(),s=u,a=null;continue}return new VideoFrame(s)}},async cancel(){let d=a;a=null,s?.close(),s=null,o.cancel(),(await d?.catch(()=>null))?.close()}}}},Ha=r=>Math.round(r*1e3);async function qa(r,e,t){return(await Promise.all(e.map(async({item:o,localTime:i})=>{if(o.kind!==M.Audio)return;let s=await r.getSink(o.mediaHash);if(!s)return;let a=o.start+i,c=Pr((t-a)/1e3),l=s.samples(a/1e3),d=await l.next();if(d.done)return;let u=d.value,f=l.next();return{offset:c,gain:o.gain??1,get currentSample(){return u},timelineTime:()=>Pr(c+u.timestamp),output:()=>({sample:u,timestamp:c+u.timestamp,gain:o.gain??1}),advance:async()=>{let m=await f;return m.done?!1:(u=m.value,f=l.next(),!0)}}}))).filter(o=>!!o)}var to=class{resolveMedia;#e=new Map;constructor(e){this.resolveMedia=e}async getSink(e){let t=this.#e.get(e);if(t)return t.sink;let n=new ee({formats:ie,source:await ce(this.resolveMedia(e))}),o=await n.getPrimaryAudioTrack(),s=!!o&&await o.canDecode()&&o?new mr(o):null;return this.#e.set(e,{input:n,sink:s}),s}};function Ga(r){let e={index:0,stream:r[0],time:r[0].timelineTime()};for(let[t,n]of r.entries()){let o=n.timelineTime();o<e.time&&(e={time:o,stream:n,index:t})}return e}function ro(r){let e=new to(r);return{async*sampleAudio(t,n){let o=za({timeline:t,from:n}),i=await qa(e,o,n);for(;i.length>0;){let{stream:s,index:a}=Ga(i);yield s.output(),await s.advance()||i.splice(a,1)}}}}var no=class{driver;timeline;resolveMedia;audioSampler;seekVisualSampler;playVisualSampler=null;#e=U(0);#t=null;#r=Ra();onTick=this.#r.onTick;audioContext=new AudioContext({sampleRate:48e3});audioGain=this.audioContext.createGain();audioNodes=new Set;#n=null;constructor(e,t,n){this.driver=e,this.timeline=t,this.resolveMedia=n,this.audioGain.connect(this.audioContext.destination),this.audioGain.gain.value=.7**2,this.seekVisualSampler=eo(this.resolveMedia),this.audioSampler=ro(this.resolveMedia),this.#i()}async#i(){for await(let e of this.#r.ticks()){let t=await this.playVisualSampler?.next(this.currentTime)??[];(await this.driver.composite(t)).close(),this.currentTime>=this.duration&&this.pause()}}async seek(e){return this.pause(),this.#e=e,await this.seekVisualSampler.sample(this.timeline,e)}async start(e){if(!this.#r.isPlaying()){this.timeline=e,await this.audioContext.resume(),this.#e=this.currentTime,this.#t=this.audioContext.currentTime,this.#n?.abort(),this.#n=new AbortController;for(let t of this.audioNodes)t.stop();this.audioNodes.clear(),this.playVisualSampler?.cancel(),this.playVisualSampler=new Gt(this.driver,this.resolveMedia,this.timeline),this.#r.play(),this.#s(this.#n.signal,Pr(this.#e/1e3))}}pause(){this.#e=this.currentTime,this.#r.pause(),this.#n?.abort();for(let e of this.audioNodes)e.stop();this.audioNodes.clear(),this.playVisualSampler?.cancel(),this.playVisualSampler=null}get duration(){return pe(this.timeline.rootId,this.timeline)}get currentTime(){if(!this.#r.isPlaying()||this.#t===null)return this.#e;let e=(this.audioContext.currentTime-this.#t)*1e3;return U(this.#e+e)}setFps(e){this.#r.setFPS(e)}async#s(e,t){let n=this.audioContext;if(this.#t!==null)for await(let{sample:o,timestamp:i}of this.audioSampler.sampleAudio(this.timeline,U(t*1e3))){if(e.aborted||!this.#r.isPlaying())return;for(;i-(n.currentTime-this.#t+t)>.75;)await new Promise(c=>setTimeout(c,25));let s=n.createBufferSource();s.buffer=o.toAudioBuffer(),s.connect(this.audioGain),s.onended=()=>this.audioNodes.delete(s),this.audioNodes.add(s);let a=this.#t+i-t;a>=n.currentTime?s.start(a):s.start(n.currentTime,n.currentTime-a)}}};var oo=class{driver;timeline;canvas;playback;constructor(e,t,n){this.driver=e,this.timeline=n,this.playback=new no(e,n,t),this.canvas=e.compositor.pixi.renderer.canvas}async play(){await this.playback.start(this.timeline)}pause(){this.playback.pause()}async seek(e){let t=await this.playback.seek(U(e));(await this.driver.composite(t)).close()}setFPS(e){this.playback.setFps(qt(e))}get duration(){return this.playback.duration}get currentTime(){return this.playback.currentTime}async update(e){this.timeline=e}};var mt=class{state;constructor(e){this.state=e}require(e){return e===void 0?void 0:this.state.timeline.items.find(n=>n.id===e)}get timeline(){return this.state.timeline}getId(){return he.toInteger(he.random())}#e(e){this.state.timeline=e(this.state.timeline)}register(e){this.#e(t=>({...t,items:[...t.items,e]}))}textStyle=e=>{let t={id:this.getId(),kind:M.TextStyle,style:e};return this.register(t),t};spatial=e=>{let t={id:this.getId(),kind:M.Spatial,transform:e,enabled:!0};return this.register(t),t};sequence=(...e)=>{let t={id:this.getId(),kind:M.Sequence,childrenIds:e.map(n=>n.id)};return this.register(t),t};stack=(...e)=>{let t={kind:M.Stack,id:this.getId(),childrenIds:e.map(n=>n.id)};return this.register(t),t};video=(e,t)=>{if(!e.hasVideo)throw new Error(`Video clip error: media "${e.datafile.filename}" has no video track.`);let n={kind:M.Video,id:this.getId(),mediaHash:e.datafile.checksum.hash,start:t?.start??0,duration:t?.duration??e.duration};return this.register(n),n};audio=(e,t)=>{if(!e.hasAudio)throw new Error(`Audio clip error: media "${e.datafile.filename}" has no audio track.`);let n={kind:M.Audio,id:this.getId(),mediaHash:e.datafile.checksum.hash,start:t?.start??0,duration:t?.duration??e.duration,gain:t?.gain??1};return this.register(n),n};text=(e,t)=>{let n={id:this.getId(),content:e,kind:M.Text,duration:t?.duration??2e3};return t?.styles&&(n.styleId=this.textStyle(t.styles).id),this.register(n),n};gap=e=>{let t={id:this.getId(),kind:M.Gap,duration:e};return this.register(t),t};transition={crossfade:e=>{let t={id:this.getId(),kind:M.Transition,effect:Kn.Crossfade,duration:e};return this.register(t),t}};transform=e=>{let t=[e?.position?.[0]??0,e?.position?.[1]??0],n=[e?.scale?.[0]??1,e?.scale?.[1]??1],o=e?.rotation??0;return[t,n,o]};addChildren(e,...t){this.#e(n=>(n.items.find(({id:i})=>i===e.id).childrenIds.push(...t.map(i=>i.id)),n))}set=(e,t)=>{this.#e(n=>({...n,items:n.items.map(o=>o.id===e?{...o,...t}:o)}))}};var io=class{#e;#t;constructor(e={}){this.#e=e.chunkFrames??1024,this.#t=e.clamp??!0}async*mix(e){let t=this.#e,n=null,o=null,i=[],s=0,a=0;for await(let c of e){if(o===null)o=c.planes.length,n=c.sampleRate;else{if(c.planes.length!==o)throw new Error("Channel count changed");if(c.sampleRate!==n)throw new Error("Sample rate changed")}let l=Math.round(c.timestamp*n),d=c.planes[0]?.length??0;for(;s+t<=l;)yield this.#r(i,s,o,n),s+=t;i.push({startFrame:l,endFrame:l+d,data:c.planes}),a=Math.max(a,l+d)}if(o!==null&&n!==null)for(;s<a;)yield this.#r(i,s,o,n),s+=t}#r(e,t,n,o){let i=this.#e,s=new Float32Array(n*i),a=t+i;for(let c=0;c<n;c++){let l=c*i,d=s.subarray(l,l+i);for(let u of e){let f=u.data[c];if(!f)continue;let m=Math.max(t,u.startFrame),p=Math.min(a,u.endFrame);if(m>=p)continue;let g=m-t,y=m-u.startFrame,b=p-m;for(let x=0;x<b;x++)d[g+x]+=f[y+x]}if(this.#t)for(let u=0;u<i;u++){let f=d[u];d[u]=f<-1?-1:f>1?1:f}}for(let c=e.length-1;c>=0;c--)e[c].endFrame<=a&&e.splice(c,1);return{planar:s,sampleRate:o,channels:n,frames:i,startFrame:t}}};var Yc=(r,e,t)=>{if(e===t)return r;let n=t/e,o=Math.max(1,Math.round(r.length*n)),i=new Float32Array(o);for(let s=0;s<o;s++){let a=s/n,c=Math.floor(a),l=Math.min(c+1,r.length-1),d=a-c;i[s]=r[c]*(1-d)+r[l]*d}return i},Wa=(r,e)=>{let t=r.numberOfChannels,n=new Array(t),o=0;for(let i=0;i<t;i++){let s=new Float32Array(r.numberOfFrames);r.copyTo(s,{planeIndex:i,format:"f32-planar"});let a=Yc(s,r.sampleRate,e);n[i]=a,o=a.length}return{data:n,frames:o}};var ja=(r,e)=>{if(e!==1)for(let t of r)for(let n=0;n<t.length;n++)t[n]*=e};function $a({timeline:r,resolveMedia:e}){let t=new io,n=Zc(r,e),o=new TransformStream,i=o.writable.getWriter();async function s(){for await(let a of t.mix(n)){let c=new AudioData({format:"f32-planar",sampleRate:a.sampleRate,numberOfFrames:a.frames,numberOfChannels:a.channels,timestamp:Math.round(a.startFrame/a.sampleRate*1e6),data:new Float32Array(a.planar)});await i.write(c)}await i.close()}return s(),o.readable}async function*Zc(r,e){let t=ro(e);for await(let{sample:n,timestamp:o,gain:i}of t.sampleAudio(r,U(0))){let{data:s}=Wa(n,48e3);ja(s,i),yield{planes:s,sampleRate:48e3,timestamp:o},n.close()}}function Ka({timeline:r,fps:e,driver:t,resolveMedia:n}){let o=new TransformStream,i=o.writable.getWriter(),s=new Gt(t,n,r),a=1/e,c=pe(r.rootId,r);async function l(){await Ma({fps:e,duration:c},async(d,u)=>{let f=await s.next(d),m=await t.composite(f),p=new VideoFrame(m,{timestamp:Math.round(u*a*1e6),duration:Math.round(a*1e6)});await i.write(p),m.close()}),await i.close()}return l(),o.readable}function Xa(r){let e=$a({...r}),t=Ka({...r});return r.driver.encode({video:t,audio:e,config:{audio:{codec:"opus",bitrate:128e3},video:{codec:"vp9",bitrate:1e6}}})}var so=class{driver;resources=new Qn;constructor(e){this.driver=e}load=async e=>Object.fromEntries(await Promise.all(Object.entries(e).map(async([t,n])=>[t,await this.resources.store(await n)])));timeline=e=>{let t=new mt({timeline:{format:"timeline",info:"https://omniclip.app/",version:0,items:[],rootId:0}}),n=e(t);return t.timeline.rootId=n.id,t.timeline};playback=async e=>new oo(this.driver,t=>this.resources.require(t).url,e);render=async(e,t=30)=>Xa({timeline:e,fps:qt(t),driver:this.driver,resolveMedia:n=>this.resources.require(n).url})};var ao=class{data;bytes;hash;nickname;constructor(e,t,n,o){this.data=e,this.bytes=t,this.hash=n,this.nickname=o}static async make(e){let t=new Uint8Array(e),n=new Uint8Array(await crypto.subtle.digest("SHA-256",t)),o=_r.fromBytes(n),i=Ri.sigil.fromBytes(n);return new this(e,n,o,i)}};var co=class{url;bytes;blob;filename;checksum;constructor(e,t,n,o,i){this.url=e,this.bytes=t,this.blob=n,this.filename=o,this.checksum=i}static async make(e,t){let n=await e.arrayBuffer(),o=new Uint8Array(n),i=await ao.make(o),s=t??i.nickname,a=URL.createObjectURL(e);return new this(a,o,e,s,i)}static async load(e){}};async function Ya(r,e,t){let n=t.querySelector(".play"),o=t.querySelector(".stop"),i=t.querySelector(".scrub"),s=t.querySelector(".playhead"),a=t.querySelector(".timecode"),c=t.querySelector(".player-canvas"),l=new mt({timeline:r}),d=await e.playback(r);c.replaceChildren(d.canvas),n.disabled=!1,o.disabled=!1,n.addEventListener("click",()=>d.play()),o.addEventListener("click",()=>d.pause()),i.max=String(Math.ceil(d.duration));let u=!1,f=null,m=!1;d.playback.onTick.on(()=>y(d.currentTime,d.duration));let p=async b=>{if(f=b,!m){for(m=!0;f;){let x=f;f=null,await d.seek(x)}m=!1}},g=(b,x)=>{a.textContent=`${Qa(b)} / ${Qa(x)}`};i.addEventListener("input",async()=>{u=!0;let b=Math.max(0,Math.min(+i.value,d.duration));g(b,d.duration),await p(b)}),i.addEventListener("change",async()=>{u=!1;let b=Math.max(0,Math.min(+i.value,d.duration));await p(b)});let y=(b,x)=>{let T=Math.max(0,Math.min(b,x));u||(i.value=String(Math.round(T)));let k=x?T/x*100:0;s.style.left=`${k}%`,g(T,x)};d.update(l.timeline)}function Qa(r){let e=Math.max(0,r),t=Math.floor(e/1e3),n=Math.floor(t/60),o=t%60,i=Math.floor(e%1e3);return`${n}:${String(o).padStart(2,"0")}.${String(i).padStart(3,"0")}`}async function Ja(r,e,t){let n=t.querySelector(".waveform-canvas"),o=t.querySelector(".width");n.replaceChildren(),n.style.position="relative",n.style.height="96px",n.style.overflow="hidden";let i=await Zn.init(r,e,{tileHeight:96,onChange:()=>s()}),s=()=>{let a=+o.value,c=Za(a,i.duration);i.zoom=c,n.style.width=`${a}px`,n.replaceChildren(...[...i.getTiles().values()].map(l=>(l.canvas.style.position="absolute",l.canvas.style.top="0",l.canvas.style.left=`${l.startTime*Za(a,i.duration)}px`,l.canvas.style.height="100%",l.canvas)))};o.oninput=s,i.range=[0,i.duration]}function Za(r,e){return e>0?r/e:0}async function vi(r,e){let t=new so(r),{videoA:n}=await t.load({videoA:co.make(e)});return{timeline:t.timeline(i=>{let s=i.text("content",{duration:1e3}),a=i.textStyle({fill:"green",fontSize:100});return i.set(s.id,{styleId:a.id}),i.sequence(i.stack(s,i.video(n,{duration:3e3,start:1e3}),i.audio(n,{duration:1e3})),i.gap(500),i.video(n,{duration:7e3,start:5e3}))}),omni:t}}async function ec(r,e){let t=e.querySelector(".range"),n=e.querySelector(".range-view"),o=e.querySelector(".range-size"),i=e.querySelector(".frequency"),s=e.querySelector(".frequency-view"),a=e.querySelector(".filmstrip"),c=1/10,l=.5;a.replaceChildren();let d=await Yn.init(r,{onChange(u){let f=u.sort((m,p)=>m.time-p.time);a.replaceChildren(...f.map(({time:m,canvas:p})=>Jc(m,p.canvas)))},frequency:c,canvasSinkOptions:{width:80,height:50,fit:"fill"}});o.oninput=()=>{l=+o.value;let u=+t.value,f=u+l;d.range=[u,f],n.textContent=`visible time range: [${u}, ${f}]`},t.oninput=()=>{let u=+t.value,f=u+l;d.range=[u,f],n.textContent=`visible time range: [${u}, ${f}]`},i.oninput=()=>{d.frequency=1/+i.value,s.textContent=`frame every ${d.frequency.toFixed(3)} second (${i.value} frames per second)`},d.range=[10,10.5]}function Jc(r,e){let t=document.createElement("div");t.style.position="relative",t.style.display="inline-block",t.style.marginRight="4px",t.appendChild(e);let n=document.createElement("div");return n.textContent=`${r.toFixed(2)}s`,n.style.position="absolute",n.style.top="2px",n.style.right="4px",n.style.fontSize="10px",n.style.color="white",n.style.background="rgba(0,0,0,0.6)",n.style.padding="2px 4px",n.style.borderRadius="4px",n.style.pointerEvents="none",t.appendChild(n),t}function tc(r,e){let t={width:1920,height:1080},n=document.createElement("canvas");n.width=t.width,n.height=t.height;let o=n.getContext("2d");async function i(){let s=r.decodeVideo({source:e,async onFrame(f){let m=await r.composite([{id:0,kind:"image",frame:f},{id:1,kind:"text",content:"omnitool",style:{fontSize:50,fill:"green"}}]);return f.close(),o?.drawImage(m,0,0),m}}),a=r.decodeAudio({source:e}),{readable:c,done:l}=r.encode({video:s.readable,audio:a.readable,config:{audio:{codec:"opus",bitrate:128e3},video:{codec:"vp9",bitrate:1e6}}}),u=await(await window.showSaveFilePicker()).createWritable();await Promise.all([c.pipeTo(u),l])}return{canvas:n,run:i}}var Wt=await $n.setup({workerUrl:new URL("../driver/driver.worker.bundle.min.js",import.meta.url)}),el=document.querySelector("[data-demo='transcode']"),tl=document.querySelector("[data-demo='filmstrip']"),rl=document.querySelector("[data-demo='waveform']"),rc=document.querySelector("[data-demo='playback']"),pt=document.querySelector("[data-demo='export']"),nc=pt.querySelector("[data-action='export']"),lo=null;await Wt.thread.work.hello(),Wt.machina.count===1?console.log("\u2705 driver works"):console.error("\u274C FAIL driver call didn't work");var jt=(r,e)=>{let t=r.querySelector(".progress"),n=r.querySelector(".status");!t||!n||(e==="running"?(t.removeAttribute("value"),n.textContent="running"):e==="done"?(t.value=1,n.textContent="done"):(t.value=0,n.textContent="idle"))},Pi=(r,e)=>{let t=r.querySelector("input[type='file']"),n=r.querySelector("[data-action='run']");n.disabled=!0,t.addEventListener("input",()=>{n.disabled=!t.files?.length}),n.addEventListener("click",async()=>{let o=t.files?.[0];if(o){n.disabled=!0,jt(r,"running");try{await e(o,r),jt(r,"done")}finally{n.disabled=!1}}})};Pi(el,async(r,e)=>{let t=e.querySelector(".demo-preview"),n=tc(Wt,r);t.replaceChildren(n.canvas),await n.run()});Pi(tl,async(r,e)=>{await ec(r,e)});Pi(rl,async(r,e)=>{await Ja(Wt,r,e)});{let r=rc.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;let{timeline:t,omni:n}=await vi(Wt,e);await Ya(t,n,rc)})}{let r=pt.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;jt(pt,"running");let{timeline:t,omni:n}=await vi(Wt,e);lo={timeline:t,omni:n},nc.disabled=!1;let o=pt.querySelector(".demo-preview"),i=await n.playback(t);await i.seek(0),o.replaceChildren(i.canvas),jt(pt,"done")})}nc.addEventListener("click",async()=>{lo&&(jt(pt,"running"),await lo.omni.render(lo.timeline),jt(pt,"done"))});
2416
2416
  /*! Bundled license information:
2417
2417
 
2418
2418
  mediabunny/dist/modules/src/misc.js: