@smoove/core 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.
Files changed (307) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/animation/color.d.ts +9 -0
  4. package/dist/animation/color.d.ts.map +1 -0
  5. package/dist/animation/color.js +224 -0
  6. package/dist/animation/color.js.map +1 -0
  7. package/dist/animation/easing.d.ts +22 -0
  8. package/dist/animation/easing.d.ts.map +1 -0
  9. package/dist/animation/easing.js +59 -0
  10. package/dist/animation/easing.js.map +1 -0
  11. package/dist/animation/interpolate-colors.d.ts +7 -0
  12. package/dist/animation/interpolate-colors.d.ts.map +1 -0
  13. package/dist/animation/interpolate-colors.js +19 -0
  14. package/dist/animation/interpolate-colors.js.map +1 -0
  15. package/dist/animation/interpolate.d.ts +12 -0
  16. package/dist/animation/interpolate.d.ts.map +1 -0
  17. package/dist/animation/interpolate.js +65 -0
  18. package/dist/animation/interpolate.js.map +1 -0
  19. package/dist/audio/asset.d.ts +21 -0
  20. package/dist/audio/asset.d.ts.map +1 -0
  21. package/dist/audio/asset.js +2 -0
  22. package/dist/audio/asset.js.map +1 -0
  23. package/dist/audio/audio-driver.d.ts +34 -0
  24. package/dist/audio/audio-driver.d.ts.map +1 -0
  25. package/dist/audio/audio-driver.js +2 -0
  26. package/dist/audio/audio-driver.js.map +1 -0
  27. package/dist/audio/audio-for-preview.d.ts +12 -0
  28. package/dist/audio/audio-for-preview.d.ts.map +1 -0
  29. package/dist/audio/audio-for-preview.js +70 -0
  30. package/dist/audio/audio-for-preview.js.map +1 -0
  31. package/dist/audio/audio-for-rendering.d.ts +16 -0
  32. package/dist/audio/audio-for-rendering.d.ts.map +1 -0
  33. package/dist/audio/audio-for-rendering.js +32 -0
  34. package/dist/audio/audio-for-rendering.js.map +1 -0
  35. package/dist/audio/audio-source-browser.d.ts +30 -0
  36. package/dist/audio/audio-source-browser.d.ts.map +1 -0
  37. package/dist/audio/audio-source-browser.js +139 -0
  38. package/dist/audio/audio-source-browser.js.map +1 -0
  39. package/dist/audio/audio-source.d.ts +38 -0
  40. package/dist/audio/audio-source.d.ts.map +1 -0
  41. package/dist/audio/audio-source.js +2 -0
  42. package/dist/audio/audio-source.js.map +1 -0
  43. package/dist/audio/index.d.ts +45 -0
  44. package/dist/audio/index.d.ts.map +1 -0
  45. package/dist/audio/index.js +143 -0
  46. package/dist/audio/index.js.map +1 -0
  47. package/dist/audio/mixer.d.ts +43 -0
  48. package/dist/audio/mixer.d.ts.map +1 -0
  49. package/dist/audio/mixer.js +51 -0
  50. package/dist/audio/mixer.js.map +1 -0
  51. package/dist/audio/types.d.ts +31 -0
  52. package/dist/audio/types.d.ts.map +1 -0
  53. package/dist/audio/types.js +2 -0
  54. package/dist/audio/types.js.map +1 -0
  55. package/dist/block.d.ts +16 -0
  56. package/dist/block.d.ts.map +1 -0
  57. package/dist/block.js +173 -0
  58. package/dist/block.js.map +1 -0
  59. package/dist/composition.d.ts.map +1 -0
  60. package/dist/composition.js.map +1 -0
  61. package/dist/easing.d.ts +22 -0
  62. package/dist/easing.d.ts.map +1 -0
  63. package/dist/easing.js +59 -0
  64. package/dist/easing.js.map +1 -0
  65. package/dist/emitter.d.ts +7 -0
  66. package/dist/emitter.d.ts.map +1 -0
  67. package/dist/emitter.js +29 -0
  68. package/dist/emitter.js.map +1 -0
  69. package/dist/engine/composition.d.ts +182 -0
  70. package/dist/engine/composition.d.ts.map +1 -0
  71. package/dist/engine/composition.js +527 -0
  72. package/dist/engine/composition.js.map +1 -0
  73. package/dist/engine/emitter.d.ts +7 -0
  74. package/dist/engine/emitter.d.ts.map +1 -0
  75. package/dist/engine/emitter.js +29 -0
  76. package/dist/engine/emitter.js.map +1 -0
  77. package/dist/engine/environment.d.ts +30 -0
  78. package/dist/engine/environment.d.ts.map +1 -0
  79. package/dist/engine/environment.js +27 -0
  80. package/dist/engine/environment.js.map +1 -0
  81. package/dist/engine/offsets.d.ts +39 -0
  82. package/dist/engine/offsets.d.ts.map +1 -0
  83. package/dist/engine/offsets.js +54 -0
  84. package/dist/engine/offsets.js.map +1 -0
  85. package/dist/engine/runtime-defaults.d.ts +50 -0
  86. package/dist/engine/runtime-defaults.d.ts.map +1 -0
  87. package/dist/engine/runtime-defaults.js +77 -0
  88. package/dist/engine/runtime-defaults.js.map +1 -0
  89. package/dist/engine/sequence.d.ts +44 -0
  90. package/dist/engine/sequence.d.ts.map +1 -0
  91. package/dist/engine/sequence.js +101 -0
  92. package/dist/engine/sequence.js.map +1 -0
  93. package/dist/engine/series.d.ts +40 -0
  94. package/dist/engine/series.d.ts.map +1 -0
  95. package/dist/engine/series.js +58 -0
  96. package/dist/engine/series.js.map +1 -0
  97. package/dist/engine/signal.d.ts +10 -0
  98. package/dist/engine/signal.d.ts.map +1 -0
  99. package/dist/engine/signal.js +39 -0
  100. package/dist/engine/signal.js.map +1 -0
  101. package/dist/environment.d.ts.map +1 -0
  102. package/dist/environment.js.map +1 -0
  103. package/dist/flex-engine.d.ts +31 -0
  104. package/dist/flex-engine.d.ts.map +1 -0
  105. package/dist/flex-engine.js +186 -0
  106. package/dist/flex-engine.js.map +1 -0
  107. package/dist/flex-types.d.ts +165 -0
  108. package/dist/flex-types.d.ts.map +1 -0
  109. package/dist/flex-types.js +2 -0
  110. package/dist/flex-types.js.map +1 -0
  111. package/dist/flex.d.ts +26 -0
  112. package/dist/flex.d.ts.map +1 -0
  113. package/dist/flex.js +179 -0
  114. package/dist/flex.js.map +1 -0
  115. package/dist/image.d.ts +10 -0
  116. package/dist/image.d.ts.map +1 -0
  117. package/dist/image.js +156 -0
  118. package/dist/image.js.map +1 -0
  119. package/dist/index.d.ts +34 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +28 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/interpolate-colors.d.ts +7 -0
  124. package/dist/interpolate-colors.d.ts.map +1 -0
  125. package/dist/interpolate-colors.js +240 -0
  126. package/dist/interpolate-colors.js.map +1 -0
  127. package/dist/interpolate.d.ts +12 -0
  128. package/dist/interpolate.d.ts.map +1 -0
  129. package/dist/interpolate.js +65 -0
  130. package/dist/interpolate.js.map +1 -0
  131. package/dist/layout/block.d.ts +54 -0
  132. package/dist/layout/block.d.ts.map +1 -0
  133. package/dist/layout/block.js +186 -0
  134. package/dist/layout/block.js.map +1 -0
  135. package/dist/layout/contract.d.ts +41 -0
  136. package/dist/layout/contract.d.ts.map +1 -0
  137. package/dist/layout/contract.js +8 -0
  138. package/dist/layout/contract.js.map +1 -0
  139. package/dist/layout/flex/engine.d.ts +31 -0
  140. package/dist/layout/flex/engine.d.ts.map +1 -0
  141. package/dist/layout/flex/engine.js +186 -0
  142. package/dist/layout/flex/engine.js.map +1 -0
  143. package/dist/layout/flex/flex.d.ts +31 -0
  144. package/dist/layout/flex/flex.d.ts.map +1 -0
  145. package/dist/layout/flex/flex.js +175 -0
  146. package/dist/layout/flex/flex.js.map +1 -0
  147. package/dist/layout/flex/mixin.d.ts +52 -0
  148. package/dist/layout/flex/mixin.d.ts.map +1 -0
  149. package/dist/layout/flex/mixin.js +114 -0
  150. package/dist/layout/flex/mixin.js.map +1 -0
  151. package/dist/layout/flex/types.d.ts +31 -0
  152. package/dist/layout/flex/types.d.ts.map +1 -0
  153. package/dist/layout/flex/types.js +2 -0
  154. package/dist/layout/flex/types.js.map +1 -0
  155. package/dist/layout/image.d.ts +46 -0
  156. package/dist/layout/image.d.ts.map +1 -0
  157. package/dist/layout/image.js +198 -0
  158. package/dist/layout/image.js.map +1 -0
  159. package/dist/layout/shapes.d.ts +72 -0
  160. package/dist/layout/shapes.d.ts.map +1 -0
  161. package/dist/layout/shapes.js +29 -0
  162. package/dist/layout/shapes.js.map +1 -0
  163. package/dist/layout/text/font.d.ts +92 -0
  164. package/dist/layout/text/font.d.ts.map +1 -0
  165. package/dist/layout/text/font.js +166 -0
  166. package/dist/layout/text/font.js.map +1 -0
  167. package/dist/layout/text/geometry.d.ts +31 -0
  168. package/dist/layout/text/geometry.d.ts.map +1 -0
  169. package/dist/layout/text/geometry.js +81 -0
  170. package/dist/layout/text/geometry.js.map +1 -0
  171. package/dist/layout/text/text.d.ts +98 -0
  172. package/dist/layout/text/text.d.ts.map +1 -0
  173. package/dist/layout/text/text.js +676 -0
  174. package/dist/layout/text/text.js.map +1 -0
  175. package/dist/layout/text/types.d.ts +103 -0
  176. package/dist/layout/text/types.d.ts.map +1 -0
  177. package/dist/layout/text/types.js +2 -0
  178. package/dist/layout/text/types.js.map +1 -0
  179. package/dist/media/audio/asset.d.ts +21 -0
  180. package/dist/media/audio/asset.d.ts.map +1 -0
  181. package/dist/media/audio/asset.js +2 -0
  182. package/dist/media/audio/asset.js.map +1 -0
  183. package/dist/media/audio/audio-driver.d.ts +34 -0
  184. package/dist/media/audio/audio-driver.d.ts.map +1 -0
  185. package/dist/media/audio/audio-driver.js +2 -0
  186. package/dist/media/audio/audio-driver.js.map +1 -0
  187. package/dist/media/audio/audio-for-preview.d.ts +47 -0
  188. package/dist/media/audio/audio-for-preview.d.ts.map +1 -0
  189. package/dist/media/audio/audio-for-preview.js +232 -0
  190. package/dist/media/audio/audio-for-preview.js.map +1 -0
  191. package/dist/media/audio/audio-for-rendering.d.ts +16 -0
  192. package/dist/media/audio/audio-for-rendering.d.ts.map +1 -0
  193. package/dist/media/audio/audio-for-rendering.js +32 -0
  194. package/dist/media/audio/audio-for-rendering.js.map +1 -0
  195. package/dist/media/audio/audio-source-browser.d.ts +30 -0
  196. package/dist/media/audio/audio-source-browser.d.ts.map +1 -0
  197. package/dist/media/audio/audio-source-browser.js +139 -0
  198. package/dist/media/audio/audio-source-browser.js.map +1 -0
  199. package/dist/media/audio/audio-source-mediabunny.d.ts +45 -0
  200. package/dist/media/audio/audio-source-mediabunny.d.ts.map +1 -0
  201. package/dist/media/audio/audio-source-mediabunny.js +79 -0
  202. package/dist/media/audio/audio-source-mediabunny.js.map +1 -0
  203. package/dist/media/audio/audio-source.d.ts +38 -0
  204. package/dist/media/audio/audio-source.d.ts.map +1 -0
  205. package/dist/media/audio/audio-source.js +2 -0
  206. package/dist/media/audio/audio-source.js.map +1 -0
  207. package/dist/media/audio/index.d.ts +57 -0
  208. package/dist/media/audio/index.d.ts.map +1 -0
  209. package/dist/media/audio/index.js +170 -0
  210. package/dist/media/audio/index.js.map +1 -0
  211. package/dist/media/audio/mixer.d.ts +43 -0
  212. package/dist/media/audio/mixer.d.ts.map +1 -0
  213. package/dist/media/audio/mixer.js +51 -0
  214. package/dist/media/audio/mixer.js.map +1 -0
  215. package/dist/media/audio/shared-audio-context.d.ts +30 -0
  216. package/dist/media/audio/shared-audio-context.d.ts.map +1 -0
  217. package/dist/media/audio/shared-audio-context.js +68 -0
  218. package/dist/media/audio/shared-audio-context.js.map +1 -0
  219. package/dist/media/audio/types.d.ts +31 -0
  220. package/dist/media/audio/types.d.ts.map +1 -0
  221. package/dist/media/audio/types.js +2 -0
  222. package/dist/media/audio/types.js.map +1 -0
  223. package/dist/media/media-marker.d.ts +26 -0
  224. package/dist/media/media-marker.d.ts.map +1 -0
  225. package/dist/media/media-marker.js +26 -0
  226. package/dist/media/media-marker.js.map +1 -0
  227. package/dist/media/media-time.d.ts +17 -0
  228. package/dist/media/media-time.d.ts.map +1 -0
  229. package/dist/media/media-time.js +17 -0
  230. package/dist/media/media-time.js.map +1 -0
  231. package/dist/media/video/driver.d.ts +31 -0
  232. package/dist/media/video/driver.d.ts.map +1 -0
  233. package/dist/media/video/driver.js +3 -0
  234. package/dist/media/video/driver.js.map +1 -0
  235. package/dist/media/video/index.d.ts +66 -0
  236. package/dist/media/video/index.d.ts.map +1 -0
  237. package/dist/media/video/index.js +372 -0
  238. package/dist/media/video/index.js.map +1 -0
  239. package/dist/media/video/types.d.ts +36 -0
  240. package/dist/media/video/types.d.ts.map +1 -0
  241. package/dist/media/video/types.js +2 -0
  242. package/dist/media/video/types.js.map +1 -0
  243. package/dist/media/video/video-for-preview.d.ts +17 -0
  244. package/dist/media/video/video-for-preview.d.ts.map +1 -0
  245. package/dist/media/video/video-for-preview.js +30 -0
  246. package/dist/media/video/video-for-preview.js.map +1 -0
  247. package/dist/media/video/video-for-rendering.d.ts +17 -0
  248. package/dist/media/video/video-for-rendering.d.ts.map +1 -0
  249. package/dist/media/video/video-for-rendering.js +59 -0
  250. package/dist/media/video/video-for-rendering.js.map +1 -0
  251. package/dist/media/video/video-source-browser.d.ts +37 -0
  252. package/dist/media/video/video-source-browser.d.ts.map +1 -0
  253. package/dist/media/video/video-source-browser.js +171 -0
  254. package/dist/media/video/video-source-browser.js.map +1 -0
  255. package/dist/media/video/video-source-mediabunny.d.ts +69 -0
  256. package/dist/media/video/video-source-mediabunny.d.ts.map +1 -0
  257. package/dist/media/video/video-source-mediabunny.js +236 -0
  258. package/dist/media/video/video-source-mediabunny.js.map +1 -0
  259. package/dist/media/video/video-source.d.ts +48 -0
  260. package/dist/media/video/video-source.d.ts.map +1 -0
  261. package/dist/media/video/video-source.js +2 -0
  262. package/dist/media/video/video-source.js.map +1 -0
  263. package/dist/media-marker.d.ts +19 -0
  264. package/dist/media-marker.d.ts.map +1 -0
  265. package/dist/media-marker.js +19 -0
  266. package/dist/media-marker.js.map +1 -0
  267. package/dist/media-time.d.ts +17 -0
  268. package/dist/media-time.d.ts.map +1 -0
  269. package/dist/media-time.js +17 -0
  270. package/dist/media-time.js.map +1 -0
  271. package/dist/signal.d.ts +10 -0
  272. package/dist/signal.d.ts.map +1 -0
  273. package/dist/signal.js +39 -0
  274. package/dist/signal.js.map +1 -0
  275. package/dist/text.d.ts +91 -0
  276. package/dist/text.d.ts.map +1 -0
  277. package/dist/text.js +704 -0
  278. package/dist/text.js.map +1 -0
  279. package/dist/video/driver.d.ts +31 -0
  280. package/dist/video/driver.d.ts.map +1 -0
  281. package/dist/video/driver.js +3 -0
  282. package/dist/video/driver.js.map +1 -0
  283. package/dist/video/index.d.ts +45 -0
  284. package/dist/video/index.d.ts.map +1 -0
  285. package/dist/video/index.js +276 -0
  286. package/dist/video/index.js.map +1 -0
  287. package/dist/video/types.d.ts +35 -0
  288. package/dist/video/types.d.ts.map +1 -0
  289. package/dist/video/types.js +2 -0
  290. package/dist/video/types.js.map +1 -0
  291. package/dist/video/video-for-preview.d.ts +12 -0
  292. package/dist/video/video-for-preview.d.ts.map +1 -0
  293. package/dist/video/video-for-preview.js +73 -0
  294. package/dist/video/video-for-preview.js.map +1 -0
  295. package/dist/video/video-for-rendering.d.ts +16 -0
  296. package/dist/video/video-for-rendering.d.ts.map +1 -0
  297. package/dist/video/video-for-rendering.js +45 -0
  298. package/dist/video/video-for-rendering.js.map +1 -0
  299. package/dist/video/video-source-browser.d.ts +37 -0
  300. package/dist/video/video-source-browser.d.ts.map +1 -0
  301. package/dist/video/video-source-browser.js +171 -0
  302. package/dist/video/video-source-browser.js.map +1 -0
  303. package/dist/video/video-source.d.ts +48 -0
  304. package/dist/video/video-source.d.ts.map +1 -0
  305. package/dist/video/video-source.js +2 -0
  306. package/dist/video/video-source.js.map +1 -0
  307. package/package.json +42 -0
