@omnimedia/omnitool 1.1.0-80 → 1.1.0-82
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/README.md +10 -0
- package/package.json +1 -1
- package/s/timeline/index.ts +1 -0
- package/s/timeline/renderers/parts/handy.ts +2 -2
- package/s/timeline/renderers/renderers.test.ts +18 -0
- package/s/timeline/utils/anim.ts +5 -4
- package/x/demo/demo.bundle.min.js +1 -1
- package/x/demo/demo.bundle.min.js.map +3 -3
- package/x/index.html +2 -2
- package/x/tests.bundle.min.js +101 -101
- package/x/tests.bundle.min.js.map +3 -3
- package/x/tests.html +1 -1
- package/x/timeline/index.d.ts +1 -0
- package/x/timeline/index.js +1 -0
- package/x/timeline/index.js.map +1 -1
- package/x/timeline/renderers/parts/handy.js +2 -2
- package/x/timeline/renderers/parts/handy.js.map +1 -1
- package/x/timeline/renderers/renderers.test.d.ts +1 -0
- package/x/timeline/renderers/renderers.test.js +16 -0
- package/x/timeline/renderers/renderers.test.js.map +1 -1
- package/x/timeline/utils/anim.d.ts +1 -1
- package/x/timeline/utils/anim.js +5 -5
- package/x/timeline/utils/anim.js.map +1 -1
package/README.md
CHANGED
|
@@ -229,6 +229,16 @@ Object.entries(animations).forEach(([property, meta]) => {
|
|
|
229
229
|
|
|
230
230
|
Each animation definition describes the semantic shape of the animation: its value kind, default interpolation, and numeric channels with defaults and units. This is useful for tools that need to create valid keyframes without hardcoding Omnitool's track layout.
|
|
231
231
|
|
|
232
|
+
Utils:
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
import {resolveTransform} from "@omnimedia/omnitool"
|
|
236
|
+
|
|
237
|
+
const transform = resolveTransform(spatial, localTime)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
`resolveTransform` gets a spatial item's current transform. It returns the static transform for `Item.Spatial`, or resolves the animated transform for `Item.AnimatedSpatial` at the given local time.
|
|
241
|
+
|
|
232
242
|
Worker URL notes:
|
|
233
243
|
- `Driver.setup()` defaults to `/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js`.
|
|
234
244
|
- If you serve the worker from a different location, pass `workerUrl`:
|
package/package.json
CHANGED
package/s/timeline/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {ms, Ms} from '../../../units/ms.js'
|
|
|
3
3
|
import {Id, TimelineFile} from '../../parts/basics.js'
|
|
4
4
|
import { SampleContext } from './samplers/visual/parts/types.js'
|
|
5
5
|
import {I6, Mat6, mul6, transformToMat6} from '../../utils/matrix.js'
|
|
6
|
-
import {resolveScalarAnimation,
|
|
6
|
+
import {resolveScalarAnimation, resolveTransform} from '../../utils/anim.js'
|
|
7
7
|
import {ContainerItem, Item, Kind, PlayableItem, SpatialItem} from '../../parts/item.js'
|
|
8
8
|
|
|
9
9
|
function isPlayableItem(item: Item.Any): item is PlayableItem {
|
|
@@ -101,7 +101,7 @@ function applySpatialIfAny(
|
|
|
101
101
|
if ("spatialId" in item && item.spatialId) {
|
|
102
102
|
const spatial = items.get(item.spatialId) as SpatialItem | undefined
|
|
103
103
|
if (spatial?.enabled) {
|
|
104
|
-
const local = transformToMat6(
|
|
104
|
+
const local = transformToMat6(resolveTransform(spatial, time))
|
|
105
105
|
return mul6(local, parentMatrix)
|
|
106
106
|
}
|
|
107
107
|
}
|
|
@@ -8,6 +8,7 @@ import {fps} from "../../units/fps.js"
|
|
|
8
8
|
import {Datafile} from "../utils/datafile.js"
|
|
9
9
|
import {Driver} from "../../driver/driver.js"
|
|
10
10
|
import {AudioMix} from "./export/parts/audio-mix.js"
|
|
11
|
+
import {resolveTransformAnimation} from "../utils/anim.js"
|
|
11
12
|
import {produceAudio} from "./export/parts/produce-audio.js"
|
|
12
13
|
import {resampleToPlanar} from "./export/parts/resamplers.js"
|
|
13
14
|
import {loadVideo} from "../../demo/routines/load-video.js"
|
|
@@ -41,6 +42,23 @@ const near = (actual: number, expected: number, eps = 1e-6) =>
|
|
|
41
42
|
|
|
42
43
|
export default Science.suite({
|
|
43
44
|
|
|
45
|
+
"empty transform animation tracks resolve to identity transform defaults": test(async () => {
|
|
46
|
+
const transform = resolveTransformAnimation(ms(100), {
|
|
47
|
+
terp: "linear",
|
|
48
|
+
track: {
|
|
49
|
+
position: {x: [], y: []},
|
|
50
|
+
scale: {x: [], y: []},
|
|
51
|
+
rotation: [],
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
expect(transform[0][0]).is(0)
|
|
56
|
+
expect(transform[0][1]).is(0)
|
|
57
|
+
expect(transform[1][0]).is(1)
|
|
58
|
+
expect(transform[1][1]).is(1)
|
|
59
|
+
expect(transform[2]).is(0)
|
|
60
|
+
}),
|
|
61
|
+
|
|
44
62
|
"cursor visual sampler cannot get previous samples": test(async () => {
|
|
45
63
|
const {omni, videoA, resolveMedia, driver} = await setupTest()
|
|
46
64
|
const {timeline} = new O({timeline: omni.timeline(o => o.sequence(
|
package/s/timeline/utils/anim.ts
CHANGED
|
@@ -7,9 +7,10 @@ const resolveScalar =(
|
|
|
7
7
|
time: number,
|
|
8
8
|
keys: Keyframes,
|
|
9
9
|
terp: Anim<Keyframes>["terp"],
|
|
10
|
+
fallback = 0,
|
|
10
11
|
): number => {
|
|
11
12
|
if (keys.length === 0)
|
|
12
|
-
return
|
|
13
|
+
return fallback
|
|
13
14
|
|
|
14
15
|
if (keys.length === 1)
|
|
15
16
|
return keys[0][1]
|
|
@@ -50,8 +51,8 @@ export const resolveTransformAnimation =(
|
|
|
50
51
|
resolveScalar(time, anim.track.position.y, anim.terp),
|
|
51
52
|
],
|
|
52
53
|
[
|
|
53
|
-
resolveScalar(time, anim.track.scale.x, anim.terp),
|
|
54
|
-
resolveScalar(time, anim.track.scale.y, anim.terp),
|
|
54
|
+
resolveScalar(time, anim.track.scale.x, anim.terp, 1),
|
|
55
|
+
resolveScalar(time, anim.track.scale.y, anim.terp, 1),
|
|
55
56
|
],
|
|
56
57
|
resolveScalar(time, anim.track.rotation, anim.terp),
|
|
57
58
|
])
|
|
@@ -61,7 +62,7 @@ export const resolveScalarAnimation =(
|
|
|
61
62
|
anim: ScalarAnimation,
|
|
62
63
|
): number => resolveScalar(time, anim.track, anim.terp)
|
|
63
64
|
|
|
64
|
-
export const
|
|
65
|
+
export const resolveTransform =(
|
|
65
66
|
spatial: Item.Spatial | Item.AnimatedSpatial,
|
|
66
67
|
time: number,
|
|
67
68
|
): Transform =>
|
|
@@ -7322,7 +7322,7 @@ fn rand(co: vec2<f32>, seed: f32) -> f32
|
|
|
7322
7322
|
vec2 uv = vTextureCoord.xy;
|
|
7323
7323
|
gl_FragColor = transition(vTextureCoord);
|
|
7324
7324
|
}
|
|
7325
|
-
`;function Hm({name:r,renderer:e}){let t=qm.default.find(c=>c.name===r),n=new Xt,o=new ne,i=new Kt({}),s=new Kt({}),a=new k({glProgram:new P({vertex:Vm,fragment:Gm(t.glsl)}),resources:{from:i,to:s,uniforms:{...na.basics,...na.custom(t)}}});return n.filters=[a],{render({width:c,height:l,from:f,to:u,progress:m}){return(n.width!==c||n.height!==l)&&(n.setSize({width:c,height:l}),o.source.resize(c,l)),i.resource=f,s.resource=u,i.update(),s.update(),a.resources.uniforms.uniforms.progress=m,e.render({container:n,target:o,clear:!1,width:c,height:l}),o}}}var ni=class{pixi;onPointerDown=ke();onPointerMove=ke();onPointerUp=ke();onDispose=ke();static async setup(){let e=await Os({width:1920,height:1080,preference:"webgl",background:"black",preferWebGLVersion:2}),t=new _i;return t.interactive=!0,new this({renderer:e,stage:t})}constructor(e){this.pixi=e}#e=new Map;#t=new Map;#r=new WeakMap;async composite(e){let{stage:t,renderer:n}=this.pixi;this.#d(this.#m(e));let{dispose:o}=await this.#n(e,t);n.render(t);let i=new VideoFrame(n.canvas,{timestamp:0,duration:0});return o(),i}getActiveObject(e){return this.#t.get(e)?.sprite}async#n(e,t){if(Array.isArray(e)){let n=[];for(let o of[...e].reverse()){let i=await this.#n(o,t);n.push(i.dispose)}return{dispose:()=>n.forEach(o=>o())}}switch(e.kind){case"text":return this.#o(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:()=>{}}}}#o(e,t){let n=this.#f(e);return this.#c(n,e.matrix),this.#a(n,e.alpha),this.#l(n,e.crop),this.#u(n,e.filters),t.addChild(n),{dispose:()=>{}}}#i(e,t){let n=this.#f(e);n.texture&&n.texture!==ne.EMPTY&&n.texture.destroy(!0);let o=ne.from(e.frame);return n.texture=o,this.#c(n,e.matrix),this.#a(n,e.alpha),this.#l(n,e.crop),this.#u(n,e.filters),t.addChild(n),{dispose:()=>{e.frame.close()}}}#s({from:e,to:t,progress:n,name:o},i){let a=(this.#e.get(o)??(this.#e.set(o,Hm({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 Xt(a);return i.addChild(c),{dispose:()=>c.destroy(!1)}}#c(e,t){if(!t)return;let n=Mm(t);e.setFromMatrix(n)}#a(e,t){e.alpha=t??1}#l(e,t){let n=this.#r.get(e);if(n&&(e.mask===n&&(e.mask=null),n.removeFromParent(),n.clear()),!t||t.every(h=>h===0))return;let[o,i,s,a]=t,c=e.mask;e.mask=null;let l=e.getLocalBounds();e.mask=c;let f=l.x+l.width*a,u=l.y+l.height*o,m=l.width*Math.max(0,1-a-i),d=l.height*Math.max(0,1-o-s),p=n??new Ai;p.clear(),p.beginFill(16777215),p.drawRect(f,u,m,d),p.endFill(),e.addChild(p),e.mask=p,this.#r.set(e,p)}#u(e,t){if(!t?.length){e.filters=null;return}e.filters=t.map(n=>{switch(n.type){case"ColorMatrixFilter":{let{matrix:o,...i}=n.params??{},s=new Ut(i);return o&&(s.matrix=o),s}case"EmbossFilter":return new Ir(n.params?.strength);case"PixelateFilter":return new Fr(n.params?.size);default:{let o=Om(n.type);return o?new o(n.params):void 0}}}).filter(n=>!!n)}#f(e){let t=this.#t.get(e.id);if(t)return t.sprite;switch(e.kind){case"text":{let n=new xn({text:e.content,style:e.style});n.eventMode="static";let o=a=>this.onPointerDown.publish({event:a,id:e.id,object:n}),i=a=>this.onPointerUp.publish({event:a,id:e.id,object:n}),s=a=>this.onPointerUp.publish({event:a,id:e.id,object:n});return n.on("pointerdown",o),n.on("pointerup",i),n.on("pointermove",s),this.#t.set(e.id,{sprite:n,dispose:()=>{this.onDispose.publish({id:e.id,object:n}),n.off("pointermove",s),n.off("pointerdown",o),n.off("pointerup",i)}}).get(e.id)?.sprite}case"image":{let n=new Xt;n.eventMode="static";let o=a=>this.onPointerDown.publish({event:a,id:e.id,object:n}),i=a=>this.onPointerUp.publish({event:a,id:e.id,object:n}),s=a=>this.onPointerUp.publish({event:a,id:e.id,object:n});return n.on("pointerdown",o),n.on("pointermove",s),n.on("pointerup",i),this.#t.set(e.id,{sprite:n,dispose:()=>{this.onDispose.publish({id:e.id,object:n}),n.off("pointerdown",o),n.off("pointermove",s),n.off("pointerup",i)}}).get(e.id)?.sprite}}}#m(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}#d(e){for(let t of this.#t.keys())if(!e.has(t)){let{sprite:n,dispose:o}=this.#t.get(t);o(),n.destroy(!0),this.#t.delete(t)}}};var Wm=r=>Gn.host(e=>({async world(){r.count++}}));async function Ce(r){return r instanceof Blob?new pn(r):new hn(r)}var oi=class{machina;thread;compositor;static async setup(e){let t=new Uo,n=await Gn.thread({label:"OmnitoolDriver",workerUrl:e?.workerUrl??"/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",setupHost:Wm(t)}),o=await ni.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 he({source:await Ce(e),formats:Se}).getPrimaryAudioTrack();if(!n)throw new Error("primary audio track not found");return await n.computeDuration()}async getVideoDuration(e){return await(await new he({source:await Ce(e),formats:Se}).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[Jt]({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[Jt]({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(Pn.happy),a=this.thread.work.encode[Jt]({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 Hh={transform:{type:"transform",defaultTerp:"linear",channels:[{path:"position.x",type:"number",default:0,unit:"pixel"},{path:"position.y",type:"number",default:0,unit:"pixel"},{path:"scale.x",type:"number",default:1,unit:"scale"},{path:"scale.y",type:"number",default:1,unit:"scale"},{path:"rotation",type:"number",default:0,unit:"radian"}]}},vn={opacity:{type:"scalar",defaultTerp:"linear",channels:[{type:"number",default:1,unit:"ratio",range:[0,1]}]}},k4={...Hh,...vn};var b=(r,e,t,n)=>({type:"number",min:r,max:e,default:t,...n===void 0?{}:{step:n}}),rt=r=>({type:"color",default:r}),Ge=r=>({type:"boolean",default:r}),ii=(r,e)=>({type:"choice",options:r,default:e}),ee=r=>({type:"object",properties:r}),Wh=r=>({type:"array",items:r}),jm=[3,5,7,9,11,13,15,17,19,21,23,25],jh={TRANSPARENT:0,ORIGINAL:1,LOOP:2,CLAMP:3,MIRROR:4},q=()=>(r,e={})=>({type:r,schema:e}),si={adjustment:q()("AdjustmentFilter",{gamma:b(0,5,1),saturation:b(0,5,1),contrast:b(0,5,1),brightness:b(0,5,1),red:b(0,5,1),green:b(0,5,1),blue:b(0,5,1),alpha:b(0,1,1,.01)}),advancedBloom:q()("AdvancedBloomFilter",{threshold:b(.1,.9,.5,.01),bloomScale:b(.5,1.5,1,.01),brightness:b(.5,1.5,1,.01),blur:b(0,20,8,.1),quality:b(1,20,4,1)}),alpha:q()("AlphaFilter",{alpha:b(0,1,1,.01)}),ascii:q()("AsciiFilter",{size:b(2,20,8,1),color:rt("#ffffff"),replaceColor:Ge(!1)}),backdropBlur:q()("BackdropBlurFilter",{strength:b(0,100,8,.1),quality:b(1,10,4,1)}),bevel:q()("BevelFilter",{rotation:b(0,360,45,1),thickness:b(0,10,2,.1),lightColor:rt("#ffffff"),lightAlpha:b(0,1,.7,.01),shadowColor:rt("#000000"),shadowAlpha:b(0,1,.7,.01)}),bloom:q()("BloomFilter",{strength:ee({x:b(0,20,2,.1),y:b(0,20,2,.1)}),quality:b(1,20,4,1),resolution:b(.25,4,1,.01),kernelSize:ii([5,7,9,11,13,15],5)}),blur:q()("BlurFilter",{strength:b(0,100,8,.1),quality:b(1,10,4,1)}),bulgePinch:q()("BulgePinchFilter",{radius:b(0,1e3,100,1),strength:b(-1,1,1,.01),center:ee({x:b(0,1,.5,.01),y:b(0,1,.5,.01)})}),colorGradient:q()("ColorGradientFilter"),colorMatrix:q()("ColorMatrixFilter"),colorOverlay:q()("ColorOverlayFilter",{color:rt("#ff0000"),alpha:b(0,1,.5,.01)}),colorReplace:q()("ColorReplaceFilter",{originalColor:rt("#ff0000"),targetColor:rt("#000000"),tolerance:b(0,1,.4,.01)}),convolution:q()("ConvolutionFilter",{width:b(0,500,300,1),height:b(0,500,300,1),matrix:Wh([b(0,1,0),b(0,1,.5,.01),b(0,1,0),b(0,1,.5,.01),b(0,1,1,.01),b(0,1,.5,.01),b(0,1,0),b(0,1,.5,.01),b(0,1,0)])}),crossHatch:q()("CrossHatchFilter"),crt:q()("CRTFilter",{curvature:b(0,10,1,.01),lineWidth:b(0,5,3,.01),lineContrast:b(0,1,.3,.01),verticalLine:Ge(!1),noise:b(0,1,.2,.01),noiseSize:b(1,10,1,.1),vignetting:b(0,1,.3,.01),vignettingAlpha:b(0,1,1,.01),vignettingBlur:b(0,1,.3,.01),seed:b(0,1,0,.01),time:b(.5,20,.5,.01)}),dot:q()("DotFilter",{scale:b(.3,1,1,.01),angle:b(0,5,5,.01),grayscale:Ge(!0)}),dropShadow:q()("DropShadowFilter",{blur:b(0,20,2,.1),quality:b(1,20,3,1),alpha:b(0,1,.5,.01),offset:ee({x:b(-50,50,4,1),y:b(-50,50,4,1)}),color:rt("#000000"),shadowOnly:Ge(!1)}),emboss:q()("EmbossFilter",{strength:b(0,20,5,.1)}),glitch:q()("GlitchFilter",{slices:b(0,64,5,1),seed:b(0,1,.5,.01),offset:b(-400,400,100,1),direction:b(-180,180,0,1),fillMode:ii(jh,"LOOP"),average:Ge(!1),minSize:b(0,64,8,1),sampleSize:b(1,2048,512,1),red:ee({x:b(-50,50,2,1),y:b(-50,50,2,1)}),blue:ee({x:b(-50,50,10,1),y:b(-50,50,-4,1)}),green:ee({x:b(-50,50,-10,1),y:b(-50,50,4,1)})}),glow:q()("GlowFilter",{distance:b(0,20,15,.1),innerStrength:b(0,20,0,.1),outerStrength:b(0,20,2,.1),color:rt("#ffffff"),quality:b(0,1,.2,.01),alpha:b(0,1,1,.01),knockout:Ge(!1)}),godray:q()("GodrayFilter",{time:b(0,1,0,.01),gain:b(0,1,.6,.01),lacunarity:b(0,5,2.75,.01),alpha:b(0,1,1,.01),parallel:Ge(!0),angle:b(-60,60,30,1),center:ee({x:b(-100,2012,956,1),y:b(-1e3,-100,-100,1)})}),grayscale:q()("GrayscaleFilter"),hslAdjustment:q()("HslAdjustmentFilter",{hue:b(-180,180,0,1),saturation:b(-1,1,0,.01),lightness:b(-1,1,0,.01),colorize:Ge(!1),alpha:b(0,1,1,.01)}),kawaseBlur:q()("KawaseBlurFilter",{strength:b(0,20,4,.1),quality:b(1,20,3,1),pixelSize:ee({x:b(0,10,1,.1),y:b(0,10,1,.1)})}),motionBlur:q()("MotionBlurFilter",{velocity:ee({x:b(-90,90,40,1),y:b(-90,90,40,1)}),kernelSize:ii(jm,15),offset:b(-150,150,0,1)}),multiColorReplace:q()("MultiColorReplaceFilter"),noise:q()("NoiseFilter",{noise:b(0,1,.5,.01),seed:b(.01,10,.5,.01)}),oldFilm:q()("OldFilmFilter",{sepia:b(0,1,.3,.01),noise:b(0,1,.3,.01),noiseSize:b(1,10,1,.1),scratch:b(-1,1,.5,.01),scratchDensity:b(0,1,.3,.01),scratchWidth:b(1,20,1,.1),vignetting:b(0,1,.3,.01),vignettingAlpha:b(0,1,1,.01),vignettingBlur:b(0,1,.3,.01)}),outline:q()("OutlineFilter",{thickness:b(0,10,4,.1),color:rt("#000000"),alpha:b(0,1,1,.01),knockout:Ge(!1)}),pixelate:q()("PixelateFilter",{size:ee({x:b(4,40,10,1),y:b(4,40,10,1)})}),radialBlur:q()("RadialBlurFilter",{angle:b(-180,180,20,1),radius:b(-1,1912,300,1),center:ee({x:b(0,1912,956,1),y:b(0,920,460,1)}),kernelSize:ii(jm,15)}),reflection:q()("ReflectionFilter",{mirror:Ge(!0),boundary:b(0,1,.5,.01),amplitude:ee({start:b(0,50,0,.1),end:b(0,50,20,.1)}),waveLength:ee({start:b(10,200,30,1),end:b(10,200,100,1)}),alpha:ee({start:b(0,1,1,.01),end:b(0,1,1,.01)}),time:b(0,20,0,.01)}),rgbSplit:q()("RGBSplitFilter",{red:ee({x:b(-20,20,-10,1),y:b(-20,20,0,1)}),blue:ee({x:b(-20,20,0,1),y:b(-20,20,0,1)}),green:ee({x:b(-20,20,0,1),y:b(-20,20,10,1)})}),shockwave:q()("ShockwaveFilter",{speed:b(500,2e3,500,1),amplitude:b(1,100,30,1),wavelength:b(2,400,160,1),brightness:b(.2,2,1,.01),radius:b(100,2e3,-1,1),center:ee({x:b(0,1912,956,1),y:b(0,920,460,1)})}),simplexNoise:q()("SimplexNoiseFilter",{strength:b(0,1,.5,.01),noiseScale:b(0,50,10,.1),offsetX:b(0,5,0,.01),offsetY:b(0,5,0,.01),offsetZ:b(0,5,0,.01),step:b(-1,1,-1,.01)}),tiltShift:q()("TiltShiftFilter",{blur:b(0,200,100,.1),gradientBlur:b(0,1e3,600,1),start:ee({x:b(0,1912,0,1),y:b(0,920,460,1)}),end:ee({x:b(0,1912,1912,1),y:b(0,920,460,1)})}),twist:q()("TwistFilter",{angle:b(-10,10,4,.01),radius:b(0,1912,200,1),offset:ee({x:b(0,1912,956,1),y:b(0,920,460,1)})}),zoomBlur:q()("ZoomBlurFilter",{strength:b(.01,.5,.1,.01),center:ee({x:b(0,1912,956,1),y:b(0,920,460,1)}),innerRadius:b(0,956,80,1),radius:b(0,956,-1,1)})};var V;(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.AnimatedSpatial=7]="AnimatedSpatial",r[r.Animation=8]="Animation",r[r.Transition=9]="Transition",r[r.TextStyle=10]="TextStyle",r[r.Filter=11]="Filter"})(V||(V={}));var ai;(function(r){r[r.Crossfade=0]="Crossfade"})(ai||(ai={}));var ci=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 he({formats:Se,source:await Ce(e)}).computeDuration();return Number(n.toFixed(5))}static async#e(e){let t=new he({formats:Se,source:await Ce(e)});return{audio:!!await t.getPrimaryAudioTrack(),video:!!await t.getPrimaryVideoTrack()}}};var li=class{#e=new _n;async store(e){let t=await ci.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,duration:t.duration});return t}require(e){return this.#e.require(e)}};var ui=class r{videoTrack;options;#e;#t=new Map;#r=[0,0];constructor(e,t){this.videoTrack=e,this.options=t,this.#e=new nn(e,t.canvasSinkOptions)}static async init(e,t){let o=await new he({formats:Se,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.#a())}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,f=n>c;!l&&!f||(this.#r=this.#n(e,2),this.#a())}#s=null;#c=!1;async#a(){if(this.#o(),this.#s){this.#c=!0;return}this.#s=this.#i(),await this.#s,this.#s=null,this.#c&&(this.#c=!1,await this.#a())}getThumbnail(e){return this.#t.get(e)}};function Xm(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),f=Math.max(l+1,Math.floor((c+1)*a)),u=0;for(let d=l;d<f&&d<r.length;d++)r[d]>u&&(u=r[d]);let m=u*e.height;o.fillRect(c,i-m/2,1,m)}return n}var oa=[2048,1024,512,256,128,64,32];async function Km(r,e){let t=await r.getAudioDuration(e)??0,n=r.decodeAudio({source:e}).readable,o=oa[oa.length-1],i=[],s=0,a=0,c=0;for await(let u of n){c||=u.sampleRate;let m=u.numberOfFrames,d=new Float32Array(m);u.copyTo(d,{planeIndex:0});for(let p=0;p<d.length;p++){let h=Math.abs(d[p]);h>s&&(s=h),a++,a>=o&&(i.push(s),s=0,a=0)}u.close()}a>0&&i.push(s);let l=new Float32Array(i),f=oa.map(u=>{let m=Math.max(1,Math.round(u/o)),d=m===1?l:Xh(l,m);return{samplesPerPeak:u,peaks:d,peaksPerSecond:c>0?c/u:0}});return{duration:t,levels:f}}function Xh(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 Kh=4096,fi=class r{#e=new Map;#t=[0,0];#r=[0,0];#n;#o;#i;#s=!1;color;duration;tileSize;tileHeight;preloadMargin;constructor(e,t,n){this.#o=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.#i=n.onChange}static async init(e,t,n={}){let{duration:o,levels:i}=await Km(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.#a())}get zoom(){return this.#n}get range(){return this.#r}#c([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>0,c=s<this.duration,l=!a||t>=i+o,f=!c||n<=s-o;l&&f||(this.#t=this.#c(e,this.preloadMargin),this.#a())}#a(){this.#s||(this.#s=!0,queueMicrotask(()=>{this.#s=!1,this.#l()}))}#l(){let[e,t]=this.#t,n=new Set,o=this.#f(),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.#m(n,e,t);return{startTime:e,endTime:t,peaks:o,canvas:Xm(o,{width:this.#d(e,t),height:this.tileHeight,color:this.color})}}#f(){return this.#o.find(e=>e.peaksPerSecond>=this.#n)??this.#o[this.#o.length-1]}#m(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)}#d(e,t){return Math.min(Kh,Math.max(1,Math.ceil((t-e)*this.#n)))}#p(){this.#i&&this.#i([...this.#e.values()].sort((e,t)=>e.startTime-t.startTime))}getTiles(){return this.#e}};var X=r=>r;var Er=r=>r;var Ym=()=>{let r=!1,e=Er(60),t=1e3/e,n=0,o=0,i=ke(),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}},$m=async(r,e)=>{let t=X(1e3/r.fps),n=r.duration/1e3,o=Math.ceil(n*r.fps);for(let i=0;i<o;i++){let s=X(i*t);await e(s,i)}};var ia=class{keys;index;constructor(e,t){this.keys=e,this.index=t}near(e){return this.keys[Math.max(0,Math.min(this.keys.length-1,this.index+e))][1]}},Qm=r=>r,yn=r=>Qm((e,t)=>r(e,t.near(0),t.near(1))),bn=(r,e,t)=>e+(t-e)*r,Yh={linear:yn(bn),ease:yn((r,e,t)=>{let n=r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2;return bn(n,e,t)}),easeIn:yn((r,e,t)=>bn(r*r*r,e,t)),easeOut:yn((r,e,t)=>bn(1-Math.pow(1-r,3),e,t)),bounce:yn((r,e,t)=>{let i=r<.36363636363636365?7.5625*r*r:r<.7272727272727273?7.5625*(r-.5454545454545454)**2+.75:r<.9090909090909091?7.5625*(r-.8181818181818182)**2+.9375:7.5625*(r-.9545454545454546)**2+.984375;return bn(i,e,t)}),catmullRom:Qm((r,e)=>{let t=e.near(-1),n=e.near(0),o=e.near(1),i=e.near(2),s=r*r,a=s*r;return .5*(2*n+(-t+o)*r+(2*t-5*n+4*o-i)*s+(-t+3*n-3*o+i)*a)})},Zm=(r,e,t,n)=>{let o=Yh[r];if(!o)throw new Error(`unknown terp "${r}"`);return o(e,new ia(t,n))};var Dr=(r,e,t)=>{if(e.length===0)return 0;if(e.length===1)return e[0][1];let n=[...e].sort((f,u)=>f[0]-u[0]);if(r<=n[0][0])return n[0][1];let o=n[n.length-1];if(r>=o[0])return o[1];let i=0;for(let f=0;f<n.length-1;f++){let u=n[f],m=n[f+1];if(r>=u[0]&&r<=m[0]){i=f;break}}let[s]=n[i],[a]=n[i+1],c=a-s,l=c===0?0:(r-s)/c;return Zm(t,l,n,i)},$h=(r,e)=>[[Dr(r,e.track.position.x,e.terp),Dr(r,e.track.position.y,e.terp)],[Dr(r,e.track.scale.x,e.terp),Dr(r,e.track.scale.y,e.terp)],Dr(r,e.track.rotation,e.terp)],Jm=(r,e)=>Dr(r,e.track,e.terp),ed=(r,e)=>r.kind===V.AnimatedSpatial?$h(e,r.anim):r.transform;function rd(r){return"duration"in r}function nd(r){let e=[],t=new Map(r.timeline.items.map(n=>[n.id,n]));return sa(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 od(r,e,t,n){let o=Um;for(let i of e)o=td(r,i.item,o,i.localTime);return td(r,t,o,n)}function td(r,e,t,n){if("spatialId"in e&&e.spatialId){let o=r.get(e.spatialId);if(o?.enabled){let i=Rm(ed(o,n));return Bm(i,t)}}return t}function sa(r,e,t,n,o=[]){let i=e.get(r);if(i)switch(i.kind){case V.Stack:n.stack(i,t,o);for(let s of i.childrenIds)sa(s,e,t,n,[...o,{item:i,localTime:t}]);break;case V.Sequence:{n.sequence(i,t,o);let s=X(0);for(let a of i.childrenIds){let c=e.get(a);if(!c||!rd(c))continue;let l=X(s+c.duration);if(t>=l){s=l;continue}let f=X(Math.max(0,t-s));sa(a,e,f,n,[...o,{item:i,localTime:t}]),s=l}break}case V.Video:n.video(i,t,o);break;case V.Text:n.text(i,t,o);break;case V.Audio:n.audio(i,t,o);break}}function ze(r,e){let t=e.items.find(n=>n.id===r);if(!t)return X(0);switch(t.kind){case V.Sequence:{let n=t.childrenIds.map(i=>e.items.find(s=>s.id===i)).filter(Boolean),o=X(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===V.Transition){let a=n[i-1],c=n[i+1];if(a&&c&&a.kind!==V.Transition&&c.kind!==V.Transition){let l=ze(a.id,e),f=ze(c.id,e),u=Math.max(0,Math.min(s.duration,l,f));o=X(o-u)}continue}o=X(o+ze(s.id,e))}return o}case V.Stack:{let n=X(0);for(let o of t.childrenIds){let i=ze(o,e);i>n&&(n=i)}return n}default:return rd(t)?t.duration:X(0)}}function id(r,e,t){if(!("animationId"in e)||e.animationId===void 0)return 1;let n=r.items.get(e.animationId);return n?.enabled&&n.anims.opacity?Jm(t,n.anims.opacity):1}var Sn=r=>r;var mi=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 he({formats:Se,source:await Ce(this.resolveMedia(e))}),o=await n.getPrimaryVideoTrack(),s=!!o&&await o.canDecode()&&o?new sr(o):null;return this.#e.set(e,{input:n,sink:s}),s}};async function sd(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 ad(r,e,t,n){let o=Qh(r,e,t);if(!o)return[];let i=[...n,{item:e,localTime:t}];return o.isTransitioning?sd(o.transition,o.progress,Ht(r,o.outgoing,o.outgoingTime,i),Ht(r,o.incoming,o.incomingTime,i)):Ht(r,o.item,o.localTime,i)}function Qh(r,e,t){let n=e.childrenIds.map(i=>r.items.get(i)).filter(i=>!!i),o=X(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===V.Transition)continue;let a=o,c=ze(s.id,r.timeline),l=X(a+c),f=n[i+1];if(!(f?.kind===V.Transition)){if(t<l)return{isTransitioning:!1,item:s,localTime:X(t-a)};o=l;continue}let m=f,d=n[i+2];if(!d||d.kind===V.Transition){o=l;continue}let p=ze(d.id,r.timeline),h=Math.max(0,Math.min(m.duration,c,p)),x=X(l-h);if(t<x)return{isTransitioning:!1,item:s,localTime:X(t-a)};if(t<l){let y=X(t-x),v=X(t-a);return{isTransitioning:!0,incoming:d,outgoing:s,outgoingTime:v,incomingTime:y,progress:h>0?y/h:1,transition:m}}o=x,i++}return null}async function Ht(r,e,t,n){let o=od(r.items,n,e,t),i=id(r,e,t),s="spatialId"in e&&e.spatialId?r.items.get(e.spatialId)?.crop:void 0,a="filterIds"in e&&e.filterIds?e.filterIds.map(c=>r.items.get(c)).filter(c=>!!c?.enabled).map(c=>({type:c.type,params:c.params})):void 0;switch(e.kind){case V.Stack:{let c=[...n,{item:e,localTime:t}];return(await Promise.all(e.childrenIds.map(f=>r.items.get(f)).filter(f=>!!f).map(f=>Ht(r,f,t,c)))).flat()}case V.Sequence:return ad(r,e,t,n);case V.Video:{if(t<0||t>=e.duration)return[];let c=await r.videoSampler(e,t);return c?[{kind:"image",frame:c,matrix:o,alpha:i,crop:s,filters:a,id:e.id}]:[]}case V.Text:{if(t<0||t>=e.duration)return[];let c=e.styleId?r.items.get(e.styleId)?.style:void 0;return[{id:e.id,kind:"text",content:e.content,style:c,matrix:o,alpha:i,crop:s,filters:a}]}case V.Gap:return[{id:e.id,kind:"gap"}];default:return[]}}function cd(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 di(r,e){let t=new mi(r),n=e??cd(t);return{async sample(o,i){let s=new Map(o.items.map(c=>[c.id,c])),a=s.get(o.rootId);return a?Ht({videoSampler:n,timeline:o,items:s},a,i,[]):[]}}}var Or=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=di(this.resolveMedia,(o,i)=>{let s=ld(i),a=this.#t.get(o.id);if(!a){let c=this.resolveMedia(o.mediaHash),l=ld(X(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:f,value:u}=await i.read();if(f)return c=!0,null;let m=new VideoFrame(u);return u.close(),m};return{async next(f){if(s??=await l(),!!s)for(;;){a??=l();let u=await a;if(!u)return new VideoFrame(s);let m=s.timestamp??-1/0,d=u.timestamp??m;if(d<f){s.close(),s=u,a=null;continue}if(Math.abs(d-f)<Math.abs(m-f)){s.close(),s=u,a=null;continue}return new VideoFrame(s)}},async cancel(){let f=a;a=null,c=!0,(await f?.catch(()=>null))?.close(),s?.close(),s=null,o.cancel()}}}},ld=r=>Math.round(r*1e3);async function ud(r,e,t){return(await Promise.all(e.map(async({item:o,localTime:i})=>{if(o.kind!==V.Audio)return;let s=await r.getSink(o.mediaHash);if(!s)return;let a=o.start+i,c=Sn((t-a)/1e3),l=s.samples(a/1e3),f=await l.next();if(f.done)return;let u=f.value,m=l.next();return{offset:c,gain:o.gain??1,get currentSample(){return u},timelineTime:()=>Sn(c+u.timestamp),output:()=>({sample:u,timestamp:c+u.timestamp,gain:o.gain??1}),advance:async()=>{let d=await m;return d.done?!1:(u=d.value,m=l.next(),!0)}}}))).filter(o=>!!o)}var pi=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 he({formats:Se,source:await Ce(this.resolveMedia(e))}),o=await n.getPrimaryAudioTrack(),s=!!o&&await o.canDecode()&&o?new on(o):null;return this.#e.set(e,{input:n,sink:s}),s}};function fd(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 hi(r){let e=new pi(r);return{async*sampleAudio(t,n){let o=nd({timeline:t,from:n}),i=await ud(e,o,n);for(;i.length>0;){let{stream:s,index:a}=fd(i);yield s.output(),await s.advance()||i.splice(a,1)}}}}var gi=class{driver;timeline;resolveMedia;audioSampler;seekVisualSampler;playVisualSampler=null;#e=X(0);#t=null;#r=Ym();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=di(this.resolveMedia),this.audioSampler=hi(this.resolveMedia),this.#o()}update(e){this.timeline=e}get isPlaying(){return this.#r.isPlaying()}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(){if(!this.#r.isPlaying()){await this.audioContext.resume(),this.#e=this.currentTime,this.#t=this.audioContext.currentTime,this.#n?.abort(),this.#n=new AbortController;for(let e of this.audioNodes)e.stop();this.audioNodes.clear(),this.playVisualSampler=new Or(this.driver,this.resolveMedia,this.timeline),this.#r.play(),this.#i(this.#n.signal,Sn(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&&(this.playVisualSampler.cancel(),this.playVisualSampler=null)}get duration(){return ze(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 X(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,X(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 xi=class{driver;canvas;playback;#e=null;#t=null;constructor(e,t,n){this.driver=e,this.playback=new gi(e,n,t),this.canvas=e.compositor.pixi.renderer.canvas}async play(){await this.playback.start()}pause(){this.playback.pause()}seek(e){return this.#e=e,this.#t??=this.#r().finally(()=>this.#t=null)}setFPS(e){this.playback.setFps(Er(e))}get isSeeking(){return this.#t!==null}get isPlaying(){return this.playback.isPlaying}get duration(){return this.playback.duration}get currentTime(){return this.playback.currentTime}update(e){this.playback.update(e)}async#r(){for(;this.#e!==null;){let e=this.#e;this.#e=null;let t=await this.playback.seek(X(e));(await this.driver.composite(t)).close()}}};var Wt=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 De.toInteger(De.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:V.TextStyle,style:e};return this.register(t),t};spatial=(e,t)=>{let n={id:this.getId(),kind:V.Spatial,transform:e??this.transform(),crop:t,enabled:!0};return this.register(n),n};animatedSpatial=(e,t)=>{let n={id:this.getId(),kind:V.AnimatedSpatial,anim:e,crop:t,enabled:!0};return this.register(n),n};#t=e=>{let t={id:this.getId(),kind:V.Animation,anims:e,enabled:!0};return this.register(t),t};anim={scalar:(e,t)=>({terp:e,track:t}),vec2:(e,t)=>{let n={x:[],y:[]};for(let[o,[i,s]]of t)n.x.push([o,i]),n.y.push([o,s]);return{terp:e,track:n}},transform:(e,t)=>{let n={position:{x:[],y:[]},scale:{x:[],y:[]},rotation:[]};for(let[o,[i,s,a]]of t)n.position.x.push([o,i[0]]),n.position.y.push([o,i[1]]),n.scale.x.push([o,s[0]]),n.scale.y.push([o,s[1]]),n.rotation.push([o,a]);return{terp:e,track:n}}};#r=e=>{let t=o=>{let i={id:this.getId(),kind:V.Filter,type:e,params:o,enabled:!0};return this.register(i),i},n=((o,i)=>{let s=t(i),a={...o,filterIds:[...o.filterIds??[],s.id]};return this.set(o.id,a),a});return n.make=t,n};#n=()=>{let e=Object.entries(si).map(([t,n])=>[t,this.#r(n.type)]);return Object.fromEntries(e)};filter=this.#n();#o=e=>{let t=(o,i)=>this.#t({[e]:this.anim.scalar(o,i)}),n=((o,i,s)=>{let a=t(i,s),c={...o,animationId:a.id};return this.set(o.id,c),c});return n.make=t,n};#i=()=>{let e=Object.keys(vn).map(t=>[t,this.#o(t)]);return Object.fromEntries(e)};animate=this.#i();sequence=(...e)=>{let t={id:this.getId(),kind:V.Sequence,childrenIds:e.map(n=>n.id)};return this.register(t),t};stack=(...e)=>{let t={kind:V.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:V.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:V.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:V.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:V.Gap,duration:e};return this.register(t),t};transition={crossfade:e=>{let t={id:this.getId(),kind:V.Transition,effect:ai.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)}))}};function Zh(r){let e=((t,n)=>o=>r(o)(t(o),n));return e.make=t=>n=>r(n).make(t),e}function Jh(){let e=Object.keys(si).map(t=>[t,Zh(n=>n.filter[t])]);return Object.fromEntries(e)}var iF=Jh();function e0(r){let e=((t,n,o)=>i=>r(i)(t(i),n,o));return e.make=(t,n)=>o=>r(o).make(t,n),e}function t0(){let r=Object.keys(vn).map(e=>[e,e0(t=>t.animate[e])]);return Object.fromEntries(r)}var sF=t0();var vi=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),f=c.planes[0]?.length??0;for(;s+t<=l;)yield this.#r(i,s,o,n),s+=t;i.push({startFrame:l,endFrame:l+f,data:c.planes}),a=Math.max(a,l+f)}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,f=s.subarray(l,l+i);for(let u of e){let m=u.data[c];if(!m)continue;let d=Math.max(t,u.startFrame),p=Math.min(a,u.endFrame);if(d>=p)continue;let h=d-t,x=d-u.startFrame,y=p-d;for(let v=0;v<y;v++)f[h+v]+=m[x+v]}if(this.#t)for(let u=0;u<i;u++){let m=f[u];f[u]=m<-1?-1:m>1?1:m}}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 r0=(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),f=a-c;i[s]=r[c]*(1-f)+r[l]*f}return i},md=(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=r0(s,r.sampleRate,e);n[i]=a,o=a.length}return{data:n,frames:o}};var dd=(r,e)=>{if(e!==1)for(let t of r)for(let n=0;n<t.length;n++)t[n]*=e};function pd({timeline:r,resolveMedia:e}){let t=new vi,n=n0(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*n0(r,e){let t=hi(e);for await(let{sample:n,timestamp:o,gain:i}of t.sampleAudio(r,X(0))){let{data:s}=md(n,48e3);dd(s,i),yield{planes:s,sampleRate:48e3,timestamp:o},n.close()}}function hd({timeline:r,fps:e,driver:t,resolveMedia:n}){let o=new TransformStream,i=o.writable.getWriter(),s=new Or(t,n,r),a=1/e,c=ze(r.rootId,r);async function l(){await $m({fps:e,duration:c},async(f,u)=>{let m=await s.next(f),d=await t.composite(m),p=new VideoFrame(d,{timestamp:Math.round(u*a*1e6),duration:Math.round(a*1e6)});await i.write(p),d.close()}),await i.close()}return l(),o.readable}function gd(r){let e=pd({...r}),t=hd({...r});return r.driver.encode({video:t,audio:e,config:{audio:{codec:"opus",bitrate:128e3},video:{codec:"vp9",bitrate:1e6}}})}var yi=class{driver;resources=new li;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 Wt({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 xi(this.driver,t=>this.resources.require(t).url,e);render=async(e,t=30)=>gd({timeline:e,fps:Er(t),driver:this.driver,resolveMedia:n=>this.resources.require(n).url})};var bi=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=kn.fromBytes(n),i=ha.sigil.fromBytes(n);return new this(e,n,o,i)}};var Si=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 bi.make(o),s=t??i.nickname,a=URL.createObjectURL(e);return new this(a,o,e,s,i)}static async load(e){}};async function vd(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 Wt({timeline:r}),f=await e.playback(r);c.replaceChildren(f.canvas),n.disabled=!1,o.disabled=!1,n.addEventListener("click",()=>f.play()),o.addEventListener("click",()=>f.pause()),i.max=String(Math.ceil(f.duration));let u=!1;f.playback.onTick.on(()=>d(f.currentTime,f.duration));let m=(p,h)=>{a.textContent=`${xd(p)} / ${xd(h)}`};i.addEventListener("input",async()=>{u=!0;let p=Math.max(0,Math.min(+i.value,f.duration));m(p,f.duration),await f.seek(p)}),i.addEventListener("change",async()=>{u=!1;let p=Math.max(0,Math.min(+i.value,f.duration));await f.seek(p)});let d=(p,h)=>{let x=Math.max(0,Math.min(p,h));u||(i.value=String(Math.round(x)));let y=h?x/h*100:0;s.style.left=`${y}%`,m(x,h)};f.update(l.timeline)}function xd(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 bd(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 fi.init(r,e,{tileHeight:96,onChange:()=>s()}),s=()=>{let a=+o.value,c=yd(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*yd(a,i.duration)}px`,l.canvas.style.height="100%",l.canvas)))};o.oninput=s,i.range=[0,i.duration]}function yd(r,e){return e>0?r/e:0}async function aa(r,e){let t=new yi(r),{videoA:n}=await t.load({videoA:Si.make(e)});return{timeline:t.timeline(i=>{let s=i.text("content",{duration:3e3}),a=i.animate.opacity.make("easeIn",[[0,0],[700,1],[2200,1],[3e3,.35]]),c=i.textStyle({fill:"green",fontSize:100}),l=i.spatial(i.transform({position:[240,160],scale:[1.4,1.4],rotation:.08}),[.15,.1,.05,.2]),f=i.animatedSpatial(i.anim.transform("linear",[[0,i.transform({position:[-320,80],scale:[.7,.7]})],[1e3,i.transform({position:[120,80],scale:[1,1]})],[2e3,i.transform({position:[200,40],scale:[1.35,1.35],rotation:8})],[3e3,i.transform({position:[320,0],scale:[1.15,1.15],rotation:0})]])),u=i.video(n,{duration:3e3,start:1e3});return i.set(s.id,{styleId:c.id,spatialId:f.id,animationId:a.id}),i.set(u.id,{spatialId:l.id}),i.sequence(i.stack(s,u,i.audio(n,{duration:1e3})),i.gap(500),i.video(n,{duration:7e3,start:5e3}))}),omni:t}}async function Sd(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 f=await ui.init(r,{onChange(u){let m=u.sort((d,p)=>d.time-p.time);a.replaceChildren(...m.map(({time:d,canvas:p})=>o0(d,p.canvas)))},frequency:c,canvasSinkOptions:{width:80,height:50,fit:"fill"}});o.oninput=()=>{l=+o.value;let u=+t.value,m=u+l;f.range=[u,m],n.textContent=`visible time range: [${u}, ${m}]`},t.oninput=()=>{let u=+t.value,m=u+l;f.range=[u,m],n.textContent=`visible time range: [${u}, ${m}]`},i.oninput=()=>{f.frequency=1/+i.value,s.textContent=`frame every ${f.frequency.toFixed(3)} second (${i.value} frames per second)`},f.range=[10,10.5]}function o0(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 Td(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(m){let d=await r.composite([{id:0,kind:"image",frame:m},{id:1,kind:"text",content:"omnitool",style:{fontSize:50,fill:"green"}}]);return m.close(),o?.drawImage(d,0,0),d}}),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 Rr=await oi.setup({workerUrl:new URL("../driver/driver.worker.bundle.min.js",import.meta.url)}),i0=document.querySelector("[data-demo='transcode']"),s0=document.querySelector("[data-demo='filmstrip']"),a0=document.querySelector("[data-demo='waveform']"),wd=document.querySelector("[data-demo='playback']"),jt=document.querySelector("[data-demo='export']"),Cd=jt.querySelector("[data-action='export']"),Ti=null;await Rr.thread.work.hello(),Rr.machina.count===1?console.log("\u2705 driver works"):console.error("\u274C FAIL driver call didn't work");var Mr=(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"))},ca=(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,Mr(r,"running");try{await e(o,r),Mr(r,"done")}finally{n.disabled=!1}}})};ca(i0,async(r,e)=>{let t=e.querySelector(".demo-preview"),n=Td(Rr,r);t.replaceChildren(n.canvas),await n.run()});ca(s0,async(r,e)=>{await Sd(r,e)});ca(a0,async(r,e)=>{await bd(Rr,r,e)});{let r=wd.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;let{timeline:t,omni:n}=await aa(Rr,e);await vd(t,n,wd)})}{let r=jt.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;Mr(jt,"running");let{timeline:t,omni:n}=await aa(Rr,e);Ti={timeline:t,omni:n},Cd.disabled=!1;let o=jt.querySelector(".demo-preview"),i=await n.playback(t);await i.seek(0),o.replaceChildren(i.canvas),Mr(jt,"done")})}Cd.addEventListener("click",async()=>{Ti&&(Mr(jt,"running"),await Ti.omni.render(Ti.timeline),Mr(jt,"done"))});
|
|
7325
|
+
`;function Hm({name:r,renderer:e}){let t=qm.default.find(c=>c.name===r),n=new Xt,o=new ne,i=new Kt({}),s=new Kt({}),a=new k({glProgram:new P({vertex:Vm,fragment:Gm(t.glsl)}),resources:{from:i,to:s,uniforms:{...na.basics,...na.custom(t)}}});return n.filters=[a],{render({width:c,height:l,from:f,to:u,progress:m}){return(n.width!==c||n.height!==l)&&(n.setSize({width:c,height:l}),o.source.resize(c,l)),i.resource=f,s.resource=u,i.update(),s.update(),a.resources.uniforms.uniforms.progress=m,e.render({container:n,target:o,clear:!1,width:c,height:l}),o}}}var ni=class{pixi;onPointerDown=ke();onPointerMove=ke();onPointerUp=ke();onDispose=ke();static async setup(){let e=await Os({width:1920,height:1080,preference:"webgl",background:"black",preferWebGLVersion:2}),t=new _i;return t.interactive=!0,new this({renderer:e,stage:t})}constructor(e){this.pixi=e}#e=new Map;#t=new Map;#r=new WeakMap;async composite(e){let{stage:t,renderer:n}=this.pixi;this.#d(this.#m(e));let{dispose:o}=await this.#n(e,t);n.render(t);let i=new VideoFrame(n.canvas,{timestamp:0,duration:0});return o(),i}getActiveObject(e){return this.#t.get(e)?.sprite}async#n(e,t){if(Array.isArray(e)){let n=[];for(let o of[...e].reverse()){let i=await this.#n(o,t);n.push(i.dispose)}return{dispose:()=>n.forEach(o=>o())}}switch(e.kind){case"text":return this.#o(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:()=>{}}}}#o(e,t){let n=this.#f(e);return this.#c(n,e.matrix),this.#a(n,e.alpha),this.#l(n,e.crop),this.#u(n,e.filters),t.addChild(n),{dispose:()=>{}}}#i(e,t){let n=this.#f(e);n.texture&&n.texture!==ne.EMPTY&&n.texture.destroy(!0);let o=ne.from(e.frame);return n.texture=o,this.#c(n,e.matrix),this.#a(n,e.alpha),this.#l(n,e.crop),this.#u(n,e.filters),t.addChild(n),{dispose:()=>{e.frame.close()}}}#s({from:e,to:t,progress:n,name:o},i){let a=(this.#e.get(o)??(this.#e.set(o,Hm({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 Xt(a);return i.addChild(c),{dispose:()=>c.destroy(!1)}}#c(e,t){if(!t)return;let n=Mm(t);e.setFromMatrix(n)}#a(e,t){e.alpha=t??1}#l(e,t){let n=this.#r.get(e);if(n&&(e.mask===n&&(e.mask=null),n.removeFromParent(),n.clear()),!t||t.every(h=>h===0))return;let[o,i,s,a]=t,c=e.mask;e.mask=null;let l=e.getLocalBounds();e.mask=c;let f=l.x+l.width*a,u=l.y+l.height*o,m=l.width*Math.max(0,1-a-i),d=l.height*Math.max(0,1-o-s),p=n??new Ai;p.clear(),p.beginFill(16777215),p.drawRect(f,u,m,d),p.endFill(),e.addChild(p),e.mask=p,this.#r.set(e,p)}#u(e,t){if(!t?.length){e.filters=null;return}e.filters=t.map(n=>{switch(n.type){case"ColorMatrixFilter":{let{matrix:o,...i}=n.params??{},s=new Ut(i);return o&&(s.matrix=o),s}case"EmbossFilter":return new Ir(n.params?.strength);case"PixelateFilter":return new Fr(n.params?.size);default:{let o=Om(n.type);return o?new o(n.params):void 0}}}).filter(n=>!!n)}#f(e){let t=this.#t.get(e.id);if(t)return t.sprite;switch(e.kind){case"text":{let n=new xn({text:e.content,style:e.style});n.eventMode="static";let o=a=>this.onPointerDown.publish({event:a,id:e.id,object:n}),i=a=>this.onPointerUp.publish({event:a,id:e.id,object:n}),s=a=>this.onPointerUp.publish({event:a,id:e.id,object:n});return n.on("pointerdown",o),n.on("pointerup",i),n.on("pointermove",s),this.#t.set(e.id,{sprite:n,dispose:()=>{this.onDispose.publish({id:e.id,object:n}),n.off("pointermove",s),n.off("pointerdown",o),n.off("pointerup",i)}}).get(e.id)?.sprite}case"image":{let n=new Xt;n.eventMode="static";let o=a=>this.onPointerDown.publish({event:a,id:e.id,object:n}),i=a=>this.onPointerUp.publish({event:a,id:e.id,object:n}),s=a=>this.onPointerUp.publish({event:a,id:e.id,object:n});return n.on("pointerdown",o),n.on("pointermove",s),n.on("pointerup",i),this.#t.set(e.id,{sprite:n,dispose:()=>{this.onDispose.publish({id:e.id,object:n}),n.off("pointerdown",o),n.off("pointermove",s),n.off("pointerup",i)}}).get(e.id)?.sprite}}}#m(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}#d(e){for(let t of this.#t.keys())if(!e.has(t)){let{sprite:n,dispose:o}=this.#t.get(t);o(),n.destroy(!0),this.#t.delete(t)}}};var Wm=r=>Gn.host(e=>({async world(){r.count++}}));async function Ce(r){return r instanceof Blob?new pn(r):new hn(r)}var oi=class{machina;thread;compositor;static async setup(e){let t=new Uo,n=await Gn.thread({label:"OmnitoolDriver",workerUrl:e?.workerUrl??"/node_modules/@omnimedia/omnitool/x/driver/driver.worker.bundle.min.js",setupHost:Wm(t)}),o=await ni.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 he({source:await Ce(e),formats:Se}).getPrimaryAudioTrack();if(!n)throw new Error("primary audio track not found");return await n.computeDuration()}async getVideoDuration(e){return await(await new he({source:await Ce(e),formats:Se}).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[Jt]({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[Jt]({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(Pn.happy),a=this.thread.work.encode[Jt]({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 Hh={transform:{type:"transform",defaultTerp:"linear",channels:[{path:"position.x",type:"number",default:0,unit:"pixel"},{path:"position.y",type:"number",default:0,unit:"pixel"},{path:"scale.x",type:"number",default:1,unit:"scale"},{path:"scale.y",type:"number",default:1,unit:"scale"},{path:"rotation",type:"number",default:0,unit:"radian"}]}},vn={opacity:{type:"scalar",defaultTerp:"linear",channels:[{type:"number",default:1,unit:"ratio",range:[0,1]}]}},k4={...Hh,...vn};var b=(r,e,t,n)=>({type:"number",min:r,max:e,default:t,...n===void 0?{}:{step:n}}),rt=r=>({type:"color",default:r}),Ge=r=>({type:"boolean",default:r}),ii=(r,e)=>({type:"choice",options:r,default:e}),ee=r=>({type:"object",properties:r}),Wh=r=>({type:"array",items:r}),jm=[3,5,7,9,11,13,15,17,19,21,23,25],jh={TRANSPARENT:0,ORIGINAL:1,LOOP:2,CLAMP:3,MIRROR:4},q=()=>(r,e={})=>({type:r,schema:e}),si={adjustment:q()("AdjustmentFilter",{gamma:b(0,5,1),saturation:b(0,5,1),contrast:b(0,5,1),brightness:b(0,5,1),red:b(0,5,1),green:b(0,5,1),blue:b(0,5,1),alpha:b(0,1,1,.01)}),advancedBloom:q()("AdvancedBloomFilter",{threshold:b(.1,.9,.5,.01),bloomScale:b(.5,1.5,1,.01),brightness:b(.5,1.5,1,.01),blur:b(0,20,8,.1),quality:b(1,20,4,1)}),alpha:q()("AlphaFilter",{alpha:b(0,1,1,.01)}),ascii:q()("AsciiFilter",{size:b(2,20,8,1),color:rt("#ffffff"),replaceColor:Ge(!1)}),backdropBlur:q()("BackdropBlurFilter",{strength:b(0,100,8,.1),quality:b(1,10,4,1)}),bevel:q()("BevelFilter",{rotation:b(0,360,45,1),thickness:b(0,10,2,.1),lightColor:rt("#ffffff"),lightAlpha:b(0,1,.7,.01),shadowColor:rt("#000000"),shadowAlpha:b(0,1,.7,.01)}),bloom:q()("BloomFilter",{strength:ee({x:b(0,20,2,.1),y:b(0,20,2,.1)}),quality:b(1,20,4,1),resolution:b(.25,4,1,.01),kernelSize:ii([5,7,9,11,13,15],5)}),blur:q()("BlurFilter",{strength:b(0,100,8,.1),quality:b(1,10,4,1)}),bulgePinch:q()("BulgePinchFilter",{radius:b(0,1e3,100,1),strength:b(-1,1,1,.01),center:ee({x:b(0,1,.5,.01),y:b(0,1,.5,.01)})}),colorGradient:q()("ColorGradientFilter"),colorMatrix:q()("ColorMatrixFilter"),colorOverlay:q()("ColorOverlayFilter",{color:rt("#ff0000"),alpha:b(0,1,.5,.01)}),colorReplace:q()("ColorReplaceFilter",{originalColor:rt("#ff0000"),targetColor:rt("#000000"),tolerance:b(0,1,.4,.01)}),convolution:q()("ConvolutionFilter",{width:b(0,500,300,1),height:b(0,500,300,1),matrix:Wh([b(0,1,0),b(0,1,.5,.01),b(0,1,0),b(0,1,.5,.01),b(0,1,1,.01),b(0,1,.5,.01),b(0,1,0),b(0,1,.5,.01),b(0,1,0)])}),crossHatch:q()("CrossHatchFilter"),crt:q()("CRTFilter",{curvature:b(0,10,1,.01),lineWidth:b(0,5,3,.01),lineContrast:b(0,1,.3,.01),verticalLine:Ge(!1),noise:b(0,1,.2,.01),noiseSize:b(1,10,1,.1),vignetting:b(0,1,.3,.01),vignettingAlpha:b(0,1,1,.01),vignettingBlur:b(0,1,.3,.01),seed:b(0,1,0,.01),time:b(.5,20,.5,.01)}),dot:q()("DotFilter",{scale:b(.3,1,1,.01),angle:b(0,5,5,.01),grayscale:Ge(!0)}),dropShadow:q()("DropShadowFilter",{blur:b(0,20,2,.1),quality:b(1,20,3,1),alpha:b(0,1,.5,.01),offset:ee({x:b(-50,50,4,1),y:b(-50,50,4,1)}),color:rt("#000000"),shadowOnly:Ge(!1)}),emboss:q()("EmbossFilter",{strength:b(0,20,5,.1)}),glitch:q()("GlitchFilter",{slices:b(0,64,5,1),seed:b(0,1,.5,.01),offset:b(-400,400,100,1),direction:b(-180,180,0,1),fillMode:ii(jh,"LOOP"),average:Ge(!1),minSize:b(0,64,8,1),sampleSize:b(1,2048,512,1),red:ee({x:b(-50,50,2,1),y:b(-50,50,2,1)}),blue:ee({x:b(-50,50,10,1),y:b(-50,50,-4,1)}),green:ee({x:b(-50,50,-10,1),y:b(-50,50,4,1)})}),glow:q()("GlowFilter",{distance:b(0,20,15,.1),innerStrength:b(0,20,0,.1),outerStrength:b(0,20,2,.1),color:rt("#ffffff"),quality:b(0,1,.2,.01),alpha:b(0,1,1,.01),knockout:Ge(!1)}),godray:q()("GodrayFilter",{time:b(0,1,0,.01),gain:b(0,1,.6,.01),lacunarity:b(0,5,2.75,.01),alpha:b(0,1,1,.01),parallel:Ge(!0),angle:b(-60,60,30,1),center:ee({x:b(-100,2012,956,1),y:b(-1e3,-100,-100,1)})}),grayscale:q()("GrayscaleFilter"),hslAdjustment:q()("HslAdjustmentFilter",{hue:b(-180,180,0,1),saturation:b(-1,1,0,.01),lightness:b(-1,1,0,.01),colorize:Ge(!1),alpha:b(0,1,1,.01)}),kawaseBlur:q()("KawaseBlurFilter",{strength:b(0,20,4,.1),quality:b(1,20,3,1),pixelSize:ee({x:b(0,10,1,.1),y:b(0,10,1,.1)})}),motionBlur:q()("MotionBlurFilter",{velocity:ee({x:b(-90,90,40,1),y:b(-90,90,40,1)}),kernelSize:ii(jm,15),offset:b(-150,150,0,1)}),multiColorReplace:q()("MultiColorReplaceFilter"),noise:q()("NoiseFilter",{noise:b(0,1,.5,.01),seed:b(.01,10,.5,.01)}),oldFilm:q()("OldFilmFilter",{sepia:b(0,1,.3,.01),noise:b(0,1,.3,.01),noiseSize:b(1,10,1,.1),scratch:b(-1,1,.5,.01),scratchDensity:b(0,1,.3,.01),scratchWidth:b(1,20,1,.1),vignetting:b(0,1,.3,.01),vignettingAlpha:b(0,1,1,.01),vignettingBlur:b(0,1,.3,.01)}),outline:q()("OutlineFilter",{thickness:b(0,10,4,.1),color:rt("#000000"),alpha:b(0,1,1,.01),knockout:Ge(!1)}),pixelate:q()("PixelateFilter",{size:ee({x:b(4,40,10,1),y:b(4,40,10,1)})}),radialBlur:q()("RadialBlurFilter",{angle:b(-180,180,20,1),radius:b(-1,1912,300,1),center:ee({x:b(0,1912,956,1),y:b(0,920,460,1)}),kernelSize:ii(jm,15)}),reflection:q()("ReflectionFilter",{mirror:Ge(!0),boundary:b(0,1,.5,.01),amplitude:ee({start:b(0,50,0,.1),end:b(0,50,20,.1)}),waveLength:ee({start:b(10,200,30,1),end:b(10,200,100,1)}),alpha:ee({start:b(0,1,1,.01),end:b(0,1,1,.01)}),time:b(0,20,0,.01)}),rgbSplit:q()("RGBSplitFilter",{red:ee({x:b(-20,20,-10,1),y:b(-20,20,0,1)}),blue:ee({x:b(-20,20,0,1),y:b(-20,20,0,1)}),green:ee({x:b(-20,20,0,1),y:b(-20,20,10,1)})}),shockwave:q()("ShockwaveFilter",{speed:b(500,2e3,500,1),amplitude:b(1,100,30,1),wavelength:b(2,400,160,1),brightness:b(.2,2,1,.01),radius:b(100,2e3,-1,1),center:ee({x:b(0,1912,956,1),y:b(0,920,460,1)})}),simplexNoise:q()("SimplexNoiseFilter",{strength:b(0,1,.5,.01),noiseScale:b(0,50,10,.1),offsetX:b(0,5,0,.01),offsetY:b(0,5,0,.01),offsetZ:b(0,5,0,.01),step:b(-1,1,-1,.01)}),tiltShift:q()("TiltShiftFilter",{blur:b(0,200,100,.1),gradientBlur:b(0,1e3,600,1),start:ee({x:b(0,1912,0,1),y:b(0,920,460,1)}),end:ee({x:b(0,1912,1912,1),y:b(0,920,460,1)})}),twist:q()("TwistFilter",{angle:b(-10,10,4,.01),radius:b(0,1912,200,1),offset:ee({x:b(0,1912,956,1),y:b(0,920,460,1)})}),zoomBlur:q()("ZoomBlurFilter",{strength:b(.01,.5,.1,.01),center:ee({x:b(0,1912,956,1),y:b(0,920,460,1)}),innerRadius:b(0,956,80,1),radius:b(0,956,-1,1)})};var V;(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.AnimatedSpatial=7]="AnimatedSpatial",r[r.Animation=8]="Animation",r[r.Transition=9]="Transition",r[r.TextStyle=10]="TextStyle",r[r.Filter=11]="Filter"})(V||(V={}));var ai;(function(r){r[r.Crossfade=0]="Crossfade"})(ai||(ai={}));var ci=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 he({formats:Se,source:await Ce(e)}).computeDuration();return Number(n.toFixed(5))}static async#e(e){let t=new he({formats:Se,source:await Ce(e)});return{audio:!!await t.getPrimaryAudioTrack(),video:!!await t.getPrimaryVideoTrack()}}};var li=class{#e=new _n;async store(e){let t=await ci.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,duration:t.duration});return t}require(e){return this.#e.require(e)}};var ui=class r{videoTrack;options;#e;#t=new Map;#r=[0,0];constructor(e,t){this.videoTrack=e,this.options=t,this.#e=new nn(e,t.canvasSinkOptions)}static async init(e,t){let o=await new he({formats:Se,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.#a())}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,f=n>c;!l&&!f||(this.#r=this.#n(e,2),this.#a())}#s=null;#c=!1;async#a(){if(this.#o(),this.#s){this.#c=!0;return}this.#s=this.#i(),await this.#s,this.#s=null,this.#c&&(this.#c=!1,await this.#a())}getThumbnail(e){return this.#t.get(e)}};function Xm(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),f=Math.max(l+1,Math.floor((c+1)*a)),u=0;for(let d=l;d<f&&d<r.length;d++)r[d]>u&&(u=r[d]);let m=u*e.height;o.fillRect(c,i-m/2,1,m)}return n}var oa=[2048,1024,512,256,128,64,32];async function Km(r,e){let t=await r.getAudioDuration(e)??0,n=r.decodeAudio({source:e}).readable,o=oa[oa.length-1],i=[],s=0,a=0,c=0;for await(let u of n){c||=u.sampleRate;let m=u.numberOfFrames,d=new Float32Array(m);u.copyTo(d,{planeIndex:0});for(let p=0;p<d.length;p++){let h=Math.abs(d[p]);h>s&&(s=h),a++,a>=o&&(i.push(s),s=0,a=0)}u.close()}a>0&&i.push(s);let l=new Float32Array(i),f=oa.map(u=>{let m=Math.max(1,Math.round(u/o)),d=m===1?l:Xh(l,m);return{samplesPerPeak:u,peaks:d,peaksPerSecond:c>0?c/u:0}});return{duration:t,levels:f}}function Xh(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 Kh=4096,fi=class r{#e=new Map;#t=[0,0];#r=[0,0];#n;#o;#i;#s=!1;color;duration;tileSize;tileHeight;preloadMargin;constructor(e,t,n){this.#o=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.#i=n.onChange}static async init(e,t,n={}){let{duration:o,levels:i}=await Km(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.#a())}get zoom(){return this.#n}get range(){return this.#r}#c([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>0,c=s<this.duration,l=!a||t>=i+o,f=!c||n<=s-o;l&&f||(this.#t=this.#c(e,this.preloadMargin),this.#a())}#a(){this.#s||(this.#s=!0,queueMicrotask(()=>{this.#s=!1,this.#l()}))}#l(){let[e,t]=this.#t,n=new Set,o=this.#f(),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.#m(n,e,t);return{startTime:e,endTime:t,peaks:o,canvas:Xm(o,{width:this.#d(e,t),height:this.tileHeight,color:this.color})}}#f(){return this.#o.find(e=>e.peaksPerSecond>=this.#n)??this.#o[this.#o.length-1]}#m(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)}#d(e,t){return Math.min(Kh,Math.max(1,Math.ceil((t-e)*this.#n)))}#p(){this.#i&&this.#i([...this.#e.values()].sort((e,t)=>e.startTime-t.startTime))}getTiles(){return this.#e}};var X=r=>r;var Er=r=>r;var Ym=()=>{let r=!1,e=Er(60),t=1e3/e,n=0,o=0,i=ke(),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}},$m=async(r,e)=>{let t=X(1e3/r.fps),n=r.duration/1e3,o=Math.ceil(n*r.fps);for(let i=0;i<o;i++){let s=X(i*t);await e(s,i)}};var ia=class{keys;index;constructor(e,t){this.keys=e,this.index=t}near(e){return this.keys[Math.max(0,Math.min(this.keys.length-1,this.index+e))][1]}},Qm=r=>r,yn=r=>Qm((e,t)=>r(e,t.near(0),t.near(1))),bn=(r,e,t)=>e+(t-e)*r,Yh={linear:yn(bn),ease:yn((r,e,t)=>{let n=r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2;return bn(n,e,t)}),easeIn:yn((r,e,t)=>bn(r*r*r,e,t)),easeOut:yn((r,e,t)=>bn(1-Math.pow(1-r,3),e,t)),bounce:yn((r,e,t)=>{let i=r<.36363636363636365?7.5625*r*r:r<.7272727272727273?7.5625*(r-.5454545454545454)**2+.75:r<.9090909090909091?7.5625*(r-.8181818181818182)**2+.9375:7.5625*(r-.9545454545454546)**2+.984375;return bn(i,e,t)}),catmullRom:Qm((r,e)=>{let t=e.near(-1),n=e.near(0),o=e.near(1),i=e.near(2),s=r*r,a=s*r;return .5*(2*n+(-t+o)*r+(2*t-5*n+4*o-i)*s+(-t+3*n-3*o+i)*a)})},Zm=(r,e,t,n)=>{let o=Yh[r];if(!o)throw new Error(`unknown terp "${r}"`);return o(e,new ia(t,n))};var Dr=(r,e,t,n=0)=>{if(e.length===0)return n;if(e.length===1)return e[0][1];let o=[...e].sort((u,m)=>u[0]-m[0]);if(r<=o[0][0])return o[0][1];let i=o[o.length-1];if(r>=i[0])return i[1];let s=0;for(let u=0;u<o.length-1;u++){let m=o[u],d=o[u+1];if(r>=m[0]&&r<=d[0]){s=u;break}}let[a]=o[s],[c]=o[s+1],l=c-a,f=l===0?0:(r-a)/l;return Zm(t,f,o,s)},$h=(r,e)=>[[Dr(r,e.track.position.x,e.terp),Dr(r,e.track.position.y,e.terp)],[Dr(r,e.track.scale.x,e.terp,1),Dr(r,e.track.scale.y,e.terp,1)],Dr(r,e.track.rotation,e.terp)],Jm=(r,e)=>Dr(r,e.track,e.terp),ed=(r,e)=>r.kind===V.AnimatedSpatial?$h(e,r.anim):r.transform;function rd(r){return"duration"in r}function nd(r){let e=[],t=new Map(r.timeline.items.map(n=>[n.id,n]));return sa(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 od(r,e,t,n){let o=Um;for(let i of e)o=td(r,i.item,o,i.localTime);return td(r,t,o,n)}function td(r,e,t,n){if("spatialId"in e&&e.spatialId){let o=r.get(e.spatialId);if(o?.enabled){let i=Rm(ed(o,n));return Bm(i,t)}}return t}function sa(r,e,t,n,o=[]){let i=e.get(r);if(i)switch(i.kind){case V.Stack:n.stack(i,t,o);for(let s of i.childrenIds)sa(s,e,t,n,[...o,{item:i,localTime:t}]);break;case V.Sequence:{n.sequence(i,t,o);let s=X(0);for(let a of i.childrenIds){let c=e.get(a);if(!c||!rd(c))continue;let l=X(s+c.duration);if(t>=l){s=l;continue}let f=X(Math.max(0,t-s));sa(a,e,f,n,[...o,{item:i,localTime:t}]),s=l}break}case V.Video:n.video(i,t,o);break;case V.Text:n.text(i,t,o);break;case V.Audio:n.audio(i,t,o);break}}function ze(r,e){let t=e.items.find(n=>n.id===r);if(!t)return X(0);switch(t.kind){case V.Sequence:{let n=t.childrenIds.map(i=>e.items.find(s=>s.id===i)).filter(Boolean),o=X(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===V.Transition){let a=n[i-1],c=n[i+1];if(a&&c&&a.kind!==V.Transition&&c.kind!==V.Transition){let l=ze(a.id,e),f=ze(c.id,e),u=Math.max(0,Math.min(s.duration,l,f));o=X(o-u)}continue}o=X(o+ze(s.id,e))}return o}case V.Stack:{let n=X(0);for(let o of t.childrenIds){let i=ze(o,e);i>n&&(n=i)}return n}default:return rd(t)?t.duration:X(0)}}function id(r,e,t){if(!("animationId"in e)||e.animationId===void 0)return 1;let n=r.items.get(e.animationId);return n?.enabled&&n.anims.opacity?Jm(t,n.anims.opacity):1}var Sn=r=>r;var mi=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 he({formats:Se,source:await Ce(this.resolveMedia(e))}),o=await n.getPrimaryVideoTrack(),s=!!o&&await o.canDecode()&&o?new sr(o):null;return this.#e.set(e,{input:n,sink:s}),s}};async function sd(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 ad(r,e,t,n){let o=Qh(r,e,t);if(!o)return[];let i=[...n,{item:e,localTime:t}];return o.isTransitioning?sd(o.transition,o.progress,Ht(r,o.outgoing,o.outgoingTime,i),Ht(r,o.incoming,o.incomingTime,i)):Ht(r,o.item,o.localTime,i)}function Qh(r,e,t){let n=e.childrenIds.map(i=>r.items.get(i)).filter(i=>!!i),o=X(0);for(let i=0;i<n.length;i++){let s=n[i];if(s.kind===V.Transition)continue;let a=o,c=ze(s.id,r.timeline),l=X(a+c),f=n[i+1];if(!(f?.kind===V.Transition)){if(t<l)return{isTransitioning:!1,item:s,localTime:X(t-a)};o=l;continue}let m=f,d=n[i+2];if(!d||d.kind===V.Transition){o=l;continue}let p=ze(d.id,r.timeline),h=Math.max(0,Math.min(m.duration,c,p)),x=X(l-h);if(t<x)return{isTransitioning:!1,item:s,localTime:X(t-a)};if(t<l){let y=X(t-x),v=X(t-a);return{isTransitioning:!0,incoming:d,outgoing:s,outgoingTime:v,incomingTime:y,progress:h>0?y/h:1,transition:m}}o=x,i++}return null}async function Ht(r,e,t,n){let o=od(r.items,n,e,t),i=id(r,e,t),s="spatialId"in e&&e.spatialId?r.items.get(e.spatialId)?.crop:void 0,a="filterIds"in e&&e.filterIds?e.filterIds.map(c=>r.items.get(c)).filter(c=>!!c?.enabled).map(c=>({type:c.type,params:c.params})):void 0;switch(e.kind){case V.Stack:{let c=[...n,{item:e,localTime:t}];return(await Promise.all(e.childrenIds.map(f=>r.items.get(f)).filter(f=>!!f).map(f=>Ht(r,f,t,c)))).flat()}case V.Sequence:return ad(r,e,t,n);case V.Video:{if(t<0||t>=e.duration)return[];let c=await r.videoSampler(e,t);return c?[{kind:"image",frame:c,matrix:o,alpha:i,crop:s,filters:a,id:e.id}]:[]}case V.Text:{if(t<0||t>=e.duration)return[];let c=e.styleId?r.items.get(e.styleId)?.style:void 0;return[{id:e.id,kind:"text",content:e.content,style:c,matrix:o,alpha:i,crop:s,filters:a}]}case V.Gap:return[{id:e.id,kind:"gap"}];default:return[]}}function cd(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 di(r,e){let t=new mi(r),n=e??cd(t);return{async sample(o,i){let s=new Map(o.items.map(c=>[c.id,c])),a=s.get(o.rootId);return a?Ht({videoSampler:n,timeline:o,items:s},a,i,[]):[]}}}var Or=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=di(this.resolveMedia,(o,i)=>{let s=ld(i),a=this.#t.get(o.id);if(!a){let c=this.resolveMedia(o.mediaHash),l=ld(X(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:f,value:u}=await i.read();if(f)return c=!0,null;let m=new VideoFrame(u);return u.close(),m};return{async next(f){if(s??=await l(),!!s)for(;;){a??=l();let u=await a;if(!u)return new VideoFrame(s);let m=s.timestamp??-1/0,d=u.timestamp??m;if(d<f){s.close(),s=u,a=null;continue}if(Math.abs(d-f)<Math.abs(m-f)){s.close(),s=u,a=null;continue}return new VideoFrame(s)}},async cancel(){let f=a;a=null,c=!0,(await f?.catch(()=>null))?.close(),s?.close(),s=null,o.cancel()}}}},ld=r=>Math.round(r*1e3);async function ud(r,e,t){return(await Promise.all(e.map(async({item:o,localTime:i})=>{if(o.kind!==V.Audio)return;let s=await r.getSink(o.mediaHash);if(!s)return;let a=o.start+i,c=Sn((t-a)/1e3),l=s.samples(a/1e3),f=await l.next();if(f.done)return;let u=f.value,m=l.next();return{offset:c,gain:o.gain??1,get currentSample(){return u},timelineTime:()=>Sn(c+u.timestamp),output:()=>({sample:u,timestamp:c+u.timestamp,gain:o.gain??1}),advance:async()=>{let d=await m;return d.done?!1:(u=d.value,m=l.next(),!0)}}}))).filter(o=>!!o)}var pi=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 he({formats:Se,source:await Ce(this.resolveMedia(e))}),o=await n.getPrimaryAudioTrack(),s=!!o&&await o.canDecode()&&o?new on(o):null;return this.#e.set(e,{input:n,sink:s}),s}};function fd(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 hi(r){let e=new pi(r);return{async*sampleAudio(t,n){let o=nd({timeline:t,from:n}),i=await ud(e,o,n);for(;i.length>0;){let{stream:s,index:a}=fd(i);yield s.output(),await s.advance()||i.splice(a,1)}}}}var gi=class{driver;timeline;resolveMedia;audioSampler;seekVisualSampler;playVisualSampler=null;#e=X(0);#t=null;#r=Ym();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=di(this.resolveMedia),this.audioSampler=hi(this.resolveMedia),this.#o()}update(e){this.timeline=e}get isPlaying(){return this.#r.isPlaying()}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(){if(!this.#r.isPlaying()){await this.audioContext.resume(),this.#e=this.currentTime,this.#t=this.audioContext.currentTime,this.#n?.abort(),this.#n=new AbortController;for(let e of this.audioNodes)e.stop();this.audioNodes.clear(),this.playVisualSampler=new Or(this.driver,this.resolveMedia,this.timeline),this.#r.play(),this.#i(this.#n.signal,Sn(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&&(this.playVisualSampler.cancel(),this.playVisualSampler=null)}get duration(){return ze(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 X(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,X(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 xi=class{driver;canvas;playback;#e=null;#t=null;constructor(e,t,n){this.driver=e,this.playback=new gi(e,n,t),this.canvas=e.compositor.pixi.renderer.canvas}async play(){await this.playback.start()}pause(){this.playback.pause()}seek(e){return this.#e=e,this.#t??=this.#r().finally(()=>this.#t=null)}setFPS(e){this.playback.setFps(Er(e))}get isSeeking(){return this.#t!==null}get isPlaying(){return this.playback.isPlaying}get duration(){return this.playback.duration}get currentTime(){return this.playback.currentTime}update(e){this.playback.update(e)}async#r(){for(;this.#e!==null;){let e=this.#e;this.#e=null;let t=await this.playback.seek(X(e));(await this.driver.composite(t)).close()}}};var Wt=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 De.toInteger(De.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:V.TextStyle,style:e};return this.register(t),t};spatial=(e,t)=>{let n={id:this.getId(),kind:V.Spatial,transform:e??this.transform(),crop:t,enabled:!0};return this.register(n),n};animatedSpatial=(e,t)=>{let n={id:this.getId(),kind:V.AnimatedSpatial,anim:e,crop:t,enabled:!0};return this.register(n),n};#t=e=>{let t={id:this.getId(),kind:V.Animation,anims:e,enabled:!0};return this.register(t),t};anim={scalar:(e,t)=>({terp:e,track:t}),vec2:(e,t)=>{let n={x:[],y:[]};for(let[o,[i,s]]of t)n.x.push([o,i]),n.y.push([o,s]);return{terp:e,track:n}},transform:(e,t)=>{let n={position:{x:[],y:[]},scale:{x:[],y:[]},rotation:[]};for(let[o,[i,s,a]]of t)n.position.x.push([o,i[0]]),n.position.y.push([o,i[1]]),n.scale.x.push([o,s[0]]),n.scale.y.push([o,s[1]]),n.rotation.push([o,a]);return{terp:e,track:n}}};#r=e=>{let t=o=>{let i={id:this.getId(),kind:V.Filter,type:e,params:o,enabled:!0};return this.register(i),i},n=((o,i)=>{let s=t(i),a={...o,filterIds:[...o.filterIds??[],s.id]};return this.set(o.id,a),a});return n.make=t,n};#n=()=>{let e=Object.entries(si).map(([t,n])=>[t,this.#r(n.type)]);return Object.fromEntries(e)};filter=this.#n();#o=e=>{let t=(o,i)=>this.#t({[e]:this.anim.scalar(o,i)}),n=((o,i,s)=>{let a=t(i,s),c={...o,animationId:a.id};return this.set(o.id,c),c});return n.make=t,n};#i=()=>{let e=Object.keys(vn).map(t=>[t,this.#o(t)]);return Object.fromEntries(e)};animate=this.#i();sequence=(...e)=>{let t={id:this.getId(),kind:V.Sequence,childrenIds:e.map(n=>n.id)};return this.register(t),t};stack=(...e)=>{let t={kind:V.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:V.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:V.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:V.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:V.Gap,duration:e};return this.register(t),t};transition={crossfade:e=>{let t={id:this.getId(),kind:V.Transition,effect:ai.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)}))}};function Zh(r){let e=((t,n)=>o=>r(o)(t(o),n));return e.make=t=>n=>r(n).make(t),e}function Jh(){let e=Object.keys(si).map(t=>[t,Zh(n=>n.filter[t])]);return Object.fromEntries(e)}var iF=Jh();function e0(r){let e=((t,n,o)=>i=>r(i)(t(i),n,o));return e.make=(t,n)=>o=>r(o).make(t,n),e}function t0(){let r=Object.keys(vn).map(e=>[e,e0(t=>t.animate[e])]);return Object.fromEntries(r)}var sF=t0();var vi=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),f=c.planes[0]?.length??0;for(;s+t<=l;)yield this.#r(i,s,o,n),s+=t;i.push({startFrame:l,endFrame:l+f,data:c.planes}),a=Math.max(a,l+f)}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,f=s.subarray(l,l+i);for(let u of e){let m=u.data[c];if(!m)continue;let d=Math.max(t,u.startFrame),p=Math.min(a,u.endFrame);if(d>=p)continue;let h=d-t,x=d-u.startFrame,y=p-d;for(let v=0;v<y;v++)f[h+v]+=m[x+v]}if(this.#t)for(let u=0;u<i;u++){let m=f[u];f[u]=m<-1?-1:m>1?1:m}}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 r0=(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),f=a-c;i[s]=r[c]*(1-f)+r[l]*f}return i},md=(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=r0(s,r.sampleRate,e);n[i]=a,o=a.length}return{data:n,frames:o}};var dd=(r,e)=>{if(e!==1)for(let t of r)for(let n=0;n<t.length;n++)t[n]*=e};function pd({timeline:r,resolveMedia:e}){let t=new vi,n=n0(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*n0(r,e){let t=hi(e);for await(let{sample:n,timestamp:o,gain:i}of t.sampleAudio(r,X(0))){let{data:s}=md(n,48e3);dd(s,i),yield{planes:s,sampleRate:48e3,timestamp:o},n.close()}}function hd({timeline:r,fps:e,driver:t,resolveMedia:n}){let o=new TransformStream,i=o.writable.getWriter(),s=new Or(t,n,r),a=1/e,c=ze(r.rootId,r);async function l(){await $m({fps:e,duration:c},async(f,u)=>{let m=await s.next(f),d=await t.composite(m),p=new VideoFrame(d,{timestamp:Math.round(u*a*1e6),duration:Math.round(a*1e6)});await i.write(p),d.close()}),await i.close()}return l(),o.readable}function gd(r){let e=pd({...r}),t=hd({...r});return r.driver.encode({video:t,audio:e,config:{audio:{codec:"opus",bitrate:128e3},video:{codec:"vp9",bitrate:1e6}}})}var yi=class{driver;resources=new li;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 Wt({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 xi(this.driver,t=>this.resources.require(t).url,e);render=async(e,t=30)=>gd({timeline:e,fps:Er(t),driver:this.driver,resolveMedia:n=>this.resources.require(n).url})};var bi=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=kn.fromBytes(n),i=ha.sigil.fromBytes(n);return new this(e,n,o,i)}};var Si=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 bi.make(o),s=t??i.nickname,a=URL.createObjectURL(e);return new this(a,o,e,s,i)}static async load(e){}};async function vd(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 Wt({timeline:r}),f=await e.playback(r);c.replaceChildren(f.canvas),n.disabled=!1,o.disabled=!1,n.addEventListener("click",()=>f.play()),o.addEventListener("click",()=>f.pause()),i.max=String(Math.ceil(f.duration));let u=!1;f.playback.onTick.on(()=>d(f.currentTime,f.duration));let m=(p,h)=>{a.textContent=`${xd(p)} / ${xd(h)}`};i.addEventListener("input",async()=>{u=!0;let p=Math.max(0,Math.min(+i.value,f.duration));m(p,f.duration),await f.seek(p)}),i.addEventListener("change",async()=>{u=!1;let p=Math.max(0,Math.min(+i.value,f.duration));await f.seek(p)});let d=(p,h)=>{let x=Math.max(0,Math.min(p,h));u||(i.value=String(Math.round(x)));let y=h?x/h*100:0;s.style.left=`${y}%`,m(x,h)};f.update(l.timeline)}function xd(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 bd(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 fi.init(r,e,{tileHeight:96,onChange:()=>s()}),s=()=>{let a=+o.value,c=yd(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*yd(a,i.duration)}px`,l.canvas.style.height="100%",l.canvas)))};o.oninput=s,i.range=[0,i.duration]}function yd(r,e){return e>0?r/e:0}async function aa(r,e){let t=new yi(r),{videoA:n}=await t.load({videoA:Si.make(e)});return{timeline:t.timeline(i=>{let s=i.text("content",{duration:3e3}),a=i.animate.opacity.make("easeIn",[[0,0],[700,1],[2200,1],[3e3,.35]]),c=i.textStyle({fill:"green",fontSize:100}),l=i.spatial(i.transform({position:[240,160],scale:[1.4,1.4],rotation:.08}),[.15,.1,.05,.2]),f=i.animatedSpatial(i.anim.transform("linear",[[0,i.transform({position:[-320,80],scale:[.7,.7]})],[1e3,i.transform({position:[120,80],scale:[1,1]})],[2e3,i.transform({position:[200,40],scale:[1.35,1.35],rotation:8})],[3e3,i.transform({position:[320,0],scale:[1.15,1.15],rotation:0})]])),u=i.video(n,{duration:3e3,start:1e3});return i.set(s.id,{styleId:c.id,spatialId:f.id,animationId:a.id}),i.set(u.id,{spatialId:l.id}),i.sequence(i.stack(s,u,i.audio(n,{duration:1e3})),i.gap(500),i.video(n,{duration:7e3,start:5e3}))}),omni:t}}async function Sd(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 f=await ui.init(r,{onChange(u){let m=u.sort((d,p)=>d.time-p.time);a.replaceChildren(...m.map(({time:d,canvas:p})=>o0(d,p.canvas)))},frequency:c,canvasSinkOptions:{width:80,height:50,fit:"fill"}});o.oninput=()=>{l=+o.value;let u=+t.value,m=u+l;f.range=[u,m],n.textContent=`visible time range: [${u}, ${m}]`},t.oninput=()=>{let u=+t.value,m=u+l;f.range=[u,m],n.textContent=`visible time range: [${u}, ${m}]`},i.oninput=()=>{f.frequency=1/+i.value,s.textContent=`frame every ${f.frequency.toFixed(3)} second (${i.value} frames per second)`},f.range=[10,10.5]}function o0(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 Td(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(m){let d=await r.composite([{id:0,kind:"image",frame:m},{id:1,kind:"text",content:"omnitool",style:{fontSize:50,fill:"green"}}]);return m.close(),o?.drawImage(d,0,0),d}}),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 Rr=await oi.setup({workerUrl:new URL("../driver/driver.worker.bundle.min.js",import.meta.url)}),i0=document.querySelector("[data-demo='transcode']"),s0=document.querySelector("[data-demo='filmstrip']"),a0=document.querySelector("[data-demo='waveform']"),wd=document.querySelector("[data-demo='playback']"),jt=document.querySelector("[data-demo='export']"),Cd=jt.querySelector("[data-action='export']"),Ti=null;await Rr.thread.work.hello(),Rr.machina.count===1?console.log("\u2705 driver works"):console.error("\u274C FAIL driver call didn't work");var Mr=(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"))},ca=(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,Mr(r,"running");try{await e(o,r),Mr(r,"done")}finally{n.disabled=!1}}})};ca(i0,async(r,e)=>{let t=e.querySelector(".demo-preview"),n=Td(Rr,r);t.replaceChildren(n.canvas),await n.run()});ca(s0,async(r,e)=>{await Sd(r,e)});ca(a0,async(r,e)=>{await bd(Rr,r,e)});{let r=wd.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;let{timeline:t,omni:n}=await aa(Rr,e);await vd(t,n,wd)})}{let r=jt.querySelector("input[type='file']");r.addEventListener("input",async()=>{let e=r.files?.[0];if(!e)return;Mr(jt,"running");let{timeline:t,omni:n}=await aa(Rr,e);Ti={timeline:t,omni:n},Cd.disabled=!1;let o=jt.querySelector(".demo-preview"),i=await n.playback(t);await i.seek(0),o.replaceChildren(i.canvas),Mr(jt,"done")})}Cd.addEventListener("click",async()=>{Ti&&(Mr(jt,"running"),await Ti.omni.render(Ti.timeline),Mr(jt,"done"))});
|
|
7326
7326
|
/*! Bundled license information:
|
|
7327
7327
|
|
|
7328
7328
|
mediabunny/dist/modules/src/misc.js:
|