@pixerate/editor 0.124.0 → 0.125.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/dist/agent/index.cjs +3 -3
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.js +3 -3
- package/dist/animation-editor/index.cjs +424 -85
- package/dist/animation-editor/index.cjs.map +1 -1
- package/dist/animation-editor/index.d.cts +174 -7
- package/dist/animation-editor/index.d.ts +174 -7
- package/dist/animation-editor/index.js +348 -9
- package/dist/animation-editor/index.js.map +1 -1
- package/dist/chunk-FJ3324TZ.js +59 -0
- package/dist/chunk-FJ3324TZ.js.map +1 -0
- package/dist/{chunk-5EO2IXQE.js → chunk-FPRIUR4T.js} +1 -1
- package/dist/chunk-FPRIUR4T.js.map +1 -0
- package/dist/{chunk-YVVSTD3B.js → chunk-G6WXWS4Y.js} +9 -18
- package/dist/chunk-G6WXWS4Y.js.map +1 -0
- package/dist/{chunk-NGYD3AMN.js → chunk-MPQAO33O.js} +2 -2
- package/dist/{chunk-PEHYWUVV.cjs → chunk-O5RVCDEC.cjs} +82 -82
- package/dist/{chunk-PEHYWUVV.cjs.map → chunk-O5RVCDEC.cjs.map} +1 -1
- package/dist/{chunk-TK53AB4Q.cjs → chunk-QDJKUBWE.cjs} +3 -3
- package/dist/{chunk-TK53AB4Q.cjs.map → chunk-QDJKUBWE.cjs.map} +1 -1
- package/dist/{chunk-5XXMLBH4.cjs → chunk-QQKTOA4U.cjs} +1 -1
- package/dist/chunk-QQKTOA4U.cjs.map +1 -0
- package/dist/{chunk-IWSMDQE5.cjs → chunk-UXFI3CDZ.cjs} +13 -22
- package/dist/chunk-UXFI3CDZ.cjs.map +1 -0
- package/dist/{chunk-WE25VLCO.cjs → chunk-V5YGPRCZ.cjs} +36 -36
- package/dist/{chunk-WE25VLCO.cjs.map → chunk-V5YGPRCZ.cjs.map} +1 -1
- package/dist/chunk-W6QTLHZ3.cjs +59 -0
- package/dist/chunk-W6QTLHZ3.cjs.map +1 -0
- package/dist/{chunk-WATAQ2Z2.js → chunk-WUDPFWAN.js} +2 -2
- package/dist/{chunk-VFAKN46Z.js → chunk-XZWOLXWA.js} +3 -3
- package/dist/{chunk-VFAKN46Z.js.map → chunk-XZWOLXWA.js.map} +1 -1
- package/dist/effects/index.cjs +51 -6
- package/dist/effects/index.cjs.map +1 -1
- package/dist/effects/index.d.cts +39 -8
- package/dist/effects/index.d.ts +39 -8
- package/dist/effects/index.js +48 -3
- package/dist/effects/index.js.map +1 -1
- package/dist/{export-TqXMOlDt.d.cts → export-Bp7ji2r4.d.cts} +4 -3
- package/dist/{export-BzSRXyH6.d.cts → export-C1s4eolZ.d.ts} +5 -3
- package/dist/{export-8RnlngAv.d.ts → export-DAyPY94f.d.ts} +4 -3
- package/dist/{export-DM3h7QEI.d.ts → export-DVl4fWy5.d.cts} +5 -3
- package/dist/generation/index.cjs +3 -3
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.js +3 -3
- package/dist/helpers-BBLlekuM.d.ts +2009 -0
- package/dist/helpers-i95Ob6Vi.d.cts +2009 -0
- package/dist/image-editor/index.cjs +712 -721
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +5 -7
- package/dist/image-editor/index.d.ts +5 -7
- package/dist/image-editor/index.js +19 -28
- package/dist/image-editor/index.js.map +1 -1
- package/dist/paint-editor/index.cjs +12 -11
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +3 -5
- package/dist/paint-editor/index.d.ts +3 -5
- package/dist/paint-editor/index.js +6 -5
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/{svg-BDrjRnL1.d.cts → svg-BkRL-fZJ.d.cts} +1 -1
- package/dist/{svg-C-vZ3q50.d.ts → svg-DJKriJ4A.d.ts} +1 -1
- package/dist/tools/index.cjs +2 -2
- package/dist/tools/index.cjs.map +1 -1
- package/dist/tools/index.js +3 -3
- package/dist/{tools-C7JtLYzo.d.ts → tools-CM8Oe8F3.d.ts} +1 -1
- package/dist/{tools-DHKGHiSK.d.cts → tools-DZCv2kX1.d.cts} +1 -1
- package/dist/vector/index.cjs +1032 -883
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +61 -6
- package/dist/vector/index.d.ts +61 -6
- package/dist/vector/index.js +155 -6
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.cjs +271 -270
- package/dist/video-editor/index.cjs.map +1 -1
- package/dist/video-editor/index.d.cts +4 -6
- package/dist/video-editor/index.d.ts +4 -6
- package/dist/video-editor/index.js +6 -5
- package/dist/video-editor/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/pixerate-animation-editor/SKILL.md +24 -1
- package/skills/pixerate-vector/SKILL.md +15 -0
- package/dist/chunk-5EO2IXQE.js.map +0 -1
- package/dist/chunk-5XXMLBH4.cjs.map +0 -1
- package/dist/chunk-IWSMDQE5.cjs.map +0 -1
- package/dist/chunk-YVVSTD3B.js.map +0 -1
- package/dist/flair-CxB3fOcU.d.ts +0 -739
- package/dist/flair-D7BxyBwL.d.cts +0 -739
- package/dist/helpers-777mC6dc.d.cts +0 -253
- package/dist/helpers-DX2_7L5t.d.ts +0 -253
- package/dist/types-BcX7sCsn.d.ts +0 -993
- package/dist/types-CznabG7m.d.cts +0 -993
- /package/dist/{chunk-NGYD3AMN.js.map → chunk-MPQAO33O.js.map} +0 -0
- /package/dist/{chunk-WATAQ2Z2.js.map → chunk-WUDPFWAN.js.map} +0 -0
|
@@ -134,18 +134,19 @@
|
|
|
134
134
|
|
|
135
135
|
|
|
136
136
|
|
|
137
|
-
var
|
|
137
|
+
var _chunkUXFI3CDZcjs = require('../chunk-UXFI3CDZ.cjs');
|
|
138
|
+
require('../chunk-W6QTLHZ3.cjs');
|
|
138
139
|
|
|
139
140
|
|
|
140
|
-
var
|
|
141
|
+
var _chunkWAJQKWQUcjs = require('../chunk-WAJQKWQU.cjs');
|
|
141
142
|
|
|
142
143
|
|
|
144
|
+
var _chunkQDJKUBWEcjs = require('../chunk-QDJKUBWE.cjs');
|
|
143
145
|
|
|
144
|
-
var _chunkIOXKXQNWcjs = require('../chunk-IOXKXQNW.cjs');
|
|
145
|
-
require('../chunk-RIWPYSKU.cjs');
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
var
|
|
148
|
+
var _chunkIOXKXQNWcjs = require('../chunk-IOXKXQNW.cjs');
|
|
149
|
+
require('../chunk-RIWPYSKU.cjs');
|
|
149
150
|
|
|
150
151
|
|
|
151
152
|
var _chunkQKLRAA4Tcjs = require('../chunk-QKLRAA4T.cjs');
|
|
@@ -192,7 +193,7 @@ function parseVideoEase(v, path) {
|
|
|
192
193
|
if (v[0] < 0 || v[0] > 1 || v[2] < 0 || v[2] > 1) fail(path, "must have x1 and x2 between 0 and 1");
|
|
193
194
|
return [v[0], v[1], v[2], v[3]];
|
|
194
195
|
}
|
|
195
|
-
return oneOf(v,
|
|
196
|
+
return oneOf(v, _chunkUXFI3CDZcjs.VIDEO_EASE_NAMES, path);
|
|
196
197
|
}
|
|
197
198
|
function parseVideoKeyframes(v, path, { min, max } = {}) {
|
|
198
199
|
if (!isObject(v)) return fail(path, "must be a number or keyframes { keys: [{ t, v, ease }] }");
|
|
@@ -230,7 +231,7 @@ function parseVideoTimeRemap(v, speed, path) {
|
|
|
230
231
|
if (typeof remap === "number" || remap === void 0) return fail(path, "must be keyframes { keys: [{ t, v, ease }] } (v: ms of source after the in point)");
|
|
231
232
|
if (speed !== void 0 && speed !== 1) fail(path, 'cannot be used with a speed; a ramp sets the speed itself (remove "speed")');
|
|
232
233
|
try {
|
|
233
|
-
|
|
234
|
+
_chunkUXFI3CDZcjs.checkVideoTimeRemap.call(void 0, remap, path);
|
|
234
235
|
} catch (e) {
|
|
235
236
|
throw new Error(e.message.replace(/\.?$/, "."));
|
|
236
237
|
}
|
|
@@ -240,17 +241,17 @@ function parseVideoClipAnimation(v, path) {
|
|
|
240
241
|
if (v === void 0) return void 0;
|
|
241
242
|
if (!isObject(v)) return fail(path, "must be an object { effect, duration }");
|
|
242
243
|
return compact({
|
|
243
|
-
effect: oneOf(v.effect,
|
|
244
|
+
effect: oneOf(v.effect, _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_EFFECTS, `${path}.effect`, false),
|
|
244
245
|
duration: num(v.duration, `${path}.duration`, { optional: true, positive: true })
|
|
245
246
|
});
|
|
246
247
|
}
|
|
247
248
|
function parseVideoGrade(v, path) {
|
|
248
249
|
if (v === void 0) return void 0;
|
|
249
250
|
if (!isObject(v)) return fail(path, "must be an object such as { exposure, contrast, saturation }");
|
|
250
|
-
const known = /* @__PURE__ */ new Set([...
|
|
251
|
+
const known = /* @__PURE__ */ new Set([..._chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS.map((c) => c.key), "lut"]);
|
|
251
252
|
const unknown = Object.keys(v).find((k) => !known.has(k));
|
|
252
253
|
if (unknown) fail(`${path}.${unknown}`, `is not a grade setting; use ${[...known].join(", ")}`);
|
|
253
|
-
return compact({ ...Object.fromEntries(
|
|
254
|
+
return compact({ ...Object.fromEntries(_chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, num(v[c.key], `${path}.${c.key}`, { optional: true, min: c.min, max: c.max })])), lut: parseVideoGradeLut(v.lut, `${path}.lut`) });
|
|
254
255
|
}
|
|
255
256
|
function parseVideoGradeLut(v, path) {
|
|
256
257
|
if (v === void 0) return void 0;
|
|
@@ -262,15 +263,15 @@ function parseVideoGradeLut(v, path) {
|
|
|
262
263
|
function parseVideoTransition(v, path) {
|
|
263
264
|
if (v === void 0) return void 0;
|
|
264
265
|
if (!isObject(v)) return fail(path, "must be an object { type, duration }");
|
|
265
|
-
const type = oneOf(v.type,
|
|
266
|
+
const type = oneOf(v.type, _chunkUXFI3CDZcjs.VIDEO_TRANSITION_TYPES, `${path}.type`, false);
|
|
266
267
|
if (type === "effect" && v.effect === void 0) fail(`${path}.effect`, 'is required for an effect transition: { effect: "<effect id>", values }');
|
|
267
268
|
if (type !== "effect" && v.effect !== void 0) fail(`${path}.effect`, 'is only for transitions of type "effect"');
|
|
268
269
|
return compact({
|
|
269
270
|
type,
|
|
270
271
|
duration: num(v.duration, `${path}.duration`, { positive: true }),
|
|
271
272
|
color: str(v.color, `${path}.color`, true),
|
|
272
|
-
direction: oneOf(v.direction,
|
|
273
|
-
audioCurve: oneOf(v.audioCurve,
|
|
273
|
+
direction: oneOf(v.direction, _chunkUXFI3CDZcjs.VIDEO_WIPE_DIRECTIONS, `${path}.direction`),
|
|
274
|
+
audioCurve: oneOf(v.audioCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.audioCurve`),
|
|
274
275
|
effect: v.effect === void 0 ? void 0 : parseVideoEffectRef(v.effect, `${path}.effect`, false)
|
|
275
276
|
});
|
|
276
277
|
}
|
|
@@ -363,7 +364,7 @@ function parseVideoAssetProxies(v, path) {
|
|
|
363
364
|
}
|
|
364
365
|
function parseVideoClip(v, path = "clip") {
|
|
365
366
|
if (!isObject(v)) return fail(path, "must be an object");
|
|
366
|
-
const type = oneOf(_nullishCoalesce(v.type, () => ( "media")),
|
|
367
|
+
const type = oneOf(_nullishCoalesce(v.type, () => ( "media")), _chunkUXFI3CDZcjs.VIDEO_CLIP_TYPES, `${path}.type`, false);
|
|
367
368
|
const base = {
|
|
368
369
|
id: str(v.id, `${path}.id`),
|
|
369
370
|
name: str(v.name, `${path}.name`, true),
|
|
@@ -371,8 +372,8 @@ function parseVideoClip(v, path = "clip") {
|
|
|
371
372
|
duration: num(v.duration, `${path}.duration`, { positive: true }),
|
|
372
373
|
opacity: parseVideoAnimatable(v.opacity, `${path}.opacity`, { optional: true, min: 0, max: 1 }),
|
|
373
374
|
transform: parseVideoTransform(v.transform, `${path}.transform`),
|
|
374
|
-
fit: oneOf(v.fit,
|
|
375
|
-
blend: oneOf(v.blend,
|
|
375
|
+
fit: oneOf(v.fit, _chunkUXFI3CDZcjs.VIDEO_FITS, `${path}.fit`),
|
|
376
|
+
blend: oneOf(v.blend, _chunkUXFI3CDZcjs.VIDEO_BLEND_MODES, `${path}.blend`),
|
|
376
377
|
grade: parseVideoGrade(v.grade, `${path}.grade`),
|
|
377
378
|
animateIn: parseVideoClipAnimation(v.animateIn, `${path}.animateIn`),
|
|
378
379
|
animateOut: parseVideoClipAnimation(v.animateOut, `${path}.animateOut`),
|
|
@@ -391,8 +392,8 @@ function parseVideoClip(v, path = "clip") {
|
|
|
391
392
|
volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
|
|
392
393
|
muted: bool(v.muted, `${path}.muted`),
|
|
393
394
|
timeRemap: parseVideoTimeRemap(v.timeRemap, v.speed, `${path}.timeRemap`),
|
|
394
|
-
fadeInCurve: oneOf(v.fadeInCurve,
|
|
395
|
-
fadeOutCurve: oneOf(v.fadeOutCurve,
|
|
395
|
+
fadeInCurve: oneOf(v.fadeInCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
|
|
396
|
+
fadeOutCurve: oneOf(v.fadeOutCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
|
|
396
397
|
});
|
|
397
398
|
if (type === "sequence") {
|
|
398
399
|
for (const key of ["speed", "timeRemap"])
|
|
@@ -404,8 +405,8 @@ function parseVideoClip(v, path = "clip") {
|
|
|
404
405
|
in: num(v.in, `${path}.in`, { optional: true, min: 0 }),
|
|
405
406
|
volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
|
|
406
407
|
muted: bool(v.muted, `${path}.muted`),
|
|
407
|
-
fadeInCurve: oneOf(v.fadeInCurve,
|
|
408
|
-
fadeOutCurve: oneOf(v.fadeOutCurve,
|
|
408
|
+
fadeInCurve: oneOf(v.fadeInCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
|
|
409
|
+
fadeOutCurve: oneOf(v.fadeOutCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
|
|
409
410
|
});
|
|
410
411
|
}
|
|
411
412
|
if (type === "text")
|
|
@@ -516,9 +517,9 @@ function createVideoProject(options = {}) {
|
|
|
516
517
|
// src/video-editor/check.ts
|
|
517
518
|
function videoClipKeyframes(clip) {
|
|
518
519
|
const out = [
|
|
519
|
-
{ property: "opacity", keys:
|
|
520
|
-
{ property: "volume", keys: clip.type === "media" || clip.type === "sequence" ?
|
|
521
|
-
...
|
|
520
|
+
{ property: "opacity", keys: _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, clip.opacity) },
|
|
521
|
+
{ property: "volume", keys: clip.type === "media" || clip.type === "sequence" ? _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, clip.volume) : [] },
|
|
522
|
+
..._chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.map((p) => ({ property: p, keys: _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, _optionalChain([clip, 'access', _2 => _2.transform, 'optionalAccess', _3 => _3[p]])) }))
|
|
522
523
|
];
|
|
523
524
|
return out.filter((o) => o.keys.length);
|
|
524
525
|
}
|
|
@@ -545,8 +546,8 @@ var VIDEO_ISSUE_CODES = [
|
|
|
545
546
|
var videoIssueKey = (i) => [i.code, _nullishCoalesce(i.sequence, () => ( "")), _nullishCoalesce(i.track, () => ( "")), _nullishCoalesce(i.clip, () => ( "")), _nullishCoalesce(i.asset, () => ( "")), _nullishCoalesce(i.marker, () => ( ""))].join("|");
|
|
546
547
|
function checkVideoProject(project) {
|
|
547
548
|
const issues = [];
|
|
548
|
-
const assets =
|
|
549
|
-
const sequences =
|
|
549
|
+
const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project);
|
|
550
|
+
const sequences = _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, project);
|
|
550
551
|
const used = /* @__PURE__ */ new Set();
|
|
551
552
|
const usedSequences = /* @__PURE__ */ new Set();
|
|
552
553
|
const cycles = /* @__PURE__ */ new Map();
|
|
@@ -554,7 +555,7 @@ function checkVideoProject(project) {
|
|
|
554
555
|
if ((asset.kind === "video" || asset.kind === "audio") && asset.duration === void 0)
|
|
555
556
|
issues.push({ code: "unknown-duration", severity: "warning", asset: asset.id, message: `Asset "${asset.id}" has no duration, so clips of it cannot be checked against its length; set "duration" in ms.` });
|
|
556
557
|
const checkTrack = (track, sequence) => {
|
|
557
|
-
const clips =
|
|
558
|
+
const clips = _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track);
|
|
558
559
|
const where = sequence ? ` in sequence "${sequence}"` : "";
|
|
559
560
|
for (let i = 0; i < clips.length; i++) {
|
|
560
561
|
const clip = clips[i];
|
|
@@ -564,13 +565,13 @@ function checkVideoProject(project) {
|
|
|
564
565
|
const seq = sequences.get(clip.sequence);
|
|
565
566
|
if (!seq) issues.push({ code: "missing-sequence", severity: "error", ...at, message: `Compound clip "${clip.id}" plays sequence "${clip.sequence}", which is not in the project; add the sequence or delete the clip.` });
|
|
566
567
|
else {
|
|
567
|
-
if (!cycles.has(seq.id)) cycles.set(seq.id,
|
|
568
|
+
if (!cycles.has(seq.id)) cycles.set(seq.id, _chunkUXFI3CDZcjs.findVideoSequenceCycle.call(void 0, project, seq.id));
|
|
568
569
|
const cycle = cycles.get(seq.id);
|
|
569
570
|
if (cycle) issues.push({ code: "sequence-cycle", severity: "error", ...at, message: `Compound clip "${clip.id}" plays sequence "${seq.id}", which contains itself (${cycle.join(" \u2192 ")}), so it is left out of the picture and sound; remove the compound clip that closes the loop.` });
|
|
570
|
-
const length =
|
|
571
|
-
const range =
|
|
572
|
-
if (range.out > length +
|
|
573
|
-
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${
|
|
571
|
+
const length = _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, seq);
|
|
572
|
+
const range = _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, clip);
|
|
573
|
+
if (range.out > length + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
574
|
+
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, range.out)} of sequence "${seq.id}", which is only ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, length)} long; shorten the clip or move its in point.` });
|
|
574
575
|
}
|
|
575
576
|
} else if (clip.type === "media") {
|
|
576
577
|
used.add(clip.asset);
|
|
@@ -579,28 +580,28 @@ function checkVideoProject(project) {
|
|
|
579
580
|
else {
|
|
580
581
|
if (track.kind === "audio" && asset.kind === "image") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is an image on audio track "${track.id}"; move it to a video track.` });
|
|
581
582
|
if (track.kind === "video" && asset.kind === "audio") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is audio on video track "${track.id}"; move it to an audio track.` });
|
|
582
|
-
const range =
|
|
583
|
-
if (asset.duration !== void 0 && range.out > asset.duration +
|
|
584
|
-
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${
|
|
583
|
+
const range = _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, clip);
|
|
584
|
+
if (asset.duration !== void 0 && range.out > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
585
|
+
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, range.out)} of "${asset.id}", which is only ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, asset.duration)} long; shorten the clip or move its in point.` });
|
|
585
586
|
}
|
|
586
587
|
} else if (track.kind === "audio") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is a ${clip.type} clip on audio track "${track.id}"; move it to a video track.` });
|
|
587
588
|
const next = clips[i + 1];
|
|
588
|
-
if (next && next.start <
|
|
589
|
-
issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${
|
|
590
|
-
if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration +
|
|
589
|
+
if (next && next.start < _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
590
|
+
issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, next.start)}; move one of them.` });
|
|
591
|
+
if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
591
592
|
issues.push({ code: "fades-too-long", severity: "warning", ...at, message: `Clip "${clip.id}"'s fades (${_nullishCoalesce(clip.fadeIn, () => ( 0))} + ${_nullishCoalesce(clip.fadeOut, () => ( 0))} ms) are longer than the clip (${clip.duration} ms); shorten them.` });
|
|
592
|
-
const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => (
|
|
593
|
-
if (anim > clip.duration +
|
|
593
|
+
const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => ( _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0) + (clip.animateOut ? _nullishCoalesce(clip.animateOut.duration, () => ( _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0);
|
|
594
|
+
if (anim > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
594
595
|
issues.push({ code: "animations-too-long", severity: "warning", ...at, message: `Clip "${clip.id}"'s entrance and exit (${anim} ms together) are longer than the clip (${clip.duration} ms), so both are shortened; give them shorter durations.` });
|
|
595
596
|
for (const which of ["animateIn", "animateOut"]) {
|
|
596
597
|
const a = clip[which];
|
|
597
598
|
if (!a) continue;
|
|
598
|
-
const keyed =
|
|
599
|
+
const keyed = _chunkUXFI3CDZcjs.videoClipAnimationProperties.call(void 0, a).filter((p) => _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, p === "opacity" ? clip.opacity : _optionalChain([clip, 'access', _4 => _4.transform, 'optionalAccess', _5 => _5[p]])).length);
|
|
599
600
|
if (keyed.length)
|
|
600
601
|
issues.push({ code: "animation-keyed", severity: "note", ...at, message: `Clip "${clip.id}"'s ${a.effect} ${which === "animateIn" ? "entrance" : "exit"} leaves ${keyed.join(", ")} alone, because the clip keys ${keyed.length > 1 ? "them" : "it"} itself; remove those keyframes or the animation.` });
|
|
601
602
|
}
|
|
602
603
|
for (const { property, keys } of videoClipKeyframes(clip)) {
|
|
603
|
-
const outside = keys.filter((k) => k.t < -
|
|
604
|
+
const outside = keys.filter((k) => k.t < -_chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || k.t > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON);
|
|
604
605
|
if (outside.length)
|
|
605
606
|
issues.push({
|
|
606
607
|
code: "keyframes-outside-clip",
|
|
@@ -611,20 +612,20 @@ function checkVideoProject(project) {
|
|
|
611
612
|
}
|
|
612
613
|
if (clip.transition) {
|
|
613
614
|
const d = clip.transition.duration;
|
|
614
|
-
const before =
|
|
615
|
+
const before = _chunkUXFI3CDZcjs.videoClipBefore.call(void 0, track, clip);
|
|
615
616
|
if (!before) {
|
|
616
617
|
issues.push({ code: "transition-without-cut", severity: "warning", ...at, message: `Clip "${clip.id}" has a transition but no clip ends where it starts on track "${track.id}", so it plays as nothing; butt a clip up against it or remove the transition.` });
|
|
617
618
|
continue;
|
|
618
619
|
}
|
|
619
|
-
if (d > clip.duration +
|
|
620
|
+
if (d > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || d > before.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
|
|
620
621
|
issues.push({ code: "transition-too-long", severity: "error", ...at, message: `The ${d} ms transition into "${clip.id}" is longer than "${clip.id}" (${clip.duration} ms) or "${before.id}" (${before.duration} ms); make it at most ${Math.min(clip.duration, before.duration)} ms.` });
|
|
621
622
|
continue;
|
|
622
623
|
}
|
|
623
624
|
if (clip.transition.type === "dip") continue;
|
|
624
|
-
const outgoing =
|
|
625
|
-
const incoming =
|
|
625
|
+
const outgoing = _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, before, assets, sequences).after;
|
|
626
|
+
const incoming = _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, clip, assets, sequences).before;
|
|
626
627
|
const half = d / 2;
|
|
627
|
-
if (outgoing < half -
|
|
628
|
+
if (outgoing < half - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || incoming < half - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
|
|
628
629
|
const fits = 2 * Math.min(outgoing, incoming);
|
|
629
630
|
issues.push({
|
|
630
631
|
code: "transition-handles",
|
|
@@ -641,9 +642,9 @@ function checkVideoProject(project) {
|
|
|
641
642
|
for (const sequence of _nullishCoalesce(project.sequences, () => ( [])))
|
|
642
643
|
if (!usedSequences.has(sequence.id)) issues.push({ code: "unused-sequence", severity: "note", sequence: sequence.id, message: `Sequence "${sequence.id}" is not played by any compound clip.` });
|
|
643
644
|
for (const asset of project.assets) if (!used.has(asset.id)) issues.push({ code: "unused-asset", severity: "note", asset: asset.id, message: `Asset "${asset.id}" is not used by any clip.` });
|
|
644
|
-
const end =
|
|
645
|
+
const end = _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, project);
|
|
645
646
|
for (const marker of _nullishCoalesce(project.markers, () => ( [])))
|
|
646
|
-
if (marker.time > end +
|
|
647
|
+
if (marker.time > end + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) issues.push({ code: "marker-past-end", severity: "note", marker: marker.id, message: `Marker "${marker.id}" at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, marker.time)} is past the end (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, end)}).` });
|
|
647
648
|
if (!project.tracks.some((t) => t.clips.length)) issues.push({ code: "empty", severity: "note", message: "The project has no clips yet; add assets and then clips." });
|
|
648
649
|
const rank = { error: 0, warning: 1, note: 2 };
|
|
649
650
|
return issues.sort((a, b) => rank[a.severity] - rank[b.severity]);
|
|
@@ -697,7 +698,7 @@ function mergeSpans(spans) {
|
|
|
697
698
|
const out = [];
|
|
698
699
|
for (const [from, to] of [...spans].sort((a, b) => a[0] - b[0])) {
|
|
699
700
|
const last = out[out.length - 1];
|
|
700
|
-
if (last && from <= last[1] +
|
|
701
|
+
if (last && from <= last[1] + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) last[1] = Math.max(last[1], to);
|
|
701
702
|
else out.push([from, to]);
|
|
702
703
|
}
|
|
703
704
|
return out;
|
|
@@ -711,13 +712,13 @@ function clipAnimatables(clip) {
|
|
|
711
712
|
// A speed ramp is keys in clip time too, so trims and splits keep it on the same frames of source.
|
|
712
713
|
{ get: () => c.timeRemap, set: (v) => c.timeRemap = v }
|
|
713
714
|
];
|
|
714
|
-
for (const p of
|
|
715
|
+
for (const p of _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES) out.push({ get: () => _optionalChain([c, 'access', _6 => _6.transform, 'optionalAccess', _7 => _7[p]]), set: (v) => c.transform && (c.transform[p] = v) });
|
|
715
716
|
return out;
|
|
716
717
|
}
|
|
717
718
|
function retimeClipKeys(clip, fn) {
|
|
718
719
|
for (const a of clipAnimatables(clip)) {
|
|
719
720
|
const v = a.get();
|
|
720
|
-
if (
|
|
721
|
+
if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, v)) a.set(fn(v));
|
|
721
722
|
}
|
|
722
723
|
}
|
|
723
724
|
var OPTIONAL_CLIP_FIELDS = ["name", "effects", "values", "provider", "opacity", "transform", "fit", "blend", "grade", "animateIn", "animateOut", "fadeIn", "fadeOut", "fadeInCurve", "fadeOutCurve", "transition", "in", "speed", "timeRemap", "volume", "muted", "color", "fontSize", "fontFamily", "fontWeight", "background"];
|
|
@@ -734,8 +735,8 @@ var Editor = (_class = class {
|
|
|
734
735
|
return t;
|
|
735
736
|
}
|
|
736
737
|
clip(id) {
|
|
737
|
-
const at =
|
|
738
|
-
const nested = at ? null :
|
|
738
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.p, id);
|
|
739
|
+
const nested = at ? null : _chunkUXFI3CDZcjs.findVideoSequenceClip.call(void 0, this.p, id);
|
|
739
740
|
if (nested) refuse(`Clip "${id}" is inside sequence "${nested.sequence.id}", and clips inside sequences cannot be edited yet; edit the compound clip that plays the sequence instead (list_video_sequences shows which).`);
|
|
740
741
|
if (!at) {
|
|
741
742
|
const ids = this.p.tracks.flatMap((t) => t.clips.map((c) => c.id));
|
|
@@ -752,10 +753,10 @@ var Editor = (_class = class {
|
|
|
752
753
|
return a;
|
|
753
754
|
}
|
|
754
755
|
fits(track, start, duration, ignore, what) {
|
|
755
|
-
const hit =
|
|
756
|
+
const hit = _chunkUXFI3CDZcjs.videoOverlap.call(void 0, track, start, start + duration, ignore);
|
|
756
757
|
if (hit) {
|
|
757
|
-
const free =
|
|
758
|
-
refuse(`${what} at ${
|
|
758
|
+
const free = _chunkUXFI3CDZcjs.nextFreeVideoSlot.call(void 0, track, start, duration, ignore);
|
|
759
|
+
refuse(`${what} at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, start + duration)} would overlap clip "${hit.id}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, hit))}) on track "${track.id}"; the next free place is ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, free)}, or use mode "insert" to push later clips along or "overwrite" to replace what is there.`);
|
|
759
760
|
}
|
|
760
761
|
}
|
|
761
762
|
kindFits(track, clip) {
|
|
@@ -771,14 +772,14 @@ var Editor = (_class = class {
|
|
|
771
772
|
/** Moves every clip on `track` starting at or after `from` by `delta`. */
|
|
772
773
|
shift(track, from, delta, except = /* @__PURE__ */ new Set()) {
|
|
773
774
|
if (!delta) return;
|
|
774
|
-
for (const c of track.clips) if (!except.has(c.id) && c.start >= from -
|
|
775
|
+
for (const c of track.clips) if (!except.has(c.id) && c.start >= from - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) c.start = Math.max(0, c.start + delta);
|
|
775
776
|
track.clips.sort((a, b) => a.start - b.start);
|
|
776
777
|
}
|
|
777
778
|
get frame() {
|
|
778
779
|
return 1e3 / this.p.fps;
|
|
779
780
|
}
|
|
780
781
|
ids() {
|
|
781
|
-
return
|
|
782
|
+
return _chunkUXFI3CDZcjs.allVideoClipIds.call(void 0, this.p);
|
|
782
783
|
}
|
|
783
784
|
/**
|
|
784
785
|
* The tracks a ripple on `sources` moves, top to bottom: the sources, and every unlocked
|
|
@@ -786,8 +787,8 @@ var Editor = (_class = class {
|
|
|
786
787
|
*/
|
|
787
788
|
rippleTracks(sources) {
|
|
788
789
|
const set = new Set(sources);
|
|
789
|
-
if ([...set].some(
|
|
790
|
-
for (const t of this.p.tracks) if (
|
|
790
|
+
if ([...set].some(_chunkUXFI3CDZcjs.videoTrackSyncLocked)) {
|
|
791
|
+
for (const t of this.p.tracks) if (_chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, t) && !t.locked) set.add(t);
|
|
791
792
|
}
|
|
792
793
|
return this.p.tracks.filter((t) => set.has(t));
|
|
793
794
|
}
|
|
@@ -804,7 +805,7 @@ var Editor = (_class = class {
|
|
|
804
805
|
return open;
|
|
805
806
|
}
|
|
806
807
|
range(from, to) {
|
|
807
|
-
if (!(to - from >
|
|
808
|
+
if (!(to - from > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)) refuse(`"to" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, to)}) must be after "from" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, from)}).`);
|
|
808
809
|
}
|
|
809
810
|
/** Moves a media or compound clip's in point by `delta` of timeline time (stills, titles and colours have none). */
|
|
810
811
|
moveIn(clip, delta) {
|
|
@@ -813,18 +814,18 @@ var Editor = (_class = class {
|
|
|
813
814
|
if (clip.in < 1e-9) delete clip.in;
|
|
814
815
|
return;
|
|
815
816
|
}
|
|
816
|
-
if (clip.type !== "media" || _optionalChain([
|
|
817
|
-
clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta *
|
|
817
|
+
if (clip.type !== "media" || _optionalChain([_chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p), 'access', _9 => _9.get, 'call', _10 => _10(clip.asset), 'optionalAccess', _11 => _11.kind]) === "image") return;
|
|
818
|
+
clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta * _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip));
|
|
818
819
|
if (clip.in < 1e-9) delete clip.in;
|
|
819
820
|
}
|
|
820
821
|
/** Moves a clip's head `delta` later in time (start, in point and keys); the caller sets start and duration. */
|
|
821
822
|
trimHead(clip, delta) {
|
|
822
823
|
if (!isRamped(clip)) this.moveIn(clip, delta);
|
|
823
|
-
retimeClipKeys(clip, (v) =>
|
|
824
|
+
retimeClipKeys(clip, (v) => _chunkUXFI3CDZcjs.retimeVideoAnimatable.call(void 0, v, -delta));
|
|
824
825
|
}
|
|
825
826
|
/** Cuts `clip` at `at` (inside it): the left part keeps the id, the right part is returned. */
|
|
826
827
|
cut(track, clip, at, id) {
|
|
827
|
-
const end =
|
|
828
|
+
const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
|
|
828
829
|
const right = { ...structuredClone(clip), id: _nullishCoalesce(id, () => ( freshId(`${clip.id}-`, this.ids()))), start: at, duration: end - at };
|
|
829
830
|
delete right.transition;
|
|
830
831
|
delete right.fadeIn;
|
|
@@ -832,9 +833,9 @@ var Editor = (_class = class {
|
|
|
832
833
|
delete right.animateIn;
|
|
833
834
|
const leftValues = clipAnimatables(clip);
|
|
834
835
|
clipAnimatables(right).forEach((r, i) => {
|
|
835
|
-
const [l, rr] =
|
|
836
|
-
if (
|
|
837
|
-
if (
|
|
836
|
+
const [l, rr] = _chunkUXFI3CDZcjs.splitVideoAnimatable.call(void 0, leftValues[i].get(), at - clip.start);
|
|
837
|
+
if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, l)) leftValues[i].set(l);
|
|
838
|
+
if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, rr)) r.set(rr);
|
|
838
839
|
});
|
|
839
840
|
if (!isRamped(right)) this.moveIn(right, at - clip.start);
|
|
840
841
|
clip.duration = at - clip.start;
|
|
@@ -848,7 +849,7 @@ var Editor = (_class = class {
|
|
|
848
849
|
/** Cuts every clip on `tracks` that runs across `at`; returns the new right-hand parts. */
|
|
849
850
|
cutAcross(tracks, at) {
|
|
850
851
|
const made = [];
|
|
851
|
-
for (const t of tracks) for (const c of [...t.clips]) if (c.start < at -
|
|
852
|
+
for (const t of tracks) for (const c of [...t.clips]) if (c.start < at - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c) > at + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) made.push(this.cut(t, c, at));
|
|
852
853
|
return made;
|
|
853
854
|
}
|
|
854
855
|
/**
|
|
@@ -866,10 +867,10 @@ var Editor = (_class = class {
|
|
|
866
867
|
*/
|
|
867
868
|
close(tracks, from, to) {
|
|
868
869
|
for (const t of tracks) {
|
|
869
|
-
const hit =
|
|
870
|
+
const hit = _chunkUXFI3CDZcjs.videoOverlap.call(void 0, t, from, to);
|
|
870
871
|
if (hit)
|
|
871
872
|
refuse(
|
|
872
|
-
`Rippling out ${
|
|
873
|
+
`Rippling out ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, from)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, to)} would pull track "${t.id}" out of sync: clip "${hit.id}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, hit))}) is in that stretch. Extract the range across "${t.id}" too (extract_range with its id in "tracks"), turn its sync lock off (update_track with syncLocked false) or lock it, or lift instead of rippling.`
|
|
873
874
|
);
|
|
874
875
|
}
|
|
875
876
|
for (const t of tracks) this.shift(t, to, from - to);
|
|
@@ -881,10 +882,10 @@ var Editor = (_class = class {
|
|
|
881
882
|
clear(track, from, to, report) {
|
|
882
883
|
for (const c of [...track.clips]) {
|
|
883
884
|
const start = c.start;
|
|
884
|
-
const end =
|
|
885
|
-
if (end <= from +
|
|
886
|
-
const coversHead = start >= from -
|
|
887
|
-
const coversTail = end <= to +
|
|
885
|
+
const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c);
|
|
886
|
+
if (end <= from + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || start >= to - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) continue;
|
|
887
|
+
const coversHead = start >= from - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON;
|
|
888
|
+
const coversTail = end <= to + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON;
|
|
888
889
|
if (coversHead && coversTail) {
|
|
889
890
|
track.clips = track.clips.filter((x) => x !== c);
|
|
890
891
|
report.removed.push(c.id);
|
|
@@ -907,8 +908,8 @@ var Editor = (_class = class {
|
|
|
907
908
|
/** Clamps a slip, roll or slide to `[lo, hi]`, refusing when it cannot move that way at all. */
|
|
908
909
|
clamp(delta, lo, hi, why) {
|
|
909
910
|
const applied = Math.min(Math.max(delta, Math.min(0, lo)), Math.max(0, hi));
|
|
910
|
-
if (Math.abs(delta) >
|
|
911
|
-
return Math.abs(applied) <=
|
|
911
|
+
if (Math.abs(delta) > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && Math.abs(applied) <= _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(why());
|
|
912
|
+
return Math.abs(applied) <= _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON ? 0 : applied;
|
|
912
913
|
}
|
|
913
914
|
/** Places a clip on a track by `mode`, returning what it cut, trimmed, removed and rippled. */
|
|
914
915
|
place(track, clip, mode, outcome) {
|
|
@@ -918,14 +919,14 @@ var Editor = (_class = class {
|
|
|
918
919
|
outcome.rippled = tracks.map((t) => t.id);
|
|
919
920
|
} else if (mode === "overwrite") {
|
|
920
921
|
const report = { removed: [], trimmed: [], created: [] };
|
|
921
|
-
this.clear(track, clip.start,
|
|
922
|
+
this.clear(track, clip.start, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip), report);
|
|
922
923
|
Object.assign(outcome, report);
|
|
923
924
|
} else this.fits(track, clip.start, clip.duration, /* @__PURE__ */ new Set([clip.id]), `Clip "${clip.id}"`);
|
|
924
925
|
track.clips.push(clip);
|
|
925
926
|
track.clips.sort((a, b) => a.start - b.start);
|
|
926
927
|
}
|
|
927
928
|
placement(mode, ripple) {
|
|
928
|
-
if (mode !== void 0 && !
|
|
929
|
+
if (mode !== void 0 && !_chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES.includes(mode)) refuse(`"mode" must be ${_chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES.map((m) => `"${m}"`).join(", ")}.`);
|
|
929
930
|
if (ripple && mode !== void 0 && mode !== "insert") refuse(`"ripple" means mode "insert", so it cannot go with mode "${mode}"; pass one or the other.`);
|
|
930
931
|
return _nullishCoalesce(mode, () => ( (ripple ? "insert" : "refuse")));
|
|
931
932
|
}
|
|
@@ -962,7 +963,7 @@ var Editor = (_class = class {
|
|
|
962
963
|
}
|
|
963
964
|
case "remove_asset": {
|
|
964
965
|
const asset = this.asset(e.asset);
|
|
965
|
-
const users =
|
|
966
|
+
const users = _chunkUXFI3CDZcjs.allVideoTracks.call(void 0, this.p).flatMap(({ track: t }) => t.clips.filter((c) => c.type === "media" && c.asset === asset.id).map((c) => c.id));
|
|
966
967
|
if (users.length) refuse(`Asset "${asset.id}" is used by clip${users.length > 1 ? "s" : ""} ${users.map((u) => `"${u}"`).join(", ")}; delete ${users.length > 1 ? "them" : "it"} first.`);
|
|
967
968
|
this.p.assets = this.p.assets.filter((a) => a !== asset);
|
|
968
969
|
return this.outcomes.push({ op: e.op, asset: asset.id });
|
|
@@ -1015,12 +1016,12 @@ var Editor = (_class = class {
|
|
|
1015
1016
|
else draft.duration = (asset.duration - (_nullishCoalesce(draft.in, () => ( 0)))) / (_nullishCoalesce(draft.speed, () => ( 1)));
|
|
1016
1017
|
if (!(draft.duration > 0)) refuse(`"in" (${draft.in} ms) is at or past the end of "${asset.id}" (${asset.duration} ms).`);
|
|
1017
1018
|
} else if (draft.type === "sequence") {
|
|
1018
|
-
const length =
|
|
1019
|
+
const length = _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p).get(draft.sequence)) - (_nullishCoalesce(draft.in, () => ( 0)));
|
|
1019
1020
|
if (!(length > 0)) refuse(`"in" (${_nullishCoalesce(draft.in, () => ( 0))} ms) is at or past the end of sequence "${draft.sequence}".`);
|
|
1020
1021
|
draft.duration = length;
|
|
1021
1022
|
} else draft.duration = VIDEO_DEFAULT_TITLE_DURATION;
|
|
1022
1023
|
}
|
|
1023
|
-
const end =
|
|
1024
|
+
const end = _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track).reduce((m, c) => Math.max(m, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c)), 0);
|
|
1024
1025
|
draft.start ??= end;
|
|
1025
1026
|
const clip = parseVideoClip(draft, "clip");
|
|
1026
1027
|
const outcome = { op: e.op, clip: clip.id, track: track.id };
|
|
@@ -1045,20 +1046,20 @@ var Editor = (_class = class {
|
|
|
1045
1046
|
case "trim_clip": {
|
|
1046
1047
|
const { track, clip } = this.clip(e.clip);
|
|
1047
1048
|
this.unlocked(track);
|
|
1048
|
-
const speed =
|
|
1049
|
-
const end =
|
|
1049
|
+
const speed = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip);
|
|
1050
|
+
const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
|
|
1050
1051
|
const minimum = 1e3 / this.p.fps;
|
|
1051
|
-
const assets =
|
|
1052
|
+
const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p);
|
|
1052
1053
|
if (e.edge === "start") {
|
|
1053
1054
|
const delta = e.to - clip.start;
|
|
1054
|
-
if (clip.duration - delta < minimum -
|
|
1055
|
+
if (clip.duration - delta < minimum - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the start to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it ends at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, end)}.`);
|
|
1055
1056
|
if (clip.type === "media" && !isRamped(clip) || clip.type === "sequence") {
|
|
1056
1057
|
const sourceIn = (_nullishCoalesce(clip.in, () => ( 0))) + delta * speed;
|
|
1057
|
-
if (sourceIn < -
|
|
1058
|
+
if (sourceIn < -_chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" starts ${Math.round((_nullishCoalesce(clip.in, () => ( 0))) / speed)} ms into its source, so its start can move at most that far earlier (to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start - (_nullishCoalesce(clip.in, () => ( 0))) / speed)}).`);
|
|
1058
1059
|
clip.in = Math.max(0, sourceIn);
|
|
1059
1060
|
if (clip.in === 0) delete clip.in;
|
|
1060
1061
|
}
|
|
1061
|
-
retimeClipKeys(clip, (v) =>
|
|
1062
|
+
retimeClipKeys(clip, (v) => _chunkUXFI3CDZcjs.retimeVideoAnimatable.call(void 0, v, -delta));
|
|
1062
1063
|
if (e.ripple) {
|
|
1063
1064
|
const tracks = this.rippleTracks([track]);
|
|
1064
1065
|
if (delta > 0) {
|
|
@@ -1079,17 +1080,17 @@ var Editor = (_class = class {
|
|
|
1079
1080
|
}
|
|
1080
1081
|
} else {
|
|
1081
1082
|
const duration = e.to - clip.start;
|
|
1082
|
-
if (duration < minimum -
|
|
1083
|
+
if (duration < minimum - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the end to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it starts at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start)}.`);
|
|
1083
1084
|
if (clip.type === "media" && !isRamped(clip)) {
|
|
1084
1085
|
const asset = assets.get(clip.asset);
|
|
1085
1086
|
const out = (_nullishCoalesce(clip.in, () => ( 0))) + duration * speed;
|
|
1086
|
-
if (_optionalChain([asset, 'optionalAccess', _12 => _12.duration]) !== void 0 && out > asset.duration +
|
|
1087
|
-
refuse(`"${clip.id}" can end at most at ${
|
|
1087
|
+
if (_optionalChain([asset, 'optionalAccess', _12 => _12.duration]) !== void 0 && out > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
1088
|
+
refuse(`"${clip.id}" can end at most at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start + (asset.duration - (_nullishCoalesce(clip.in, () => ( 0)))) / speed)}, where "${asset.id}" runs out.`);
|
|
1088
1089
|
}
|
|
1089
1090
|
if (clip.type === "sequence") {
|
|
1090
|
-
const seq =
|
|
1091
|
-
const length = seq ?
|
|
1092
|
-
if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length +
|
|
1091
|
+
const seq = _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p).get(clip.sequence);
|
|
1092
|
+
const length = seq ? _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, seq) : Infinity;
|
|
1093
|
+
if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" can end at most at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start + length - (_nullishCoalesce(clip.in, () => ( 0))))}, where sequence "${clip.sequence}" ends.`);
|
|
1093
1094
|
}
|
|
1094
1095
|
if (e.ripple) {
|
|
1095
1096
|
const tracks = this.rippleTracks([track]);
|
|
@@ -1111,9 +1112,9 @@ var Editor = (_class = class {
|
|
|
1111
1112
|
case "split_clip": {
|
|
1112
1113
|
const { track, clip } = this.clip(e.clip);
|
|
1113
1114
|
this.unlocked(track);
|
|
1114
|
-
const end =
|
|
1115
|
+
const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
|
|
1115
1116
|
const minimum = 1e3 / this.p.fps;
|
|
1116
|
-
if (e.at < clip.start + minimum -
|
|
1117
|
+
if (e.at < clip.start + minimum - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || e.at > end - minimum + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.at)} is not inside "${clip.id}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, end)}), at least a frame from either end.`);
|
|
1117
1118
|
if (e.id !== void 0 && this.ids().includes(e.id)) refuse(`There is already a clip "${e.id}".`);
|
|
1118
1119
|
const right = this.cut(track, clip, e.at, e.id);
|
|
1119
1120
|
return this.outcomes.push({ op: e.op, clips: [clip.id, right.id], clip: right.id, track: track.id });
|
|
@@ -1124,12 +1125,12 @@ var Editor = (_class = class {
|
|
|
1124
1125
|
for (const track of new Set(found.map((f) => f.track))) track.clips = track.clips.filter((c) => !found.some((f) => f.clip === c));
|
|
1125
1126
|
if (!e.ripple) return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id) });
|
|
1126
1127
|
const rippled = /* @__PURE__ */ new Set();
|
|
1127
|
-
const groups = [...new Set(found.map((f) => f.track))].filter((t) => !
|
|
1128
|
-
if (found.some((f) =>
|
|
1128
|
+
const groups = [...new Set(found.map((f) => f.track))].filter((t) => !_chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, t)).map((t) => [t]);
|
|
1129
|
+
if (found.some((f) => _chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, f.track))) groups.push(found.filter((f) => _chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, f.track)).map((f) => f.track));
|
|
1129
1130
|
for (const sources of groups) {
|
|
1130
1131
|
const tracks = this.rippleTracks(sources);
|
|
1131
1132
|
tracks.forEach((t) => rippled.add(t));
|
|
1132
|
-
const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start,
|
|
1133
|
+
const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, f.clip)]));
|
|
1133
1134
|
for (const [from, to] of spans.reverse()) this.close(tracks, from, to);
|
|
1134
1135
|
}
|
|
1135
1136
|
return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id), rippled: this.p.tracks.filter((t) => rippled.has(t)).map((t) => t.id) });
|
|
@@ -1145,7 +1146,7 @@ var Editor = (_class = class {
|
|
|
1145
1146
|
if ("timeRemap" in set) refuse("Set a speed ramp with set_time_remap, which checks it against the media and moves later clips if asked.");
|
|
1146
1147
|
let stretch = 1;
|
|
1147
1148
|
if (at.clip.type === "media" && !("duration" in set)) {
|
|
1148
|
-
const was =
|
|
1149
|
+
const was = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, at.clip);
|
|
1149
1150
|
const now = "speed" in set ? set.speed : _optionalChain([e, 'access', _13 => _13.remove, 'optionalAccess', _14 => _14.includes, 'call', _15 => _15("speed")]) ? 1 : was;
|
|
1150
1151
|
if (now !== was) {
|
|
1151
1152
|
set.duration = at.clip.duration * was / now;
|
|
@@ -1153,7 +1154,7 @@ var Editor = (_class = class {
|
|
|
1153
1154
|
}
|
|
1154
1155
|
}
|
|
1155
1156
|
const next = { ...structuredClone(at.clip), ...set };
|
|
1156
|
-
if (stretch !== 1) retimeClipKeys(next, (v) =>
|
|
1157
|
+
if (stretch !== 1) retimeClipKeys(next, (v) => _chunkUXFI3CDZcjs.retimeVideoAnimatable.call(void 0, v, 0, stretch));
|
|
1157
1158
|
for (const k of _nullishCoalesce(e.remove, () => ( []))) delete next[k];
|
|
1158
1159
|
const clip = parseVideoClip(next, "set");
|
|
1159
1160
|
if (clip.type === "media" && clip.asset !== at.clip.asset) this.kindFits(at.track, clip);
|
|
@@ -1170,13 +1171,13 @@ var Editor = (_class = class {
|
|
|
1170
1171
|
const asset = this.asset(clip.asset);
|
|
1171
1172
|
if (asset.kind === "image") refuse(`Clip "${clip.id}" is a still ("${asset.id}"), so it has no motion to ramp.`);
|
|
1172
1173
|
const media = clip;
|
|
1173
|
-
const end =
|
|
1174
|
+
const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, media);
|
|
1174
1175
|
const duration = _nullishCoalesce(e.duration, () => ( media.duration));
|
|
1175
|
-
if (!(duration >= 1e3 / this.p.fps -
|
|
1176
|
+
if (!(duration >= 1e3 / this.p.fps - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)) refuse(`"duration" must be at least a frame (${Math.ceil(1e3 / this.p.fps)} ms).`);
|
|
1176
1177
|
if (e.keys === null) {
|
|
1177
1178
|
if (!media.timeRemap) refuse(`Clip "${clip.id}" has no speed ramp to remove.`);
|
|
1178
1179
|
const from = (_nullishCoalesce(media.in, () => ( 0))) + media.timeRemap.keys[0].v;
|
|
1179
|
-
if (asset.duration !== void 0 && from + duration > asset.duration +
|
|
1180
|
+
if (asset.duration !== void 0 && from + duration > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
1180
1181
|
refuse(`At normal speed from ${Math.round(from)} ms, "${clip.id}" would run past the end of "${asset.id}" (${asset.duration} ms); give a duration of at most ${Math.floor(asset.duration - from)} ms.`);
|
|
1181
1182
|
delete media.timeRemap;
|
|
1182
1183
|
media.in = from;
|
|
@@ -1184,17 +1185,17 @@ var Editor = (_class = class {
|
|
|
1184
1185
|
} else {
|
|
1185
1186
|
if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must be a list of at least one { t, v, ease } (or null to remove the ramp).');
|
|
1186
1187
|
const remap = parseVideoTimeRemap({ keys: e.keys }, void 0, "keys");
|
|
1187
|
-
remap.keys =
|
|
1188
|
-
|
|
1189
|
-
const span =
|
|
1190
|
-
if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration +
|
|
1188
|
+
remap.keys = _chunkUXFI3CDZcjs.sortVideoKeys.call(void 0, remap.keys);
|
|
1189
|
+
_chunkUXFI3CDZcjs.checkVideoTimeRemap.call(void 0, remap, "keys");
|
|
1190
|
+
const span = _chunkUXFI3CDZcjs.videoTimeRemapSpan.call(void 0, remap);
|
|
1191
|
+
if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
|
|
1191
1192
|
refuse(`The ramp plays ${Math.round(span.to)} ms of source from the in point (${_nullishCoalesce(media.in, () => ( 0))} ms), past the end of "${asset.id}" (${asset.duration} ms); it can use at most ${Math.floor(asset.duration - (_nullishCoalesce(media.in, () => ( 0))))} ms.`);
|
|
1192
1193
|
media.timeRemap = remap;
|
|
1193
1194
|
delete media.speed;
|
|
1194
1195
|
}
|
|
1195
1196
|
const newEnd = media.start + duration;
|
|
1196
1197
|
const outcome = { op: e.op, clip: clip.id, track: track.id };
|
|
1197
|
-
if (Math.abs(newEnd - end) >
|
|
1198
|
+
if (Math.abs(newEnd - end) > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
|
|
1198
1199
|
if (e.ripple) {
|
|
1199
1200
|
const tracks = this.rippleTracks([track]);
|
|
1200
1201
|
if (newEnd < end) {
|
|
@@ -1226,8 +1227,8 @@ var Editor = (_class = class {
|
|
|
1226
1227
|
if (clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${clip.type === "text" ? "title" : clip.type === "effect" ? "effect clip" : "colour"}, so it has no source to slip; only video, audio and compound clips slip.`);
|
|
1227
1228
|
const source = clip.type === "sequence" ? `sequence "${clip.sequence}"` : `"${this.asset(clip.asset).id}"`;
|
|
1228
1229
|
if (clip.type === "media" && this.asset(clip.asset).kind === "image") refuse(`Clip "${clip.id}" is a still ("${clip.asset}"), so it has no source to slip; only video and audio clips slip.`);
|
|
1229
|
-
const handles =
|
|
1230
|
-
const { lead, tail } =
|
|
1230
|
+
const handles = _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, clip, _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p), _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p));
|
|
1231
|
+
const { lead, tail } = _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, clip);
|
|
1231
1232
|
const delta = this.clamp(
|
|
1232
1233
|
e.delta,
|
|
1233
1234
|
lead - handles.before,
|
|
@@ -1245,13 +1246,13 @@ var Editor = (_class = class {
|
|
|
1245
1246
|
this.unlocked(track);
|
|
1246
1247
|
const L = left.clip;
|
|
1247
1248
|
const R = right.clip;
|
|
1248
|
-
if (Math.abs(
|
|
1249
|
-
if (Math.abs(
|
|
1250
|
-
refuse(`"${L.id}" ends at ${
|
|
1249
|
+
if (Math.abs(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, L) - R.start) > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
|
|
1250
|
+
if (Math.abs(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, R) - L.start) <= _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`"${R.id}" comes before "${L.id}"; pass left "${R.id}" and right "${L.id}".`);
|
|
1251
|
+
refuse(`"${L.id}" ends at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, L))} but "${R.id}" starts at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, R.start)}; a roll needs two clips that meet at a cut (use trim_clip to move one edge).`);
|
|
1251
1252
|
}
|
|
1252
|
-
const assets =
|
|
1253
|
-
const lo = Math.max(-(L.duration - this.frame), -(
|
|
1254
|
-
const hi = Math.min(R.duration - this.frame,
|
|
1253
|
+
const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p);
|
|
1254
|
+
const lo = Math.max(-(L.duration - this.frame), -(_chunkUXFI3CDZcjs.videoClipHandles.call(void 0, R, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, R).lead));
|
|
1255
|
+
const hi = Math.min(R.duration - this.frame, _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, L, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, L).tail);
|
|
1255
1256
|
const delta = this.clamp(
|
|
1256
1257
|
e.delta,
|
|
1257
1258
|
lo,
|
|
@@ -1267,18 +1268,18 @@ var Editor = (_class = class {
|
|
|
1267
1268
|
case "slide_clip": {
|
|
1268
1269
|
const { track, clip } = this.clip(e.clip);
|
|
1269
1270
|
this.unlocked(track);
|
|
1270
|
-
const before =
|
|
1271
|
-
const after =
|
|
1271
|
+
const before = _chunkUXFI3CDZcjs.videoClipBefore.call(void 0, track, clip);
|
|
1272
|
+
const after = _chunkUXFI3CDZcjs.videoClipAfter.call(void 0, track, clip);
|
|
1272
1273
|
if (!before && !after) refuse(`"${clip.id}" has no clip right before or after it on track "${track.id}", so there is nothing to slide against; use move_clip.`);
|
|
1273
|
-
const assets =
|
|
1274
|
-
const end =
|
|
1274
|
+
const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p);
|
|
1275
|
+
const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
|
|
1275
1276
|
const others = track.clips.filter((c) => c !== clip);
|
|
1276
1277
|
const room = {
|
|
1277
|
-
earlier: before ? before.duration - this.frame : clip.start - others.filter((c) =>
|
|
1278
|
-
later: after ? after.duration - this.frame : others.filter((c) => c.start >= end -
|
|
1278
|
+
earlier: before ? before.duration - this.frame : clip.start - others.filter((c) => _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c) <= clip.start + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.max(m, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c)), 0),
|
|
1279
|
+
later: after ? after.duration - this.frame : others.filter((c) => c.start >= end - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.min(m, c.start - end), Infinity)
|
|
1279
1280
|
};
|
|
1280
|
-
const lo = -Math.min(room.earlier, after ?
|
|
1281
|
-
const hi = Math.min(room.later, before ?
|
|
1281
|
+
const lo = -Math.min(room.earlier, after ? _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, after, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, after).lead : Infinity);
|
|
1282
|
+
const hi = Math.min(room.later, before ? _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, before, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, before).tail : Infinity);
|
|
1282
1283
|
const delta = this.clamp(
|
|
1283
1284
|
e.delta,
|
|
1284
1285
|
lo,
|
|
@@ -1311,29 +1312,29 @@ var Editor = (_class = class {
|
|
|
1311
1312
|
}
|
|
1312
1313
|
case "split_at": {
|
|
1313
1314
|
const tracks = this.rangeTracks(e.tracks);
|
|
1314
|
-
const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at -
|
|
1315
|
-
if (!lefts.length) refuse(`No clip runs across ${
|
|
1315
|
+
const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c) > e.at + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).map((c) => c.id));
|
|
1316
|
+
if (!lefts.length) refuse(`No clip runs across ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.at)} on ${e.tracks ? `track${tracks.length > 1 ? "s" : ""} ${tracks.map((t) => `"${t.id}"`).join(", ")}` : "the unlocked tracks"}, so there is nothing to split there.`);
|
|
1316
1317
|
const created = this.cutAcross(tracks, e.at).map((c) => c.id);
|
|
1317
1318
|
return this.outcomes.push({ op: e.op, clips: lefts, created });
|
|
1318
1319
|
}
|
|
1319
1320
|
case "set_keyframes": {
|
|
1320
1321
|
const { track, clip } = this.clip(e.clip);
|
|
1321
1322
|
this.unlocked(track);
|
|
1322
|
-
if (!
|
|
1323
|
+
if (!_chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES.includes(e.property)) refuse(`"${e.property}" cannot be keyframed; use one of ${_chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES.join(", ")}.`);
|
|
1323
1324
|
if (e.property === "volume" && clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${clip.type} clip and has no volume; volume keys go on media and compound clips.`);
|
|
1324
|
-
const limits =
|
|
1325
|
-
const transform =
|
|
1325
|
+
const limits = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[e.property];
|
|
1326
|
+
const transform = _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(e.property);
|
|
1326
1327
|
const c = clip;
|
|
1327
1328
|
const current = transform ? _optionalChain([c, 'access', _18 => _18.transform, 'optionalAccess', _19 => _19[e.property]]) : c[e.property];
|
|
1328
1329
|
let value;
|
|
1329
1330
|
if (e.keys === null) {
|
|
1330
|
-
const v =
|
|
1331
|
-
value =
|
|
1331
|
+
const v = _chunkUXFI3CDZcjs.videoValueAt.call(void 0, current, 0, limits.default);
|
|
1332
|
+
value = _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, current) ? v === limits.default ? void 0 : v : current;
|
|
1332
1333
|
} else {
|
|
1333
1334
|
if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must list at least one key { t, v }; pass null to remove the keyframes.');
|
|
1334
1335
|
let sorted = [];
|
|
1335
1336
|
try {
|
|
1336
|
-
sorted =
|
|
1337
|
+
sorted = _chunkUXFI3CDZcjs.sortVideoKeys.call(void 0, e.keys);
|
|
1337
1338
|
} catch (error) {
|
|
1338
1339
|
refuse(error.message);
|
|
1339
1340
|
}
|
|
@@ -1352,12 +1353,12 @@ var Editor = (_class = class {
|
|
|
1352
1353
|
this.unlocked(track);
|
|
1353
1354
|
let at = 0;
|
|
1354
1355
|
const moved = [];
|
|
1355
|
-
for (const clip of
|
|
1356
|
-
if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) -
|
|
1356
|
+
for (const clip of _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track)) {
|
|
1357
|
+
if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && clip.start > at + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
|
|
1357
1358
|
clip.start = Math.max(at, _nullishCoalesce(e.from, () => ( 0)));
|
|
1358
1359
|
moved.push(clip.id);
|
|
1359
1360
|
}
|
|
1360
|
-
at = Math.max(at,
|
|
1361
|
+
at = Math.max(at, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip));
|
|
1361
1362
|
}
|
|
1362
1363
|
return this.outcomes.push({ op: e.op, track: track.id, clips: moved });
|
|
1363
1364
|
}
|
|
@@ -1512,7 +1513,7 @@ function videoClipWaveform(clip, peaks, columns) {
|
|
|
1512
1513
|
const step = clip.duration / Math.max(1, n);
|
|
1513
1514
|
for (let c = 0; c < n; c++) {
|
|
1514
1515
|
const { min, max } = videoAudioPeakRange(peaks, start + c * step * speed, start + (c + 1) * step * speed);
|
|
1515
|
-
const gain =
|
|
1516
|
+
const gain = _chunkUXFI3CDZcjs.videoClipSoundGain.call(void 0, clip, (c + 0.5) * step);
|
|
1516
1517
|
out[2 * c] = min * gain;
|
|
1517
1518
|
out[2 * c + 1] = max * gain;
|
|
1518
1519
|
}
|
|
@@ -2077,7 +2078,7 @@ function videoTranscriptTrack(project, track) {
|
|
|
2077
2078
|
if (!project.tracks.some((t) => t.id === track)) throw new Error(`There is no track "${track}"; the tracks are ${project.tracks.map((t) => `"${t.id}"`).join(", ")}.`);
|
|
2078
2079
|
return track;
|
|
2079
2080
|
}
|
|
2080
|
-
const assets =
|
|
2081
|
+
const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project);
|
|
2081
2082
|
const transcribed = (t) => t.clips.some((c) => c.type === "media" && _optionalChain([assets, 'access', _21 => _21.get, 'call', _22 => _22(c.asset), 'optionalAccess', _23 => _23.transcript, 'optionalAccess', _24 => _24.length]));
|
|
2082
2083
|
return _nullishCoalesce(_optionalChain([(_nullishCoalesce(project.tracks.find((t) => t.kind === "audio" && transcribed(t)), () => ( project.tracks.find(transcribed)))), 'optionalAccess', _25 => _25.id]), () => ( null));
|
|
2083
2084
|
}
|
|
@@ -2085,16 +2086,16 @@ function videoTimelineTranscript(project, options = {}) {
|
|
|
2085
2086
|
const id = videoTranscriptTrack(project, options.track);
|
|
2086
2087
|
if (!id) return [];
|
|
2087
2088
|
const track = project.tracks.find((t) => t.id === id);
|
|
2088
|
-
const assets =
|
|
2089
|
+
const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project);
|
|
2089
2090
|
const out = [];
|
|
2090
|
-
for (const clip of
|
|
2091
|
+
for (const clip of _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track)) {
|
|
2091
2092
|
if (clip.type !== "media") continue;
|
|
2092
2093
|
const words = _optionalChain([assets, 'access', _26 => _26.get, 'call', _27 => _27(clip.asset), 'optionalAccess', _28 => _28.transcript]);
|
|
2093
2094
|
if (!_optionalChain([words, 'optionalAccess', _29 => _29.length])) continue;
|
|
2094
|
-
const speed =
|
|
2095
|
+
const speed = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip);
|
|
2095
2096
|
const from = _nullishCoalesce(clip.in, () => ( 0));
|
|
2096
2097
|
const to = from + clip.duration * speed;
|
|
2097
|
-
const toTimeline = (s) => Math.min(
|
|
2098
|
+
const toTimeline = (s) => Math.min(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip), Math.max(clip.start, clip.start + (s - from) / speed));
|
|
2098
2099
|
words.forEach((w, index) => {
|
|
2099
2100
|
const mid = (w.start + w.end) / 2;
|
|
2100
2101
|
if (mid < from || mid >= to) return;
|
|
@@ -2139,19 +2140,19 @@ function findVideoTranscriptPauses(words, options = {}) {
|
|
|
2139
2140
|
let to = b.start - keep;
|
|
2140
2141
|
if (options.fps) {
|
|
2141
2142
|
const f = 1e3 / options.fps;
|
|
2142
|
-
from =
|
|
2143
|
-
to =
|
|
2143
|
+
from = _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, Math.ceil(from / f - 1e-9) * f, options.fps);
|
|
2144
|
+
to = _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, Math.floor(to / f + 1e-9) * f, options.fps);
|
|
2144
2145
|
}
|
|
2145
|
-
if (to - from >
|
|
2146
|
+
if (to - from > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) out.push({ from, to, text: `(pause after "${a.word}")` });
|
|
2146
2147
|
}
|
|
2147
2148
|
return out;
|
|
2148
2149
|
}
|
|
2149
2150
|
function mergeVideoRanges(ranges) {
|
|
2150
|
-
const sorted = ranges.filter((r) => r.to - r.from >
|
|
2151
|
+
const sorted = ranges.filter((r) => r.to - r.from > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).map((r) => ({ from: r.from, to: r.to })).sort((a, b) => a.from - b.from);
|
|
2151
2152
|
const out = [];
|
|
2152
2153
|
for (const r of sorted) {
|
|
2153
2154
|
const last = out[out.length - 1];
|
|
2154
|
-
if (last && r.from <= last.to +
|
|
2155
|
+
if (last && r.from <= last.to + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) last.to = Math.max(last.to, r.to);
|
|
2155
2156
|
else out.push(r);
|
|
2156
2157
|
}
|
|
2157
2158
|
return out;
|
|
@@ -2235,7 +2236,7 @@ function videoProxyFfmpeg(asset, options = {}) {
|
|
|
2235
2236
|
output
|
|
2236
2237
|
];
|
|
2237
2238
|
const proxy = { scale, src: output, ...asset.width && asset.height ? { width: Math.trunc(asset.width * scale / 2) * 2, height: Math.trunc(asset.height * scale / 2) * 2 } : {} };
|
|
2238
|
-
return { asset: asset.id, args, command: ["ffmpeg", ...args].map(
|
|
2239
|
+
return { asset: asset.id, args, command: ["ffmpeg", ...args].map(_chunkUXFI3CDZcjs.videoShellQuote).join(" "), proxy };
|
|
2239
2240
|
}
|
|
2240
2241
|
function videoProxyPlan(project, options = {}) {
|
|
2241
2242
|
const scale = _nullishCoalesce(options.scale, () => ( 0.5));
|
|
@@ -2261,7 +2262,7 @@ var videoSourceFrameTime = (frame, fps) => (frame + 0.5) * 1e3 / fps;
|
|
|
2261
2262
|
var videoFrameCacheKey = (src, frame) => `${frame}@${src}`;
|
|
2262
2263
|
function videoFrameRequestsAt(project, time, srcFor = (l) => l.src) {
|
|
2263
2264
|
const out = [];
|
|
2264
|
-
for (const layer of
|
|
2265
|
+
for (const layer of _chunkUXFI3CDZcjs.videoFrameLeafLayers.call(void 0, _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, time).layers)) {
|
|
2265
2266
|
if (layer.type !== "media" || layer.assetKind !== "video") continue;
|
|
2266
2267
|
const src = srcFor(layer);
|
|
2267
2268
|
if (!src) continue;
|
|
@@ -2602,7 +2603,7 @@ var VideoPreviewEngine = (_class5 = class {
|
|
|
2602
2603
|
if (this.destroyed) return;
|
|
2603
2604
|
const state = this.source.getState();
|
|
2604
2605
|
const { project, time, playing } = state;
|
|
2605
|
-
const frame =
|
|
2606
|
+
const frame = _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, time);
|
|
2606
2607
|
const scale = resolveVideoPreviewScale(_nullishCoalesce(this.options.previewScale, () => ( state.previewScale)), this.resolutionFor(project.width));
|
|
2607
2608
|
const assets = new Map(project.assets.map((a) => [a.id, a]));
|
|
2608
2609
|
this.srcFor = (layer) => videoPreviewSrc(assets.get(_nullishCoalesce(layer.asset, () => ( ""))), scale, layer.src);
|
|
@@ -2632,7 +2633,7 @@ var VideoPreviewEngine = (_class5 = class {
|
|
|
2632
2633
|
}
|
|
2633
2634
|
};
|
|
2634
2635
|
const sounding = new Map(frame.audio.map((a) => [a.clip, a]));
|
|
2635
|
-
for (const layer of
|
|
2636
|
+
for (const layer of _chunkUXFI3CDZcjs.videoFrameLeafLayers.call(void 0, frame.layers)) {
|
|
2636
2637
|
if (layer.type !== "media" || layer.assetKind !== "video" || !layer.src) continue;
|
|
2637
2638
|
const sound = sounding.get(layer.clip);
|
|
2638
2639
|
sync(layer.clip, this.srcFor(layer), "video", _nullishCoalesce(layer.sourceTime, () => ( 0)), _nullishCoalesce(_optionalChain([sound, 'optionalAccess', _71 => _71.speed]), () => ( 1)), sound ? sound.gain : null);
|
|
@@ -2644,9 +2645,9 @@ var VideoPreviewEngine = (_class5 = class {
|
|
|
2644
2645
|
}
|
|
2645
2646
|
/** With effects, the frame is drawn at the start of its frame, so effect pictures are cached once per frame. */
|
|
2646
2647
|
drawable(project, frame) {
|
|
2647
|
-
if (!_optionalChain([this, 'access', _72 => _72.effects, 'optionalAccess', _73 => _73.available]) || !
|
|
2648
|
-
const at =
|
|
2649
|
-
return at === frame.time ? frame : { ...
|
|
2648
|
+
if (!_optionalChain([this, 'access', _72 => _72.effects, 'optionalAccess', _73 => _73.available]) || !_chunkUXFI3CDZcjs.videoLayersUseEffects.call(void 0, frame.layers)) return frame;
|
|
2649
|
+
const at = _chunkUXFI3CDZcjs.videoEffectFrameTime.call(void 0, frame.time, project.fps);
|
|
2650
|
+
return at === frame.time ? frame : { ..._chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, at), time: frame.time };
|
|
2650
2651
|
}
|
|
2651
2652
|
redraw() {
|
|
2652
2653
|
if (this.scheduled || this.destroyed) return;
|
|
@@ -2655,7 +2656,7 @@ var VideoPreviewEngine = (_class5 = class {
|
|
|
2655
2656
|
this.scheduled = false;
|
|
2656
2657
|
if (this.destroyed) return;
|
|
2657
2658
|
const { project, time } = this.source.getState();
|
|
2658
|
-
this.draw(this.drawable(project,
|
|
2659
|
+
this.draw(this.drawable(project, _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, time)));
|
|
2659
2660
|
});
|
|
2660
2661
|
}
|
|
2661
2662
|
__init33() {this.sourceFor = (layer) => {
|
|
@@ -2698,7 +2699,7 @@ var VideoPreviewEngine = (_class5 = class {
|
|
|
2698
2699
|
if (!source) this.complete = false;
|
|
2699
2700
|
return source;
|
|
2700
2701
|
};
|
|
2701
|
-
|
|
2702
|
+
_chunkUXFI3CDZcjs.drawVideoFrame.call(void 0, this.ctx, frame, sourceFor, resolution, {
|
|
2702
2703
|
defineSvgFilter: this.defineSvgFilter,
|
|
2703
2704
|
lutFor: this.lutFor,
|
|
2704
2705
|
scratch: this.scratch,
|
|
@@ -2798,17 +2799,17 @@ var VideoEditorController = (_class6 = class {
|
|
|
2798
2799
|
constructor(options = {}) {;_class6.prototype.__init37.call(this);_class6.prototype.__init38.call(this);_class6.prototype.__init39.call(this);_class6.prototype.__init40.call(this);_class6.prototype.__init41.call(this);_class6.prototype.__init42.call(this);_class6.prototype.__init43.call(this);_class6.prototype.__init44.call(this);_class6.prototype.__init45.call(this);
|
|
2799
2800
|
this.history = _nullishCoalesce(options.history, () => ( new (0, _chunkQKLRAA4Tcjs.HistoryManager)()));
|
|
2800
2801
|
this.audioPeaks = options.audioPeaks instanceof VideoAudioPeaksCache ? options.audioPeaks : new VideoAudioPeaksCache(options.audioPeaks);
|
|
2801
|
-
this.luts = options.luts instanceof
|
|
2802
|
+
this.luts = options.luts instanceof _chunkUXFI3CDZcjs.VideoLutCache ? options.luts : new (0, _chunkUXFI3CDZcjs.VideoLutCache)(options.luts);
|
|
2802
2803
|
this.frameCache = _nullishCoalesce(options.frameCache, () => ( null));
|
|
2803
2804
|
this.effects = new (0, _chunkIOXKXQNWcjs.EffectsSlot)();
|
|
2804
2805
|
if (options.effects) this.effects.set(options.effects);
|
|
2805
|
-
this.effectsEngine = new (0,
|
|
2806
|
+
this.effectsEngine = new (0, _chunkUXFI3CDZcjs.VideoEffectsEngine)({ slot: this.effects });
|
|
2806
2807
|
this.project = options.project ? parseVideoProject(options.project) : createVideoProject();
|
|
2807
2808
|
this.issues = checkVideoProject(this.project);
|
|
2808
2809
|
this.readOnly = _nullishCoalesce(options.readOnly, () => ( false));
|
|
2809
2810
|
this.previewScale = checkPreviewScale(_nullishCoalesce(options.previewScale, () => ( "auto")));
|
|
2810
2811
|
this.onChange = options.onChange;
|
|
2811
|
-
this.player = new (0, _chunk477UVMNRcjs.AnimationPlayer)({ clock: options.clock, duration: () =>
|
|
2812
|
+
this.player = new (0, _chunk477UVMNRcjs.AnimationPlayer)({ clock: options.clock, duration: () => _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, this.project), loop: "none" });
|
|
2812
2813
|
this.state = this.computeState();
|
|
2813
2814
|
this.connect();
|
|
2814
2815
|
}
|
|
@@ -2845,12 +2846,12 @@ var VideoEditorController = (_class6 = class {
|
|
|
2845
2846
|
const h = this.history.getState();
|
|
2846
2847
|
return {
|
|
2847
2848
|
project: this.project,
|
|
2848
|
-
duration:
|
|
2849
|
+
duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, this.project),
|
|
2849
2850
|
time: p.time,
|
|
2850
2851
|
playing: p.playing,
|
|
2851
2852
|
loop: p.loop,
|
|
2852
2853
|
selection: this.selection,
|
|
2853
|
-
current:
|
|
2854
|
+
current: _chunkUXFI3CDZcjs.videoClipsAt.call(void 0, this.project, p.time).map((c) => c.clip.id),
|
|
2854
2855
|
issues: this.issues,
|
|
2855
2856
|
readOnly: this.readOnly,
|
|
2856
2857
|
error: this.error,
|
|
@@ -2882,7 +2883,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
2882
2883
|
this.issues = checkVideoProject(project);
|
|
2883
2884
|
const ids = new Set(project.tracks.flatMap((t) => t.clips.map((c) => c.id)));
|
|
2884
2885
|
if (this.selection.some((id) => !ids.has(id))) this.selection = this.selection.filter((id) => ids.has(id));
|
|
2885
|
-
this.player.setDuration(() =>
|
|
2886
|
+
this.player.setDuration(() => _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, this.project));
|
|
2886
2887
|
} finally {
|
|
2887
2888
|
this.applying = false;
|
|
2888
2889
|
}
|
|
@@ -2964,7 +2965,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
2964
2965
|
}
|
|
2965
2966
|
/** Selects clips (unknown ids are dropped). `add` toggles them into the current selection. */
|
|
2966
2967
|
select(clips, options = {}) {
|
|
2967
|
-
const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _89 => _89.filter, 'call', _90 => _90((id) =>
|
|
2968
|
+
const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _89 => _89.filter, 'call', _90 => _90((id) => _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, id))]), () => ( []));
|
|
2968
2969
|
let next;
|
|
2969
2970
|
if (options.add) {
|
|
2970
2971
|
next = [...this.selection];
|
|
@@ -2991,7 +2992,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
2991
2992
|
step(frames) {
|
|
2992
2993
|
this.player.pause();
|
|
2993
2994
|
const fps = this.project.fps;
|
|
2994
|
-
this.player.seek(Math.max(0,
|
|
2995
|
+
this.player.seek(Math.max(0, _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, this.player.currentTime, fps) + frames * 1e3 / fps));
|
|
2995
2996
|
}
|
|
2996
2997
|
setLoop(loop) {
|
|
2997
2998
|
this.player.setLoop(loop);
|
|
@@ -3008,14 +3009,14 @@ var VideoEditorController = (_class6 = class {
|
|
|
3008
3009
|
*/
|
|
3009
3010
|
snap(time, options = {}) {
|
|
3010
3011
|
const threshold = _nullishCoalesce(options.threshold, () => ( 8 * 1e3 / this.project.fps));
|
|
3011
|
-
const points =
|
|
3012
|
-
const hit =
|
|
3013
|
-
return hit.snapped !== null ? hit : { time: Math.max(0,
|
|
3012
|
+
const points = _chunkUXFI3CDZcjs.videoSnapPoints.call(void 0, this.project, { exclude: options.exclude, playhead: options.playhead === false ? void 0 : this.player.currentTime });
|
|
3013
|
+
const hit = _chunkUXFI3CDZcjs.snapVideoTime.call(void 0, time, points, threshold);
|
|
3014
|
+
return hit.snapped !== null ? hit : { time: Math.max(0, _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, time, this.project.fps)), snapped: null };
|
|
3014
3015
|
}
|
|
3015
3016
|
/** Splits the selected clips (or every clip) under the playhead there, as one undo step. */
|
|
3016
3017
|
splitAtPlayhead() {
|
|
3017
|
-
const t =
|
|
3018
|
-
const under =
|
|
3018
|
+
const t = _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, this.player.currentTime, this.project.fps);
|
|
3019
|
+
const under = _chunkUXFI3CDZcjs.videoClipsAt.call(void 0, this.project, t).filter(({ clip }) => t > clip.start && t < _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip));
|
|
3019
3020
|
const chosen = this.selection.length ? under.filter(({ clip }) => this.selection.includes(clip.id)) : under;
|
|
3020
3021
|
if (!chosen.length) return this.refuse("No clip is under the playhead to split.");
|
|
3021
3022
|
return this.apply(chosen.map(({ clip }) => ({ op: "split_clip", clip: clip.id, at: t })), "Split");
|
|
@@ -3043,7 +3044,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3043
3044
|
/** The provider's description of an effect, checked for `place` (rejects without a provider or for an unknown id). */
|
|
3044
3045
|
async describeEffect(effect, place) {
|
|
3045
3046
|
const d = await this.effects.require().describe(effect);
|
|
3046
|
-
if (place)
|
|
3047
|
+
if (place) _chunkUXFI3CDZcjs.checkVideoEffectPlace.call(void 0, d, place);
|
|
3047
3048
|
return d;
|
|
3048
3049
|
}
|
|
3049
3050
|
refused(message) {
|
|
@@ -3064,7 +3065,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3064
3065
|
return { ...result, clip: plan.clip, ...plan.effect ? { effect: plan.effect() } : {} };
|
|
3065
3066
|
}
|
|
3066
3067
|
clipOrThrow(id) {
|
|
3067
|
-
const at =
|
|
3068
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, id);
|
|
3068
3069
|
if (!at) throw new Error(`There is no clip "${id}"; list_applied_effects or get_video_project lists the clips.`);
|
|
3069
3070
|
return at.clip;
|
|
3070
3071
|
}
|
|
@@ -3077,7 +3078,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3077
3078
|
return this.effectEdit(async () => {
|
|
3078
3079
|
const current = this.clipOrThrow(clip);
|
|
3079
3080
|
const d = await this.describeEffect(effect, "clip");
|
|
3080
|
-
const values =
|
|
3081
|
+
const values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
|
|
3081
3082
|
const stack = [..._nullishCoalesce(current.effects, () => ( []))];
|
|
3082
3083
|
const taken = new Set(stack.map((e) => e.id));
|
|
3083
3084
|
let n = 1;
|
|
@@ -3113,7 +3114,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3113
3114
|
if (!(k in d.controls.properties)) throw new Error(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
|
|
3114
3115
|
base[k] = d.defaults[k];
|
|
3115
3116
|
}
|
|
3116
|
-
next.values =
|
|
3117
|
+
next.values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, given, { base, keyframes: true });
|
|
3117
3118
|
}
|
|
3118
3119
|
if (changes.enabled !== void 0) {
|
|
3119
3120
|
if (changes.enabled) delete next.enabled;
|
|
@@ -3131,7 +3132,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3131
3132
|
removeClipEffect(clip, instance) {
|
|
3132
3133
|
const reason = this.readOnlyReason();
|
|
3133
3134
|
if (reason) return this.refused(reason);
|
|
3134
|
-
const at =
|
|
3135
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, clip);
|
|
3135
3136
|
if (!at) return this.refused(`There is no clip "${clip}".`);
|
|
3136
3137
|
const stack = _nullishCoalesce(at.clip.effects, () => ( []));
|
|
3137
3138
|
const was = stack.find((e) => e.id === instance);
|
|
@@ -3148,7 +3149,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3148
3149
|
return this.effectEdit(async () => {
|
|
3149
3150
|
this.clipOrThrow(clip);
|
|
3150
3151
|
const d = await this.describeEffect(effect, "transition");
|
|
3151
|
-
const values =
|
|
3152
|
+
const values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, options.values);
|
|
3152
3153
|
const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 1e3));
|
|
3153
3154
|
return { edit: { op: "set_transition", clip, transition: { type: "effect", duration, effect: { effect: d.id, provider: this.effects.require().id, name: d.name, values } } }, label: `Transition ${d.name}`, clip };
|
|
3154
3155
|
});
|
|
@@ -3161,7 +3162,7 @@ var VideoEditorController = (_class6 = class {
|
|
|
3161
3162
|
addEffectClip(track, effect, options = {}) {
|
|
3162
3163
|
return this.effectEdit(async () => {
|
|
3163
3164
|
const d = await this.describeEffect(effect, "generator");
|
|
3164
|
-
const values =
|
|
3165
|
+
const values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
|
|
3165
3166
|
const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 5e3));
|
|
3166
3167
|
const label = `Add ${d.name}`;
|
|
3167
3168
|
const clipId = _nullishCoalesce(options.id, () => ( ""));
|
|
@@ -3183,42 +3184,42 @@ var VideoEditorController = (_class6 = class {
|
|
|
3183
3184
|
if (part === "generator") {
|
|
3184
3185
|
if (current.type !== "effect") throw new Error(`Clip "${clip}" is not an effect clip.`);
|
|
3185
3186
|
const d2 = await this.describeEffect(current.effect);
|
|
3186
|
-
return { edit: { op: "update_clip", clip, set: { values:
|
|
3187
|
+
return { edit: { op: "update_clip", clip, set: { values: _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d2, values, { base: _nullishCoalesce(current.values, () => ( {})), keyframes: true }) } }, label: `Change ${_nullishCoalesce(current.name, () => ( d2.name))}`, clip };
|
|
3187
3188
|
}
|
|
3188
3189
|
const t = current.transition;
|
|
3189
3190
|
if (_optionalChain([t, 'optionalAccess', _94 => _94.type]) !== "effect" || !t.effect) throw new Error(`Clip "${clip}" has no effect transition.`);
|
|
3190
3191
|
const d = await this.describeEffect(t.effect.effect);
|
|
3191
|
-
const merged =
|
|
3192
|
+
const merged = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, values, { base: _nullishCoalesce(t.effect.values, () => ( {})) });
|
|
3192
3193
|
return { edit: { op: "set_transition", clip, transition: { ...t, effect: { ...t.effect, values: merged } } }, label: `Change transition ${d.name}`, clip };
|
|
3193
3194
|
}, options.merge);
|
|
3194
3195
|
}
|
|
3195
3196
|
/** Keys for one numeric control of a clip effect (clip-relative ms), or `null` to stop animating it (keeping its value at the clip's start). */
|
|
3196
3197
|
setClipEffectKeyframes(clip, instance, control, keys) {
|
|
3197
|
-
const current = _optionalChain([
|
|
3198
|
+
const current = _optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, clip), 'optionalAccess', _95 => _95.clip]);
|
|
3198
3199
|
const was = _optionalChain([current, 'optionalAccess', _96 => _96.effects, 'optionalAccess', _97 => _97.find, 'call', _98 => _98((e) => e.id === instance)]);
|
|
3199
3200
|
const value = _optionalChain([was, 'optionalAccess', _99 => _99.values, 'optionalAccess', _100 => _100[control]]);
|
|
3200
|
-
const plain = keys === null ?
|
|
3201
|
+
const plain = keys === null ? _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, value) ? _optionalChain([value, 'access', _101 => _101.keys, 'access', _102 => _102[0], 'optionalAccess', _103 => _103.v]) : value : { keys: [...keys].sort((a, b) => a.t - b.t) };
|
|
3201
3202
|
return this.updateClipEffect(clip, instance, { values: { [control]: _nullishCoalesce(plain, () => ( null)) } });
|
|
3202
3203
|
}
|
|
3203
3204
|
/** What plays at `time` (default: the playhead). */
|
|
3204
3205
|
frame(time = this.player.currentTime) {
|
|
3205
|
-
return
|
|
3206
|
+
return _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, this.project, time);
|
|
3206
3207
|
}
|
|
3207
3208
|
/** The frame at `time` (default: the playhead) as SVG. */
|
|
3208
3209
|
toSvg(time = this.player.currentTime, options = {}) {
|
|
3209
|
-
return
|
|
3210
|
+
return _chunkUXFI3CDZcjs.videoProjectSvg.call(void 0, this.project, time, { lutFor: (src) => this.luts.peek(src), ...options });
|
|
3210
3211
|
}
|
|
3211
3212
|
/** The project as an ffmpeg command. */
|
|
3212
3213
|
toFfmpeg(options = {}) {
|
|
3213
|
-
return
|
|
3214
|
+
return _chunkUXFI3CDZcjs.toVideoFfmpeg.call(void 0, this.project, options);
|
|
3214
3215
|
}
|
|
3215
3216
|
/** The ffmpeg command that measures the mix's loudness (see `toVideoLoudnessMeasure`). */
|
|
3216
3217
|
toLoudnessMeasure(options = {}) {
|
|
3217
|
-
return
|
|
3218
|
+
return _chunkUXFI3CDZcjs.toVideoLoudnessMeasure.call(void 0, this.project, options);
|
|
3218
3219
|
}
|
|
3219
3220
|
/** One track as a CMX 3600 EDL. */
|
|
3220
3221
|
toEdl(options = {}) {
|
|
3221
|
-
return
|
|
3222
|
+
return _chunkUXFI3CDZcjs.toVideoEdl.call(void 0, this.project, options);
|
|
3222
3223
|
}
|
|
3223
3224
|
}, _class6);
|
|
3224
3225
|
function checkPreviewScale(scale) {
|
|
@@ -3237,12 +3238,12 @@ function videoRulerTicks(duration, pxPerSecond, fps) {
|
|
|
3237
3238
|
const ticks = [];
|
|
3238
3239
|
for (let t = 0; t <= duration + 1e-6; t += step) {
|
|
3239
3240
|
const isMajor = Math.abs(t / major - Math.round(t / major)) < 1e-9;
|
|
3240
|
-
ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label:
|
|
3241
|
+
ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, t, fps).replace(/^00:/, "") } : {} });
|
|
3241
3242
|
}
|
|
3242
3243
|
return ticks;
|
|
3243
3244
|
}
|
|
3244
3245
|
function videoClipShowsWaveform(clip, asset, mode = "audio") {
|
|
3245
|
-
if (clip.type !== "media" || mode === "none" || !
|
|
3246
|
+
if (clip.type !== "media" || mode === "none" || !_chunkUXFI3CDZcjs.videoAssetHasSound.call(void 0, asset)) return false;
|
|
3246
3247
|
return mode === "all" || asset.kind === "audio";
|
|
3247
3248
|
}
|
|
3248
3249
|
var VIDEO_CLIP_ANIMATION_LABELS = {
|
|
@@ -3301,11 +3302,11 @@ function videoClipLabel(clip, asset, sequence) {
|
|
|
3301
3302
|
if (clip.type === "sequence") return `Compound: ${_nullishCoalesce(_optionalChain([sequence, 'optionalAccess', _104 => _104.name]), () => ( clip.sequence))}`;
|
|
3302
3303
|
if (clip.type === "effect") return `Effect: ${clip.effect}`;
|
|
3303
3304
|
const base = _nullishCoalesce(_nullishCoalesce(_optionalChain([asset, 'optionalAccess', _105 => _105.name]), () => ( _optionalChain([asset, 'optionalAccess', _106 => _106.src, 'access', _107 => _107.replace, 'call', _108 => _108(/^.*[\\/]/, "")]))), () => ( clip.asset));
|
|
3304
|
-
const speed =
|
|
3305
|
+
const speed = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip);
|
|
3305
3306
|
return speed !== 1 ? `${base} (${Math.round(speed * 100)}%)` : base;
|
|
3306
3307
|
}
|
|
3307
3308
|
function planVideoClipDrag(project, input) {
|
|
3308
|
-
const at =
|
|
3309
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, input.clip);
|
|
3309
3310
|
if (!at) return null;
|
|
3310
3311
|
const { clip, track } = at;
|
|
3311
3312
|
const snap = _nullishCoalesce(input.snap, () => ( ((t) => t)));
|
|
@@ -3322,17 +3323,17 @@ function planVideoClipDrag(project, input) {
|
|
|
3322
3323
|
}
|
|
3323
3324
|
const minimum = 1e3 / project.fps;
|
|
3324
3325
|
if (input.mode === "trim-start") {
|
|
3325
|
-
const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)),
|
|
3326
|
+
const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)), _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) - minimum);
|
|
3326
3327
|
const changed2 = Math.abs(to2 - clip.start) > 1e-6;
|
|
3327
|
-
const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration:
|
|
3328
|
+
const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) - to2 };
|
|
3328
3329
|
return { ...plan, track: track.id, edit: changed2 ? { op: "trim_clip", clip: clip.id, edge: "start", to: to2, ...input.ripple ? { ripple: true } : {} } : null };
|
|
3329
3330
|
}
|
|
3330
|
-
const to = Math.max(snap(
|
|
3331
|
-
const changed = Math.abs(to -
|
|
3331
|
+
const to = Math.max(snap(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) + input.delta), clip.start + minimum);
|
|
3332
|
+
const changed = Math.abs(to - _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip)) > 1e-6;
|
|
3332
3333
|
return { start: clip.start, duration: to - clip.start, track: track.id, edit: changed ? { op: "trim_clip", clip: clip.id, edge: "end", to, ...input.ripple ? { ripple: true } : {} } : null };
|
|
3333
3334
|
}
|
|
3334
3335
|
function videoDropTracks(project, clipId) {
|
|
3335
|
-
const at =
|
|
3336
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
|
|
3336
3337
|
if (!at) return [];
|
|
3337
3338
|
return project.tracks.filter((t) => t.kind === at.track.kind && !t.locked).map((t) => t.id);
|
|
3338
3339
|
}
|
|
@@ -3341,7 +3342,7 @@ function videoDragLabel(edit) {
|
|
|
3341
3342
|
return edit.op === "trim_clip" && edit.ripple ? "Ripple trim" : "Trim clip";
|
|
3342
3343
|
}
|
|
3343
3344
|
function videoAssetDropEdit(project, assetId, options = {}) {
|
|
3344
|
-
const asset =
|
|
3345
|
+
const asset = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project).get(assetId);
|
|
3345
3346
|
if (!asset) return null;
|
|
3346
3347
|
const kind = asset.kind === "audio" ? "audio" : "video";
|
|
3347
3348
|
const track = _nullishCoalesce(options.track, () => ( _optionalChain([project, 'access', _109 => _109.tracks, 'access', _110 => _110.find, 'call', _111 => _111((t) => t.kind === kind && !t.locked), 'optionalAccess', _112 => _112.id])));
|
|
@@ -3393,25 +3394,25 @@ var KEY_LABELS = {
|
|
|
3393
3394
|
scale: { label: "Scale", step: 0.05 },
|
|
3394
3395
|
rotation: { label: "Rotation", step: 1 }
|
|
3395
3396
|
};
|
|
3396
|
-
var animatableOf = (clip, property) =>
|
|
3397
|
+
var animatableOf = (clip, property) => _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _113 => _113.transform, 'optionalAccess', _114 => _114[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
|
|
3397
3398
|
var playheadInClip = (clip, time) => Math.round(Math.min(clip.duration, Math.max(0, time - clip.start)));
|
|
3398
3399
|
function videoKeyframeRows(project, clipId, time) {
|
|
3399
|
-
const at =
|
|
3400
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
|
|
3400
3401
|
if (!at) return [];
|
|
3401
3402
|
const { clip } = at;
|
|
3402
|
-
const asset = clip.type === "media" ?
|
|
3403
|
+
const asset = clip.type === "media" ? _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
|
|
3403
3404
|
const visual = !(_optionalChain([asset, 'optionalAccess', _115 => _115.kind]) === "audio" || at.track.kind === "audio");
|
|
3404
|
-
const audible = clip.type === "media" &&
|
|
3405
|
-
const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ?
|
|
3405
|
+
const audible = clip.type === "media" && _chunkUXFI3CDZcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
|
|
3406
|
+
const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES : []];
|
|
3406
3407
|
const clipTime = playheadInClip(clip, time);
|
|
3407
3408
|
return properties.map((property) => {
|
|
3408
3409
|
const prop = animatableOf(clip, property);
|
|
3409
|
-
const keys =
|
|
3410
|
-
const limits =
|
|
3410
|
+
const keys = _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop) ? prop.keys : [];
|
|
3411
|
+
const limits = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[property];
|
|
3411
3412
|
return {
|
|
3412
3413
|
property,
|
|
3413
3414
|
...KEY_LABELS[property],
|
|
3414
|
-
value: Math.round(
|
|
3415
|
+
value: Math.round(_chunkUXFI3CDZcjs.videoValueAt.call(void 0, prop, clipTime, limits.default) * 1e3) / 1e3,
|
|
3415
3416
|
keyed: keys.length > 0,
|
|
3416
3417
|
keys: keys.length,
|
|
3417
3418
|
onKey: keys.some((k) => Math.abs(k.t - clipTime) < 0.5),
|
|
@@ -3422,44 +3423,44 @@ function videoKeyframeRows(project, clipId, time) {
|
|
|
3422
3423
|
});
|
|
3423
3424
|
}
|
|
3424
3425
|
function plainValueEdit(clip, property, value) {
|
|
3425
|
-
if (!
|
|
3426
|
+
if (!_chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property))
|
|
3426
3427
|
return value === void 0 ? { op: "update_clip", clip: clip.id, remove: [property] } : { op: "update_clip", clip: clip.id, set: { [property]: value } };
|
|
3427
3428
|
const transform = { ...clip.transform, [property]: value };
|
|
3428
3429
|
if (value === void 0) delete transform[property];
|
|
3429
3430
|
return Object.keys(transform).length ? { op: "update_clip", clip: clip.id, set: { transform } } : { op: "update_clip", clip: clip.id, remove: ["transform"] };
|
|
3430
3431
|
}
|
|
3431
3432
|
function videoKeyframeValueEdit(project, clipId, property, time, value) {
|
|
3432
|
-
const at =
|
|
3433
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
|
|
3433
3434
|
if (!at) return null;
|
|
3434
3435
|
const prop = animatableOf(at.clip, property);
|
|
3435
|
-
if (!
|
|
3436
|
+
if (!_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop)) return plainValueEdit(at.clip, property, value);
|
|
3436
3437
|
if (value === void 0) return null;
|
|
3437
|
-
return { op: "set_keyframes", clip: clipId, property, keys:
|
|
3438
|
+
return { op: "set_keyframes", clip: clipId, property, keys: _chunkUXFI3CDZcjs.setVideoKey.call(void 0, prop, { t: playheadInClip(at.clip, time), v: value }, _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[property].default).keys };
|
|
3438
3439
|
}
|
|
3439
3440
|
function videoKeyframeToggleEdit(project, clipId, property, time) {
|
|
3440
|
-
const at =
|
|
3441
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
|
|
3441
3442
|
if (!at) return null;
|
|
3442
3443
|
const prop = animatableOf(at.clip, property);
|
|
3443
3444
|
const t = playheadInClip(at.clip, time);
|
|
3444
|
-
const fallback =
|
|
3445
|
-
if (
|
|
3445
|
+
const fallback = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[property].default;
|
|
3446
|
+
if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop)) {
|
|
3446
3447
|
const key = prop.keys.find((k) => Math.abs(k.t - t) < 0.5);
|
|
3447
3448
|
if (key) {
|
|
3448
|
-
const rest =
|
|
3449
|
-
return
|
|
3449
|
+
const rest = _chunkUXFI3CDZcjs.removeVideoKey.call(void 0, prop, key.t);
|
|
3450
|
+
return _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, rest) ? { op: "set_keyframes", clip: clipId, property, keys: rest.keys } : plainValueEdit(at.clip, property, rest === fallback ? void 0 : rest);
|
|
3450
3451
|
}
|
|
3451
3452
|
}
|
|
3452
|
-
const v =
|
|
3453
|
-
return { op: "set_keyframes", clip: clipId, property, keys:
|
|
3453
|
+
const v = _chunkUXFI3CDZcjs.videoValueAt.call(void 0, prop, t, fallback);
|
|
3454
|
+
return { op: "set_keyframes", clip: clipId, property, keys: _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop) ? _chunkUXFI3CDZcjs.setVideoKey.call(void 0, prop, { t, v }, fallback).keys : [{ t, v }] };
|
|
3454
3455
|
}
|
|
3455
3456
|
function videoLutEdits(project, clips, lut) {
|
|
3456
3457
|
const edits = [];
|
|
3457
3458
|
for (const id of clips) {
|
|
3458
|
-
const at =
|
|
3459
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, id);
|
|
3459
3460
|
if (!at) continue;
|
|
3460
3461
|
const { lut: current, ...rest } = _nullishCoalesce(at.clip.grade, () => ( {}));
|
|
3461
3462
|
if (!lut && !current) continue;
|
|
3462
|
-
const grade =
|
|
3463
|
+
const grade = _chunkUXFI3CDZcjs.normalizeVideoGrade.call(void 0, lut ? { ...rest, lut } : rest);
|
|
3463
3464
|
edits.push(grade ? { op: "update_clip", clip: id, set: { grade } } : { op: "update_clip", clip: id, remove: ["grade"] });
|
|
3464
3465
|
}
|
|
3465
3466
|
return edits;
|
|
@@ -3489,7 +3490,7 @@ var RIPPLE = {
|
|
|
3489
3490
|
};
|
|
3490
3491
|
var MODE = {
|
|
3491
3492
|
type: "string",
|
|
3492
|
-
enum: [...
|
|
3493
|
+
enum: [..._chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES],
|
|
3493
3494
|
description: 'What to do with clips already where it lands: "refuse" (default) fails with the next free place; "overwrite" cuts, trims or removes what is underneath on that track; "insert" cuts everything across the start and pushes later material along by its length on this track and every sync-locked track.'
|
|
3494
3495
|
};
|
|
3495
3496
|
var DELTA = (what) => ({ type: "number", description: `${what}, in milliseconds of timeline time: positive is later, negative earlier. It is clamped to what the media and neighbours allow; the result says how far it went.` });
|
|
@@ -3506,11 +3507,11 @@ var TRANSFORM = object(
|
|
|
3506
3507
|
);
|
|
3507
3508
|
var TRANSITION = object(
|
|
3508
3509
|
{
|
|
3509
|
-
type: { type: "string", enum:
|
|
3510
|
+
type: { type: "string", enum: _chunkUXFI3CDZcjs.VIDEO_TRANSITION_TYPES.filter((t) => t !== "effect"), description: "crossfade (this clip fades up over the one before), dip (down into a colour and up out of it), wipe (an edge travels across revealing this clip), push (this clip slides in and pushes the one before out), slide (this clip slides in over the one before) or iris (a circle opens from the centre). For a transition effect from the effects provider use set_video_effect_transition." },
|
|
3510
3511
|
duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms, centred on the cut. Every type but dip needs half of it in media past the cut on both sides (handles); a dip needs none." },
|
|
3511
3512
|
color: COLOR("For dip: the colour passed through (default black)"),
|
|
3512
|
-
direction: { type: "string", enum: [...
|
|
3513
|
-
audioCurve: { type: "string", enum: [...
|
|
3513
|
+
direction: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_WIPE_DIRECTIONS], description: "For wipe, push and slide: the way the edge or picture travels (default right, coming in from the left)." },
|
|
3514
|
+
audioCurve: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fades through it: default equal-power for every type but dip (steady loudness while the two sounds overlap), linear for dip; or s-curve, exponential, logarithmic." }
|
|
3514
3515
|
},
|
|
3515
3516
|
["type", "duration"],
|
|
3516
3517
|
"A transition from the clip that ends where this one starts on the same track."
|
|
@@ -3519,7 +3520,7 @@ var LUT_SRC = { type: "string", minLength: 1, description: 'A .cube 3D LUT file
|
|
|
3519
3520
|
var LUT_STRENGTH = { type: "number", minimum: 0, maximum: 1, description: "How much of the LUT's change to apply, 0 (none) to 1 (full, the default); 0.3-0.7 for a subtler look." };
|
|
3520
3521
|
var GRADE = object(
|
|
3521
3522
|
{
|
|
3522
|
-
...Object.fromEntries(
|
|
3523
|
+
...Object.fromEntries(_chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, { type: "number", minimum: c.min, maximum: c.max, description: c.description }])),
|
|
3523
3524
|
lut: object({ src: LUT_SRC, strength: LUT_STRENGTH, name: { type: "string", minLength: 1, description: "A label for the look." } }, ["src"], "A 3D LUT applied after the other settings (set_video_lut checks the file first).")
|
|
3524
3525
|
},
|
|
3525
3526
|
[],
|
|
@@ -3527,7 +3528,7 @@ var GRADE = object(
|
|
|
3527
3528
|
);
|
|
3528
3529
|
var ANIMATION = (when) => object(
|
|
3529
3530
|
{
|
|
3530
|
-
effect: { type: "string", enum: [...
|
|
3531
|
+
effect: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_EFFECTS], description: "fade; rise (up into place) or drop (down into place); slide-left / slide-right (moving that way); zoom (grows into place); pop (grows past its size and settles). Each also fades; an exit plays the movement backwards." },
|
|
3531
3532
|
duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default 500)." }
|
|
3532
3533
|
},
|
|
3533
3534
|
["effect"],
|
|
@@ -3537,11 +3538,11 @@ var CLIP_COMMON = {
|
|
|
3537
3538
|
name: { type: "string", description: "A label for the clip." },
|
|
3538
3539
|
opacity: { type: "number", minimum: 0, maximum: 1, description: "Opacity 0\u20131 (default 1). A number replaces any keyframes; set_video_keyframes animates it." },
|
|
3539
3540
|
transform: TRANSFORM,
|
|
3540
|
-
fit: { type: "string", enum: [...
|
|
3541
|
+
fit: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FITS], description: "How the picture fits the frame before the transform, as CSS object-fit (default contain for media, fill for colours)." },
|
|
3541
3542
|
grade: GRADE,
|
|
3542
3543
|
animateIn: ANIMATION("How the picture enters, from the clip's start (on top of any fade in). Titles usually rise, pop or fade in."),
|
|
3543
3544
|
animateOut: ANIMATION("How the picture leaves, ending at the clip's end."),
|
|
3544
|
-
blend: { type: "string", enum: [...
|
|
3545
|
+
blend: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_BLEND_MODES], description: "How the picture mixes with what is beneath it, as CSS mix-blend-mode (default normal): multiply darkens (shadows, textures), screen and add lighten (light leaks, flares, glows), overlay and soft-light add contrast, difference and exclusion invert." },
|
|
3545
3546
|
fadeIn: MS("Fade up from nothing (picture and sound) over this long"),
|
|
3546
3547
|
fadeOut: MS("Fade down to nothing over this long")
|
|
3547
3548
|
};
|
|
@@ -3550,8 +3551,8 @@ var MEDIA_FIELDS = {
|
|
|
3550
3551
|
speed: { type: "number", minimum: 0.05, maximum: 20, description: "Playback speed (default 1). Changing it keeps the stretch of source, so the clip gets shorter or longer." },
|
|
3551
3552
|
volume: { type: "number", minimum: 0, maximum: 4, description: "Gain (1 = unchanged, default 1). A number replaces any keyframes; set_video_keyframes animates it." },
|
|
3552
3553
|
muted: { type: "boolean", description: "Silence this clip (default false)." },
|
|
3553
|
-
fadeInCurve: { type: "string", enum: [...
|
|
3554
|
-
fadeOutCurve: { type: "string", enum: [...
|
|
3554
|
+
fadeInCurve: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade in (default linear; the picture always fades linearly): linear, equal-power (steady loudness, best for crossfades), s-curve (gentle at both ends), exponential (slow start, natural from silence) or logarithmic (fast start)." },
|
|
3555
|
+
fadeOutCurve: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade out (default linear), the same choices as fadeInCurve; exponential sounds natural fading to silence." }
|
|
3555
3556
|
};
|
|
3556
3557
|
var TEXT_FIELDS = {
|
|
3557
3558
|
text: { type: "string", minLength: 1, description: `The title's text ("\\n" breaks lines).` },
|
|
@@ -3600,7 +3601,7 @@ var ASSET_FIELDS = {
|
|
|
3600
3601
|
};
|
|
3601
3602
|
var KEY_PROPERTY = {
|
|
3602
3603
|
type: "string",
|
|
3603
|
-
enum: [...
|
|
3604
|
+
enum: [..._chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES],
|
|
3604
3605
|
description: "Which property: opacity (0\u20131), volume (media only, 0\u20134 gain), x / y (pixels from the frame's centre, right / down), scale (1 = fitted size) or rotation (degrees clockwise)."
|
|
3605
3606
|
};
|
|
3606
3607
|
var KEYS = {
|
|
@@ -3615,7 +3616,7 @@ var KEYS = {
|
|
|
3615
3616
|
ease: {
|
|
3616
3617
|
description: "How the value moves from this key to the next (default linear): linear, hold (stays, then jumps at the next key), ease-in, ease-out, ease-in-out, or CSS cubic-bezier points [x1, y1, x2, y2] with x1 and x2 in 0\u20131.",
|
|
3617
3618
|
anyOf: [
|
|
3618
|
-
{ type: "string", enum: [...
|
|
3619
|
+
{ type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_EASE_NAMES] },
|
|
3619
3620
|
{ type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }
|
|
3620
3621
|
]
|
|
3621
3622
|
}
|
|
@@ -3644,19 +3645,19 @@ var describeVideoTracks = (tracks) => tracks.map((t, index) => ({
|
|
|
3644
3645
|
...t.locked ? { locked: true } : {},
|
|
3645
3646
|
...t.syncLocked === false ? { syncLocked: false } : {},
|
|
3646
3647
|
...t.volume !== void 0 ? { volume: t.volume } : {},
|
|
3647
|
-
clips:
|
|
3648
|
+
clips: _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, t).map((c) => ({ ...c, end: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, c) } : {} }))
|
|
3648
3649
|
}));
|
|
3649
|
-
var videoSequenceUsers = (project, id) =>
|
|
3650
|
-
({ sequence, track }) => track.clips.flatMap((c) => c.type === "sequence" && c.sequence === id ? [{ clip: c.id, ...sequence ? { inSequence: sequence } : {}, track: track.id, start: c.start, end:
|
|
3650
|
+
var videoSequenceUsers = (project, id) => _chunkUXFI3CDZcjs.allVideoTracks.call(void 0, project).flatMap(
|
|
3651
|
+
({ sequence, track }) => track.clips.flatMap((c) => c.type === "sequence" && c.sequence === id ? [{ clip: c.id, ...sequence ? { inSequence: sequence } : {}, track: track.id, start: c.start, end: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), source: _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, c) }] : [])
|
|
3651
3652
|
);
|
|
3652
3653
|
function describeVideoSequence(project, sequence, tracks = true) {
|
|
3653
|
-
const cycle =
|
|
3654
|
+
const cycle = _chunkUXFI3CDZcjs.findVideoSequenceCycle.call(void 0, project, sequence.id);
|
|
3654
3655
|
return {
|
|
3655
3656
|
id: sequence.id,
|
|
3656
3657
|
...sequence.name ? { name: sequence.name } : {},
|
|
3657
|
-
duration:
|
|
3658
|
+
duration: _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, sequence),
|
|
3658
3659
|
clipCount: sequence.tracks.reduce((n, t) => n + t.clips.length, 0),
|
|
3659
|
-
nests:
|
|
3660
|
+
nests: _chunkUXFI3CDZcjs.videoSequenceChildren.call(void 0, sequence),
|
|
3660
3661
|
usedBy: videoSequenceUsers(project, sequence.id),
|
|
3661
3662
|
...cycle ? { cycle } : {},
|
|
3662
3663
|
...tracks ? { tracks: describeVideoTracks(sequence.tracks) } : { trackCount: sequence.tracks.length }
|
|
@@ -3668,7 +3669,7 @@ function describeVideoProject(project) {
|
|
|
3668
3669
|
width: project.width,
|
|
3669
3670
|
height: project.height,
|
|
3670
3671
|
fps: project.fps,
|
|
3671
|
-
duration:
|
|
3672
|
+
duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, project),
|
|
3672
3673
|
...project.background ? { background: project.background } : {},
|
|
3673
3674
|
assets: project.assets.map(videoAssetOut),
|
|
3674
3675
|
tracks: describeVideoTracks(project.tracks),
|
|
@@ -3685,7 +3686,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3685
3686
|
const project = () => controller.getProject();
|
|
3686
3687
|
const outcome = (result, extra = {}) => {
|
|
3687
3688
|
if (!result.ok) throw new Error(result.error);
|
|
3688
|
-
return { ...extra, duration:
|
|
3689
|
+
return { ...extra, duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, result.project), issues: issueSummary(result.issues) };
|
|
3689
3690
|
};
|
|
3690
3691
|
const apply = (edits, label, extra) => {
|
|
3691
3692
|
const result = controller.apply(edits, label);
|
|
@@ -3694,7 +3695,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3694
3695
|
const clipOut = (p, id) => {
|
|
3695
3696
|
for (const t of p.tracks) {
|
|
3696
3697
|
const c = t.clips.find((x) => x.id === id);
|
|
3697
|
-
if (c) return { track: t.id, ...c, end:
|
|
3698
|
+
if (c) return { track: t.id, ...c, end: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, c) } : {} };
|
|
3698
3699
|
}
|
|
3699
3700
|
return null;
|
|
3700
3701
|
};
|
|
@@ -3706,7 +3707,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3706
3707
|
});
|
|
3707
3708
|
const keysOut = (p, clip, property) => {
|
|
3708
3709
|
const c = clipOut(p, clip);
|
|
3709
|
-
const value =
|
|
3710
|
+
const value = _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _124 => _124.transform, 'optionalAccess', _125 => _125[property]]) : _optionalChain([c, 'optionalAccess', _126 => _126[property]]);
|
|
3710
3711
|
return typeof value === "object" ? { keys: value.keys } : { keys: [], value: _nullishCoalesce(value, () => ( null)) };
|
|
3711
3712
|
};
|
|
3712
3713
|
const getProject = {
|
|
@@ -3728,8 +3729,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3728
3729
|
inputSchema: object({ time: MS("Time from the start (default: the playhead)") }),
|
|
3729
3730
|
annotations: { title: "What plays at a moment", ...READ },
|
|
3730
3731
|
handler: ({ time }) => {
|
|
3731
|
-
const frame =
|
|
3732
|
-
return { ...frame, timecode:
|
|
3732
|
+
const frame = _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project(), _nullishCoalesce(time, () => ( controller.getState().time)));
|
|
3733
|
+
return { ...frame, timecode: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, frame.time, project().fps) };
|
|
3733
3734
|
}
|
|
3734
3735
|
};
|
|
3735
3736
|
const listSequences = {
|
|
@@ -3757,7 +3758,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3757
3758
|
annotations: { title: "Find gaps", ...READ },
|
|
3758
3759
|
handler: ({ track }) => {
|
|
3759
3760
|
if (track !== void 0 && !project().tracks.some((t) => t.id === track)) throw new Error(`There is no track "${track}"; the tracks are ${project().tracks.map((t) => `"${t.id}"`).join(", ")}.`);
|
|
3760
|
-
return { gaps:
|
|
3761
|
+
return { gaps: _chunkUXFI3CDZcjs.findVideoGaps.call(void 0, project(), track) };
|
|
3761
3762
|
}
|
|
3762
3763
|
};
|
|
3763
3764
|
const checkProject = {
|
|
@@ -3787,7 +3788,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3787
3788
|
const lutSrcs = [...new Set(p.tracks.flatMap((t) => t.clips.map((c) => _optionalChain([c, 'access', _127 => _127.grade, 'optionalAccess', _128 => _128.lut, 'optionalAccess', _129 => _129.src])).filter((x) => !!x)))];
|
|
3788
3789
|
const missing = (await Promise.all(lutSrcs.map((src) => controller.luts.load(src).then(() => null, (e) => e.message)))).filter((m) => !!m);
|
|
3789
3790
|
const svgOptions = { lutFor: (src) => controller.luts.peek(src), ...columns ? { columns } : {} };
|
|
3790
|
-
const svg = times ?
|
|
3791
|
+
const svg = times ? _chunkUXFI3CDZcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunkUXFI3CDZcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
|
|
3791
3792
|
const notes = [...missing.map((m) => `${m}; that LUT is left out of the picture.`), ...lutSrcs.length > missing.length ? ["LUTs are drawn approximately in SVG (curves and a colour matrix); the preview and export apply them exactly."] : []];
|
|
3792
3793
|
if (format === "png") {
|
|
3793
3794
|
if (!options.rasterize) throw new Error('This host cannot make PNG images; call render_video_frame with format "svg".');
|
|
@@ -3877,7 +3878,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
3877
3878
|
if (play === true) controller.play();
|
|
3878
3879
|
if (play === false) controller.pause();
|
|
3879
3880
|
const state = controller.getState();
|
|
3880
|
-
return { time: state.time, timecode:
|
|
3881
|
+
return { time: state.time, timecode: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, state.time, p.fps), playing: state.playing, clips: state.current };
|
|
3881
3882
|
}
|
|
3882
3883
|
};
|
|
3883
3884
|
const setSettings = {
|
|
@@ -4022,7 +4023,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4022
4023
|
const gradeTargets = (ids) => {
|
|
4023
4024
|
const p = project();
|
|
4024
4025
|
for (const id of ids) {
|
|
4025
|
-
const at =
|
|
4026
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, p, id);
|
|
4026
4027
|
if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
|
|
4027
4028
|
const { clip } = at;
|
|
4028
4029
|
if (at.track.kind !== "video" || clip.type === "media" && _optionalChain([p, 'access', _130 => _130.assets, 'access', _131 => _131.find, 'call', _132 => _132((a) => a.id === clip.asset), 'optionalAccess', _133 => _133.kind]) === "audio")
|
|
@@ -4036,7 +4037,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4036
4037
|
inputSchema: object(
|
|
4037
4038
|
{
|
|
4038
4039
|
clips: { type: "array", items: CLIP_ID, minItems: 1, description: "Clips on video tracks to grade." },
|
|
4039
|
-
preset: { type: "string", enum: [...
|
|
4040
|
+
preset: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_GRADE_PRESET_NAMES], description: "The look." },
|
|
4040
4041
|
amount: { type: "number", minimum: 0, maximum: 1, description: "Strength, 0 (none) to 1 (full, the default); 0.5 is a subtler version." }
|
|
4041
4042
|
},
|
|
4042
4043
|
["clips", "preset"]
|
|
@@ -4045,10 +4046,10 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4045
4046
|
handler: ({ clips, preset, amount }) => {
|
|
4046
4047
|
gradeTargets(clips);
|
|
4047
4048
|
const edits = clips.map((clip) => {
|
|
4048
|
-
const grade =
|
|
4049
|
+
const grade = _chunkUXFI3CDZcjs.videoGradeLook.call(void 0, _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
|
|
4049
4050
|
return grade ? { op: "update_clip", clip, set: { grade } } : { op: "update_clip", clip, remove: ["grade"] };
|
|
4050
4051
|
});
|
|
4051
|
-
return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([
|
|
4052
|
+
return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _134 => _134.clip, 'access', _135 => _135.grade]), () => ( null)) })) }));
|
|
4052
4053
|
}
|
|
4053
4054
|
};
|
|
4054
4055
|
const copyGrade = {
|
|
@@ -4059,7 +4060,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4059
4060
|
annotations: { title: "Copy a colour grade", ...WRITE_IDEMPOTENT },
|
|
4060
4061
|
handler: ({ from, to }) => {
|
|
4061
4062
|
gradeTargets([from, ...to]);
|
|
4062
|
-
const grade =
|
|
4063
|
+
const grade = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project(), from).clip.grade;
|
|
4063
4064
|
const edits = to.map((clip) => grade ? { op: "update_clip", clip, set: { grade: { ...grade } } } : { op: "update_clip", clip, remove: ["grade"] });
|
|
4064
4065
|
return apply(edits, "Copy grade", () => ({ grade: _nullishCoalesce(grade, () => ( null)), clips: to }));
|
|
4065
4066
|
}
|
|
@@ -4084,7 +4085,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4084
4085
|
const lut = await controller.luts.load(src);
|
|
4085
4086
|
const label = _nullishCoalesce(name, () => ( lut.title));
|
|
4086
4087
|
const setting = { src, ...strength !== void 0 && strength !== 1 ? { strength } : {}, ...label ? { name: label } : {} };
|
|
4087
|
-
return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([
|
|
4088
|
+
return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _136 => _136.clip, 'access', _137 => _137.grade]), () => ( null)) })) }));
|
|
4088
4089
|
}
|
|
4089
4090
|
};
|
|
4090
4091
|
const removeLut = {
|
|
@@ -4096,9 +4097,9 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4096
4097
|
handler: ({ clips }) => {
|
|
4097
4098
|
gradeTargets(clips);
|
|
4098
4099
|
const p = project();
|
|
4099
|
-
const withLut = clips.filter((id) => _optionalChain([
|
|
4100
|
+
const withLut = clips.filter((id) => _optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, p, id), 'access', _138 => _138.clip, 'access', _139 => _139.grade, 'optionalAccess', _140 => _140.lut]));
|
|
4100
4101
|
if (!withLut.length) throw new Error(`None of ${clips.map((c) => `"${c}"`).join(", ")} has a LUT; get_video_project shows each clip's grade.`);
|
|
4101
|
-
return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([
|
|
4102
|
+
return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _141 => _141.clip, 'access', _142 => _142.grade]), () => ( null)) })) }));
|
|
4102
4103
|
}
|
|
4103
4104
|
};
|
|
4104
4105
|
const PROXY_SCALE = { type: "number", exclusiveMinimum: 0, exclusiveMaximum: 1, description: "Proxy size as a fraction of the original: 0.5 (half width and height, the default) or 0.25 for very large footage." };
|
|
@@ -4207,7 +4208,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4207
4208
|
approximate: parsed.approximate,
|
|
4208
4209
|
first: list[0],
|
|
4209
4210
|
last: list[list.length - 1],
|
|
4210
|
-
...a.duration !== void 0 && list[list.length - 1].end > a.duration +
|
|
4211
|
+
...a.duration !== void 0 && list[list.length - 1].end > a.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON ? { warning: `The transcript runs to ${list[list.length - 1].end} ms, past the asset's ${a.duration} ms: is it for this asset?` } : {}
|
|
4211
4212
|
}));
|
|
4212
4213
|
}
|
|
4213
4214
|
};
|
|
@@ -4278,12 +4279,12 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4278
4279
|
const bad = ranges.findIndex((r) => !(r.to > r.from));
|
|
4279
4280
|
if (bad >= 0) throw new Error(`Range ${bad + 1} is empty or backwards (${ranges[bad].from}\u2013${ranges[bad].to} ms); "to" must be after "from".`);
|
|
4280
4281
|
const merged = mergeVideoRanges(ranges);
|
|
4281
|
-
const before =
|
|
4282
|
-
return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before -
|
|
4282
|
+
const before = _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, project());
|
|
4283
|
+
return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before - _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, r.project)), duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, r.project) }));
|
|
4283
4284
|
}
|
|
4284
4285
|
};
|
|
4285
4286
|
const rampTarget = (id) => {
|
|
4286
|
-
const at =
|
|
4287
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project(), id);
|
|
4287
4288
|
if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
|
|
4288
4289
|
const { clip } = at;
|
|
4289
4290
|
if (clip.type === "sequence") throw new Error(`Clip "${id}" is a compound clip, which plays its sequence at normal speed; change the speed of the clips inside the sequence instead.`);
|
|
@@ -4293,7 +4294,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4293
4294
|
};
|
|
4294
4295
|
const rampOut = (r, id) => {
|
|
4295
4296
|
const outcome2 = r.outcomes[r.outcomes.length - 1];
|
|
4296
|
-
return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration:
|
|
4297
|
+
return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, r.project) };
|
|
4297
4298
|
};
|
|
4298
4299
|
const RIPPLE_RAMP = { type: "boolean", description: "Move later material on every sync-locked track by the change in length (default true); false refuses if the clip would overlap the next one." };
|
|
4299
4300
|
const setSpeedRamp = {
|
|
@@ -4324,8 +4325,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4324
4325
|
),
|
|
4325
4326
|
annotations: { title: "Ramp the speed", ...WRITE_IDEMPOTENT },
|
|
4326
4327
|
handler: ({ clip, segments, ripple }) => {
|
|
4327
|
-
const edit =
|
|
4328
|
-
return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(
|
|
4328
|
+
const edit = _chunkUXFI3CDZcjs.videoSpeedRampEdit.call(void 0, rampTarget(clip), segments, _nullishCoalesce(ripple, () => ( true)));
|
|
4329
|
+
return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(_chunkUXFI3CDZcjs.videoSpeedRampKeys.call(void 0, segments).source) }));
|
|
4329
4330
|
}
|
|
4330
4331
|
};
|
|
4331
4332
|
const addFreeze = {
|
|
@@ -4345,8 +4346,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4345
4346
|
handler: ({ clip, at, duration, ripple }) => {
|
|
4346
4347
|
const c = rampTarget(clip);
|
|
4347
4348
|
const t = at - c.start;
|
|
4348
|
-
if (t < 0 || t > c.duration) throw new Error(`${
|
|
4349
|
-
return apply(
|
|
4349
|
+
if (t < 0 || t > c.duration) throw new Error(`${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, at)} is outside clip "${clip}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, c.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c))}); pick a time inside it.`);
|
|
4350
|
+
return apply(_chunkUXFI3CDZcjs.videoFreezeFrameEdit.call(void 0, c, t, duration, _nullishCoalesce(ripple, () => ( true))), "Freeze frame", (r) => rampOut(r, clip));
|
|
4350
4351
|
}
|
|
4351
4352
|
};
|
|
4352
4353
|
const removeRamp = {
|
|
@@ -4519,7 +4520,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4519
4520
|
let from;
|
|
4520
4521
|
let to;
|
|
4521
4522
|
if (args.clip !== void 0) {
|
|
4522
|
-
const found =
|
|
4523
|
+
const found = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, p, args.clip);
|
|
4523
4524
|
if (!found) throw new Error(`There is no clip "${args.clip}"; get_video_project lists the clips.`);
|
|
4524
4525
|
const c = found.clip;
|
|
4525
4526
|
if (c.type === "sequence") throw new Error(`Clip "${c.id}" is a compound clip; its sound is the mix of its sequence "${c.sequence}", so read the levels of the media in it (list_video_sequences lists its clips and assets).`);
|
|
@@ -4529,7 +4530,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4529
4530
|
toSource = (t) => (_nullishCoalesce(c.in, () => ( 0))) + (t - c.start) * speed;
|
|
4530
4531
|
toOut = (s) => c.start + (s - (_nullishCoalesce(c.in, () => ( 0)))) / speed;
|
|
4531
4532
|
from = Math.max(c.start, _nullishCoalesce(args.from, () => ( c.start)));
|
|
4532
|
-
to = Math.min(
|
|
4533
|
+
to = Math.min(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), _nullishCoalesce(args.to, () => ( _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c))));
|
|
4533
4534
|
} else {
|
|
4534
4535
|
asset = p.assets.find((a) => a.id === args.asset);
|
|
4535
4536
|
if (!asset) throw new Error(`There is no asset "${args.asset}"; the assets are ${p.assets.map((a) => `"${a.id}"`).join(", ") || "none"}.`);
|
|
@@ -4610,11 +4611,11 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4610
4611
|
annotations: { title: "Measure a frame with scopes", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
4611
4612
|
handler: async ({ time, bins, columns }) => {
|
|
4612
4613
|
const p = project();
|
|
4613
|
-
const end =
|
|
4614
|
+
const end = _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, p);
|
|
4614
4615
|
const t = _nullishCoalesce(time, () => ( controller.getState().time));
|
|
4615
4616
|
if (time !== void 0 && time > end) throw new Error(`Time ${time} ms is past the end of the project (${end} ms).`);
|
|
4616
4617
|
const pixels = await pixelsAt(t);
|
|
4617
|
-
return { time: t, timecode:
|
|
4618
|
+
return { time: t, timecode: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, t, p.fps), width: pixels.width, height: pixels.height, ...summarizeVideoScopes(pixels, { bins, columns }) };
|
|
4618
4619
|
}
|
|
4619
4620
|
};
|
|
4620
4621
|
const reads = [getProject, listSequences, getFrame, getTranscript, findText, findFillers, findPauses, findGaps, checkProject, renderFrame, getScopes, previewCache, planProxies, exportFfmpeg, exportLoudnessMeasure, exportEdl, audioLevels, findSilences, seek, setPreviewScale];
|
|
@@ -4654,7 +4655,7 @@ var KEYS2 = {
|
|
|
4654
4655
|
properties: {
|
|
4655
4656
|
t: { type: "number", description: "Clip-relative time in ms (0 = the clip's start)." },
|
|
4656
4657
|
v: { type: "number", description: "The control's value at t, within its range from describe_effect." },
|
|
4657
|
-
ease: { anyOf: [{ type: "string", enum: [...
|
|
4658
|
+
ease: { anyOf: [{ type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_EASE_NAMES] }, { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }], description: "How the value moves to the next key: linear (default), hold, ease-in, ease-out, ease-in-out, or CSS cubic-bezier [x1, y1, x2, y2]." }
|
|
4658
4659
|
},
|
|
4659
4660
|
required: ["t", "v"],
|
|
4660
4661
|
additionalProperties: false
|
|
@@ -4668,7 +4669,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
4668
4669
|
return controller.readOnlyReason();
|
|
4669
4670
|
};
|
|
4670
4671
|
const clipOf = (id) => {
|
|
4671
|
-
const at =
|
|
4672
|
+
const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, controller.getProject(), id);
|
|
4672
4673
|
if (!at) {
|
|
4673
4674
|
const ids = controller.getProject().tracks.flatMap((t) => t.clips.map((c) => c.id));
|
|
4674
4675
|
throw new Error(`There is no clip "${id}"; the clips are ${ids.map((c) => `"${c}"`).join(", ") || "none"} (get_video_project lists them).`);
|
|
@@ -4681,7 +4682,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
4681
4682
|
const effect = _nullishCoalesce(effects.find((e) => e.id === (_nullishCoalesce(instance, () => ( _optionalChain([r, 'access', _154 => _154.effect, 'optionalAccess', _155 => _155.id]))))), () => ( (r.effect ? { id: r.effect.id, effect: r.effect.effect, role: "clip effect", enabled: r.effect.enabled !== false, values: _nullishCoalesce(r.effect.values, () => ( {})) } : effects[0])));
|
|
4682
4683
|
return { target, effect, effects, ...extra };
|
|
4683
4684
|
};
|
|
4684
|
-
return
|
|
4685
|
+
return _chunkQDJKUBWEcjs.createEffectToolProvider.call(void 0, {
|
|
4685
4686
|
id: _nullishCoalesce(options.id, () => ( "video-effects")),
|
|
4686
4687
|
namespace: options.namespace,
|
|
4687
4688
|
target: { noun: "clip", id: 'A clip id from get_video_project (e.g. "c1").' },
|
|
@@ -4736,7 +4737,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
4736
4737
|
duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default: the effect's own length, else 5000)." },
|
|
4737
4738
|
values: ctx.valuesSchema("Control values over the effect's defaults", true),
|
|
4738
4739
|
name: { type: "string", minLength: 1, description: "A label for the clip (default: the effect's name)." },
|
|
4739
|
-
mode: { type: "string", enum: [...
|
|
4740
|
+
mode: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES], description: "What to do with clips already there: refuse (default), overwrite or insert." }
|
|
4740
4741
|
},
|
|
4741
4742
|
required: ["track", "effect"],
|
|
4742
4743
|
additionalProperties: false
|
|
@@ -4796,7 +4797,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
4796
4797
|
const clip = clipOf(args.clip);
|
|
4797
4798
|
if (clip.type !== "effect") throw new Error(`Clip "${args.clip}" is not an effect clip; give the id of one of its effects (list_applied_effects).`);
|
|
4798
4799
|
const was = _optionalChain([clip, 'access', _156 => _156.values, 'optionalAccess', _157 => _157[args.control]]);
|
|
4799
|
-
const plain = keys === null ?
|
|
4800
|
+
const plain = keys === null ? _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _158 => _158.keys, 'access', _159 => _159[0], 'optionalAccess', _160 => _160.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
|
|
4800
4801
|
if (plain === void 0) throw new Error(`"${args.control}" has no value to keep; give keys instead.`);
|
|
4801
4802
|
r = await controller.updateEffectValues(args.clip, "generator", { [args.control]: plain });
|
|
4802
4803
|
} else r = await controller.setClipEffectKeyframes(args.clip, args.effect, args.control, keys);
|
|
@@ -5059,5 +5060,5 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
5059
5060
|
|
|
5060
5061
|
|
|
5061
5062
|
|
|
5062
|
-
exports.VIDEO_BLEND_MODES = _chunkIWSMDQE5cjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkIWSMDQE5cjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkIWSMDQE5cjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkIWSMDQE5cjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_EASE_NAMES = _chunkIWSMDQE5cjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkIWSMDQE5cjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkIWSMDQE5cjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkIWSMDQE5cjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkIWSMDQE5cjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkIWSMDQE5cjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkIWSMDQE5cjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkIWSMDQE5cjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkIWSMDQE5cjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LUT_MAX_SIZE = _chunkIWSMDQE5cjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkIWSMDQE5cjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkIWSMDQE5cjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkIWSMDQE5cjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkIWSMDQE5cjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkIWSMDQE5cjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkIWSMDQE5cjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkIWSMDQE5cjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkIWSMDQE5cjs.allVideoClipIds; exports.allVideoTracks = _chunkIWSMDQE5cjs.allVideoTracks; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkIWSMDQE5cjs.applyVideoGrade; exports.applyVideoLut = _chunkIWSMDQE5cjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkIWSMDQE5cjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkIWSMDQE5cjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkIWSMDQE5cjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkIWSMDQE5cjs.checkVideoTimeRemap; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.drawVideoFrame = _chunkIWSMDQE5cjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkIWSMDQE5cjs.ffmpegFilterValue; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkIWSMDQE5cjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkIWSMDQE5cjs.findVideoGaps; exports.findVideoSequenceClip = _chunkIWSMDQE5cjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkIWSMDQE5cjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkIWSMDQE5cjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkIWSMDQE5cjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkIWSMDQE5cjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkIWSMDQE5cjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkIWSMDQE5cjs.isVideoKeyframes; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkIWSMDQE5cjs.mixEffectPixels; exports.nextFreeVideoSlot = _chunkIWSMDQE5cjs.nextFreeVideoSlot; exports.normalizeVideoGrade = _chunkIWSMDQE5cjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkIWSMDQE5cjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.overEffectPixels = _chunkIWSMDQE5cjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoCubeLut = _chunkIWSMDQE5cjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkIWSMDQE5cjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkIWSMDQE5cjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoPrefetch = planVideoPrefetch; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkIWSMDQE5cjs.removeVideoKey; exports.renderVideoFrameExact = _chunkIWSMDQE5cjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkIWSMDQE5cjs.retimeVideoAnimatable; exports.setVideoKey = _chunkIWSMDQE5cjs.setVideoKey; exports.snapToVideoFrame = _chunkIWSMDQE5cjs.snapToVideoFrame; exports.snapVideoTime = _chunkIWSMDQE5cjs.snapVideoTime; exports.sortVideoKeys = _chunkIWSMDQE5cjs.sortVideoKeys; exports.sortedVideoClips = _chunkIWSMDQE5cjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkIWSMDQE5cjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkIWSMDQE5cjs.toVideoEdl; exports.toVideoFfmpeg = _chunkIWSMDQE5cjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkIWSMDQE5cjs.toVideoLoudnessMeasure; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkIWSMDQE5cjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkIWSMDQE5cjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkIWSMDQE5cjs.videoClipAfter; exports.videoClipAnimated = _chunkIWSMDQE5cjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkIWSMDQE5cjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkIWSMDQE5cjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkIWSMDQE5cjs.videoClipBefore; exports.videoClipEffectUses = _chunkIWSMDQE5cjs.videoClipEffectUses; exports.videoClipEnd = _chunkIWSMDQE5cjs.videoClipEnd; exports.videoClipHandles = _chunkIWSMDQE5cjs.videoClipHandles; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkIWSMDQE5cjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkIWSMDQE5cjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkIWSMDQE5cjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkIWSMDQE5cjs.videoClipSourceTime; exports.videoClipSpeed = _chunkIWSMDQE5cjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkIWSMDQE5cjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkIWSMDQE5cjs.videoClipsAt; exports.videoContactSheetSvg = _chunkIWSMDQE5cjs.videoContactSheetSvg; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoEaseBezier = _chunkIWSMDQE5cjs.videoEaseBezier; exports.videoEaseProgress = _chunkIWSMDQE5cjs.videoEaseProgress; exports.videoEffectFrameTime = _chunkIWSMDQE5cjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkIWSMDQE5cjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkIWSMDQE5cjs.videoEffectValuesAt; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkIWSMDQE5cjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkIWSMDQE5cjs.videoFfmpegUnsupportedEffects; exports.videoFrameAt = _chunkIWSMDQE5cjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkIWSMDQE5cjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkIWSMDQE5cjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkIWSMDQE5cjs.videoFrameToSvg; exports.videoFrames = _chunkIWSMDQE5cjs.videoFrames; exports.videoFreezeFrameEdit = _chunkIWSMDQE5cjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkIWSMDQE5cjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkIWSMDQE5cjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkIWSMDQE5cjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkIWSMDQE5cjs.videoGradeLook; exports.videoGradePreset = _chunkIWSMDQE5cjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkIWSMDQE5cjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkIWSMDQE5cjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkIWSMDQE5cjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkIWSMDQE5cjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkIWSMDQE5cjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkIWSMDQE5cjs.videoHourFrames; exports.videoIrisRadius = _chunkIWSMDQE5cjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkIWSMDQE5cjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkIWSMDQE5cjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkIWSMDQE5cjs.videoKeysOf; exports.videoLayersUseEffects = _chunkIWSMDQE5cjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkIWSMDQE5cjs.videoLayersWithoutTransitionEffects; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkIWSMDQE5cjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkIWSMDQE5cjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkIWSMDQE5cjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkIWSMDQE5cjs.videoLutToCube; exports.videoOverlap = _chunkIWSMDQE5cjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkIWSMDQE5cjs.videoProjectDuration; exports.videoProjectEffects = _chunkIWSMDQE5cjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkIWSMDQE5cjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkIWSMDQE5cjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkIWSMDQE5cjs.videoSequenceDuration; exports.videoSequenceMap = _chunkIWSMDQE5cjs.videoSequenceMap; exports.videoShellQuote = _chunkIWSMDQE5cjs.videoShellQuote; exports.videoSlowMotionRamp = _chunkIWSMDQE5cjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkIWSMDQE5cjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeedRampEdit = _chunkIWSMDQE5cjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkIWSMDQE5cjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkIWSMDQE5cjs.videoTextStyle; exports.videoTimeRemapBreakpoints = _chunkIWSMDQE5cjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkIWSMDQE5cjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkIWSMDQE5cjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkIWSMDQE5cjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkIWSMDQE5cjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkIWSMDQE5cjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkIWSMDQE5cjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkIWSMDQE5cjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkIWSMDQE5cjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkIWSMDQE5cjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange;
|
|
5063
|
+
exports.VIDEO_BLEND_MODES = _chunkUXFI3CDZcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkUXFI3CDZcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_EASE_NAMES = _chunkUXFI3CDZcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkUXFI3CDZcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkUXFI3CDZcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkUXFI3CDZcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkUXFI3CDZcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LUT_MAX_SIZE = _chunkUXFI3CDZcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkUXFI3CDZcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkUXFI3CDZcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkUXFI3CDZcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkUXFI3CDZcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkUXFI3CDZcjs.allVideoClipIds; exports.allVideoTracks = _chunkUXFI3CDZcjs.allVideoTracks; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkUXFI3CDZcjs.applyVideoGrade; exports.applyVideoLut = _chunkUXFI3CDZcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkUXFI3CDZcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkUXFI3CDZcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkUXFI3CDZcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkUXFI3CDZcjs.checkVideoTimeRemap; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.drawVideoFrame = _chunkUXFI3CDZcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkUXFI3CDZcjs.ffmpegFilterValue; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkUXFI3CDZcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkUXFI3CDZcjs.findVideoGaps; exports.findVideoSequenceClip = _chunkUXFI3CDZcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkUXFI3CDZcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkUXFI3CDZcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkUXFI3CDZcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkUXFI3CDZcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkUXFI3CDZcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkUXFI3CDZcjs.isVideoKeyframes; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkUXFI3CDZcjs.mixEffectPixels; exports.nextFreeVideoSlot = _chunkUXFI3CDZcjs.nextFreeVideoSlot; exports.normalizeVideoGrade = _chunkUXFI3CDZcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkUXFI3CDZcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.overEffectPixels = _chunkUXFI3CDZcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoCubeLut = _chunkUXFI3CDZcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkUXFI3CDZcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkUXFI3CDZcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoPrefetch = planVideoPrefetch; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkUXFI3CDZcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkUXFI3CDZcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkUXFI3CDZcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkUXFI3CDZcjs.setVideoKey; exports.snapToVideoFrame = _chunkUXFI3CDZcjs.snapToVideoFrame; exports.snapVideoTime = _chunkUXFI3CDZcjs.snapVideoTime; exports.sortVideoKeys = _chunkUXFI3CDZcjs.sortVideoKeys; exports.sortedVideoClips = _chunkUXFI3CDZcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkUXFI3CDZcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkUXFI3CDZcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkUXFI3CDZcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkUXFI3CDZcjs.toVideoLoudnessMeasure; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkUXFI3CDZcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkUXFI3CDZcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkUXFI3CDZcjs.videoClipAfter; exports.videoClipAnimated = _chunkUXFI3CDZcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkUXFI3CDZcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkUXFI3CDZcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkUXFI3CDZcjs.videoClipBefore; exports.videoClipEffectUses = _chunkUXFI3CDZcjs.videoClipEffectUses; exports.videoClipEnd = _chunkUXFI3CDZcjs.videoClipEnd; exports.videoClipHandles = _chunkUXFI3CDZcjs.videoClipHandles; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkUXFI3CDZcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkUXFI3CDZcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkUXFI3CDZcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkUXFI3CDZcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkUXFI3CDZcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkUXFI3CDZcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkUXFI3CDZcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkUXFI3CDZcjs.videoContactSheetSvg; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoEaseBezier = _chunkUXFI3CDZcjs.videoEaseBezier; exports.videoEaseProgress = _chunkUXFI3CDZcjs.videoEaseProgress; exports.videoEffectFrameTime = _chunkUXFI3CDZcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkUXFI3CDZcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkUXFI3CDZcjs.videoEffectValuesAt; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkUXFI3CDZcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkUXFI3CDZcjs.videoFfmpegUnsupportedEffects; exports.videoFrameAt = _chunkUXFI3CDZcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkUXFI3CDZcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkUXFI3CDZcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkUXFI3CDZcjs.videoFrameToSvg; exports.videoFrames = _chunkUXFI3CDZcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkUXFI3CDZcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkUXFI3CDZcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkUXFI3CDZcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkUXFI3CDZcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkUXFI3CDZcjs.videoGradeLook; exports.videoGradePreset = _chunkUXFI3CDZcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkUXFI3CDZcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkUXFI3CDZcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkUXFI3CDZcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkUXFI3CDZcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkUXFI3CDZcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkUXFI3CDZcjs.videoHourFrames; exports.videoIrisRadius = _chunkUXFI3CDZcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkUXFI3CDZcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkUXFI3CDZcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkUXFI3CDZcjs.videoKeysOf; exports.videoLayersUseEffects = _chunkUXFI3CDZcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkUXFI3CDZcjs.videoLayersWithoutTransitionEffects; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkUXFI3CDZcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkUXFI3CDZcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkUXFI3CDZcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkUXFI3CDZcjs.videoLutToCube; exports.videoOverlap = _chunkUXFI3CDZcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkUXFI3CDZcjs.videoProjectDuration; exports.videoProjectEffects = _chunkUXFI3CDZcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkUXFI3CDZcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkUXFI3CDZcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkUXFI3CDZcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkUXFI3CDZcjs.videoSequenceMap; exports.videoShellQuote = _chunkUXFI3CDZcjs.videoShellQuote; exports.videoSlowMotionRamp = _chunkUXFI3CDZcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkUXFI3CDZcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeedRampEdit = _chunkUXFI3CDZcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkUXFI3CDZcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkUXFI3CDZcjs.videoTextStyle; exports.videoTimeRemapBreakpoints = _chunkUXFI3CDZcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkUXFI3CDZcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkUXFI3CDZcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkUXFI3CDZcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkUXFI3CDZcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkUXFI3CDZcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkUXFI3CDZcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkUXFI3CDZcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkUXFI3CDZcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkUXFI3CDZcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange;
|
|
5063
5064
|
//# sourceMappingURL=index.cjs.map
|