@smoove/core 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/audio/asset.d.ts +0 -21
- package/dist/audio/asset.d.ts.map +0 -1
- package/dist/audio/asset.js +0 -2
- package/dist/audio/asset.js.map +0 -1
- package/dist/audio/audio-driver.d.ts +0 -34
- package/dist/audio/audio-driver.d.ts.map +0 -1
- package/dist/audio/audio-driver.js +0 -2
- package/dist/audio/audio-driver.js.map +0 -1
- package/dist/audio/audio-for-preview.d.ts +0 -12
- package/dist/audio/audio-for-preview.d.ts.map +0 -1
- package/dist/audio/audio-for-preview.js +0 -70
- package/dist/audio/audio-for-preview.js.map +0 -1
- package/dist/audio/audio-for-rendering.d.ts +0 -16
- package/dist/audio/audio-for-rendering.d.ts.map +0 -1
- package/dist/audio/audio-for-rendering.js +0 -32
- package/dist/audio/audio-for-rendering.js.map +0 -1
- package/dist/audio/audio-source-browser.d.ts +0 -30
- package/dist/audio/audio-source-browser.d.ts.map +0 -1
- package/dist/audio/audio-source-browser.js +0 -139
- package/dist/audio/audio-source-browser.js.map +0 -1
- package/dist/audio/audio-source.d.ts +0 -38
- package/dist/audio/audio-source.d.ts.map +0 -1
- package/dist/audio/audio-source.js +0 -2
- package/dist/audio/audio-source.js.map +0 -1
- package/dist/audio/index.d.ts +0 -45
- package/dist/audio/index.d.ts.map +0 -1
- package/dist/audio/index.js +0 -143
- package/dist/audio/index.js.map +0 -1
- package/dist/audio/mixer.d.ts +0 -43
- package/dist/audio/mixer.d.ts.map +0 -1
- package/dist/audio/mixer.js +0 -51
- package/dist/audio/mixer.js.map +0 -1
- package/dist/audio/types.d.ts +0 -31
- package/dist/audio/types.d.ts.map +0 -1
- package/dist/audio/types.js +0 -2
- package/dist/audio/types.js.map +0 -1
- package/dist/block.d.ts +0 -16
- package/dist/block.d.ts.map +0 -1
- package/dist/block.js +0 -173
- package/dist/block.js.map +0 -1
- package/dist/composition.d.ts.map +0 -1
- package/dist/composition.js.map +0 -1
- package/dist/easing.d.ts +0 -22
- package/dist/easing.d.ts.map +0 -1
- package/dist/easing.js +0 -59
- package/dist/easing.js.map +0 -1
- package/dist/emitter.d.ts +0 -7
- package/dist/emitter.d.ts.map +0 -1
- package/dist/emitter.js +0 -29
- package/dist/emitter.js.map +0 -1
- package/dist/environment.d.ts.map +0 -1
- package/dist/environment.js.map +0 -1
- package/dist/flex-engine.d.ts +0 -31
- package/dist/flex-engine.d.ts.map +0 -1
- package/dist/flex-engine.js +0 -186
- package/dist/flex-engine.js.map +0 -1
- package/dist/flex-types.d.ts +0 -165
- package/dist/flex-types.d.ts.map +0 -1
- package/dist/flex-types.js +0 -2
- package/dist/flex-types.js.map +0 -1
- package/dist/flex.d.ts +0 -26
- package/dist/flex.d.ts.map +0 -1
- package/dist/flex.js +0 -179
- package/dist/flex.js.map +0 -1
- package/dist/image.d.ts +0 -10
- package/dist/image.d.ts.map +0 -1
- package/dist/image.js +0 -156
- package/dist/image.js.map +0 -1
- package/dist/interpolate-colors.d.ts +0 -7
- package/dist/interpolate-colors.d.ts.map +0 -1
- package/dist/interpolate-colors.js +0 -240
- package/dist/interpolate-colors.js.map +0 -1
- package/dist/interpolate.d.ts +0 -12
- package/dist/interpolate.d.ts.map +0 -1
- package/dist/interpolate.js +0 -65
- package/dist/interpolate.js.map +0 -1
- package/dist/media-marker.d.ts +0 -19
- package/dist/media-marker.d.ts.map +0 -1
- package/dist/media-marker.js +0 -19
- package/dist/media-marker.js.map +0 -1
- package/dist/media-time.d.ts +0 -17
- package/dist/media-time.d.ts.map +0 -1
- package/dist/media-time.js +0 -17
- package/dist/media-time.js.map +0 -1
- package/dist/signal.d.ts +0 -10
- package/dist/signal.d.ts.map +0 -1
- package/dist/signal.js +0 -39
- package/dist/signal.js.map +0 -1
- package/dist/text.d.ts +0 -91
- package/dist/text.d.ts.map +0 -1
- package/dist/text.js +0 -704
- package/dist/text.js.map +0 -1
- package/dist/video/driver.d.ts +0 -31
- package/dist/video/driver.d.ts.map +0 -1
- package/dist/video/driver.js +0 -3
- package/dist/video/driver.js.map +0 -1
- package/dist/video/index.d.ts +0 -45
- package/dist/video/index.d.ts.map +0 -1
- package/dist/video/index.js +0 -276
- package/dist/video/index.js.map +0 -1
- package/dist/video/types.d.ts +0 -35
- package/dist/video/types.d.ts.map +0 -1
- package/dist/video/types.js +0 -2
- package/dist/video/types.js.map +0 -1
- package/dist/video/video-for-preview.d.ts +0 -12
- package/dist/video/video-for-preview.d.ts.map +0 -1
- package/dist/video/video-for-preview.js +0 -73
- package/dist/video/video-for-preview.js.map +0 -1
- package/dist/video/video-for-rendering.d.ts +0 -16
- package/dist/video/video-for-rendering.d.ts.map +0 -1
- package/dist/video/video-for-rendering.js +0 -45
- package/dist/video/video-for-rendering.js.map +0 -1
- package/dist/video/video-source-browser.d.ts +0 -37
- package/dist/video/video-source-browser.d.ts.map +0 -1
- package/dist/video/video-source-browser.js +0 -171
- package/dist/video/video-source-browser.js.map +0 -1
- package/dist/video/video-source.d.ts +0 -48
- package/dist/video/video-source.d.ts.map +0 -1
- package/dist/video/video-source.js +0 -2
- package/dist/video/video-source.js.map +0 -1
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { getMediaTime } from "./driver.js";
|
|
2
|
-
/**
|
|
3
|
-
* Deterministic, gated frame production — Remotion's `VideoForRendering`. Never
|
|
4
|
-
* plays in realtime: each tick seeks the source to the exact media time and
|
|
5
|
-
* holds a `delayRender` handle so `Composition.renderFrame()` waits for the
|
|
6
|
-
* decoded frame before the canvas is captured.
|
|
7
|
-
*/
|
|
8
|
-
export class RenderingVideoDriver {
|
|
9
|
-
ctx;
|
|
10
|
-
_lastMediaTime = Number.NaN;
|
|
11
|
-
constructor(ctx) {
|
|
12
|
-
this.ctx = ctx;
|
|
13
|
-
}
|
|
14
|
-
tick(localFrame) {
|
|
15
|
-
const { source, comp } = this.ctx;
|
|
16
|
-
if (!source.isReady) {
|
|
17
|
-
// The source isn't decodable yet; redraw so whatever is available shows.
|
|
18
|
-
this.ctx.redraw();
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
const mediaTime = getMediaTime(localFrame, this.ctx.timing);
|
|
22
|
-
if (mediaTime === this._lastMediaTime) {
|
|
23
|
-
this.ctx.redraw();
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
this._lastMediaTime = mediaTime;
|
|
27
|
-
const handle = comp.delayRender(`seek video -> ${mediaTime.toFixed(4)}s`);
|
|
28
|
-
source
|
|
29
|
-
.seek(mediaTime)
|
|
30
|
-
.then(() => {
|
|
31
|
-
this.ctx.redraw();
|
|
32
|
-
})
|
|
33
|
-
.catch((err) => {
|
|
34
|
-
console.error("[konva-motion] video seek failed during render:", err);
|
|
35
|
-
})
|
|
36
|
-
.finally(() => {
|
|
37
|
-
comp.continueRender(handle);
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
deactivate() {
|
|
41
|
-
this._lastMediaTime = Number.NaN;
|
|
42
|
-
}
|
|
43
|
-
dispose() { }
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=video-for-rendering.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-for-rendering.js","sourceRoot":"","sources":["../../src/video/video-for-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IAGF;IAFrB,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC;IAEpC,YAA6B,GAAuB;QAAvB,QAAG,GAAH,GAAG,CAAoB;IAAG,CAAC;IAExD,IAAI,CAAC,UAAkB;QACrB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,yEAAyE;YACzE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1E,MAAM;aACH,IAAI,CAAC,SAAS,CAAC;aACf,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACpB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,UAAU;QACR,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,OAAO,KAAU,CAAC;CACnB"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { SeekMode, VideoSource } from "./video-source.js";
|
|
2
|
-
/**
|
|
3
|
-
* Preview-mode {@link VideoSource}: wraps an `HTMLVideoElement` and drives it in
|
|
4
|
-
* realtime. The server renderer injects a different source via
|
|
5
|
-
* `VideoConfig.sourceFactory`.
|
|
6
|
-
*/
|
|
7
|
-
export declare class BrowserVideoSource implements VideoSource {
|
|
8
|
-
private readonly _el;
|
|
9
|
-
private _ready;
|
|
10
|
-
private readonly _readyCbs;
|
|
11
|
-
private readonly _frameCbs;
|
|
12
|
-
private _rvfcId;
|
|
13
|
-
private _rvfcRunning;
|
|
14
|
-
private _seeking;
|
|
15
|
-
private _pending;
|
|
16
|
-
constructor();
|
|
17
|
-
load(src: string): Promise<void>;
|
|
18
|
-
private _startFrameLoop;
|
|
19
|
-
get element(): CanvasImageSource | null;
|
|
20
|
-
get naturalWidth(): number;
|
|
21
|
-
get naturalHeight(): number;
|
|
22
|
-
get duration(): number;
|
|
23
|
-
get currentTime(): number;
|
|
24
|
-
get isReady(): boolean;
|
|
25
|
-
seek(timeSeconds: number, mode?: SeekMode): Promise<void>;
|
|
26
|
-
/** Issue the pending seek if none is in flight; chains the latest target after each completes. */
|
|
27
|
-
private _drainSeek;
|
|
28
|
-
play(): Promise<void>;
|
|
29
|
-
pause(): void;
|
|
30
|
-
setMuted(muted: boolean): void;
|
|
31
|
-
setVolume(volume: number): void;
|
|
32
|
-
setPlaybackRate(rate: number): void;
|
|
33
|
-
onReady(cb: () => void): () => void;
|
|
34
|
-
onFrame(cb: () => void): () => void;
|
|
35
|
-
destroy(): void;
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=video-source-browser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-source-browser.d.ts","sourceRoot":"","sources":["../../src/video/video-source-browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQ/D;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,YAAY,CAAS;IAK7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA+E;;IAY/F,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBhC,OAAO,CAAC,eAAe;IAWvB,IAAI,OAAO,IAAI,iBAAiB,GAAG,IAAI,CAEtC;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,QAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpE,kGAAkG;IAClG,OAAO,CAAC,UAAU;IA6BlB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,IAAI;IAIb,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI9B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IASnC,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAKnC,OAAO,IAAI,IAAI;CAYhB"}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Preview-mode {@link VideoSource}: wraps an `HTMLVideoElement` and drives it in
|
|
3
|
-
* realtime. The server renderer injects a different source via
|
|
4
|
-
* `VideoConfig.sourceFactory`.
|
|
5
|
-
*/
|
|
6
|
-
export class BrowserVideoSource {
|
|
7
|
-
_el;
|
|
8
|
-
_ready = false;
|
|
9
|
-
_readyCbs = new Set();
|
|
10
|
-
_frameCbs = new Set();
|
|
11
|
-
_rvfcId = null;
|
|
12
|
-
_rvfcRunning = false;
|
|
13
|
-
// Seek coalescing: keep at most one seek in flight. Rapid scrubbing only ever
|
|
14
|
-
// lands the latest target — intermediate ones are dropped — so the backlog
|
|
15
|
-
// never grows (which is what makes scrubbing a large clip degrade over time).
|
|
16
|
-
_seeking = false;
|
|
17
|
-
_pending = null;
|
|
18
|
-
constructor() {
|
|
19
|
-
const el = document.createElement("video");
|
|
20
|
-
el.crossOrigin = "anonymous";
|
|
21
|
-
el.playsInline = true;
|
|
22
|
-
el.preload = "auto";
|
|
23
|
-
// Muted so the browser allows programmatic play()/seek before any user gesture.
|
|
24
|
-
el.muted = true;
|
|
25
|
-
this._el = el;
|
|
26
|
-
}
|
|
27
|
-
load(src) {
|
|
28
|
-
return new Promise((resolve, reject) => {
|
|
29
|
-
const onReady = () => {
|
|
30
|
-
cleanup();
|
|
31
|
-
this._ready = true;
|
|
32
|
-
this._startFrameLoop();
|
|
33
|
-
for (const cb of this._readyCbs)
|
|
34
|
-
cb();
|
|
35
|
-
resolve();
|
|
36
|
-
};
|
|
37
|
-
const onErr = () => {
|
|
38
|
-
cleanup();
|
|
39
|
-
reject(new Error(`Failed to load video: ${src}`));
|
|
40
|
-
};
|
|
41
|
-
const cleanup = () => {
|
|
42
|
-
this._el.removeEventListener("loadeddata", onReady);
|
|
43
|
-
this._el.removeEventListener("error", onErr);
|
|
44
|
-
};
|
|
45
|
-
this._el.addEventListener("loadeddata", onReady);
|
|
46
|
-
this._el.addEventListener("error", onErr);
|
|
47
|
-
this._el.src = src;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
_startFrameLoop() {
|
|
51
|
-
if (this._rvfcRunning)
|
|
52
|
-
return;
|
|
53
|
-
if (typeof this._el.requestVideoFrameCallback !== "function")
|
|
54
|
-
return;
|
|
55
|
-
this._rvfcRunning = true;
|
|
56
|
-
const tick = () => {
|
|
57
|
-
for (const cb of this._frameCbs)
|
|
58
|
-
cb();
|
|
59
|
-
this._rvfcId = this._el.requestVideoFrameCallback?.(tick) ?? null;
|
|
60
|
-
};
|
|
61
|
-
this._rvfcId = this._el.requestVideoFrameCallback(tick);
|
|
62
|
-
}
|
|
63
|
-
get element() {
|
|
64
|
-
return this._ready ? this._el : null;
|
|
65
|
-
}
|
|
66
|
-
get naturalWidth() {
|
|
67
|
-
return this._el.videoWidth;
|
|
68
|
-
}
|
|
69
|
-
get naturalHeight() {
|
|
70
|
-
return this._el.videoHeight;
|
|
71
|
-
}
|
|
72
|
-
get duration() {
|
|
73
|
-
return Number.isFinite(this._el.duration) ? this._el.duration : 0;
|
|
74
|
-
}
|
|
75
|
-
get currentTime() {
|
|
76
|
-
return this._el.currentTime;
|
|
77
|
-
}
|
|
78
|
-
get isReady() {
|
|
79
|
-
return this._ready;
|
|
80
|
-
}
|
|
81
|
-
seek(timeSeconds, mode = "precise") {
|
|
82
|
-
const clamped = Math.max(0, this.duration > 0 ? Math.min(this.duration, timeSeconds) : timeSeconds);
|
|
83
|
-
// No-op seek with nothing in flight: already there, resolve immediately.
|
|
84
|
-
if (!this._seeking && Math.abs(this._el.currentTime - clamped) <= 1e-4) {
|
|
85
|
-
return Promise.resolve();
|
|
86
|
-
}
|
|
87
|
-
return new Promise((resolve) => {
|
|
88
|
-
if (this._pending) {
|
|
89
|
-
// Supersede the queued target — only the latest scrub position matters.
|
|
90
|
-
this._pending.time = clamped;
|
|
91
|
-
this._pending.mode = mode;
|
|
92
|
-
this._pending.resolvers.push(resolve);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this._pending = { time: clamped, mode, resolvers: [resolve] };
|
|
96
|
-
}
|
|
97
|
-
this._drainSeek();
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/** Issue the pending seek if none is in flight; chains the latest target after each completes. */
|
|
101
|
-
_drainSeek() {
|
|
102
|
-
if (this._seeking || !this._pending)
|
|
103
|
-
return;
|
|
104
|
-
const { time, mode, resolvers } = this._pending;
|
|
105
|
-
this._pending = null;
|
|
106
|
-
if (Math.abs(this._el.currentTime - time) <= 1e-4) {
|
|
107
|
-
for (const r of resolvers)
|
|
108
|
-
r();
|
|
109
|
-
this._drainSeek();
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
this._seeking = true;
|
|
113
|
-
const onSeeked = () => {
|
|
114
|
-
this._el.removeEventListener("seeked", onSeeked);
|
|
115
|
-
this._seeking = false;
|
|
116
|
-
for (const r of resolvers)
|
|
117
|
-
r();
|
|
118
|
-
// A newer target may have arrived mid-seek — land it now.
|
|
119
|
-
this._drainSeek();
|
|
120
|
-
};
|
|
121
|
-
this._el.addEventListener("seeked", onSeeked);
|
|
122
|
-
// fastSeek jumps to the nearest keyframe — much snappier for scrubbing a
|
|
123
|
-
// large clip. Fall back to a precise currentTime seek when unavailable.
|
|
124
|
-
if (mode === "fast" && typeof this._el.fastSeek === "function") {
|
|
125
|
-
this._el.fastSeek(time);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
this._el.currentTime = time;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
play() {
|
|
132
|
-
return this._el.play();
|
|
133
|
-
}
|
|
134
|
-
pause() {
|
|
135
|
-
this._el.pause();
|
|
136
|
-
}
|
|
137
|
-
setMuted(muted) {
|
|
138
|
-
this._el.muted = muted;
|
|
139
|
-
}
|
|
140
|
-
setVolume(volume) {
|
|
141
|
-
this._el.volume = Math.max(0, Math.min(1, volume));
|
|
142
|
-
}
|
|
143
|
-
setPlaybackRate(rate) {
|
|
144
|
-
this._el.playbackRate = rate;
|
|
145
|
-
}
|
|
146
|
-
onReady(cb) {
|
|
147
|
-
if (this._ready) {
|
|
148
|
-
cb();
|
|
149
|
-
return () => { };
|
|
150
|
-
}
|
|
151
|
-
this._readyCbs.add(cb);
|
|
152
|
-
return () => this._readyCbs.delete(cb);
|
|
153
|
-
}
|
|
154
|
-
onFrame(cb) {
|
|
155
|
-
this._frameCbs.add(cb);
|
|
156
|
-
return () => this._frameCbs.delete(cb);
|
|
157
|
-
}
|
|
158
|
-
destroy() {
|
|
159
|
-
if (this._rvfcId !== null && typeof this._el.cancelVideoFrameCallback === "function") {
|
|
160
|
-
this._el.cancelVideoFrameCallback(this._rvfcId);
|
|
161
|
-
}
|
|
162
|
-
this._el.pause();
|
|
163
|
-
this._el.removeAttribute("src");
|
|
164
|
-
this._el.load();
|
|
165
|
-
this._readyCbs.clear();
|
|
166
|
-
this._frameCbs.clear();
|
|
167
|
-
this._pending = null;
|
|
168
|
-
this._seeking = false;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=video-source-browser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-source-browser.js","sourceRoot":"","sources":["../../src/video/video-source-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type { Environment } from "../environment.js";
|
|
2
|
-
/** Seek precision: exact frame ("precise", default) vs. snappy nearest-keyframe ("fast", for scrubbing). */
|
|
3
|
-
export type SeekMode = "precise" | "fast";
|
|
4
|
-
/**
|
|
5
|
-
* Runtime-agnostic video source — the dependency-injection seam between the
|
|
6
|
-
* engine and the actual media decoder. The browser implementation
|
|
7
|
-
* ({@link BrowserVideoSource}) wraps an `HTMLVideoElement`; a server renderer
|
|
8
|
-
* (e.g. Bun + Skia Canvas) injects its own decoder-backed source that produces
|
|
9
|
-
* drawable frames on demand.
|
|
10
|
-
*/
|
|
11
|
-
export interface VideoSource {
|
|
12
|
-
load(src: string): Promise<void>;
|
|
13
|
-
/** Drawable surface for `Konva.Image`, or null until ready. */
|
|
14
|
-
readonly element: CanvasImageSource | null;
|
|
15
|
-
readonly naturalWidth: number;
|
|
16
|
-
readonly naturalHeight: number;
|
|
17
|
-
/** Duration in seconds, or 0 if unknown. */
|
|
18
|
-
readonly duration: number;
|
|
19
|
-
/** Current media playback position in seconds. */
|
|
20
|
-
readonly currentTime: number;
|
|
21
|
-
readonly isReady: boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Seek to a time in seconds. Resolves once the frame at that time has been
|
|
24
|
-
* decoded and is ready to draw — rendering `await`s this to gate frame
|
|
25
|
-
* capture; preview fires it and forgets.
|
|
26
|
-
*
|
|
27
|
-
* `mode: "fast"` requests an approximate, snappy seek (nearest keyframe) for
|
|
28
|
-
* scrubbing; the default `"precise"` lands on the exact frame.
|
|
29
|
-
*/
|
|
30
|
-
seek(timeSeconds: number, mode?: SeekMode): Promise<void>;
|
|
31
|
-
play(): Promise<void>;
|
|
32
|
-
pause(): void;
|
|
33
|
-
setMuted(muted: boolean): void;
|
|
34
|
-
setVolume(volume: number): void;
|
|
35
|
-
setPlaybackRate(rate: number): void;
|
|
36
|
-
/** Fires once when metadata + first frame are available. */
|
|
37
|
-
onReady(cb: () => void): () => void;
|
|
38
|
-
/** Fires whenever a new frame has been decoded and is ready to draw. */
|
|
39
|
-
onFrame(cb: () => void): () => void;
|
|
40
|
-
destroy(): void;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Factory for a {@link VideoSource}. Receives the resolved {@link Environment}
|
|
44
|
-
* so a single factory can pick an implementation (e.g. browser vs. decoder)
|
|
45
|
-
* based on whether we are rendering or previewing.
|
|
46
|
-
*/
|
|
47
|
-
export type VideoSourceFactory = (env: Environment) => VideoSource;
|
|
48
|
-
//# sourceMappingURL=video-source.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-source.d.ts","sourceRoot":"","sources":["../../src/video/video-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,4GAA4G;AAC5G,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACpC,wEAAwE;IACxE,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IACpC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,WAAW,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-source.js","sourceRoot":"","sources":["../../src/video/video-source.ts"],"names":[],"mappings":""}
|