@@ -0,0 +1,372 @@
1
+ import Konva from "konva";
2
+ import { getComposition } from "../../engine/composition.js";
3
+ import { detectEnvironment, getEnvironment } from "../../engine/environment.js";
4
+ import { getDefaultVideoSourceFactory } from "../../engine/runtime-defaults.js";
5
+ import { createSignal } from "../../engine/signal.js";
6
+ import { applySize, parseSize } from "../../layout/flex/engine.js";
7
+ import { PreviewAudioDriver } from "../audio/audio-for-preview.js";
8
+ import { RenderingAudioDriver } from "../audio/audio-for-rendering.js";
9
+ import { isSchedulable } from "../audio/audio-source-mediabunny.js";
10
+ import { MEDIA_MARK, VIDEO_MARK } from "../media-marker.js";
11
+ import { PreviewVideoDriver } from "./video-for-preview.js";
12
+ import { RenderingVideoDriver } from "./video-for-rendering.js";
13
+ const VIDEO_KEYS = [
14
+ "src",
15
+ "trimBefore",
16
+ "trimAfter",
17
+ "startFrom",
18
+ "endAt",
19
+ "loop",
20
+ "muted",
21
+ "volume",
22
+ "playbackRate",
23
+ "objectFit",
24
+ "objectPosition",
25
+ "flexGrow",
26
+ "flexShrink",
27
+ "flexBasis",
28
+ "alignSelf",
29
+ "margin",
30
+ "sourceFactory",
31
+ ];
32
+ function pickKonvaConfig(config) {
33
+ const out = { ...config };
34
+ for (const k of VIDEO_KEYS)
35
+ delete out[k];
36
+ const w = parseSize(config.width);
37
+ const h = parseSize(config.height);
38
+ out.width = w?.kind === "px" ? w.value : undefined;
39
+ out.height = h?.kind === "px" ? h.value : undefined;
40
+ out.cornerRadius = undefined;
41
+ return out;
42
+ }
43
+ /**
44
+ * Timeline-driven video. API mirrors {@link Image} (`new Video({src, ...ImageProps})`)
45
+ * but the frame source is a runtime-agnostic {@link VideoSource} and playback is
46
+ * driven by the composition's frame clock. Picks a {@link RenderingVideoDriver}
47
+ * or {@link PreviewVideoDriver} based on the composition's {@link Environment}.
48
+ */
49
+ export class Video extends Konva.Group {
50
+ _kmRole = "leaf";
51
+ /** Human label for mixer UIs — `config.name`, falling back to `config.src`. */
52
+ label;
53
+ /** Intrinsic audio level, 0..1 — scaled by the composition mixer's master. */
54
+ volume;
55
+ muted;
56
+ _img;
57
+ // Reassigned on suspend/resume, so not readonly; `!` = set via _acquireSource().
58
+ _source;
59
+ _env;
60
+ _factory;
61
+ _suspended = false;
62
+ _trimBefore;
63
+ _trimAfter;
64
+ _loop;
65
+ _playbackRate;
66
+ _volume;
67
+ _muted;
68
+ _mixer = null;
69
+ _driver = null;
70
+ _audioDriver = null;
71
+ _src;
72
+ constructor(config) {
73
+ super(pickKonvaConfig(config));
74
+ this.setAttr(MEDIA_MARK, true);
75
+ this.setAttr(VIDEO_MARK, true);
76
+ this._src = config.src;
77
+ this._trimBefore = config.trimBefore ?? config.startFrom ?? 0;
78
+ this._trimAfter = config.trimAfter ?? config.endAt;
79
+ this._loop = config.loop ?? false;
80
+ this._playbackRate = config.playbackRate ?? 1;
81
+ this.label = config.name ?? config.src;
82
+ this._volume = createSignal(config.volume ?? 1);
83
+ this._muted = createSignal(config.muted ?? false);
84
+ this.volume = this._volume;
85
+ this.muted = this._muted;
86
+ this._img = new Konva.Image({ image: undefined, listening: false });
87
+ super.add(this._img);
88
+ this.setAttrs({
89
+ flexGrow: config.flexGrow,
90
+ flexShrink: config.flexShrink,
91
+ flexBasis: config.flexBasis,
92
+ alignSelf: config.alignSelf,
93
+ margin: config.margin,
94
+ objectFit: config.objectFit ?? "cover",
95
+ objectPosition: config.objectPosition ?? "center",
96
+ cornerRadius: config.cornerRadius,
97
+ flexWidth: config.width,
98
+ flexHeight: config.height,
99
+ });
100
+ if (config.cornerRadius !== undefined) {
101
+ const cr = normalizeCorners(config.cornerRadius);
102
+ this.clipFunc((ctx) => roundRectPath(ctx, 0, 0, this.width(), this.height(), cr));
103
+ }
104
+ this.on("widthChange heightChange", () => this._layoutImage());
105
+ // Build the source eagerly so loading starts immediately. The driver (which
106
+ // needs the attached stage's composition) is resolved lazily on first tick.
107
+ this._env = detectEnvironment();
108
+ this._factory = config.sourceFactory ?? getDefaultVideoSourceFactory();
109
+ this._acquireSource();
110
+ this._layoutImage();
111
+ }
112
+ /**
113
+ * Create the media source and start loading it. Called once at construction
114
+ * and again by {@link _kmResume} after {@link _kmSuspend} dropped it.
115
+ */
116
+ _acquireSource() {
117
+ this._source = this._factory(this._env);
118
+ this._applyAudio(); // honor config/mixer volume+muted before playback
119
+ this._source.setPlaybackRate(this._playbackRate);
120
+ this._source.onReady(() => {
121
+ const el = this._source.element;
122
+ if (el)
123
+ this._img.image(el);
124
+ this._layoutImage();
125
+ this.getLayer()?.batchDraw();
126
+ });
127
+ this._source.onFrame(() => {
128
+ this.getLayer()?.batchDraw();
129
+ });
130
+ this._source.load(this._src).catch((err) => {
131
+ console.error("[smoove] Video load failed:", err);
132
+ });
133
+ }
134
+ /** @internal — {@link Composition.suspend}: drop the source to stop downloading/decoding. */
135
+ _kmSuspend() {
136
+ if (this._suspended)
137
+ return;
138
+ this._suspended = true;
139
+ this._driver?.dispose();
140
+ this._driver = null;
141
+ this._audioDriver?.dispose();
142
+ this._audioDriver = null;
143
+ this._source.destroy();
144
+ this._img.image(undefined);
145
+ this.getLayer()?.batchDraw();
146
+ }
147
+ /** @internal — {@link Composition.resume}: re-acquire the dropped source. */
148
+ _kmResume() {
149
+ if (!this._suspended)
150
+ return;
151
+ this._suspended = false;
152
+ this._acquireSource();
153
+ }
154
+ /** @internal — called by Sequence on each tick while this video is on-stage. */
155
+ _kmTick(localFrame) {
156
+ const driver = this._ensureDriver();
157
+ driver?.tick(localFrame);
158
+ this._audioDriver?.tick(localFrame);
159
+ }
160
+ /** @internal — called by Sequence when it goes out of range. */
161
+ _kmDeactivate() {
162
+ this._driver?.deactivate();
163
+ this._audioDriver?.deactivate();
164
+ }
165
+ /** @internal — {@link KMLayoutNode}: size from explicit width/height (cover/contain handle the rest). */
166
+ _kmMeasure(node) {
167
+ applySize(node, this.attrs.flexWidth, this.attrs.flexHeight);
168
+ }
169
+ /** @internal — {@link KMLayoutNode}: write the computed box back + re-fit the frame. */
170
+ _kmPlace(box) {
171
+ this.x(box.left);
172
+ this.y(box.top);
173
+ this.width(box.width);
174
+ this.height(box.height);
175
+ this._layoutImage();
176
+ }
177
+ _ensureDriver() {
178
+ if (this._driver)
179
+ return this._driver;
180
+ const stage = this.getStage();
181
+ if (!stage)
182
+ return null;
183
+ const comp = getComposition(stage);
184
+ if (!comp)
185
+ return null;
186
+ // Lazy fallback for videos added after their sequence was registered.
187
+ comp.mixer.register(this);
188
+ const timing = {
189
+ fps: comp.fps,
190
+ trimBefore: this._trimBefore,
191
+ trimAfter: this._trimAfter,
192
+ loop: this._loop,
193
+ playbackRate: this._playbackRate,
194
+ };
195
+ const ctx = {
196
+ source: this._source,
197
+ timing,
198
+ comp,
199
+ redraw: () => {
200
+ this._layoutImage();
201
+ this.getLayer()?.batchDraw();
202
+ },
203
+ };
204
+ if (getEnvironment(stage).isRendering) {
205
+ this._driver = new RenderingVideoDriver(ctx);
206
+ // Record the file's soundtrack as audio assets so the server mux can decode
207
+ // and mix it (videos with no audio track simply yield no audible PCM).
208
+ const audioCtx = {
209
+ source: this._source,
210
+ timing,
211
+ comp,
212
+ id: this.id() || `video-${this._id}`,
213
+ src: this._src,
214
+ effectiveVolume: () => {
215
+ const m = this._mixer;
216
+ return (m ? m.volume.get() : 1) * this._volume.get();
217
+ },
218
+ effectiveMuted: () => {
219
+ const m = this._mixer;
220
+ return (m ? m.muted.get() : false) || this._muted.get();
221
+ },
222
+ };
223
+ this._audioDriver = new RenderingAudioDriver(audioCtx);
224
+ }
225
+ else {
226
+ this._driver = new PreviewVideoDriver(ctx);
227
+ // In preview, schedule the file's own soundtrack through the shared Web
228
+ // Audio context — same scheduler the standalone Audio node uses. (The
229
+ // rendering branch above records it as audio assets for the server mux.)
230
+ if (isSchedulable(this._source)) {
231
+ const audioCtx = {
232
+ source: this._source,
233
+ timing,
234
+ comp,
235
+ id: this.id() || `video-${this._id}`,
236
+ src: this._src,
237
+ effectiveVolume: () => {
238
+ const m = this._mixer;
239
+ return (m ? m.volume.get() : 1) * this._volume.get();
240
+ },
241
+ effectiveMuted: () => {
242
+ const m = this._mixer;
243
+ return (m ? m.muted.get() : false) || this._muted.get();
244
+ },
245
+ };
246
+ this._audioDriver = new PreviewAudioDriver(audioCtx);
247
+ }
248
+ }
249
+ return this._driver;
250
+ }
251
+ setMuted(muted) {
252
+ this._muted.set(muted);
253
+ this._applyAudio();
254
+ }
255
+ setVolume(volume) {
256
+ this._volume.set(Math.max(0, Math.min(1, volume)));
257
+ this._applyAudio();
258
+ }
259
+ /** @internal — {@link AudioMixer} hands us the bus (or null on unregister). */
260
+ _bindMixer(mixer) {
261
+ this._mixer = mixer;
262
+ this._applyAudio();
263
+ }
264
+ /** @internal — push effective level (master × intrinsic) to the source. */
265
+ _applyAudio() {
266
+ const m = this._mixer;
267
+ const master = m ? m.volume.get() : 1;
268
+ const masterMuted = m ? m.muted.get() : false;
269
+ this._source.setVolume(master * this._volume.get());
270
+ this._source.setMuted(masterMuted || this._muted.get());
271
+ }
272
+ setPlaybackRate(rate) {
273
+ this._source.setPlaybackRate(rate);
274
+ }
275
+ destroy() {
276
+ this._mixer?.unregister(this);
277
+ this._mixer = null;
278
+ this._driver?.dispose();
279
+ this._driver = null;
280
+ this._audioDriver?.dispose();
281
+ this._audioDriver = null;
282
+ this._source.destroy();
283
+ return super.destroy();
284
+ }
285
+ /** @internal */
286
+ _layoutImage() {
287
+ const w = this.width();
288
+ const h = this.height();
289
+ if (w <= 0 || h <= 0)
290
+ return;
291
+ const fit = (this.attrs.objectFit ?? "cover");
292
+ const pos = (this.attrs.objectPosition ?? "center");
293
+ const nw = this._source.naturalWidth;
294
+ const nh = this._source.naturalHeight;
295
+ if (!this._source.isReady || nw === 0 || nh === 0)
296
+ return;
297
+ if (fit === "fill") {
298
+ this._img.position({ x: 0, y: 0 });
299
+ this._img.size({ width: w, height: h });
300
+ this._img.crop({ x: 0, y: 0, width: nw, height: nh });
301
+ return;
302
+ }
303
+ if (fit === "none") {
304
+ const { x, y } = positionOffset(pos, w - nw, h - nh);
305
+ this._img.position({ x, y });
306
+ this._img.size({ width: nw, height: nh });
307
+ this._img.crop({ x: 0, y: 0, width: nw, height: nh });
308
+ return;
309
+ }
310
+ if (fit === "contain") {
311
+ const scale = Math.min(w / nw, h / nh);
312
+ const dw = nw * scale;
313
+ const dh = nh * scale;
314
+ const { x, y } = positionOffset(pos, w - dw, h - dh);
315
+ this._img.position({ x, y });
316
+ this._img.size({ width: dw, height: dh });
317
+ this._img.crop({ x: 0, y: 0, width: nw, height: nh });
318
+ return;
319
+ }
320
+ const scale = Math.max(w / nw, h / nh);
321
+ const cropW = w / scale;
322
+ const cropH = h / scale;
323
+ const { x: cx, y: cy } = positionOffset(pos, nw - cropW, nh - cropH);
324
+ this._img.position({ x: 0, y: 0 });
325
+ this._img.size({ width: w, height: h });
326
+ this._img.crop({ x: cx, y: cy, width: cropW, height: cropH });
327
+ }
328
+ }
329
+ export function isVideoNode(node) {
330
+ return node.getAttr(VIDEO_MARK) === true;
331
+ }
332
+ function positionOffset(pos, freeX, freeY) {
333
+ let fx = 0.5;
334
+ let fy = 0.5;
335
+ if (pos.includes("left"))
336
+ fx = 0;
337
+ else if (pos.includes("right"))
338
+ fx = 1;
339
+ if (pos.includes("top"))
340
+ fy = 0;
341
+ else if (pos.includes("bottom"))
342
+ fy = 1;
343
+ if (pos === "center") {
344
+ fx = 0.5;
345
+ fy = 0.5;
346
+ }
347
+ return { x: freeX * fx, y: freeY * fy };
348
+ }
349
+ function normalizeCorners(c) {
350
+ if (typeof c === "number")
351
+ return [c, c, c, c];
352
+ if (c.length === 1)
353
+ return [c[0] ?? 0, c[0] ?? 0, c[0] ?? 0, c[0] ?? 0];
354
+ if (c.length === 2)
355
+ return [c[0] ?? 0, c[1] ?? 0, c[0] ?? 0, c[1] ?? 0];
356
+ return [c[0] ?? 0, c[1] ?? 0, c[2] ?? 0, c[3] ?? 0];
357
+ }
358
+ function roundRectPath(ctx, x, y, w, h, r) {
359
+ const [tl, tr, br, bl] = r;
360
+ ctx.beginPath();
361
+ ctx.moveTo(x + (tl ?? 0), y);
362
+ ctx.lineTo(x + w - (tr ?? 0), y);
363
+ ctx.quadraticCurveTo(x + w, y, x + w, y + (tr ?? 0));
364
+ ctx.lineTo(x + w, y + h - (br ?? 0));
365
+ ctx.quadraticCurveTo(x + w, y + h, x + w - (br ?? 0), y + h);
366
+ ctx.lineTo(x + (bl ?? 0), y + h);
367
+ ctx.quadraticCurveTo(x, y + h, x, y + h - (bl ?? 0));
368
+ ctx.lineTo(x, y + (tl ?? 0));
369
+ ctx.quadraticCurveTo(x, y, x + (tl ?? 0), y);
370
+ ctx.closePath();
371
+ }
372
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/media/video/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAoB,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAoC,MAAM,wBAAwB,CAAC;AAExF,OAAO,EAAE,SAAS,EAAoB,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAIrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,MAAM,UAAU,GAAG;IACjB,KAAK;IACL,YAAY;IACZ,WAAW;IACX,WAAW;IACX,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,WAAW;IACX,WAAW;IACX,QAAQ;IACR,eAAe;CACP,CAAC;AAEX,SAAS,eAAe,CAAC,MAAmB;IAC1C,MAAM,GAAG,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,KAA8B,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,MAA+B,CAAC,CAAC;IAC5D,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC;IAC7B,OAAO,GAAwB,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,KAAM,SAAQ,KAAK,CAAC,KAAK;IAC3B,OAAO,GAAG,MAAe,CAAC;IACnC,+EAA+E;IACtE,KAAK,CAAS;IACvB,8EAA8E;IACrE,MAAM,CAAyB;IAC/B,KAAK,CAA0B;IAEvB,IAAI,CAAc;IACnC,iFAAiF;IACzE,OAAO,CAAe;IACb,IAAI,CAAc;IAClB,QAAQ,CAAqB;IACtC,UAAU,GAAG,KAAK,CAAC;IACV,WAAW,CAAS;IACpB,UAAU,CAAU;IACpB,KAAK,CAAU;IACf,aAAa,CAAS;IACtB,OAAO,CAAiB;IACxB,MAAM,CAAkB;IACjC,MAAM,GAAsB,IAAI,CAAC;IACjC,OAAO,GAAuB,IAAI,CAAC;IACnC,YAAY,GAAuB,IAAI,CAAC;IAC/B,IAAI,CAAS;IAE9B,YAAY,MAAmB;QAC7B,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE/B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAEzB,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErB,IAAI,CAAC,QAAQ,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,OAAO;YACtC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,QAAQ;YACjD,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,UAAU,EAAE,MAAM,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAE/D,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,4BAA4B,EAAE,CAAC;QACvE,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,kDAAkD;QACtE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAChC,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE;YACxB,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAClD,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,6FAA6F;IAC7F,UAAU;QACR,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,6EAA6E;IAC7E,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,gFAAgF;IAChF,OAAO,CAAC,UAAkB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,gEAAgE;IAChE,aAAa;QACX,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,yGAAyG;IACzG,UAAU,CAAC,IAAiB;QAC1B,SAAS,CACP,IAAI,EACJ,IAAI,CAAC,KAAK,CAAC,SAAkC,EAC7C,IAAI,CAAC,KAAK,CAAC,UAAmC,CAC/C,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,QAAQ,CAAC,GAAc;QACrB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,sEAAsE;QACtE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAgB;YAC1B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,YAAY,EAAE,IAAI,CAAC,aAAa;SACjC,CAAC;QACF,MAAM,GAAG,GAAuB;YAC9B,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,MAAM;YACN,IAAI;YACJ,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC;YAC/B,CAAC;SACF,CAAC;QACF,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC7C,4EAA4E;YAC5E,uEAAuE;YACvE,MAAM,QAAQ,GAAuB;gBACnC,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,MAAM;gBACN,IAAI;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE;gBACpC,GAAG,EAAE,IAAI,CAAC,IAAI;gBACd,eAAe,EAAE,GAAG,EAAE;oBACpB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;oBACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACvD,CAAC;gBACD,cAAc,EAAE,GAAG,EAAE;oBACnB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;oBACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC1D,CAAC;aACF,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC3C,wEAAwE;YACxE,sEAAsE;YACtE,yEAAyE;YACzE,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAuB;oBACnC,MAAM,EAAE,IAAI,CAAC,OAAO;oBACpB,MAAM;oBACN,IAAI;oBACJ,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE;oBACpC,GAAG,EAAE,IAAI,CAAC,IAAI;oBACd,eAAe,EAAE,GAAG,EAAE;wBACpB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;wBACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACvD,CAAC;oBACD,cAAc,EAAE,GAAG,EAAE;wBACnB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;wBACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBAC1D,CAAC;iBACF,CAAC;gBACF,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,+EAA+E;IAC/E,UAAU,CAAC,KAAwB;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,2EAA2E;IAC3E,WAAW;QACT,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEQ,OAAO;QACd,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,gBAAgB;IAChB,YAAY;QACV,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QAC7B,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAc,CAAC;QAC3D,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,QAAQ,CAAmB,CAAC;QACtE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO;QAE1D,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACtB,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;YACtB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,cAAc,CACrB,GAAmB,EACnB,KAAa,EACb,KAAa;IAEb,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,EAAE,GAAG,CAAC,CAAC;SAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,EAAE,GAAG,CAAC,CAAC;SAC3B,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,EAAE,GAAG,GAAG,CAAC;QACT,EAAE,GAAG,GAAG,CAAC;IACX,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAoB;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CACpB,GAA6C,EAC7C,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAS,EACT,CAAW;IAEX,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,SAAS,EAAE,CAAC;IAChB,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,GAAG,CAAC,SAAS,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type Konva from "konva";
2
+ import type { FlexChildProps, SizeValue } from "../../layout/flex/types.js";
3
+ import type { ObjectFit, ObjectPosition } from "../../layout/image.js";
4
+ import type { VideoSourceFactory } from "./video-source.js";
5
+ /**
6
+ * Config for {@link Video}. Mirrors {@link ImageConfig} plus Remotion's
7
+ * `<Video>` playback props (`trimBefore`/`trimAfter`/`loop`/`muted`/`volume`/
8
+ * `playbackRate`) and a `sourceFactory` dependency-injection seam.
9
+ */
10
+ export type VideoConfig = Omit<Konva.GroupConfig, "width" | "height"> & FlexChildProps & {
11
+ width?: SizeValue;
12
+ height?: SizeValue;
13
+ src: string;
14
+ /** Human label for the audio mixer channel / UIs. Defaults to {@link src}. */
15
+ name?: string;
16
+ objectFit?: ObjectFit;
17
+ objectPosition?: ObjectPosition;
18
+ cornerRadius?: number | number[];
19
+ /** Frames trimmed from the start of the media (composition fps). Remotion v4 name. */
20
+ trimBefore?: number;
21
+ /** Exclusive frame bound — media past this offset is trimmed (composition fps). */
22
+ trimAfter?: number;
23
+ /** @deprecated alias of {@link trimBefore} (Remotion's pre-v4.0.319 name). */
24
+ startFrom?: number;
25
+ /** @deprecated alias of {@link trimAfter} (Remotion's pre-v4.0.319 name). */
26
+ endAt?: number;
27
+ /** Repeat the trimmed clip within its sequence window instead of freezing on the last frame. */
28
+ loop?: boolean;
29
+ muted?: boolean;
30
+ /** 0..1 */
31
+ volume?: number;
32
+ playbackRate?: number;
33
+ /** Inject an alternative VideoSource. Defaults to BrowserVideoSource. */
34
+ sourceFactory?: VideoSourceFactory;
35
+ };
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/media/video/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,GAAG,QAAQ,CAAC,GACnE,cAAc,GAAG;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACjC,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/media/video/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { type VideoDriver, type VideoDriverContext } from "./driver.js";
2
+ /**
3
+ * Realtime preview driver for a **pull-based** {@link VideoSource} (Mediabunny +
4
+ * WebCodecs). Unlike the old `HTMLVideoElement` model — where the element played
5
+ * on its own and we only corrected drift — nothing self-plays here: every tick we
6
+ * seek the source to the exact media time for the current frame and redraw. The
7
+ * frame clock is the single source of truth, so playback and scrubbing are
8
+ * identical code paths and both land on the exact frame.
9
+ */
10
+ export declare class PreviewVideoDriver implements VideoDriver {
11
+ private readonly ctx;
12
+ constructor(ctx: VideoDriverContext);
13
+ tick(localFrame: number): void;
14
+ deactivate(): void;
15
+ dispose(): void;
16
+ }
17
+ //# sourceMappingURL=video-for-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-for-preview.d.ts","sourceRoot":"","sources":["../../../src/media/video/video-for-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,kBAAkB;IAEpD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAW9B,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI;CAChB"}
@@ -0,0 +1,30 @@
1
+ import { getMediaTime } from "./driver.js";
2
+ /**
3
+ * Realtime preview driver for a **pull-based** {@link VideoSource} (Mediabunny +
4
+ * WebCodecs). Unlike the old `HTMLVideoElement` model — where the element played
5
+ * on its own and we only corrected drift — nothing self-plays here: every tick we
6
+ * seek the source to the exact media time for the current frame and redraw. The
7
+ * frame clock is the single source of truth, so playback and scrubbing are
8
+ * identical code paths and both land on the exact frame.
9
+ */
10
+ export class PreviewVideoDriver {
11
+ ctx;
12
+ constructor(ctx) {
13
+ this.ctx = ctx;
14
+ }
15
+ tick(localFrame) {
16
+ const { source } = this.ctx;
17
+ if (!source.isReady) {
18
+ this.ctx.redraw();
19
+ return;
20
+ }
21
+ const expected = getMediaTime(localFrame, this.ctx.timing);
22
+ void source.seek(expected).then(() => this.ctx.redraw());
23
+ this.ctx.redraw();
24
+ }
25
+ deactivate() {
26
+ this.ctx.source.pause();
27
+ }
28
+ dispose() { }
29
+ }
30
+ //# sourceMappingURL=video-for-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-for-preview.js","sourceRoot":"","sources":["../../../src/media/video/video-for-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,aAAa,CAAC;AAEtF;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,GAAuB;QAAvB,QAAG,GAAH,GAAG,CAAoB;IAAG,CAAC;IAExD,IAAI,CAAC,UAAkB;QACrB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3D,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,UAAU;QACR,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,KAAU,CAAC;CACnB"}
@@ -0,0 +1,17 @@
1
+ import { type VideoDriver, type VideoDriverContext } 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 declare class RenderingVideoDriver implements VideoDriver {
9
+ private readonly ctx;
10
+ private _lastMediaTime;
11
+ constructor(ctx: VideoDriverContext);
12
+ tick(localFrame: number): void;
13
+ private _waitReady;
14
+ deactivate(): void;
15
+ dispose(): void;
16
+ }
17
+ //# sourceMappingURL=video-for-rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-for-rendering.d.ts","sourceRoot":"","sources":["../../../src/media/video/video-for-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,WAAW;IAG1C,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,cAAc,CAAc;gBAEP,GAAG,EAAE,kBAAkB;IAEpD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IA4B9B,OAAO,CAAC,UAAU;IAclB,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI;CAChB"}
@@ -0,0 +1,59 @@
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
+ const mediaTime = getMediaTime(localFrame, this.ctx.timing);
17
+ // Already decoded this exact frame and the source is live — just redraw.
18
+ if (source.isReady && mediaTime === this._lastMediaTime) {
19
+ this.ctx.redraw();
20
+ return;
21
+ }
22
+ this._lastMediaTime = mediaTime;
23
+ // Gate the frame: wait for the source to become decodable (the async
24
+ // `load()` fired in the constructor may still be in flight), then seek to
25
+ // the exact media time. Holding the handle across both steps is what keeps
26
+ // `renderFrame()` from capturing a blank frame before the video is ready.
27
+ const handle = comp.delayRender(`seek video -> ${mediaTime.toFixed(4)}s`);
28
+ this._waitReady()
29
+ .then(() => source.seek(mediaTime))
30
+ .then(() => {
31
+ this.ctx.redraw();
32
+ })
33
+ .catch((err) => {
34
+ console.error("[smoove] video seek failed during render:", err);
35
+ })
36
+ .finally(() => {
37
+ comp.continueRender(handle);
38
+ });
39
+ }
40
+ _waitReady() {
41
+ const { source } = this.ctx;
42
+ // Short-circuit when already ready: registering `onReady` here would invoke
43
+ // the callback synchronously (sources fire immediately when ready), and the
44
+ // callback references `off` before its `const` is initialized (TDZ).
45
+ if (source.isReady)
46
+ return Promise.resolve();
47
+ return new Promise((resolve) => {
48
+ const off = source.onReady(() => {
49
+ off();
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ deactivate() {
55
+ this._lastMediaTime = Number.NaN;
56
+ }
57
+ dispose() { }
58
+ }
59
+ //# sourceMappingURL=video-for-rendering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-for-rendering.js","sourceRoot":"","sources":["../../../src/media/video/video-for-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,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,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5D,yEAAyE;QACzE,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAEhC,qEAAqE;QACrE,0EAA0E;QAC1E,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,EAAE;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAClC,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,2CAA2C,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,UAAU;QAChB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAC5B,4EAA4E;QAC5E,4EAA4E;QAC5E,qEAAqE;QACrE,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC9B,GAAG,EAAE,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,OAAO,KAAU,CAAC;CACnB"}
@@ -0,0 +1,37 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-source-browser.d.ts","sourceRoot":"","sources":["../../../src/media/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"}