@cutcraft/player 0.0.0-stage → 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bohdan Snisar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,103 @@
1
- # Temporary Holding Version
1
+ <p align="center"><img src="../../docs/public/logo.svg" width="64" alt="cutcut logo"></p>
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ # @cutcraft/player
4
+
5
+ The browser player for cut files. It takes a `ResolvedState` from `@cutcraft/kit`
6
+ and plays it: footage decoded with WebCodecs through mediabunny and composited
7
+ on one canvas, overlays rendered as React DOM above it, sound mixed and
8
+ clocked by Web Audio. The editor's preview and the model's filmstrip drive the
9
+ same `PlayerCore`; the export (`@cutcraft/render`) runs the same engine in Node
10
+ through `@cutcraft/player/engine` and `@cutcraft/player/overlays`, which have no
11
+ React layer, DOM or Web Audio in them.
12
+
13
+ ```tsx
14
+ import { collectModule, resolve } from "@cutcraft/kit";
15
+ import { Player } from "@cutcraft/player";
16
+ import * as file from "./video"; // the TSX file the model wrote
17
+
18
+ const state = resolve(collectModule(file), manifest);
19
+ <Player state={state} element={file.default(file.defaults)} media={{ interview: blob, bed: "/bed.ogg" }} controls />
20
+ ```
21
+
22
+ `media` maps asset ids to Blobs or URLs (or implements `MediaResolver`).
23
+ `element` is only needed for `<Layer>` interiors, which the resolver drops.
24
+
25
+ ## What it does
26
+
27
+ - **Clock.** Composition time is an anchor on `AudioContext.currentTime`
28
+ (`anchorTime + (now − anchorClock) × rate`), re-anchored on play, pause, seek
29
+ and rate change; it never accumulates drift. The render loop is
30
+ `requestAnimationFrame`; a tick that lands while a frame is in flight is
31
+ coalesced, and a tick on the same frame index only keeps decoders prefetching.
32
+ - **Decoding.** One mediabunny `Input` per asset, shared by every clip of it
33
+ and by nested compositions, ref-counted and closed when idle. Each clip near
34
+ the play head has a `ClipDecoder`: a `VideoSampleSink` stream feeding a
35
+ short queue for forward play, pre-decoded windows for reverse, single-frame
36
+ fetches at high speeds and while scrubbing, one retained frame per freeze.
37
+ A playing tick never waits for a frame; a seek does. A trim or speed drag
38
+ updates the decoder in place rather than reopening it, and a paused preview
39
+ repaints each drag step with what is decoded, then fetches the exact frame
40
+ once the gesture has been quiet for 120 ms.
41
+ - **Compositing.** `buildFramePlan(state, t)` is pure and deterministic: tracks
42
+ in document order (the first track is the bottom), each clip with its
43
+ animated transform, crop, fit, opacity, blend, filter and mask; transitions
44
+ draw the incoming clip over the outgoing one; adjustments re-filter what is
45
+ below them. `CanvasPainter` executes it. Titles, shapes, SVG, stickers,
46
+ layers and captions are DOM elements positioned with the same matrix math.
47
+ - **Audio.** `buildAudioPlan` lists every audio-bearing chunk in a window with
48
+ its gain envelope (volume, fades, automation, ducking, keyframes, mute and
49
+ solo). `AudioEngine` schedules each chunk once per play session, 200 ms
50
+ ahead, as an `AudioBufferSourceNode` with the right offset, duration and
51
+ `playbackRate = clipSpeed × rate`, automated along a speed-key ramp and
52
+ split around freeze holds, which are silent; PCM is decoded per source range with
53
+ `AudioBufferSink` and cached. Pause stops everything; seek reschedules once.
54
+ - **Addressability.** Every DOM element carries `data-el` and `data-kind`; the
55
+ root carries `data-time` and `data-frame`; the canvas is
56
+ `[data-el="composition"]`.
57
+ - **Determinism.** `seekTo(t)` and `renderFrame(t)` draw the exact frame for
58
+ `t`, paused or playing. The exporter steps through frames with
59
+ `Compositor.step(t)`, which keeps every decoder streaming.
60
+ - **Looking at the result.** `captureSheet(times, { columns })` returns a
61
+ labelled contact sheet of those frames, the way an agent or a test checks
62
+ a cut without exporting.
63
+
64
+ ## API
65
+
66
+ `PlayerCore` (framework-free): `play`, `pause`, `toggle`, `seekTo`,
67
+ `seekToFrame`, `renderFrame`, `captureSheet`, `getCurrentTime`,
68
+ `getCurrentFrame`, `isPlaying`, `duration`, `playbackRate` (0.25–4), `loop`, `muted`, `volume`,
69
+ `setState`, `attachCanvas`, `addEventListener` (`frameupdate`, `play`,
70
+ `pause`, `seeked`, `ended`, `ratechange`, `volumechange`, `error`),
71
+ `subscribeTime`, `dispose`. Every browser dependency is injectable
72
+ (`clock`, `audioOutput`, `frameSourceFactory`, `audioSourceFactory`,
73
+ `createCanvas`, `raf`, `setInterval`), which is how the unit tests run in jsdom.
74
+
75
+ React: `<Player>` with `controls`, `loop`, `autoPlay`, `initiallyMuted`,
76
+ `playbackRate`, `fit`, `onError`, `onFrame` and a `PlayerRef`; hooks
77
+ `usePlayer`, `useCompositionTime`, `useCompositionFrame`, `useLayerT`.
78
+ Mounting a Player installs the kit's `useT()` and `useLayer()`.
79
+
80
+ ## Not rendered yet
81
+
82
+ Transition types other than crossfade, dips to black or white, wipe, slide and push (drawn as a crossfade), effects that
83
+ have no CSS filter equivalent (sharpen, glow, …; vignette and grain are drawn),
84
+ colour wheels, curves and LUTs, matte masks, audio effects, pitch correction,
85
+ 3D text, most text animation presets (shown as a fade),
86
+ `background.mode: "blur"` under overlays that sit beneath the footage (the
87
+ plain colour), sticker packs and `file:` nested references. The
88
+ kit's `not-rendered` lint warning reports these in the file before anything
89
+ plays, from the same table (`RENDERED_*` in `@cutcraft/kit`) the player reads.
90
+
91
+ ## Tests
92
+
93
+ ```
94
+ pnpm --filter @cutcraft/player test # vitest over jsdom with fakes (part of `pnpm check`)
95
+ pnpm --filter @cutcraft/player test:e2e # Playwright: ffmpeg-generated media, Vite, headless Chromium
96
+ ```
97
+
98
+ The browser suite generates `bars.webm` (frame number encoded in a binary
99
+ strip), `tone.ogg`, `logo.png` and `solid.webm` into `e2e/app/public/`, then
100
+ checks seek accuracy, real-time playback on the audio clock, rate changes,
101
+ crossfade blending, DOM overlays and `useT`, image clips, ended/loop and
102
+ determinism. It needs `ffmpeg` and Playwright's Chromium (pinned to 1.56.1 to
103
+ match the preinstalled browser).
@@ -0,0 +1,131 @@
1
+ import { FitMode, LayerClock, Placement, ResolvedState, ResolvedTrack, Transform } from "@cutcraft/kit";
2
+ declare function frameIndex(t: number, fps: number): number;
3
+ declare function frameTime(frame: number, fps: number): number;
4
+ /** `mm:ss.ff` for a composition time, what the controls show and the contact sheet labels. */
5
+ declare function timecode(t: number, fps: number): string;
6
+ /** 0..1 progress through a placement, what `useT()` returns inside a Layer. */
7
+ declare function localT(p: Placement, t: number): number;
8
+ /** What `useLayer()` returns inside a Layer: progress plus real seconds. */
9
+ declare function layerClock(p: Placement, t: number, fps: number): LayerClock;
10
+ /**
11
+ * Source seconds a media placement shows at composition time `t`: in/out
12
+ * trim, constant speed or a speed-key ramp, reverse, and freeze holds.
13
+ * A freeze is an insert hold: it shows `at` over its window, then the clip
14
+ * resumes from where it stopped; the result is clamped to the trimmed range.
15
+ */
16
+ declare function placementSourceTime(p: Placement, children: readonly Placement[], t: number): number;
17
+ declare function nestedSourceTime(p: Placement, t: number): number;
18
+ interface TransitionRole {
19
+ readonly placement: Placement;
20
+ readonly role: "out" | "in";
21
+ /** 0..1 through the transition, eased by its curve. */
22
+ readonly progress: number;
23
+ }
24
+ interface VisibleItem {
25
+ readonly placement: Placement;
26
+ readonly track: ResolvedTrack;
27
+ readonly children: readonly Placement[];
28
+ readonly transition?: TransitionRole;
29
+ }
30
+ /** Visual, timed placements that show at `t`: tracks in document order (the first track is the bottom), items in track order. */
31
+ declare function visiblePlacements(state: ResolvedState, t: number): VisibleItem[];
32
+ declare function isVisibleAt(p: Placement, t: number, compositionDuration: number): boolean;
33
+ /** Placements that sit on a track, in track order; a multicam's generated clips follow their parent. */
34
+ declare function trackItems(state: ResolvedState, track: ResolvedTrack): Placement[];
35
+ interface DrawRect {
36
+ readonly x: number;
37
+ readonly y: number;
38
+ readonly w: number;
39
+ readonly h: number;
40
+ }
41
+ /** Row-major 2D affine matrix in the canvas/CSS `matrix(a, b, c, d, e, f)` convention. */
42
+ interface Matrix2D {
43
+ readonly a: number;
44
+ readonly b: number;
45
+ readonly c: number;
46
+ readonly d: number;
47
+ readonly e: number;
48
+ readonly f: number;
49
+ }
50
+ interface Layout {
51
+ /** Where the element lands in composition pixels before its transform. */
52
+ readonly rect: DrawRect;
53
+ /** Maps local element coordinates (0..rect.w, 0..rect.h) to composition coordinates. */
54
+ readonly matrix: Matrix2D;
55
+ /** Source sub-rectangle in source pixels, when cropped. */
56
+ readonly crop?: DrawRect;
57
+ readonly opacity: number;
58
+ }
59
+ declare const IDENTITY: Matrix2D;
60
+ declare function multiply(m: Matrix2D, n: Matrix2D): Matrix2D;
61
+ declare const translate: (x: number, y: number) => Matrix2D;
62
+ declare const scaleM: (sx: number, sy: number) => Matrix2D;
63
+ declare function rotate(deg: number): Matrix2D;
64
+ declare function matrixToCss(m: Matrix2D): string;
65
+ interface Box {
66
+ readonly width: number;
67
+ readonly height: number;
68
+ }
69
+ /** The fitted rectangle of a source inside the composition, centred. */
70
+ declare function fitRect(comp: Box, src: Box, fit: FitMode): DrawRect;
71
+ /**
72
+ * Lay out a source of `src` pixels in the composition: crop, fit, then the
73
+ * element transform (position offset, scale, rotation about the anchor).
74
+ */
75
+ declare function layoutRect(comp: Box, src: Box, fit: FitMode, transform?: Transform | undefined): Layout;
76
+ /** The matrix mapping an element's local pixels to the composition, given its untransformed rect. */
77
+ declare function transformMatrix(rect: DrawRect, t: Transform | undefined): Matrix2D;
78
+ /** The upright box around `rect` after `m`: where a rectangle of an element's local pixels lands in the composition. */
79
+ declare function boundsOf(rect: DrawRect, m: Matrix2D): DrawRect;
80
+ /** The transform with its keyframed properties evaluated at element-relative time `rel`. */
81
+ declare function animatedTransform(base: Transform | undefined, children: readonly Placement[], rel: number): Transform;
82
+ /** CSS for a DOM element laid out like `layoutRect` does: it sits at the origin with `transform-origin: 0 0`. */
83
+ declare function cssTransform(layout: Layout): string;
84
+ /** An entrance or exit as the schema writes it. */
85
+ interface GraphicAnimation {
86
+ readonly type: string;
87
+ readonly duration?: number;
88
+ readonly easing?: string;
89
+ }
90
+ /** A rectangle in the element's own pixels. */
91
+ interface ClipRect {
92
+ readonly x: number;
93
+ readonly y: number;
94
+ readonly w: number;
95
+ readonly h: number;
96
+ }
97
+ /**
98
+ * What an element's entrance and exit do to it at one moment, in its own pixels:
99
+ * an opacity factor, a matrix applied before its layout, the part of it shown
100
+ * (null for all of it) and how much of its strokes are drawn (null when not drawing).
101
+ */
102
+ interface Motion {
103
+ readonly opacity: number;
104
+ readonly matrix: Matrix2D;
105
+ readonly clip: readonly ClipRect[] | null;
106
+ readonly draw: number | null;
107
+ }
108
+ declare const STILL: Motion;
109
+ /**
110
+ * The entrance and exit of an element `rel` seconds into its `duration`, for a
111
+ * `width` by `height` box. Both can play at once on a short element; their
112
+ * effects multiply. Pop, bounce and elastic carry their own curve; the others
113
+ * follow the animation's easing (default ease-out).
114
+ */
115
+ declare function motionAt(enter: GraphicAnimation | undefined, exit: GraphicAnimation | undefined, rel: number, duration: number, width: number, height: number): Motion;
116
+ /** One animation at raw progress `x` (0 hidden, 1 fully shown). */
117
+ declare function effect(anim: GraphicAnimation, x: number, w: number, h: number): Motion;
118
+ /** Both effects at once: opacities and draw amounts multiply, matrices compose, clips intersect. */
119
+ declare function combine(a: Motion, b: Motion): Motion;
120
+ /** Kinds the overlay plane draws (as DOM in the preview, through Satori and skia in the export) rather than the canvas. */
121
+ declare const OVERLAY_KINDS: ReadonlySet<string>;
122
+ /**
123
+ * The tracks whose overlays draw beneath the footage: those below every
124
+ * visible track that holds footage, when one of them holds an overlay (a
125
+ * background graphic under the cut, say). Empty otherwise, and then every
126
+ * overlay draws above the footage as before. When it is not empty, the canvas
127
+ * holds only the footage over a transparent ground, and the composition
128
+ * background is painted beneath the backdrop instead.
129
+ */
130
+ declare function backdropTracks(state: ResolvedState): ReadonlySet<string>;
131
+ export { visiblePlacements as A, scaleM as C, VisibleItem as D, TransitionRole as E, nestedSourceTime as F, placementSourceTime as I, timecode as L, frameTime as M, layerClock as N, isVisibleAt as O, localT as P, rotate as S, translate as T, cssTransform as _, Motion as a, matrixToCss as b, effect as c, DrawRect as d, IDENTITY as f, boundsOf as g, animatedTransform as h, GraphicAnimation as i, frameIndex as j, trackItems as k, motionAt as l, Matrix2D as m, backdropTracks as n, STILL as o, Layout as p, ClipRect as r, combine as s, OVERLAY_KINDS as t, Box as u, fitRect as v, transformMatrix as w, multiply as x, layoutRect as y };
@@ -0,0 +1,3 @@
1
+ import { $ as postEffects, A as ImageFrameSource, At as FRAME_EPS, B as buildGainEnvelope, Bt as QUEUE_MAX, C as ClipDecoder, Ct as devWarn, D as ErrorFrame, Dt as DUCK_ATTACK_S, E as AssetSources, Et as AUDIO_PRIME_S, F as ManualClock, Ft as MAX_RATE, G as MaskSpec, Gt as SEEK_MODE_SPEED, H as BackgroundGradient, Ht as REVERSE_WINDOW_FRAMES, I as PerformanceClock, It as MIN_RATE, J as buildFramePlan, K as ResolveNested, Kt as SETTLE_MS, L as AudioOccurrence, Lt as MOUNT_AHEAD_S, M as defaultCreateCanvas, Mt as INPUT_IDLE_CLOSE_S, N as fromMap, Nt as LOOKAHEAD_S, O as ErrorFrameSource, Ot as DUCK_RELEASE_S, P as toResolver, Pt as MAX_OPEN_INPUTS, Q as filterString, R as GainPoint, Rt as PICK_EPS, S as DecoderPool, St as captureWarnings, T as AssetSourceDeps, Tt as AUDIO_CHUNK_S, U as DrawOp, Ut as REVERSE_WINDOW_S, V as duckIntervals, Vt as QUEUE_TARGET, W as FramePlan, Wt as SCHEDULER_MS, X as FilterResult, Y as compositionBackground, Z as PostEffect, _ as FrameSourceHooks, _t as MediaHandle, a as TickOptions, at as AudioOutput, b as mediabunnyFrameSourceFactory, bt as PlayerEvents, c as backgroundCss, ct as AudioSourceInfo, d as paintBackground, dt as Ctx2D, et as EASING_FN, f as setMatrix, ft as EnvelopePoint, g as mediabunnyAudioSourceFactory, gt as FrameSourceInfo, h as MediabunnyAudioSource, ht as FrameSourceFactory, i as FrameIntercept, it as AnyCanvas, j as copyFrame, jt as FRAME_WAIT_MS, k as ImageFrame, kt as ENVELOPE_STEP_S, l as backgroundFill, lt as Clock, m as traceMask, mt as FrameSource, n as Compositor, nt as hasKeyframes, o as CanvasPainter, ot as AudioSource, p as roundedRect, pt as Frame, q as blendOf, qt as UNMOUNT_BEHIND_S, r as CompositorDeps, rt as keyframedValue, s as PaintInputs, st as AudioSourceFactory, t as makeNestedResolver, tt as ease, u as coversCanvas, ut as CreateCanvas, v as MediabunnyFrameSource, vt as MediaResolver, w as DecodeMode, wt as AUDIO_CACHE_S, x as MediabunnyInputs, xt as ScheduledSource, y as SampleFrame, yt as PlayerErrorEvent, z as buildAudioPlan, zt as PLAY_PRIME_TIMEOUT_MS } from "./nested-Bd4Y7qrF.mjs";
2
+ import { A as visiblePlacements, C as scaleM, D as VisibleItem, E as TransitionRole, F as nestedSourceTime, I as placementSourceTime, L as timecode, M as frameTime, N as layerClock, O as isVisibleAt, P as localT, S as rotate, T as translate, _ as cssTransform, a as Motion, b as matrixToCss, c as effect, d as DrawRect, f as IDENTITY, g as boundsOf, h as animatedTransform, i as GraphicAnimation, j as frameIndex, k as trackItems, l as motionAt, m as Matrix2D, n as backdropTracks, o as STILL, p as Layout, r as ClipRect, s as combine, t as OVERLAY_KINDS, u as Box, v as fitRect, w as transformMatrix, x as multiply, y as layoutRect } from "./backdrop-BqrzCzTB.mjs";
3
+ export { AUDIO_CACHE_S, AUDIO_CHUNK_S, AUDIO_PRIME_S, AnyCanvas, AssetSourceDeps, AssetSources, AudioOccurrence, AudioOutput, AudioSource, AudioSourceFactory, AudioSourceInfo, BackgroundGradient, Box, CanvasPainter, ClipDecoder, ClipRect, Clock, Compositor, CompositorDeps, CreateCanvas, Ctx2D, DUCK_ATTACK_S, DUCK_RELEASE_S, DecodeMode, DecoderPool, DrawOp, DrawRect, EASING_FN, ENVELOPE_STEP_S, EnvelopePoint, ErrorFrame, ErrorFrameSource, FRAME_EPS, FRAME_WAIT_MS, FilterResult, Frame, FrameIntercept, FramePlan, FrameSource, FrameSourceFactory, FrameSourceHooks, FrameSourceInfo, GainPoint, GraphicAnimation, IDENTITY, INPUT_IDLE_CLOSE_S, ImageFrame, ImageFrameSource, LOOKAHEAD_S, Layout, MAX_OPEN_INPUTS, MAX_RATE, MIN_RATE, MOUNT_AHEAD_S, ManualClock, MaskSpec, Matrix2D, MediaHandle, MediaResolver, MediabunnyAudioSource, MediabunnyFrameSource, MediabunnyInputs, Motion, OVERLAY_KINDS, PICK_EPS, PLAY_PRIME_TIMEOUT_MS, PaintInputs, PerformanceClock, PlayerErrorEvent, PlayerEvents, PostEffect, QUEUE_MAX, QUEUE_TARGET, REVERSE_WINDOW_FRAMES, REVERSE_WINDOW_S, ResolveNested, SCHEDULER_MS, SEEK_MODE_SPEED, SETTLE_MS, STILL, SampleFrame, ScheduledSource, TickOptions, TransitionRole, UNMOUNT_BEHIND_S, VisibleItem, animatedTransform, backdropTracks, backgroundCss, backgroundFill, blendOf, boundsOf, buildAudioPlan, buildFramePlan, buildGainEnvelope, captureWarnings, combine, compositionBackground, copyFrame, coversCanvas, cssTransform, defaultCreateCanvas, devWarn, duckIntervals, ease, effect, filterString, fitRect, frameIndex, frameTime, fromMap, hasKeyframes, isVisibleAt, keyframedValue, layerClock, layoutRect, localT, makeNestedResolver, matrixToCss, mediabunnyAudioSourceFactory, mediabunnyFrameSourceFactory, motionAt, multiply, nestedSourceTime, paintBackground, placementSourceTime, postEffects, rotate, roundedRect, scaleM, setMatrix, timecode, toResolver, traceMask, trackItems, transformMatrix, translate, visiblePlacements };
@@ -0,0 +1,3 @@
1
+ import { $ as MIN_RATE, A as hasKeyframes, B as devWarn, C as transformMatrix, D as visiblePlacements, E as trackItems, F as localT, G as DUCK_RELEASE_S, H as AUDIO_CHUNK_S, I as nestedSourceTime, J as FRAME_WAIT_MS, K as ENVELOPE_STEP_S, L as placementSourceTime, M as frameIndex, N as frameTime, O as EASING_FN, P as layerClock, Q as MAX_RATE, R as timecode, S as scaleM, T as isVisibleAt, U as AUDIO_PRIME_S, V as AUDIO_CACHE_S, W as DUCK_ATTACK_S, X as LOOKAHEAD_S, Y as INPUT_IDLE_CLOSE_S, Z as MAX_OPEN_INPUTS, _ as fitRect, a as backdropTracks, at as REVERSE_WINDOW_FRAMES, b as multiply, c as combine, ct as SEEK_MODE_SPEED, d as filterString, et as MOUNT_AHEAD_S, f as postEffects, g as cssTransform, h as boundsOf, i as OVERLAY_KINDS, it as QUEUE_TARGET, j as keyframedValue, k as ease, l as effect, lt as SETTLE_MS, m as animatedTransform, n as buildFramePlan, nt as PLAY_PRIME_TIMEOUT_MS, ot as REVERSE_WINDOW_S, p as IDENTITY, q as FRAME_EPS, r as compositionBackground, rt as QUEUE_MAX, s as STILL, st as SCHEDULER_MS, t as blendOf, tt as PICK_EPS, u as motionAt, ut as UNMOUNT_BEHIND_S, v as layoutRect, w as translate, x as rotate, y as matrixToCss, z as captureWarnings } from "./frame-plan-BNwblf1s.mjs";
2
+ import { A as buildAudioPlan, C as ImageFrameSource, D as toResolver, E as fromMap, M as duckIntervals, O as ManualClock, S as ImageFrame, T as defaultCreateCanvas, _ as DecoderPool, a as backgroundFill, b as ErrorFrame, c as setMatrix, d as MediabunnyAudioSource, f as mediabunnyAudioSourceFactory, g as MediabunnyInputs, h as mediabunnyFrameSourceFactory, i as backgroundCss, j as buildGainEnvelope, k as PerformanceClock, l as roundedRect, m as SampleFrame, n as Compositor, o as coversCanvas, p as MediabunnyFrameSource, r as CanvasPainter, s as paintBackground, t as makeNestedResolver, u as traceMask, v as ClipDecoder, w as copyFrame, x as ErrorFrameSource, y as AssetSources } from "./nested-DSXA1q8d.mjs";
3
+ export { AUDIO_CACHE_S, AUDIO_CHUNK_S, AUDIO_PRIME_S, AssetSources, CanvasPainter, ClipDecoder, Compositor, DUCK_ATTACK_S, DUCK_RELEASE_S, DecoderPool, EASING_FN, ENVELOPE_STEP_S, ErrorFrame, ErrorFrameSource, FRAME_EPS, FRAME_WAIT_MS, IDENTITY, INPUT_IDLE_CLOSE_S, ImageFrame, ImageFrameSource, LOOKAHEAD_S, MAX_OPEN_INPUTS, MAX_RATE, MIN_RATE, MOUNT_AHEAD_S, ManualClock, MediabunnyAudioSource, MediabunnyFrameSource, MediabunnyInputs, OVERLAY_KINDS, PICK_EPS, PLAY_PRIME_TIMEOUT_MS, PerformanceClock, QUEUE_MAX, QUEUE_TARGET, REVERSE_WINDOW_FRAMES, REVERSE_WINDOW_S, SCHEDULER_MS, SEEK_MODE_SPEED, SETTLE_MS, STILL, SampleFrame, UNMOUNT_BEHIND_S, animatedTransform, backdropTracks, backgroundCss, backgroundFill, blendOf, boundsOf, buildAudioPlan, buildFramePlan, buildGainEnvelope, captureWarnings, combine, compositionBackground, copyFrame, coversCanvas, cssTransform, defaultCreateCanvas, devWarn, duckIntervals, ease, effect, filterString, fitRect, frameIndex, frameTime, fromMap, hasKeyframes, isVisibleAt, keyframedValue, layerClock, layoutRect, localT, makeNestedResolver, matrixToCss, mediabunnyAudioSourceFactory, mediabunnyFrameSourceFactory, motionAt, multiply, nestedSourceTime, paintBackground, placementSourceTime, postEffects, rotate, roundedRect, scaleM, setMatrix, timecode, toResolver, traceMask, trackItems, transformMatrix, translate, visiblePlacements };