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