@dojo-video-engine/player 0.0.0-stage → 1.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 +91 -2
- package/dist/audio.d.ts +101 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +329 -0
- package/dist/audio.js.map +1 -0
- package/dist/index.d.ts +202 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +587 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { type Scene } from "@dojo-video-engine/schema";
|
|
2
|
+
import { type ResolvedAssets, type ResolveAssetsOptions, type ScratchSurfacePool, type Canvas2DStaticDisplayCache, type Canvas2DOpaqueExtensionRegistry } from "@dojo-video-engine/renderer-canvas2d";
|
|
3
|
+
import { type Canvas2DSceneRuntime } from "@dojo-video-engine/renderer-canvas2d/runtime";
|
|
4
|
+
import { type AudioPreview } from "./audio.js";
|
|
5
|
+
export { ChunkedWebAudioPreview, previewAudioChunkRange, WebAudioPreview, type AudioPreview, } from "./audio.js";
|
|
6
|
+
/**
|
|
7
|
+
* Maps wall-clock time to scene frames. This is the only place in the
|
|
8
|
+
* playback path where wall-clock time exists: rendering stays a pure function
|
|
9
|
+
* of (scene, frame). The clock is pure given injected timestamps, so playback
|
|
10
|
+
* timing is unit-testable without timers.
|
|
11
|
+
*
|
|
12
|
+
* Frames are integers in [0, durationInFrames). While playing, the frame at
|
|
13
|
+
* time `now` is anchored to the play() position: floor((now − anchorTime) /
|
|
14
|
+
* 1000 × fps) + anchorFrame. Pausing re-anchors; seeking re-anchors while
|
|
15
|
+
* preserving play state.
|
|
16
|
+
*/
|
|
17
|
+
export declare class FrameClock {
|
|
18
|
+
readonly fps: number;
|
|
19
|
+
readonly durationInFrames: number;
|
|
20
|
+
loop: boolean;
|
|
21
|
+
private anchorFrame;
|
|
22
|
+
private anchorTime;
|
|
23
|
+
private isPlaying;
|
|
24
|
+
constructor(options: {
|
|
25
|
+
fps: number;
|
|
26
|
+
durationInFrames: number;
|
|
27
|
+
loop?: boolean;
|
|
28
|
+
});
|
|
29
|
+
get playing(): boolean;
|
|
30
|
+
/** Starts (or restarts) playback at the current frame position. */
|
|
31
|
+
play(now: number): void;
|
|
32
|
+
/** Freezes the clock at the frame visible at `now`. */
|
|
33
|
+
pause(now: number): void;
|
|
34
|
+
/** Jumps to a frame (clamped to the scene range), preserving play state. */
|
|
35
|
+
seek(frame: number, now: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* The frame visible at wall time `now`, and whether non-looping playback
|
|
38
|
+
* has run past the final frame. Calling this never mutates the clock;
|
|
39
|
+
* the caller decides what to do at the end (pause, loop is internal).
|
|
40
|
+
*/
|
|
41
|
+
frameAt(now: number): {
|
|
42
|
+
frame: number;
|
|
43
|
+
ended: boolean;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export type PlayerEvent = "frame" | "play" | "pause" | "ended";
|
|
47
|
+
export type PlayerOptions = {
|
|
48
|
+
/** A 2D context sized to the scene; the player draws into it. */
|
|
49
|
+
context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;
|
|
50
|
+
scene: unknown;
|
|
51
|
+
/** Host-owned frame renderer (for example a worker). Requires audio:false;
|
|
52
|
+
* the host owns media resolution and renderer disposal. */
|
|
53
|
+
renderFrame?: (frame: number, signal: AbortSignal) => Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Pre-resolved assets. When omitted, createPlayer() resolves them and
|
|
56
|
+
* dispose() releases them; when provided, the caller owns their lifetime.
|
|
57
|
+
*/
|
|
58
|
+
assets?: ResolvedAssets;
|
|
59
|
+
/** Trusted extension definitions used when resolving extension nodes. */
|
|
60
|
+
extensions?: ResolveAssetsOptions["extensions"];
|
|
61
|
+
/** Require every extension definition to support worker execution. */
|
|
62
|
+
worker?: boolean;
|
|
63
|
+
/** Exact opaque handlers used for extension display preflight/execution. */
|
|
64
|
+
opaqueExtensionRegistry?: Canvas2DOpaqueExtensionRegistry;
|
|
65
|
+
/** Preview uses declared proxy sources by default. */
|
|
66
|
+
preferProxy?: boolean;
|
|
67
|
+
/** Decoder/cache/image memory limits forwarded to asset resolution. */
|
|
68
|
+
budget?: ResolveAssetsOptions["budget"];
|
|
69
|
+
assetPolicy?: ResolveAssetsOptions["assetPolicy"];
|
|
70
|
+
analysisCache?: ResolveAssetsOptions["analysisCache"];
|
|
71
|
+
fontCache?: ResolveAssetsOptions["fontCache"];
|
|
72
|
+
/** Cancels asset resolution and in-flight frame preparation. */
|
|
73
|
+
signal?: AbortSignal;
|
|
74
|
+
analyzeWaveforms?: boolean;
|
|
75
|
+
/** Reused for every frame; the caller retains ownership and must dispose it. */
|
|
76
|
+
scratchSurfacePool?: ScratchSurfacePool;
|
|
77
|
+
/** Caller-owned bounded static raster cache; Player never disposes it. */
|
|
78
|
+
staticDisplayCache?: Canvas2DStaticDisplayCache;
|
|
79
|
+
loop?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Audio preview. Defaults to a WebAudioPreview when the environment has
|
|
82
|
+
* AudioContext; pass `false` to disable sound, or your own AudioPreview.
|
|
83
|
+
* Preview audio is best-effort — the export is the audio source of truth.
|
|
84
|
+
*/
|
|
85
|
+
audio?: AudioPreview | false;
|
|
86
|
+
/** Injectable time source for tests; defaults to performance.now. */
|
|
87
|
+
now?: () => number;
|
|
88
|
+
/** Injectable frame scheduler for tests; defaults to requestAnimationFrame. */
|
|
89
|
+
requestFrame?: (callback: () => void) => number;
|
|
90
|
+
cancelFrame?: (handle: number) => void;
|
|
91
|
+
};
|
|
92
|
+
type PlayerRuntimeOwnedOption = "scene" | "assets" | "extensions" | "worker" | "opaqueExtensionRegistry" | "preferProxy" | "budget" | "assetPolicy" | "analysisCache" | "fontCache" | "analyzeWaveforms" | "scratchSurfacePool" | "staticDisplayCache";
|
|
93
|
+
/**
|
|
94
|
+
* Player options for an already-prepared Canvas2D runtime. Media resolution
|
|
95
|
+
* belongs to the runtime; the player only borrows its current Scene/assets.
|
|
96
|
+
*/
|
|
97
|
+
export type RuntimePlayerOptions = Omit<PlayerOptions, PlayerRuntimeOwnedOption>;
|
|
98
|
+
type PlayerLifecycle = {
|
|
99
|
+
onDisposeRequested?: () => void;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* A playing/seekable view of a scene on a canvas. Create with createPlayer().
|
|
103
|
+
*
|
|
104
|
+
* The render loop awaits prepareFrame() per displayed frame (video decode),
|
|
105
|
+
* so a slow decode never tears: the player skips to the latest target frame
|
|
106
|
+
* rather than rendering stale intermediates.
|
|
107
|
+
*/
|
|
108
|
+
export declare class Player {
|
|
109
|
+
readonly scene: Scene;
|
|
110
|
+
private readonly clock;
|
|
111
|
+
private readonly context;
|
|
112
|
+
private readonly externalRenderFrame;
|
|
113
|
+
private readonly assets;
|
|
114
|
+
private readonly ownsAssets;
|
|
115
|
+
private readonly now;
|
|
116
|
+
private readonly requestFrame;
|
|
117
|
+
private readonly cancelFrame;
|
|
118
|
+
private readonly signal;
|
|
119
|
+
private readonly scratchSurfacePool;
|
|
120
|
+
private readonly staticDisplayCache;
|
|
121
|
+
private readonly renderController;
|
|
122
|
+
private unlinkOptionSignal;
|
|
123
|
+
private listeners;
|
|
124
|
+
private renderedFrame;
|
|
125
|
+
private rafHandle;
|
|
126
|
+
private rendering;
|
|
127
|
+
private renderQueue;
|
|
128
|
+
private assetsReleased;
|
|
129
|
+
private disposed;
|
|
130
|
+
private disposalPromise;
|
|
131
|
+
private lastRenderError;
|
|
132
|
+
private errorListeners;
|
|
133
|
+
private audio;
|
|
134
|
+
private pendingAudio;
|
|
135
|
+
private readonly disposedAudio;
|
|
136
|
+
private audioReadyPromise;
|
|
137
|
+
private readonly textMeasureCache;
|
|
138
|
+
private onDisposeRequested;
|
|
139
|
+
/** @internal — use createPlayer(). */
|
|
140
|
+
constructor(scene: Scene, options: PlayerOptions, assets: ResolvedAssets | undefined, ownsAssets: boolean, lifecycle?: PlayerLifecycle);
|
|
141
|
+
get playing(): boolean;
|
|
142
|
+
/** The most recently rendered frame (−1 before the first render). */
|
|
143
|
+
get currentFrame(): number;
|
|
144
|
+
get loop(): boolean;
|
|
145
|
+
set loop(value: boolean);
|
|
146
|
+
/** Last asynchronous render-loop error, if playback stopped because of one. */
|
|
147
|
+
get error(): Error | null;
|
|
148
|
+
onError(listener: (error: Error) => void): () => void;
|
|
149
|
+
/**
|
|
150
|
+
* Resolves once the audio preview is attached, or once the player knows
|
|
151
|
+
* there will be none (silent scene, unsupported environment, mix failure).
|
|
152
|
+
* The mix is prepared off the critical path, so the first frame paints
|
|
153
|
+
* before sound exists; playback started earlier joins the audio clock the
|
|
154
|
+
* moment it attaches. Await this when audio must be live before play().
|
|
155
|
+
*/
|
|
156
|
+
get audioReady(): Promise<void>;
|
|
157
|
+
on(event: PlayerEvent, listener: (frame: number) => void): () => void;
|
|
158
|
+
play(): void;
|
|
159
|
+
pause(): void;
|
|
160
|
+
/** Jumps to a frame and renders it; resolves when the frame is on screen. */
|
|
161
|
+
seek(frame: number): Promise<void>;
|
|
162
|
+
/** Stops playback and releases player-owned assets. */
|
|
163
|
+
dispose(): void;
|
|
164
|
+
/** Stops playback and waits for audio/render work and owned media teardown. */
|
|
165
|
+
disposeAsync(): Promise<void>;
|
|
166
|
+
/** @internal — wired by createPlayer() after load() decides audibility. */
|
|
167
|
+
attachAudio(audio: AudioPreview): void;
|
|
168
|
+
/** @internal — binds preview preparation to the player lifecycle signal. */
|
|
169
|
+
loadAudio(audio: AudioPreview): Promise<boolean>;
|
|
170
|
+
/** @internal — clears a preview that resolved silent or failed to load. */
|
|
171
|
+
discardAudio(audio: AudioPreview): void;
|
|
172
|
+
private disposeAudioOnce;
|
|
173
|
+
/** @internal — wired by createPlayer(). */
|
|
174
|
+
setAudioReady(ready: Promise<void>): void;
|
|
175
|
+
/** @internal — first paint from createPlayer(). */
|
|
176
|
+
renderInitialFrame(): Promise<void>;
|
|
177
|
+
private scheduleTick;
|
|
178
|
+
private stopTicking;
|
|
179
|
+
private tick;
|
|
180
|
+
private renderFrame;
|
|
181
|
+
private performRenderFrame;
|
|
182
|
+
private beginDisposal;
|
|
183
|
+
private releaseOwnedAssets;
|
|
184
|
+
private handleRenderError;
|
|
185
|
+
private emit;
|
|
186
|
+
private assertAlive;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Validates the scene, resolves assets (unless provided), renders frame 0,
|
|
190
|
+
* and returns a ready Player.
|
|
191
|
+
*/
|
|
192
|
+
export declare function createPlayer(options: PlayerOptions): Promise<Player>;
|
|
193
|
+
/**
|
|
194
|
+
* Creates a player that borrows the current prepared Canvas2D runtime state.
|
|
195
|
+
*
|
|
196
|
+
* The compatibility scope stays open until the player is fully disposed, so
|
|
197
|
+
* the runtime cannot replace or release media while a frame/audio task still
|
|
198
|
+
* uses it. A runtime update/disposal or caller abort disposes the player and
|
|
199
|
+
* releases the scope before the newer runtime operation can continue.
|
|
200
|
+
*/
|
|
201
|
+
export declare function createPlayerFromRuntime(runtime: Canvas2DSceneRuntime, options: RuntimePlayerOptions): Promise<Player>;
|
|
202
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|