@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 +21 -0
- package/README.md +102 -2
- package/dist/backdrop-BqrzCzTB.d.mts +131 -0
- package/dist/engine.d.mts +3 -0
- package/dist/engine.mjs +3 -0
- package/dist/frame-plan-BNwblf1s.mjs +1074 -0
- package/dist/index.d.mts +298 -0
- package/dist/index.mjs +1410 -0
- package/dist/layer-interiors-r4SeMbp2.d.mts +8 -0
- package/dist/nested-Bd4Y7qrF.d.mts +720 -0
- package/dist/nested-DSXA1q8d.mjs +1698 -0
- package/dist/overlays.d.mts +201 -0
- package/dist/overlays.mjs +3 -0
- package/dist/svg-element-BUXbz-U5.mjs +1736 -0
- package/fonts.css +23 -0
- package/package.json +67 -3
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
|
-
|
|
1
|
+
<p align="center"><img src="../../docs/public/logo.svg" width="64" alt="cutcut logo"></p>
|
|
2
2
|
|
|
3
|
-
|
|
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 };
|
package/dist/engine.mjs
ADDED
|
@@ -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 };
|