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