@pixerate/editor 0.227.0 → 0.227.1
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 -9
- package/dist/animation-editor/index.js +1 -1
- package/dist/canvas/effects.d.cts +18 -0
- package/dist/canvas/effects.d.ts +18 -0
- package/dist/canvas/index.cjs +27 -8
- package/dist/canvas/index.js +20 -1
- package/dist/{chunk-ABQ2VGUB.cjs → chunk-5MQOBTNP.cjs} +13 -2
- package/dist/{chunk-C6CMQXMI.cjs → chunk-IGPEBXUD.cjs} +7 -7
- package/dist/{chunk-4PA6YS6W.cjs → chunk-K5GXW5TR.cjs} +14 -14
- package/dist/{chunk-56RFHF7O.js → chunk-LPTFDCJO.js} +1 -1
- package/dist/{chunk-4MDWEX44.js → chunk-PB6JV62G.js} +1 -1
- package/dist/{chunk-7DZ55AIE.js → chunk-UGYUGZE2.js} +13 -2
- package/dist/effects/index.cjs +44 -44
- package/dist/effects/index.js +2 -2
- package/dist/image-editor/index.cjs +13 -13
- package/dist/image-editor/index.js +1 -1
- package/dist/paint-editor/index.cjs +7 -7
- package/dist/paint-editor/index.js +2 -2
- package/dist/vector/index.cjs +6 -6
- package/dist/vector/index.js +1 -1
- package/dist/video-editor/index.cjs +309 -309
- package/dist/video-editor/index.js +3 -3
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7;
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkK5GXW5TRcjs = require('../chunk-K5GXW5TR.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
@@ -148,7 +148,7 @@ var _chunk4PA6YS6Wcjs = require('../chunk-4PA6YS6W.cjs');
|
|
|
148
148
|
|
|
149
149
|
|
|
150
150
|
|
|
151
|
-
var
|
|
151
|
+
var _chunkIGPEBXUDcjs = require('../chunk-IGPEBXUD.cjs');
|
|
152
152
|
require('../chunk-PY4GWSE2.cjs');
|
|
153
153
|
|
|
154
154
|
|
|
@@ -157,7 +157,7 @@ var _chunkEBDZWIOPcjs = require('../chunk-EBDZWIOP.cjs');
|
|
|
157
157
|
|
|
158
158
|
|
|
159
159
|
|
|
160
|
-
var
|
|
160
|
+
var _chunk5MQOBTNPcjs = require('../chunk-5MQOBTNP.cjs');
|
|
161
161
|
require('../chunk-WOFXZ3XU.cjs');
|
|
162
162
|
|
|
163
163
|
|
|
@@ -216,7 +216,7 @@ function parseVideoEase(v, path) {
|
|
|
216
216
|
if (v[0] < 0 || v[0] > 1 || v[2] < 0 || v[2] > 1) fail(path, "must have x1 and x2 between 0 and 1");
|
|
217
217
|
return [v[0], v[1], v[2], v[3]];
|
|
218
218
|
}
|
|
219
|
-
return oneOf(v,
|
|
219
|
+
return oneOf(v, _chunkIGPEBXUDcjs.VIDEO_EASE_NAMES, path);
|
|
220
220
|
}
|
|
221
221
|
function parseVideoKeyframes(v, path, { min, max } = {}) {
|
|
222
222
|
if (!isObject(v)) return fail(path, "must be a number or keyframes { keys: [{ t, v, ease }] }");
|
|
@@ -254,7 +254,7 @@ function parseVideoTimeRemap(v, speed, path) {
|
|
|
254
254
|
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)");
|
|
255
255
|
if (speed !== void 0 && speed !== 1) fail(path, 'cannot be used with a speed; a ramp sets the speed itself (remove "speed")');
|
|
256
256
|
try {
|
|
257
|
-
|
|
257
|
+
_chunkIGPEBXUDcjs.checkVideoTimeRemap.call(void 0, remap, path);
|
|
258
258
|
} catch (e) {
|
|
259
259
|
throw new Error(e.message.replace(/\.?$/, "."));
|
|
260
260
|
}
|
|
@@ -264,17 +264,17 @@ function parseVideoClipAnimation(v, path) {
|
|
|
264
264
|
if (v === void 0) return void 0;
|
|
265
265
|
if (!isObject(v)) return fail(path, "must be an object { effect, duration }");
|
|
266
266
|
return compact({
|
|
267
|
-
effect: oneOf(v.effect,
|
|
267
|
+
effect: oneOf(v.effect, _chunkIGPEBXUDcjs.VIDEO_CLIP_ANIMATION_EFFECTS, `${path}.effect`, false),
|
|
268
268
|
duration: num(v.duration, `${path}.duration`, { optional: true, positive: true })
|
|
269
269
|
});
|
|
270
270
|
}
|
|
271
271
|
function parseVideoGrade(v, path) {
|
|
272
272
|
if (v === void 0) return void 0;
|
|
273
273
|
if (!isObject(v)) return fail(path, "must be an object such as { exposure, contrast, saturation }");
|
|
274
|
-
const known = /* @__PURE__ */ new Set([...
|
|
274
|
+
const known = /* @__PURE__ */ new Set([..._chunkIGPEBXUDcjs.VIDEO_GRADE_CONTROLS.map((c) => c.key), "lut"]);
|
|
275
275
|
const unknown = Object.keys(v).find((k) => !known.has(k));
|
|
276
276
|
if (unknown) fail(`${path}.${unknown}`, `is not a grade setting; use ${[...known].join(", ")}`);
|
|
277
|
-
return compact({ ...Object.fromEntries(
|
|
277
|
+
return compact({ ...Object.fromEntries(_chunkIGPEBXUDcjs.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`) });
|
|
278
278
|
}
|
|
279
279
|
function parseVideoGradeLut(v, path) {
|
|
280
280
|
if (v === void 0) return void 0;
|
|
@@ -289,7 +289,7 @@ function parseVideoClipMask(v, path) {
|
|
|
289
289
|
if (!isObject(v)) return fail(path, 'must be an object such as { shape: "ellipse", x: 0.5, y: 0.5, width: 0.4, height: 0.6, feather: 20 }');
|
|
290
290
|
const unknown = Object.keys(v).find((k) => !MASK_KEYS.includes(k));
|
|
291
291
|
if (unknown) fail(`${path}.${unknown}`, `is not a mask setting; use ${MASK_KEYS.join(", ")}`);
|
|
292
|
-
const shape = oneOf(v.shape,
|
|
292
|
+
const shape = oneOf(v.shape, _chunkIGPEBXUDcjs.VIDEO_MASK_SHAPES, `${path}.shape`, false);
|
|
293
293
|
let points;
|
|
294
294
|
if (v.points !== void 0) {
|
|
295
295
|
if (shape !== "polygon") fail(`${path}.points`, "is only for polygon masks");
|
|
@@ -315,15 +315,15 @@ function parseVideoClipMask(v, path) {
|
|
|
315
315
|
function parseVideoTransition(v, path) {
|
|
316
316
|
if (v === void 0) return void 0;
|
|
317
317
|
if (!isObject(v)) return fail(path, "must be an object { type, duration }");
|
|
318
|
-
const type = oneOf(v.type,
|
|
318
|
+
const type = oneOf(v.type, _chunkIGPEBXUDcjs.VIDEO_TRANSITION_TYPES, `${path}.type`, false);
|
|
319
319
|
if (type === "effect" && v.effect === void 0) fail(`${path}.effect`, 'is required for an effect transition: { effect: "<effect id>", values }');
|
|
320
320
|
if (type !== "effect" && v.effect !== void 0) fail(`${path}.effect`, 'is only for transitions of type "effect"');
|
|
321
321
|
return compact({
|
|
322
322
|
type,
|
|
323
323
|
duration: num(v.duration, `${path}.duration`, { positive: true }),
|
|
324
324
|
color: str(v.color, `${path}.color`, true),
|
|
325
|
-
direction: oneOf(v.direction,
|
|
326
|
-
audioCurve: oneOf(v.audioCurve,
|
|
325
|
+
direction: oneOf(v.direction, _chunkIGPEBXUDcjs.VIDEO_WIPE_DIRECTIONS, `${path}.direction`),
|
|
326
|
+
audioCurve: oneOf(v.audioCurve, _chunkIGPEBXUDcjs.VIDEO_FADE_CURVES, `${path}.audioCurve`),
|
|
327
327
|
effect: v.effect === void 0 ? void 0 : parseVideoEffectRef(v.effect, `${path}.effect`, false)
|
|
328
328
|
});
|
|
329
329
|
}
|
|
@@ -416,7 +416,7 @@ function parseVideoAssetProxies(v, path) {
|
|
|
416
416
|
}
|
|
417
417
|
function parseVideoClip(v, path = "clip") {
|
|
418
418
|
if (!isObject(v)) return fail(path, "must be an object");
|
|
419
|
-
const type = oneOf(_nullishCoalesce(v.type, () => ( "media")),
|
|
419
|
+
const type = oneOf(_nullishCoalesce(v.type, () => ( "media")), _chunkIGPEBXUDcjs.VIDEO_CLIP_TYPES, `${path}.type`, false);
|
|
420
420
|
const base = {
|
|
421
421
|
id: str(v.id, `${path}.id`),
|
|
422
422
|
name: str(v.name, `${path}.name`, true),
|
|
@@ -424,8 +424,8 @@ function parseVideoClip(v, path = "clip") {
|
|
|
424
424
|
duration: num(v.duration, `${path}.duration`, { positive: true }),
|
|
425
425
|
opacity: parseVideoAnimatable(v.opacity, `${path}.opacity`, { optional: true, min: 0, max: 1 }),
|
|
426
426
|
transform: parseVideoTransform(v.transform, `${path}.transform`),
|
|
427
|
-
fit: oneOf(v.fit,
|
|
428
|
-
blend: oneOf(v.blend,
|
|
427
|
+
fit: oneOf(v.fit, _chunkIGPEBXUDcjs.VIDEO_FITS, `${path}.fit`),
|
|
428
|
+
blend: oneOf(v.blend, _chunkIGPEBXUDcjs.VIDEO_BLEND_MODES, `${path}.blend`),
|
|
429
429
|
grade: parseVideoGrade(v.grade, `${path}.grade`),
|
|
430
430
|
animateIn: parseVideoClipAnimation(v.animateIn, `${path}.animateIn`),
|
|
431
431
|
animateOut: parseVideoClipAnimation(v.animateOut, `${path}.animateOut`),
|
|
@@ -445,8 +445,8 @@ function parseVideoClip(v, path = "clip") {
|
|
|
445
445
|
volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
|
|
446
446
|
muted: bool(v.muted, `${path}.muted`),
|
|
447
447
|
timeRemap: parseVideoTimeRemap(v.timeRemap, v.speed, `${path}.timeRemap`),
|
|
448
|
-
fadeInCurve: oneOf(v.fadeInCurve,
|
|
449
|
-
fadeOutCurve: oneOf(v.fadeOutCurve,
|
|
448
|
+
fadeInCurve: oneOf(v.fadeInCurve, _chunkIGPEBXUDcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
|
|
449
|
+
fadeOutCurve: oneOf(v.fadeOutCurve, _chunkIGPEBXUDcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
|
|
450
450
|
});
|
|
451
451
|
if (type === "sequence") {
|
|
452
452
|
for (const key of ["speed", "timeRemap"])
|
|
@@ -458,8 +458,8 @@ function parseVideoClip(v, path = "clip") {
|
|
|
458
458
|
in: num(v.in, `${path}.in`, { optional: true, min: 0 }),
|
|
459
459
|
volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
|
|
460
460
|
muted: bool(v.muted, `${path}.muted`),
|
|
461
|
-
fadeInCurve: oneOf(v.fadeInCurve,
|
|
462
|
-
fadeOutCurve: oneOf(v.fadeOutCurve,
|
|
461
|
+
fadeInCurve: oneOf(v.fadeInCurve, _chunkIGPEBXUDcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
|
|
462
|
+
fadeOutCurve: oneOf(v.fadeOutCurve, _chunkIGPEBXUDcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
|
|
463
463
|
});
|
|
464
464
|
}
|
|
465
465
|
if (type === "text")
|
|
@@ -474,7 +474,7 @@ function parseVideoClip(v, path = "clip") {
|
|
|
474
474
|
background: str(v.background, `${path}.background`, true)
|
|
475
475
|
});
|
|
476
476
|
if (type === "adjustment") {
|
|
477
|
-
const scope = oneOf(v.scope,
|
|
477
|
+
const scope = oneOf(v.scope, _chunkIGPEBXUDcjs.VIDEO_ADJUSTMENT_SCOPES, `${path}.scope`);
|
|
478
478
|
const targetTrack = str(v.targetTrack, `${path}.targetTrack`, true);
|
|
479
479
|
if (scope === "track" && !targetTrack) fail(`${path}.targetTrack`, 'is required when scope is "track": the id of the track whose pictures the adjustment changes');
|
|
480
480
|
if (targetTrack !== void 0 && scope !== "track") fail(`${path}.targetTrack`, 'is only for scope "track"');
|
|
@@ -577,9 +577,9 @@ function createVideoProject(options = {}) {
|
|
|
577
577
|
// src/video-editor/check.ts
|
|
578
578
|
function videoClipKeyframes(clip) {
|
|
579
579
|
const out = [
|
|
580
|
-
{ property: "opacity", keys:
|
|
581
|
-
{ property: "volume", keys: clip.type === "media" || clip.type === "sequence" ?
|
|
582
|
-
...
|
|
580
|
+
{ property: "opacity", keys: _chunkIGPEBXUDcjs.videoKeysOf.call(void 0, clip.opacity) },
|
|
581
|
+
{ property: "volume", keys: clip.type === "media" || clip.type === "sequence" ? _chunkIGPEBXUDcjs.videoKeysOf.call(void 0, clip.volume) : [] },
|
|
582
|
+
..._chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES.map((p) => ({ property: p, keys: _chunkIGPEBXUDcjs.videoKeysOf.call(void 0, _optionalChain([clip, 'access', _2 => _2.transform, 'optionalAccess', _3 => _3[p]])) }))
|
|
583
583
|
];
|
|
584
584
|
return out.filter((o) => o.keys.length);
|
|
585
585
|
}
|
|
@@ -607,8 +607,8 @@ var VIDEO_ISSUE_CODES = [
|
|
|
607
607
|
var videoIssueKey = (i) => [i.code, _nullishCoalesce(i.sequence, () => ( "")), _nullishCoalesce(i.track, () => ( "")), _nullishCoalesce(i.clip, () => ( "")), _nullishCoalesce(i.asset, () => ( "")), _nullishCoalesce(i.marker, () => ( ""))].join("|");
|
|
608
608
|
function checkVideoProject(project) {
|
|
609
609
|
const issues = [];
|
|
610
|
-
const assets =
|
|
611
|
-
const sequences =
|
|
610
|
+
const assets = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, project);
|
|
611
|
+
const sequences = _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, project);
|
|
612
612
|
const used = /* @__PURE__ */ new Set();
|
|
613
613
|
const usedSequences = /* @__PURE__ */ new Set();
|
|
614
614
|
const cycles = /* @__PURE__ */ new Map();
|
|
@@ -616,7 +616,7 @@ function checkVideoProject(project) {
|
|
|
616
616
|
if ((asset.kind === "video" || asset.kind === "audio") && asset.duration === void 0)
|
|
617
617
|
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.` });
|
|
618
618
|
const checkTrack = (track, sequence) => {
|
|
619
|
-
const clips =
|
|
619
|
+
const clips = _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, track);
|
|
620
620
|
const where = sequence ? ` in sequence "${sequence}"` : "";
|
|
621
621
|
for (let i = 0; i < clips.length; i++) {
|
|
622
622
|
const clip = clips[i];
|
|
@@ -626,13 +626,13 @@ function checkVideoProject(project) {
|
|
|
626
626
|
const seq = sequences.get(clip.sequence);
|
|
627
627
|
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.` });
|
|
628
628
|
else {
|
|
629
|
-
if (!cycles.has(seq.id)) cycles.set(seq.id,
|
|
629
|
+
if (!cycles.has(seq.id)) cycles.set(seq.id, _chunkIGPEBXUDcjs.findVideoSequenceCycle.call(void 0, project, seq.id));
|
|
630
630
|
const cycle = cycles.get(seq.id);
|
|
631
631
|
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.` });
|
|
632
|
-
const length =
|
|
633
|
-
const range =
|
|
634
|
-
if (range.out > length +
|
|
635
|
-
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${
|
|
632
|
+
const length = _chunkIGPEBXUDcjs.videoSequenceDuration.call(void 0, seq);
|
|
633
|
+
const range = _chunkIGPEBXUDcjs.videoClipSourceRange.call(void 0, clip);
|
|
634
|
+
if (range.out > length + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
635
|
+
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, range.out)} of sequence "${seq.id}", which is only ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, length)} long; shorten the clip or move its in point.` });
|
|
636
636
|
}
|
|
637
637
|
} else if (clip.type === "media") {
|
|
638
638
|
used.add(clip.asset);
|
|
@@ -641,30 +641,30 @@ function checkVideoProject(project) {
|
|
|
641
641
|
else {
|
|
642
642
|
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.` });
|
|
643
643
|
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.` });
|
|
644
|
-
const range =
|
|
645
|
-
if (asset.duration !== void 0 && range.out > asset.duration +
|
|
646
|
-
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${
|
|
644
|
+
const range = _chunkIGPEBXUDcjs.videoClipSourceRange.call(void 0, clip);
|
|
645
|
+
if (asset.duration !== void 0 && range.out > asset.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
646
|
+
issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, range.out)} of "${asset.id}", which is only ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, asset.duration)} long; shorten the clip or move its in point.` });
|
|
647
647
|
}
|
|
648
648
|
} 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.` });
|
|
649
649
|
if (clip.type === "adjustment" && (_nullishCoalesce(clip.scope, () => ( "underneath"))) === "track" && !(sequence ? _nullishCoalesce(_optionalChain([sequences, 'access', _4 => _4.get, 'call', _5 => _5(sequence), 'optionalAccess', _6 => _6.tracks]), () => ( [])) : project.tracks).some((t) => t.id === clip.targetTrack))
|
|
650
650
|
issues.push({ code: "missing-target-track", severity: "warning", ...at, message: `Adjustment clip "${clip.id}" changes track "${clip.targetTrack}", which is not ${sequence ? `in sequence "${sequence}"` : "in the project"}, so it changes nothing; set its targetTrack to a track beside it or change its scope.` });
|
|
651
651
|
const next = clips[i + 1];
|
|
652
|
-
if (next && next.start <
|
|
653
|
-
issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${
|
|
654
|
-
if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration +
|
|
652
|
+
if (next && next.start < _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip) - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
653
|
+
issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, next.start)}; move one of them.` });
|
|
654
|
+
if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
655
655
|
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.` });
|
|
656
|
-
const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => (
|
|
657
|
-
if (anim > clip.duration +
|
|
656
|
+
const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => ( _chunkIGPEBXUDcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0) + (clip.animateOut ? _nullishCoalesce(clip.animateOut.duration, () => ( _chunkIGPEBXUDcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0);
|
|
657
|
+
if (anim > clip.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
658
658
|
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.` });
|
|
659
659
|
for (const which of ["animateIn", "animateOut"]) {
|
|
660
660
|
const a = clip[which];
|
|
661
661
|
if (!a) continue;
|
|
662
|
-
const keyed =
|
|
662
|
+
const keyed = _chunkIGPEBXUDcjs.videoClipAnimationProperties.call(void 0, a).filter((p) => _chunkIGPEBXUDcjs.videoKeysOf.call(void 0, p === "opacity" ? clip.opacity : _optionalChain([clip, 'access', _7 => _7.transform, 'optionalAccess', _8 => _8[p]])).length);
|
|
663
663
|
if (keyed.length)
|
|
664
664
|
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.` });
|
|
665
665
|
}
|
|
666
666
|
for (const { property, keys } of videoClipKeyframes(clip)) {
|
|
667
|
-
const outside = keys.filter((k) => k.t < -
|
|
667
|
+
const outside = keys.filter((k) => k.t < -_chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON || k.t > clip.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON);
|
|
668
668
|
if (outside.length)
|
|
669
669
|
issues.push({
|
|
670
670
|
code: "keyframes-outside-clip",
|
|
@@ -675,20 +675,20 @@ function checkVideoProject(project) {
|
|
|
675
675
|
}
|
|
676
676
|
if (clip.transition) {
|
|
677
677
|
const d = clip.transition.duration;
|
|
678
|
-
const before =
|
|
678
|
+
const before = _chunkIGPEBXUDcjs.videoClipBefore.call(void 0, track, clip);
|
|
679
679
|
if (!before) {
|
|
680
680
|
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.` });
|
|
681
681
|
continue;
|
|
682
682
|
}
|
|
683
|
-
if (d > clip.duration +
|
|
683
|
+
if (d > clip.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON || d > before.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) {
|
|
684
684
|
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.` });
|
|
685
685
|
continue;
|
|
686
686
|
}
|
|
687
687
|
if (clip.transition.type === "dip") continue;
|
|
688
|
-
const outgoing =
|
|
689
|
-
const incoming =
|
|
688
|
+
const outgoing = _chunkIGPEBXUDcjs.videoClipHandles.call(void 0, before, assets, sequences).after;
|
|
689
|
+
const incoming = _chunkIGPEBXUDcjs.videoClipHandles.call(void 0, clip, assets, sequences).before;
|
|
690
690
|
const half = d / 2;
|
|
691
|
-
if (outgoing < half -
|
|
691
|
+
if (outgoing < half - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON || incoming < half - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) {
|
|
692
692
|
const fits = 2 * Math.min(outgoing, incoming);
|
|
693
693
|
issues.push({
|
|
694
694
|
code: "transition-handles",
|
|
@@ -705,9 +705,9 @@ function checkVideoProject(project) {
|
|
|
705
705
|
for (const sequence of _nullishCoalesce(project.sequences, () => ( [])))
|
|
706
706
|
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.` });
|
|
707
707
|
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.` });
|
|
708
|
-
const end =
|
|
708
|
+
const end = _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, project);
|
|
709
709
|
for (const marker of _nullishCoalesce(project.markers, () => ( [])))
|
|
710
|
-
if (marker.time > end +
|
|
710
|
+
if (marker.time > end + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) issues.push({ code: "marker-past-end", severity: "note", marker: marker.id, message: `Marker "${marker.id}" at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, marker.time)} is past the end (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, end)}).` });
|
|
711
711
|
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." });
|
|
712
712
|
const rank = { error: 0, warning: 1, note: 2 };
|
|
713
713
|
return issues.sort((a, b) => rank[a.severity] - rank[b.severity]);
|
|
@@ -761,7 +761,7 @@ function mergeSpans(spans) {
|
|
|
761
761
|
const out = [];
|
|
762
762
|
for (const [from, to] of [...spans].sort((a, b) => a[0] - b[0])) {
|
|
763
763
|
const last = out[out.length - 1];
|
|
764
|
-
if (last && from <= last[1] +
|
|
764
|
+
if (last && from <= last[1] + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) last[1] = Math.max(last[1], to);
|
|
765
765
|
else out.push([from, to]);
|
|
766
766
|
}
|
|
767
767
|
return out;
|
|
@@ -775,13 +775,13 @@ function clipAnimatables(clip) {
|
|
|
775
775
|
// A speed ramp is keys in clip time too, so trims and splits keep it on the same frames of source.
|
|
776
776
|
{ get: () => c.timeRemap, set: (v) => c.timeRemap = v }
|
|
777
777
|
];
|
|
778
|
-
for (const p of
|
|
778
|
+
for (const p of _chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES) out.push({ get: () => _optionalChain([c, 'access', _9 => _9.transform, 'optionalAccess', _10 => _10[p]]), set: (v) => c.transform && (c.transform[p] = v) });
|
|
779
779
|
return out;
|
|
780
780
|
}
|
|
781
781
|
function retimeClipKeys(clip, fn) {
|
|
782
782
|
for (const a of clipAnimatables(clip)) {
|
|
783
783
|
const v = a.get();
|
|
784
|
-
if (
|
|
784
|
+
if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, v)) a.set(fn(v));
|
|
785
785
|
}
|
|
786
786
|
}
|
|
787
787
|
var OPTIONAL_CLIP_FIELDS = ["name", "effects", "mask", "scope", "targetTrack", "values", "provider", "opacity", "transform", "fit", "blend", "grade", "animateIn", "animateOut", "fadeIn", "fadeOut", "fadeInCurve", "fadeOutCurve", "transition", "in", "speed", "timeRemap", "volume", "muted", "color", "fontSize", "fontFamily", "fontWeight", "background"];
|
|
@@ -798,8 +798,8 @@ var Editor = (_class = class {
|
|
|
798
798
|
return t;
|
|
799
799
|
}
|
|
800
800
|
clip(id) {
|
|
801
|
-
const at =
|
|
802
|
-
const nested = at ? null :
|
|
801
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, this.p, id);
|
|
802
|
+
const nested = at ? null : _chunkIGPEBXUDcjs.findVideoSequenceClip.call(void 0, this.p, id);
|
|
803
803
|
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).`);
|
|
804
804
|
if (!at) {
|
|
805
805
|
const ids = this.p.tracks.flatMap((t) => t.clips.map((c) => c.id));
|
|
@@ -816,16 +816,16 @@ var Editor = (_class = class {
|
|
|
816
816
|
return a;
|
|
817
817
|
}
|
|
818
818
|
fits(track, start, duration, ignore, what) {
|
|
819
|
-
const hit =
|
|
819
|
+
const hit = _chunkIGPEBXUDcjs.videoOverlap.call(void 0, track, start, start + duration, ignore);
|
|
820
820
|
if (hit) {
|
|
821
|
-
const free =
|
|
822
|
-
refuse(`${what} at ${
|
|
821
|
+
const free = _chunkIGPEBXUDcjs.nextFreeVideoSlot.call(void 0, track, start, duration, ignore);
|
|
822
|
+
refuse(`${what} at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, start)}\u2013${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, start + duration)} would overlap clip "${hit.id}" (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, hit))}) on track "${track.id}"; the next free place is ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, free)}, or use mode "insert" to push later clips along or "overwrite" to replace what is there.`);
|
|
823
823
|
}
|
|
824
824
|
}
|
|
825
825
|
/** An adjustment clip's target track must exist. */
|
|
826
826
|
adjustmentTarget(clip) {
|
|
827
827
|
if (clip.type !== "adjustment" || clip.targetTrack === void 0) return;
|
|
828
|
-
const ids =
|
|
828
|
+
const ids = _chunkIGPEBXUDcjs.allVideoTracks.call(void 0, this.p).map(({ track }) => track.id);
|
|
829
829
|
if (!ids.includes(clip.targetTrack)) refuse(`Adjustment clip "${clip.id}" targets track ${_chunkEBDZWIOPcjs.namedWithSuggestion.call(void 0, clip.targetTrack, ids)}, which does not exist; the tracks are ${ids.map((t) => `"${t}"`).join(", ")}.`);
|
|
830
830
|
}
|
|
831
831
|
kindFits(track, clip) {
|
|
@@ -841,14 +841,14 @@ var Editor = (_class = class {
|
|
|
841
841
|
/** Moves every clip on `track` starting at or after `from` by `delta`. */
|
|
842
842
|
shift(track, from, delta, except = /* @__PURE__ */ new Set()) {
|
|
843
843
|
if (!delta) return;
|
|
844
|
-
for (const c of track.clips) if (!except.has(c.id) && c.start >= from -
|
|
844
|
+
for (const c of track.clips) if (!except.has(c.id) && c.start >= from - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) c.start = Math.max(0, c.start + delta);
|
|
845
845
|
track.clips.sort((a, b) => a.start - b.start);
|
|
846
846
|
}
|
|
847
847
|
get frame() {
|
|
848
848
|
return 1e3 / this.p.fps;
|
|
849
849
|
}
|
|
850
850
|
ids() {
|
|
851
|
-
return
|
|
851
|
+
return _chunkIGPEBXUDcjs.allVideoClipIds.call(void 0, this.p);
|
|
852
852
|
}
|
|
853
853
|
/**
|
|
854
854
|
* The tracks a ripple on `sources` moves, top to bottom: the sources, and every unlocked
|
|
@@ -856,8 +856,8 @@ var Editor = (_class = class {
|
|
|
856
856
|
*/
|
|
857
857
|
rippleTracks(sources) {
|
|
858
858
|
const set = new Set(sources);
|
|
859
|
-
if ([...set].some(
|
|
860
|
-
for (const t of this.p.tracks) if (
|
|
859
|
+
if ([...set].some(_chunkIGPEBXUDcjs.videoTrackSyncLocked)) {
|
|
860
|
+
for (const t of this.p.tracks) if (_chunkIGPEBXUDcjs.videoTrackSyncLocked.call(void 0, t) && !t.locked) set.add(t);
|
|
861
861
|
}
|
|
862
862
|
return this.p.tracks.filter((t) => set.has(t));
|
|
863
863
|
}
|
|
@@ -874,7 +874,7 @@ var Editor = (_class = class {
|
|
|
874
874
|
return open;
|
|
875
875
|
}
|
|
876
876
|
range(from, to) {
|
|
877
|
-
if (!(to - from >
|
|
877
|
+
if (!(to - from > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)) refuse(`"to" (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, to)}) must be after "from" (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, from)}).`);
|
|
878
878
|
}
|
|
879
879
|
/** Moves a media or compound clip's in point by `delta` of timeline time (stills, titles and colours have none). */
|
|
880
880
|
moveIn(clip, delta) {
|
|
@@ -883,18 +883,18 @@ var Editor = (_class = class {
|
|
|
883
883
|
if (clip.in < 1e-9) delete clip.in;
|
|
884
884
|
return;
|
|
885
885
|
}
|
|
886
|
-
if (clip.type !== "media" || _optionalChain([
|
|
887
|
-
clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta *
|
|
886
|
+
if (clip.type !== "media" || _optionalChain([_chunkIGPEBXUDcjs.videoAssetMap.call(void 0, this.p), 'access', _12 => _12.get, 'call', _13 => _13(clip.asset), 'optionalAccess', _14 => _14.kind]) === "image") return;
|
|
887
|
+
clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta * _chunkIGPEBXUDcjs.videoClipSpeed.call(void 0, clip));
|
|
888
888
|
if (clip.in < 1e-9) delete clip.in;
|
|
889
889
|
}
|
|
890
890
|
/** Moves a clip's head `delta` later in time (start, in point and keys); the caller sets start and duration. */
|
|
891
891
|
trimHead(clip, delta) {
|
|
892
892
|
if (!isRamped(clip)) this.moveIn(clip, delta);
|
|
893
|
-
retimeClipKeys(clip, (v) =>
|
|
893
|
+
retimeClipKeys(clip, (v) => _chunkIGPEBXUDcjs.retimeVideoAnimatable.call(void 0, v, -delta));
|
|
894
894
|
}
|
|
895
895
|
/** Cuts `clip` at `at` (inside it): the left part keeps the id, the right part is returned. */
|
|
896
896
|
cut(track, clip, at, id) {
|
|
897
|
-
const end =
|
|
897
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip);
|
|
898
898
|
const right = { ...structuredClone(clip), id: _nullishCoalesce(id, () => ( freshId(`${clip.id}-`, this.ids()))), start: at, duration: end - at };
|
|
899
899
|
delete right.transition;
|
|
900
900
|
delete right.fadeIn;
|
|
@@ -902,9 +902,9 @@ var Editor = (_class = class {
|
|
|
902
902
|
delete right.animateIn;
|
|
903
903
|
const leftValues = clipAnimatables(clip);
|
|
904
904
|
clipAnimatables(right).forEach((r, i) => {
|
|
905
|
-
const [l, rr] =
|
|
906
|
-
if (
|
|
907
|
-
if (
|
|
905
|
+
const [l, rr] = _chunkIGPEBXUDcjs.splitVideoAnimatable.call(void 0, leftValues[i].get(), at - clip.start);
|
|
906
|
+
if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, l)) leftValues[i].set(l);
|
|
907
|
+
if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, rr)) r.set(rr);
|
|
908
908
|
});
|
|
909
909
|
if (!isRamped(right)) this.moveIn(right, at - clip.start);
|
|
910
910
|
clip.duration = at - clip.start;
|
|
@@ -918,7 +918,7 @@ var Editor = (_class = class {
|
|
|
918
918
|
/** Cuts every clip on `tracks` that runs across `at`; returns the new right-hand parts. */
|
|
919
919
|
cutAcross(tracks, at) {
|
|
920
920
|
const made = [];
|
|
921
|
-
for (const t of tracks) for (const c of [...t.clips]) if (c.start < at -
|
|
921
|
+
for (const t of tracks) for (const c of [...t.clips]) if (c.start < at - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON && _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c) > at + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) made.push(this.cut(t, c, at));
|
|
922
922
|
return made;
|
|
923
923
|
}
|
|
924
924
|
/**
|
|
@@ -936,10 +936,10 @@ var Editor = (_class = class {
|
|
|
936
936
|
*/
|
|
937
937
|
close(tracks, from, to) {
|
|
938
938
|
for (const t of tracks) {
|
|
939
|
-
const hit =
|
|
939
|
+
const hit = _chunkIGPEBXUDcjs.videoOverlap.call(void 0, t, from, to);
|
|
940
940
|
if (hit)
|
|
941
941
|
refuse(
|
|
942
|
-
`Rippling out ${
|
|
942
|
+
`Rippling out ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, from)}\u2013${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, to)} would pull track "${t.id}" out of sync: clip "${hit.id}" (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, _chunkIGPEBXUDcjs.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.`
|
|
943
943
|
);
|
|
944
944
|
}
|
|
945
945
|
for (const t of tracks) this.shift(t, to, from - to);
|
|
@@ -951,10 +951,10 @@ var Editor = (_class = class {
|
|
|
951
951
|
clear(track, from, to, report) {
|
|
952
952
|
for (const c of [...track.clips]) {
|
|
953
953
|
const start = c.start;
|
|
954
|
-
const end =
|
|
955
|
-
if (end <= from +
|
|
956
|
-
const coversHead = start >= from -
|
|
957
|
-
const coversTail = end <= to +
|
|
954
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c);
|
|
955
|
+
if (end <= from + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON || start >= to - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) continue;
|
|
956
|
+
const coversHead = start >= from - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON;
|
|
957
|
+
const coversTail = end <= to + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON;
|
|
958
958
|
if (coversHead && coversTail) {
|
|
959
959
|
track.clips = track.clips.filter((x) => x !== c);
|
|
960
960
|
report.removed.push(c.id);
|
|
@@ -977,8 +977,8 @@ var Editor = (_class = class {
|
|
|
977
977
|
/** Clamps a slip, roll or slide to `[lo, hi]`, refusing when it cannot move that way at all. */
|
|
978
978
|
clamp(delta, lo, hi, why) {
|
|
979
979
|
const applied = Math.min(Math.max(delta, Math.min(0, lo)), Math.max(0, hi));
|
|
980
|
-
if (Math.abs(delta) >
|
|
981
|
-
return Math.abs(applied) <=
|
|
980
|
+
if (Math.abs(delta) > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON && Math.abs(applied) <= _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) refuse(why());
|
|
981
|
+
return Math.abs(applied) <= _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON ? 0 : applied;
|
|
982
982
|
}
|
|
983
983
|
/** Places a clip on a track by `mode`, returning what it cut, trimmed, removed and rippled. */
|
|
984
984
|
place(track, clip, mode, outcome) {
|
|
@@ -988,14 +988,14 @@ var Editor = (_class = class {
|
|
|
988
988
|
outcome.rippled = tracks.map((t) => t.id);
|
|
989
989
|
} else if (mode === "overwrite") {
|
|
990
990
|
const report = { removed: [], trimmed: [], created: [] };
|
|
991
|
-
this.clear(track, clip.start,
|
|
991
|
+
this.clear(track, clip.start, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip), report);
|
|
992
992
|
Object.assign(outcome, report);
|
|
993
993
|
} else this.fits(track, clip.start, clip.duration, /* @__PURE__ */ new Set([clip.id]), `Clip "${clip.id}"`);
|
|
994
994
|
track.clips.push(clip);
|
|
995
995
|
track.clips.sort((a, b) => a.start - b.start);
|
|
996
996
|
}
|
|
997
997
|
placement(mode, ripple) {
|
|
998
|
-
if (mode !== void 0 && !
|
|
998
|
+
if (mode !== void 0 && !_chunkIGPEBXUDcjs.VIDEO_PLACEMENT_MODES.includes(mode)) refuse(`"mode" must be ${_chunkIGPEBXUDcjs.VIDEO_PLACEMENT_MODES.map((m) => `"${m}"`).join(", ")}.`);
|
|
999
999
|
if (ripple && mode !== void 0 && mode !== "insert") refuse(`"ripple" means mode "insert", so it cannot go with mode "${mode}"; pass one or the other.`);
|
|
1000
1000
|
return _nullishCoalesce(mode, () => ( (ripple ? "insert" : "refuse")));
|
|
1001
1001
|
}
|
|
@@ -1032,7 +1032,7 @@ var Editor = (_class = class {
|
|
|
1032
1032
|
}
|
|
1033
1033
|
case "remove_asset": {
|
|
1034
1034
|
const asset = this.asset(e.asset);
|
|
1035
|
-
const users =
|
|
1035
|
+
const users = _chunkIGPEBXUDcjs.allVideoTracks.call(void 0, this.p).flatMap(({ track: t }) => t.clips.filter((c) => c.type === "media" && c.asset === asset.id).map((c) => c.id));
|
|
1036
1036
|
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.`);
|
|
1037
1037
|
this.p.assets = this.p.assets.filter((a) => a !== asset);
|
|
1038
1038
|
return this.outcomes.push({ op: e.op, asset: asset.id });
|
|
@@ -1085,12 +1085,12 @@ var Editor = (_class = class {
|
|
|
1085
1085
|
else draft.duration = (asset.duration - (_nullishCoalesce(draft.in, () => ( 0)))) / (_nullishCoalesce(draft.speed, () => ( 1)));
|
|
1086
1086
|
if (!(draft.duration > 0)) refuse(`"in" (${draft.in} ms) is at or past the end of "${asset.id}" (${asset.duration} ms).`);
|
|
1087
1087
|
} else if (draft.type === "sequence") {
|
|
1088
|
-
const length =
|
|
1088
|
+
const length = _chunkIGPEBXUDcjs.videoSequenceDuration.call(void 0, _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p).get(draft.sequence)) - (_nullishCoalesce(draft.in, () => ( 0)));
|
|
1089
1089
|
if (!(length > 0)) refuse(`"in" (${_nullishCoalesce(draft.in, () => ( 0))} ms) is at or past the end of sequence "${draft.sequence}".`);
|
|
1090
1090
|
draft.duration = length;
|
|
1091
1091
|
} else draft.duration = VIDEO_DEFAULT_TITLE_DURATION;
|
|
1092
1092
|
}
|
|
1093
|
-
const end =
|
|
1093
|
+
const end = _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, track).reduce((m, c) => Math.max(m, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c)), 0);
|
|
1094
1094
|
draft.start ??= end;
|
|
1095
1095
|
const clip = parseVideoClip(draft, "clip");
|
|
1096
1096
|
this.adjustmentTarget(clip);
|
|
@@ -1116,20 +1116,20 @@ var Editor = (_class = class {
|
|
|
1116
1116
|
case "trim_clip": {
|
|
1117
1117
|
const { track, clip } = this.clip(e.clip);
|
|
1118
1118
|
this.unlocked(track);
|
|
1119
|
-
const speed =
|
|
1120
|
-
const end =
|
|
1119
|
+
const speed = _chunkIGPEBXUDcjs.videoClipSpeed.call(void 0, clip);
|
|
1120
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip);
|
|
1121
1121
|
const minimum = 1e3 / this.p.fps;
|
|
1122
|
-
const assets =
|
|
1122
|
+
const assets = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, this.p);
|
|
1123
1123
|
if (e.edge === "start") {
|
|
1124
1124
|
const delta = e.to - clip.start;
|
|
1125
|
-
if (clip.duration - delta < minimum -
|
|
1125
|
+
if (clip.duration - delta < minimum - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the start to ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it ends at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, end)}.`);
|
|
1126
1126
|
if (clip.type === "media" && !isRamped(clip) || clip.type === "sequence") {
|
|
1127
1127
|
const sourceIn = (_nullishCoalesce(clip.in, () => ( 0))) + delta * speed;
|
|
1128
|
-
if (sourceIn < -
|
|
1128
|
+
if (sourceIn < -_chunkIGPEBXUDcjs.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 ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, clip.start - (_nullishCoalesce(clip.in, () => ( 0))) / speed)}).`);
|
|
1129
1129
|
clip.in = Math.max(0, sourceIn);
|
|
1130
1130
|
if (clip.in === 0) delete clip.in;
|
|
1131
1131
|
}
|
|
1132
|
-
retimeClipKeys(clip, (v) =>
|
|
1132
|
+
retimeClipKeys(clip, (v) => _chunkIGPEBXUDcjs.retimeVideoAnimatable.call(void 0, v, -delta));
|
|
1133
1133
|
if (e.ripple) {
|
|
1134
1134
|
const tracks = this.rippleTracks([track]);
|
|
1135
1135
|
if (delta > 0) {
|
|
@@ -1150,17 +1150,17 @@ var Editor = (_class = class {
|
|
|
1150
1150
|
}
|
|
1151
1151
|
} else {
|
|
1152
1152
|
const duration = e.to - clip.start;
|
|
1153
|
-
if (duration < minimum -
|
|
1153
|
+
if (duration < minimum - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the end to ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it starts at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, clip.start)}.`);
|
|
1154
1154
|
if (clip.type === "media" && !isRamped(clip)) {
|
|
1155
1155
|
const asset = assets.get(clip.asset);
|
|
1156
1156
|
const out = (_nullishCoalesce(clip.in, () => ( 0))) + duration * speed;
|
|
1157
|
-
if (_optionalChain([asset, 'optionalAccess', _15 => _15.duration]) !== void 0 && out > asset.duration +
|
|
1158
|
-
refuse(`"${clip.id}" can end at most at ${
|
|
1157
|
+
if (_optionalChain([asset, 'optionalAccess', _15 => _15.duration]) !== void 0 && out > asset.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
1158
|
+
refuse(`"${clip.id}" can end at most at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, clip.start + (asset.duration - (_nullishCoalesce(clip.in, () => ( 0)))) / speed)}, where "${asset.id}" runs out.`);
|
|
1159
1159
|
}
|
|
1160
1160
|
if (clip.type === "sequence") {
|
|
1161
|
-
const seq =
|
|
1162
|
-
const length = seq ?
|
|
1163
|
-
if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length +
|
|
1161
|
+
const seq = _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p).get(clip.sequence);
|
|
1162
|
+
const length = seq ? _chunkIGPEBXUDcjs.videoSequenceDuration.call(void 0, seq) : Infinity;
|
|
1163
|
+
if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" can end at most at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, clip.start + length - (_nullishCoalesce(clip.in, () => ( 0))))}, where sequence "${clip.sequence}" ends.`);
|
|
1164
1164
|
}
|
|
1165
1165
|
if (e.ripple) {
|
|
1166
1166
|
const tracks = this.rippleTracks([track]);
|
|
@@ -1182,9 +1182,9 @@ var Editor = (_class = class {
|
|
|
1182
1182
|
case "split_clip": {
|
|
1183
1183
|
const { track, clip } = this.clip(e.clip);
|
|
1184
1184
|
this.unlocked(track);
|
|
1185
|
-
const end =
|
|
1185
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip);
|
|
1186
1186
|
const minimum = 1e3 / this.p.fps;
|
|
1187
|
-
if (e.at < clip.start + minimum -
|
|
1187
|
+
if (e.at < clip.start + minimum - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON || e.at > end - minimum + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) refuse(`${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, e.at)} is not inside "${clip.id}" (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, clip.start)}\u2013${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, end)}), at least a frame from either end.`);
|
|
1188
1188
|
if (e.id !== void 0 && this.ids().includes(e.id)) refuse(`There is already a clip "${e.id}".`);
|
|
1189
1189
|
const right = this.cut(track, clip, e.at, e.id);
|
|
1190
1190
|
return this.outcomes.push({ op: e.op, clips: [clip.id, right.id], clip: right.id, track: track.id });
|
|
@@ -1195,12 +1195,12 @@ var Editor = (_class = class {
|
|
|
1195
1195
|
for (const track of new Set(found.map((f) => f.track))) track.clips = track.clips.filter((c) => !found.some((f) => f.clip === c));
|
|
1196
1196
|
if (!e.ripple) return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id) });
|
|
1197
1197
|
const rippled = /* @__PURE__ */ new Set();
|
|
1198
|
-
const groups = [...new Set(found.map((f) => f.track))].filter((t) => !
|
|
1199
|
-
if (found.some((f) =>
|
|
1198
|
+
const groups = [...new Set(found.map((f) => f.track))].filter((t) => !_chunkIGPEBXUDcjs.videoTrackSyncLocked.call(void 0, t)).map((t) => [t]);
|
|
1199
|
+
if (found.some((f) => _chunkIGPEBXUDcjs.videoTrackSyncLocked.call(void 0, f.track))) groups.push(found.filter((f) => _chunkIGPEBXUDcjs.videoTrackSyncLocked.call(void 0, f.track)).map((f) => f.track));
|
|
1200
1200
|
for (const sources of groups) {
|
|
1201
1201
|
const tracks = this.rippleTracks(sources);
|
|
1202
1202
|
tracks.forEach((t) => rippled.add(t));
|
|
1203
|
-
const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start,
|
|
1203
|
+
const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, f.clip)]));
|
|
1204
1204
|
for (const [from, to] of spans.reverse()) this.close(tracks, from, to);
|
|
1205
1205
|
}
|
|
1206
1206
|
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) });
|
|
@@ -1216,7 +1216,7 @@ var Editor = (_class = class {
|
|
|
1216
1216
|
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.");
|
|
1217
1217
|
let stretch = 1;
|
|
1218
1218
|
if (at.clip.type === "media" && !("duration" in set)) {
|
|
1219
|
-
const was =
|
|
1219
|
+
const was = _chunkIGPEBXUDcjs.videoClipSpeed.call(void 0, at.clip);
|
|
1220
1220
|
const now = "speed" in set ? set.speed : _optionalChain([e, 'access', _16 => _16.remove, 'optionalAccess', _17 => _17.includes, 'call', _18 => _18("speed")]) ? 1 : was;
|
|
1221
1221
|
if (now !== was) {
|
|
1222
1222
|
set.duration = at.clip.duration * was / now;
|
|
@@ -1224,7 +1224,7 @@ var Editor = (_class = class {
|
|
|
1224
1224
|
}
|
|
1225
1225
|
}
|
|
1226
1226
|
const next = { ...structuredClone(at.clip), ...set };
|
|
1227
|
-
if (stretch !== 1) retimeClipKeys(next, (v) =>
|
|
1227
|
+
if (stretch !== 1) retimeClipKeys(next, (v) => _chunkIGPEBXUDcjs.retimeVideoAnimatable.call(void 0, v, 0, stretch));
|
|
1228
1228
|
for (const k of _nullishCoalesce(e.remove, () => ( []))) delete next[k];
|
|
1229
1229
|
const clip = parseVideoClip(next, "set");
|
|
1230
1230
|
this.adjustmentTarget(clip);
|
|
@@ -1238,17 +1238,17 @@ var Editor = (_class = class {
|
|
|
1238
1238
|
const { track, clip } = this.clip(e.clip);
|
|
1239
1239
|
this.unlocked(track);
|
|
1240
1240
|
if (clip.type === "sequence") refuse(`Clip "${clip.id}" is a compound clip, which plays its sequence at normal speed; ramp the clips inside the sequence instead.`);
|
|
1241
|
-
if (clip.type !== "media") refuse(`Clip "${clip.id}" is a ${
|
|
1241
|
+
if (clip.type !== "media") refuse(`Clip "${clip.id}" is a ${_chunkIGPEBXUDcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to ramp; only video and audio clips change speed.`);
|
|
1242
1242
|
const asset = this.asset(clip.asset);
|
|
1243
1243
|
if (asset.kind === "image") refuse(`Clip "${clip.id}" is a still ("${asset.id}"), so it has no motion to ramp.`);
|
|
1244
1244
|
const media = clip;
|
|
1245
|
-
const end =
|
|
1245
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, media);
|
|
1246
1246
|
const duration = _nullishCoalesce(e.duration, () => ( media.duration));
|
|
1247
|
-
if (!(duration >= 1e3 / this.p.fps -
|
|
1247
|
+
if (!(duration >= 1e3 / this.p.fps - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)) refuse(`"duration" must be at least a frame (${Math.ceil(1e3 / this.p.fps)} ms).`);
|
|
1248
1248
|
if (e.keys === null) {
|
|
1249
1249
|
if (!media.timeRemap) refuse(`Clip "${clip.id}" has no speed ramp to remove.`);
|
|
1250
1250
|
const from = (_nullishCoalesce(media.in, () => ( 0))) + media.timeRemap.keys[0].v;
|
|
1251
|
-
if (asset.duration !== void 0 && from + duration > asset.duration +
|
|
1251
|
+
if (asset.duration !== void 0 && from + duration > asset.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
1252
1252
|
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.`);
|
|
1253
1253
|
delete media.timeRemap;
|
|
1254
1254
|
media.in = from;
|
|
@@ -1256,17 +1256,17 @@ var Editor = (_class = class {
|
|
|
1256
1256
|
} else {
|
|
1257
1257
|
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).');
|
|
1258
1258
|
const remap = parseVideoTimeRemap({ keys: e.keys }, void 0, "keys");
|
|
1259
|
-
remap.keys =
|
|
1260
|
-
|
|
1261
|
-
const span =
|
|
1262
|
-
if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration +
|
|
1259
|
+
remap.keys = _chunkIGPEBXUDcjs.sortVideoKeys.call(void 0, remap.keys);
|
|
1260
|
+
_chunkIGPEBXUDcjs.checkVideoTimeRemap.call(void 0, remap, "keys");
|
|
1261
|
+
const span = _chunkIGPEBXUDcjs.videoTimeRemapSpan.call(void 0, remap);
|
|
1262
|
+
if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON)
|
|
1263
1263
|
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.`);
|
|
1264
1264
|
media.timeRemap = remap;
|
|
1265
1265
|
delete media.speed;
|
|
1266
1266
|
}
|
|
1267
1267
|
const newEnd = media.start + duration;
|
|
1268
1268
|
const outcome = { op: e.op, clip: clip.id, track: track.id };
|
|
1269
|
-
if (Math.abs(newEnd - end) >
|
|
1269
|
+
if (Math.abs(newEnd - end) > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) {
|
|
1270
1270
|
if (e.ripple) {
|
|
1271
1271
|
const tracks = this.rippleTracks([track]);
|
|
1272
1272
|
if (newEnd < end) {
|
|
@@ -1295,11 +1295,11 @@ var Editor = (_class = class {
|
|
|
1295
1295
|
case "slip_clip": {
|
|
1296
1296
|
const { track, clip } = this.clip(e.clip);
|
|
1297
1297
|
this.unlocked(track);
|
|
1298
|
-
if (clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${
|
|
1298
|
+
if (clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${_chunkIGPEBXUDcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to slip; only video, audio and compound clips slip.`);
|
|
1299
1299
|
const source = clip.type === "sequence" ? `sequence "${clip.sequence}"` : `"${this.asset(clip.asset).id}"`;
|
|
1300
1300
|
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.`);
|
|
1301
|
-
const handles =
|
|
1302
|
-
const { lead, tail } =
|
|
1301
|
+
const handles = _chunkIGPEBXUDcjs.videoClipHandles.call(void 0, clip, _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, this.p), _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p));
|
|
1302
|
+
const { lead, tail } = _chunkIGPEBXUDcjs.videoClipOverhang.call(void 0, track, clip);
|
|
1303
1303
|
const delta = this.clamp(
|
|
1304
1304
|
e.delta,
|
|
1305
1305
|
lead - handles.before,
|
|
@@ -1317,13 +1317,13 @@ var Editor = (_class = class {
|
|
|
1317
1317
|
this.unlocked(track);
|
|
1318
1318
|
const L = left.clip;
|
|
1319
1319
|
const R = right.clip;
|
|
1320
|
-
if (Math.abs(
|
|
1321
|
-
if (Math.abs(
|
|
1322
|
-
refuse(`"${L.id}" ends at ${
|
|
1320
|
+
if (Math.abs(_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, L) - R.start) > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) {
|
|
1321
|
+
if (Math.abs(_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, R) - L.start) <= _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) refuse(`"${R.id}" comes before "${L.id}"; pass left "${R.id}" and right "${L.id}".`);
|
|
1322
|
+
refuse(`"${L.id}" ends at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, L))} but "${R.id}" starts at ${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, R.start)}; a roll needs two clips that meet at a cut (use trim_clip to move one edge).`);
|
|
1323
1323
|
}
|
|
1324
|
-
const assets =
|
|
1325
|
-
const lo = Math.max(-(L.duration - this.frame), -(
|
|
1326
|
-
const hi = Math.min(R.duration - this.frame,
|
|
1324
|
+
const assets = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, this.p);
|
|
1325
|
+
const lo = Math.max(-(L.duration - this.frame), -(_chunkIGPEBXUDcjs.videoClipHandles.call(void 0, R, assets, _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkIGPEBXUDcjs.videoClipOverhang.call(void 0, track, R).lead));
|
|
1326
|
+
const hi = Math.min(R.duration - this.frame, _chunkIGPEBXUDcjs.videoClipHandles.call(void 0, L, assets, _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkIGPEBXUDcjs.videoClipOverhang.call(void 0, track, L).tail);
|
|
1327
1327
|
const delta = this.clamp(
|
|
1328
1328
|
e.delta,
|
|
1329
1329
|
lo,
|
|
@@ -1339,18 +1339,18 @@ var Editor = (_class = class {
|
|
|
1339
1339
|
case "slide_clip": {
|
|
1340
1340
|
const { track, clip } = this.clip(e.clip);
|
|
1341
1341
|
this.unlocked(track);
|
|
1342
|
-
const before =
|
|
1343
|
-
const after =
|
|
1342
|
+
const before = _chunkIGPEBXUDcjs.videoClipBefore.call(void 0, track, clip);
|
|
1343
|
+
const after = _chunkIGPEBXUDcjs.videoClipAfter.call(void 0, track, clip);
|
|
1344
1344
|
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.`);
|
|
1345
|
-
const assets =
|
|
1346
|
-
const end =
|
|
1345
|
+
const assets = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, this.p);
|
|
1346
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip);
|
|
1347
1347
|
const others = track.clips.filter((c) => c !== clip);
|
|
1348
1348
|
const room = {
|
|
1349
|
-
earlier: before ? before.duration - this.frame : clip.start - others.filter((c) =>
|
|
1350
|
-
later: after ? after.duration - this.frame : others.filter((c) => c.start >= end -
|
|
1349
|
+
earlier: before ? before.duration - this.frame : clip.start - others.filter((c) => _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c) <= clip.start + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.max(m, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c)), 0),
|
|
1350
|
+
later: after ? after.duration - this.frame : others.filter((c) => c.start >= end - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.min(m, c.start - end), Infinity)
|
|
1351
1351
|
};
|
|
1352
|
-
const lo = -Math.min(room.earlier, after ?
|
|
1353
|
-
const hi = Math.min(room.later, before ?
|
|
1352
|
+
const lo = -Math.min(room.earlier, after ? _chunkIGPEBXUDcjs.videoClipHandles.call(void 0, after, assets, _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkIGPEBXUDcjs.videoClipOverhang.call(void 0, track, after).lead : Infinity);
|
|
1353
|
+
const hi = Math.min(room.later, before ? _chunkIGPEBXUDcjs.videoClipHandles.call(void 0, before, assets, _chunkIGPEBXUDcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkIGPEBXUDcjs.videoClipOverhang.call(void 0, track, before).tail : Infinity);
|
|
1354
1354
|
const delta = this.clamp(
|
|
1355
1355
|
e.delta,
|
|
1356
1356
|
lo,
|
|
@@ -1383,29 +1383,29 @@ var Editor = (_class = class {
|
|
|
1383
1383
|
}
|
|
1384
1384
|
case "split_at": {
|
|
1385
1385
|
const tracks = this.rangeTracks(e.tracks);
|
|
1386
|
-
const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at -
|
|
1387
|
-
if (!lefts.length) refuse(`No clip runs across ${
|
|
1386
|
+
const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON && _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c) > e.at + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON).map((c) => c.id));
|
|
1387
|
+
if (!lefts.length) refuse(`No clip runs across ${_chunkIGPEBXUDcjs.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.`);
|
|
1388
1388
|
const created = this.cutAcross(tracks, e.at).map((c) => c.id);
|
|
1389
1389
|
return this.outcomes.push({ op: e.op, clips: lefts, created });
|
|
1390
1390
|
}
|
|
1391
1391
|
case "set_keyframes": {
|
|
1392
1392
|
const { track, clip } = this.clip(e.clip);
|
|
1393
1393
|
this.unlocked(track);
|
|
1394
|
-
if (!
|
|
1394
|
+
if (!_chunkIGPEBXUDcjs.VIDEO_KEYFRAME_PROPERTIES.includes(e.property)) refuse(`"${e.property}" cannot be keyframed; use one of ${_chunkIGPEBXUDcjs.VIDEO_KEYFRAME_PROPERTIES.join(", ")}.`);
|
|
1395
1395
|
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.`);
|
|
1396
|
-
const limits =
|
|
1397
|
-
const transform =
|
|
1396
|
+
const limits = _chunkIGPEBXUDcjs.VIDEO_KEYFRAME_LIMITS[e.property];
|
|
1397
|
+
const transform = _chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES.includes(e.property);
|
|
1398
1398
|
const c = clip;
|
|
1399
1399
|
const current = transform ? _optionalChain([c, 'access', _21 => _21.transform, 'optionalAccess', _22 => _22[e.property]]) : c[e.property];
|
|
1400
1400
|
let value;
|
|
1401
1401
|
if (e.keys === null) {
|
|
1402
|
-
const v =
|
|
1403
|
-
value =
|
|
1402
|
+
const v = _chunkIGPEBXUDcjs.videoValueAt.call(void 0, current, 0, limits.default);
|
|
1403
|
+
value = _chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, current) ? v === limits.default ? void 0 : v : current;
|
|
1404
1404
|
} else {
|
|
1405
1405
|
if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must list at least one key { t, v }; pass null to remove the keyframes.');
|
|
1406
1406
|
let sorted = [];
|
|
1407
1407
|
try {
|
|
1408
|
-
sorted =
|
|
1408
|
+
sorted = _chunkIGPEBXUDcjs.sortVideoKeys.call(void 0, e.keys);
|
|
1409
1409
|
} catch (error) {
|
|
1410
1410
|
refuse(error.message);
|
|
1411
1411
|
}
|
|
@@ -1424,12 +1424,12 @@ var Editor = (_class = class {
|
|
|
1424
1424
|
this.unlocked(track);
|
|
1425
1425
|
let at = 0;
|
|
1426
1426
|
const moved = [];
|
|
1427
|
-
for (const clip of
|
|
1428
|
-
if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) -
|
|
1427
|
+
for (const clip of _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, track)) {
|
|
1428
|
+
if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON && clip.start > at + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) {
|
|
1429
1429
|
clip.start = Math.max(at, _nullishCoalesce(e.from, () => ( 0)));
|
|
1430
1430
|
moved.push(clip.id);
|
|
1431
1431
|
}
|
|
1432
|
-
at = Math.max(at,
|
|
1432
|
+
at = Math.max(at, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip));
|
|
1433
1433
|
}
|
|
1434
1434
|
return this.outcomes.push({ op: e.op, track: track.id, clips: moved });
|
|
1435
1435
|
}
|
|
@@ -1559,7 +1559,7 @@ function videoTranscriptTrack(project, track) {
|
|
|
1559
1559
|
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(", ")}.`);
|
|
1560
1560
|
return track;
|
|
1561
1561
|
}
|
|
1562
|
-
const assets =
|
|
1562
|
+
const assets = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, project);
|
|
1563
1563
|
const transcribed = (t) => t.clips.some((c) => c.type === "media" && _optionalChain([assets, 'access', _24 => _24.get, 'call', _25 => _25(c.asset), 'optionalAccess', _26 => _26.transcript, 'optionalAccess', _27 => _27.length]));
|
|
1564
1564
|
return _nullishCoalesce(_optionalChain([(_nullishCoalesce(project.tracks.find((t) => t.kind === "audio" && transcribed(t)), () => ( project.tracks.find(transcribed)))), 'optionalAccess', _28 => _28.id]), () => ( null));
|
|
1565
1565
|
}
|
|
@@ -1567,16 +1567,16 @@ function videoTimelineTranscript(project, options = {}) {
|
|
|
1567
1567
|
const id = videoTranscriptTrack(project, options.track);
|
|
1568
1568
|
if (!id) return [];
|
|
1569
1569
|
const track = project.tracks.find((t) => t.id === id);
|
|
1570
|
-
const assets =
|
|
1570
|
+
const assets = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, project);
|
|
1571
1571
|
const out = [];
|
|
1572
|
-
for (const clip of
|
|
1572
|
+
for (const clip of _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, track)) {
|
|
1573
1573
|
if (clip.type !== "media") continue;
|
|
1574
1574
|
const words = _optionalChain([assets, 'access', _29 => _29.get, 'call', _30 => _30(clip.asset), 'optionalAccess', _31 => _31.transcript]);
|
|
1575
1575
|
if (!_optionalChain([words, 'optionalAccess', _32 => _32.length])) continue;
|
|
1576
|
-
const speed =
|
|
1576
|
+
const speed = _chunkIGPEBXUDcjs.videoClipSpeed.call(void 0, clip);
|
|
1577
1577
|
const from = _nullishCoalesce(clip.in, () => ( 0));
|
|
1578
1578
|
const to = from + clip.duration * speed;
|
|
1579
|
-
const toTimeline = (s) => Math.min(
|
|
1579
|
+
const toTimeline = (s) => Math.min(_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip), Math.max(clip.start, clip.start + (s - from) / speed));
|
|
1580
1580
|
words.forEach((w, index) => {
|
|
1581
1581
|
const mid = (w.start + w.end) / 2;
|
|
1582
1582
|
if (mid < from || mid >= to) return;
|
|
@@ -1621,19 +1621,19 @@ function findVideoTranscriptPauses(words, options = {}) {
|
|
|
1621
1621
|
let to = b.start - keep;
|
|
1622
1622
|
if (options.fps) {
|
|
1623
1623
|
const f = 1e3 / options.fps;
|
|
1624
|
-
from =
|
|
1625
|
-
to =
|
|
1624
|
+
from = _chunkIGPEBXUDcjs.snapToVideoFrame.call(void 0, Math.ceil(from / f - 1e-9) * f, options.fps);
|
|
1625
|
+
to = _chunkIGPEBXUDcjs.snapToVideoFrame.call(void 0, Math.floor(to / f + 1e-9) * f, options.fps);
|
|
1626
1626
|
}
|
|
1627
|
-
if (to - from >
|
|
1627
|
+
if (to - from > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) out.push({ from, to, text: `(pause after "${a.word}")` });
|
|
1628
1628
|
}
|
|
1629
1629
|
return out;
|
|
1630
1630
|
}
|
|
1631
1631
|
function mergeVideoRanges(ranges) {
|
|
1632
|
-
const sorted = ranges.filter((r) => r.to - r.from >
|
|
1632
|
+
const sorted = ranges.filter((r) => r.to - r.from > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON).map((r) => ({ from: r.from, to: r.to })).sort((a, b) => a.from - b.from);
|
|
1633
1633
|
const out = [];
|
|
1634
1634
|
for (const r of sorted) {
|
|
1635
1635
|
const last = out[out.length - 1];
|
|
1636
|
-
if (last && r.from <= last.to +
|
|
1636
|
+
if (last && r.from <= last.to + _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) last.to = Math.max(last.to, r.to);
|
|
1637
1637
|
else out.push(r);
|
|
1638
1638
|
}
|
|
1639
1639
|
return out;
|
|
@@ -1679,7 +1679,7 @@ function findVideoRepetitions(words, options = {}) {
|
|
|
1679
1679
|
var VIDEO_DISFLUENCY_KINDS = ["filler", "pause", "repetition"];
|
|
1680
1680
|
function detectVideoDisfluencies(words, options = {}) {
|
|
1681
1681
|
const kinds = new Set(_nullishCoalesce(options.kinds, () => ( VIDEO_DISFLUENCY_KINDS)));
|
|
1682
|
-
const startIndex = (time) => Math.max(0, words.findIndex((w) => w.start >= time -
|
|
1682
|
+
const startIndex = (time) => Math.max(0, words.findIndex((w) => w.start >= time - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON));
|
|
1683
1683
|
const out = [];
|
|
1684
1684
|
if (kinds.has("filler"))
|
|
1685
1685
|
for (const r of findVideoFillers(words, options.fillers)) {
|
|
@@ -1693,13 +1693,13 @@ function detectVideoDisfluencies(words, options = {}) {
|
|
|
1693
1693
|
}
|
|
1694
1694
|
if (kinds.has("pause"))
|
|
1695
1695
|
for (const r of findVideoTranscriptPauses(words, options.pauses)) {
|
|
1696
|
-
const after = words.findIndex((w) => w.start >= r.to -
|
|
1696
|
+
const after = words.findIndex((w) => w.start >= r.to - _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON);
|
|
1697
1697
|
out.push({ ...r, kind: "pause", words: [Math.max(0, after - 1), Math.max(0, after)] });
|
|
1698
1698
|
}
|
|
1699
1699
|
return out.sort((a, b) => a.from - b.from || a.to - b.to);
|
|
1700
1700
|
}
|
|
1701
1701
|
function videoCutsWithMargin(ranges, keep) {
|
|
1702
|
-
return ranges.map((r) => ({ ...r, from: r.from + keep, to: r.to - keep })).filter((r) => r.to - r.from >
|
|
1702
|
+
return ranges.map((r) => ({ ...r, from: r.from + keep, to: r.to - keep })).filter((r) => r.to - r.from > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON);
|
|
1703
1703
|
}
|
|
1704
1704
|
|
|
1705
1705
|
// src/video-editor/mix.ts
|
|
@@ -1805,7 +1805,7 @@ function videoDuckingKeys(clip, speech, options = {}) {
|
|
|
1805
1805
|
const gap = Math.max(_nullishCoalesce(options.mergeGap, () => ( 600)), attack + release);
|
|
1806
1806
|
const base = _nullishCoalesce(options.base, () => ( 1));
|
|
1807
1807
|
const low = Math.round(base * 10 ** (duckDb / 20) * 1e4) / 1e4;
|
|
1808
|
-
const end =
|
|
1808
|
+
const end = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip);
|
|
1809
1809
|
const ranges = [];
|
|
1810
1810
|
for (const r of mergeVideoRanges(speech)) {
|
|
1811
1811
|
if (r.to <= clip.start - release || r.from >= end + attack) continue;
|
|
@@ -2010,7 +2010,7 @@ function videoClipWaveform(clip, peaks, columns) {
|
|
|
2010
2010
|
const step = clip.duration / Math.max(1, n);
|
|
2011
2011
|
for (let c = 0; c < n; c++) {
|
|
2012
2012
|
const { min, max } = videoAudioPeakRange(peaks, start + c * step * speed, start + (c + 1) * step * speed);
|
|
2013
|
-
const gain =
|
|
2013
|
+
const gain = _chunkIGPEBXUDcjs.videoClipSoundGain.call(void 0, clip, (c + 0.5) * step);
|
|
2014
2014
|
out[2 * c] = min * gain;
|
|
2015
2015
|
out[2 * c + 1] = max * gain;
|
|
2016
2016
|
}
|
|
@@ -2141,7 +2141,7 @@ var VideoAudioPeaksCache = (_class2 = class {
|
|
|
2141
2141
|
// src/video-editor/plan.ts
|
|
2142
2142
|
function clipIndex(project) {
|
|
2143
2143
|
const out = /* @__PURE__ */ new Map();
|
|
2144
|
-
for (const { track } of
|
|
2144
|
+
for (const { track } of _chunkIGPEBXUDcjs.allVideoTracks.call(void 0, project)) for (const c of track.clips) out.set(c.id, c);
|
|
2145
2145
|
return out;
|
|
2146
2146
|
}
|
|
2147
2147
|
function diffVideoProjects(before, after) {
|
|
@@ -2150,8 +2150,8 @@ function diffVideoProjects(before, after) {
|
|
|
2150
2150
|
const clipsAdded = [...b.keys()].filter((id) => !a.has(id));
|
|
2151
2151
|
const clipsRemoved = [...a.keys()].filter((id) => !b.has(id));
|
|
2152
2152
|
const clipsChanged = [...b.keys()].filter((id) => a.has(id) && JSON.stringify(a.get(id)) !== JSON.stringify(b.get(id)));
|
|
2153
|
-
const durationBefore =
|
|
2154
|
-
const durationAfter =
|
|
2153
|
+
const durationBefore = _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, before);
|
|
2154
|
+
const durationAfter = _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, after);
|
|
2155
2155
|
return { durationBefore, durationAfter, durationDelta: durationAfter - durationBefore, clipsAdded, clipsRemoved, clipsChanged };
|
|
2156
2156
|
}
|
|
2157
2157
|
function planVideoEdits(project, input) {
|
|
@@ -2781,7 +2781,7 @@ function videoProxyFfmpeg(asset, options = {}) {
|
|
|
2781
2781
|
output
|
|
2782
2782
|
];
|
|
2783
2783
|
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 } : {} };
|
|
2784
|
-
return { asset: asset.id, args, command: ["ffmpeg", ...args].map(
|
|
2784
|
+
return { asset: asset.id, args, command: ["ffmpeg", ...args].map(_chunkIGPEBXUDcjs.videoShellQuote).join(" "), proxy };
|
|
2785
2785
|
}
|
|
2786
2786
|
function videoProxyPlan(project, options = {}) {
|
|
2787
2787
|
const scale = _nullishCoalesce(options.scale, () => ( 0.5));
|
|
@@ -2807,7 +2807,7 @@ var videoSourceFrameTime = (frame, fps) => (frame + 0.5) * 1e3 / fps;
|
|
|
2807
2807
|
var videoFrameCacheKey = (src, frame) => `${frame}@${src}`;
|
|
2808
2808
|
function videoFrameRequestsAt(project, time, srcFor = (l) => l.src) {
|
|
2809
2809
|
const out = [];
|
|
2810
|
-
for (const layer of
|
|
2810
|
+
for (const layer of _chunkIGPEBXUDcjs.videoFrameLeafLayers.call(void 0, _chunkIGPEBXUDcjs.videoFrameAt.call(void 0, project, time).layers)) {
|
|
2811
2811
|
if (layer.type !== "media" || layer.assetKind !== "video") continue;
|
|
2812
2812
|
const src = srcFor(layer);
|
|
2813
2813
|
if (!src) continue;
|
|
@@ -3148,7 +3148,7 @@ var VideoPreviewEngine = (_class6 = class {
|
|
|
3148
3148
|
if (this.destroyed) return;
|
|
3149
3149
|
const state = this.source.getState();
|
|
3150
3150
|
const { project, time, playing } = state;
|
|
3151
|
-
const frame =
|
|
3151
|
+
const frame = _chunkIGPEBXUDcjs.videoFrameAt.call(void 0, project, time);
|
|
3152
3152
|
const scale = resolveVideoPreviewScale(_nullishCoalesce(this.options.previewScale, () => ( state.previewScale)), this.resolutionFor(project.width));
|
|
3153
3153
|
const assets = new Map(project.assets.map((a) => [a.id, a]));
|
|
3154
3154
|
this.srcFor = (layer) => videoPreviewSrc(assets.get(_nullishCoalesce(layer.asset, () => ( ""))), scale, layer.src);
|
|
@@ -3178,7 +3178,7 @@ var VideoPreviewEngine = (_class6 = class {
|
|
|
3178
3178
|
}
|
|
3179
3179
|
};
|
|
3180
3180
|
const sounding = new Map(frame.audio.map((a) => [a.clip, a]));
|
|
3181
|
-
for (const layer of
|
|
3181
|
+
for (const layer of _chunkIGPEBXUDcjs.videoFrameLeafLayers.call(void 0, frame.layers)) {
|
|
3182
3182
|
if (layer.type !== "media" || layer.assetKind !== "video" || !layer.src) continue;
|
|
3183
3183
|
const sound = sounding.get(layer.clip);
|
|
3184
3184
|
sync(layer.clip, this.srcFor(layer), "video", _nullishCoalesce(layer.sourceTime, () => ( 0)), _nullishCoalesce(_optionalChain([sound, 'optionalAccess', _86 => _86.speed]), () => ( 1)), sound ? sound.gain : null);
|
|
@@ -3190,9 +3190,9 @@ var VideoPreviewEngine = (_class6 = class {
|
|
|
3190
3190
|
}
|
|
3191
3191
|
/** With effects, the frame is drawn at the start of its frame, so effect pictures are cached once per frame. */
|
|
3192
3192
|
drawable(project, frame) {
|
|
3193
|
-
if (!_optionalChain([this, 'access', _87 => _87.effects, 'optionalAccess', _88 => _88.available]) || !
|
|
3194
|
-
const at =
|
|
3195
|
-
return at === frame.time ? frame : { ...
|
|
3193
|
+
if (!_optionalChain([this, 'access', _87 => _87.effects, 'optionalAccess', _88 => _88.available]) || !_chunkIGPEBXUDcjs.videoLayersUseEffects.call(void 0, frame.layers)) return frame;
|
|
3194
|
+
const at = _chunkIGPEBXUDcjs.videoEffectFrameTime.call(void 0, frame.time, project.fps);
|
|
3195
|
+
return at === frame.time ? frame : { ..._chunkIGPEBXUDcjs.videoFrameAt.call(void 0, project, at), time: frame.time };
|
|
3196
3196
|
}
|
|
3197
3197
|
redraw() {
|
|
3198
3198
|
if (this.scheduled || this.destroyed) return;
|
|
@@ -3201,7 +3201,7 @@ var VideoPreviewEngine = (_class6 = class {
|
|
|
3201
3201
|
this.scheduled = false;
|
|
3202
3202
|
if (this.destroyed) return;
|
|
3203
3203
|
const { project, time } = this.source.getState();
|
|
3204
|
-
this.draw(this.drawable(project,
|
|
3204
|
+
this.draw(this.drawable(project, _chunkIGPEBXUDcjs.videoFrameAt.call(void 0, project, time)));
|
|
3205
3205
|
});
|
|
3206
3206
|
}
|
|
3207
3207
|
__init40() {this.sourceFor = (layer) => {
|
|
@@ -3244,7 +3244,7 @@ var VideoPreviewEngine = (_class6 = class {
|
|
|
3244
3244
|
if (!source) this.complete = false;
|
|
3245
3245
|
return source;
|
|
3246
3246
|
};
|
|
3247
|
-
|
|
3247
|
+
_chunkIGPEBXUDcjs.drawVideoFrame.call(void 0, this.ctx, frame, sourceFor, resolution, {
|
|
3248
3248
|
defineSvgFilter: this.defineSvgFilter,
|
|
3249
3249
|
lutFor: this.lutFor,
|
|
3250
3250
|
scratch: this.scratch,
|
|
@@ -3348,17 +3348,17 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3348
3348
|
constructor(options = {}) {;_class7.prototype.__init44.call(this);_class7.prototype.__init45.call(this);_class7.prototype.__init46.call(this);_class7.prototype.__init47.call(this);_class7.prototype.__init48.call(this);_class7.prototype.__init49.call(this);_class7.prototype.__init50.call(this);_class7.prototype.__init51.call(this);_class7.prototype.__init52.call(this);_class7.prototype.__init53.call(this);_class7.prototype.__init54.call(this);_class7.prototype.__init55.call(this);
|
|
3349
3349
|
this.history = _nullishCoalesce(options.history, () => ( new (0, _chunkFJ2MSI43cjs.HistoryManager)()));
|
|
3350
3350
|
this.audioPeaks = options.audioPeaks instanceof VideoAudioPeaksCache ? options.audioPeaks : new VideoAudioPeaksCache(options.audioPeaks);
|
|
3351
|
-
this.luts = options.luts instanceof
|
|
3351
|
+
this.luts = options.luts instanceof _chunkIGPEBXUDcjs.VideoLutCache ? options.luts : new (0, _chunkIGPEBXUDcjs.VideoLutCache)(options.luts);
|
|
3352
3352
|
this.frameCache = _nullishCoalesce(options.frameCache, () => ( null));
|
|
3353
|
-
this.effects = new (0,
|
|
3353
|
+
this.effects = new (0, _chunk5MQOBTNPcjs.EffectsSlot)();
|
|
3354
3354
|
if (options.effects) this.effects.set(options.effects);
|
|
3355
|
-
this.effectsEngine = new (0,
|
|
3355
|
+
this.effectsEngine = new (0, _chunkIGPEBXUDcjs.VideoEffectsEngine)({ slot: this.effects });
|
|
3356
3356
|
this.project = options.project ? parseVideoProject(options.project) : createVideoProject();
|
|
3357
3357
|
this.issues = checkVideoProject(this.project);
|
|
3358
3358
|
this.readOnly = _nullishCoalesce(options.readOnly, () => ( false));
|
|
3359
3359
|
this.previewScale = checkPreviewScale(_nullishCoalesce(options.previewScale, () => ( "auto")));
|
|
3360
3360
|
this.onChange = options.onChange;
|
|
3361
|
-
this.player = new (0, _chunkM5GLQQWGcjs.AnimationPlayer)({ clock: options.clock, duration: () =>
|
|
3361
|
+
this.player = new (0, _chunkM5GLQQWGcjs.AnimationPlayer)({ clock: options.clock, duration: () => _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, this.project), loop: "none" });
|
|
3362
3362
|
this.state = this.computeState();
|
|
3363
3363
|
this.connect();
|
|
3364
3364
|
}
|
|
@@ -3395,12 +3395,12 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3395
3395
|
const h = this.history.getState();
|
|
3396
3396
|
return {
|
|
3397
3397
|
project: this.project,
|
|
3398
|
-
duration:
|
|
3398
|
+
duration: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, this.project),
|
|
3399
3399
|
time: p.time,
|
|
3400
3400
|
playing: p.playing,
|
|
3401
3401
|
loop: p.loop,
|
|
3402
3402
|
selection: this.selection,
|
|
3403
|
-
current:
|
|
3403
|
+
current: _chunkIGPEBXUDcjs.videoClipsAt.call(void 0, this.project, p.time).map((c) => c.clip.id),
|
|
3404
3404
|
issues: this.issues,
|
|
3405
3405
|
readOnly: this.readOnly,
|
|
3406
3406
|
error: this.error,
|
|
@@ -3433,7 +3433,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3433
3433
|
this.issues = checkVideoProject(project);
|
|
3434
3434
|
const ids = new Set(project.tracks.flatMap((t) => t.clips.map((c) => c.id)));
|
|
3435
3435
|
if (this.selection.some((id) => !ids.has(id))) this.selection = this.selection.filter((id) => ids.has(id));
|
|
3436
|
-
this.player.setDuration(() =>
|
|
3436
|
+
this.player.setDuration(() => _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, this.project));
|
|
3437
3437
|
} finally {
|
|
3438
3438
|
this.applying = false;
|
|
3439
3439
|
}
|
|
@@ -3595,7 +3595,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3595
3595
|
}
|
|
3596
3596
|
/** Selects clips (unknown ids are dropped). `add` toggles them into the current selection. */
|
|
3597
3597
|
select(clips, options = {}) {
|
|
3598
|
-
const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _104 => _104.filter, 'call', _105 => _105((id) =>
|
|
3598
|
+
const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _104 => _104.filter, 'call', _105 => _105((id) => _chunkIGPEBXUDcjs.findVideoClip.call(void 0, this.project, id))]), () => ( []));
|
|
3599
3599
|
let next;
|
|
3600
3600
|
if (options.add) {
|
|
3601
3601
|
next = [...this.selection];
|
|
@@ -3622,7 +3622,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3622
3622
|
step(frames) {
|
|
3623
3623
|
this.player.pause();
|
|
3624
3624
|
const fps = this.project.fps;
|
|
3625
|
-
this.player.seek(Math.max(0,
|
|
3625
|
+
this.player.seek(Math.max(0, _chunkIGPEBXUDcjs.snapToVideoFrame.call(void 0, this.player.currentTime, fps) + frames * 1e3 / fps));
|
|
3626
3626
|
}
|
|
3627
3627
|
setLoop(loop) {
|
|
3628
3628
|
this.player.setLoop(loop);
|
|
@@ -3639,14 +3639,14 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3639
3639
|
*/
|
|
3640
3640
|
snap(time, options = {}) {
|
|
3641
3641
|
const threshold = _nullishCoalesce(options.threshold, () => ( 8 * 1e3 / this.project.fps));
|
|
3642
|
-
const points =
|
|
3643
|
-
const hit =
|
|
3644
|
-
return hit.snapped !== null ? hit : { time: Math.max(0,
|
|
3642
|
+
const points = _chunkIGPEBXUDcjs.videoSnapPoints.call(void 0, this.project, { exclude: options.exclude, playhead: options.playhead === false ? void 0 : this.player.currentTime });
|
|
3643
|
+
const hit = _chunkIGPEBXUDcjs.snapVideoTime.call(void 0, time, points, threshold);
|
|
3644
|
+
return hit.snapped !== null ? hit : { time: Math.max(0, _chunkIGPEBXUDcjs.snapToVideoFrame.call(void 0, time, this.project.fps)), snapped: null };
|
|
3645
3645
|
}
|
|
3646
3646
|
/** Splits the selected clips (or every clip) under the playhead there, as one undo step. */
|
|
3647
3647
|
splitAtPlayhead() {
|
|
3648
|
-
const t =
|
|
3649
|
-
const under =
|
|
3648
|
+
const t = _chunkIGPEBXUDcjs.snapToVideoFrame.call(void 0, this.player.currentTime, this.project.fps);
|
|
3649
|
+
const under = _chunkIGPEBXUDcjs.videoClipsAt.call(void 0, this.project, t).filter(({ clip }) => t > clip.start && t < _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip));
|
|
3650
3650
|
const chosen = this.selection.length ? under.filter(({ clip }) => this.selection.includes(clip.id)) : under;
|
|
3651
3651
|
if (!chosen.length) return this.refuse("No clip is under the playhead to split.");
|
|
3652
3652
|
return this.apply(chosen.map(({ clip }) => ({ op: "split_clip", clip: clip.id, at: t })), "Split");
|
|
@@ -3674,7 +3674,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3674
3674
|
/** The provider's description of an effect, checked for `place` (rejects without a provider or for an unknown id). */
|
|
3675
3675
|
async describeEffect(effect, place) {
|
|
3676
3676
|
const d = await this.effects.require().describe(effect);
|
|
3677
|
-
if (place)
|
|
3677
|
+
if (place) _chunkIGPEBXUDcjs.checkVideoEffectPlace.call(void 0, d, place);
|
|
3678
3678
|
return d;
|
|
3679
3679
|
}
|
|
3680
3680
|
refused(message) {
|
|
@@ -3687,7 +3687,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3687
3687
|
try {
|
|
3688
3688
|
plan = await run();
|
|
3689
3689
|
} catch (error) {
|
|
3690
|
-
if (
|
|
3690
|
+
if (_chunk5MQOBTNPcjs.isEffectError.call(void 0, error) || error instanceof Error) return this.refused(error.message);
|
|
3691
3691
|
throw error;
|
|
3692
3692
|
}
|
|
3693
3693
|
const result = this.apply(plan.edit, plan.label, { merge });
|
|
@@ -3695,7 +3695,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3695
3695
|
return { ...result, clip: plan.clip, ...plan.effect ? { effect: plan.effect() } : {} };
|
|
3696
3696
|
}
|
|
3697
3697
|
clipOrThrow(id) {
|
|
3698
|
-
const at =
|
|
3698
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, this.project, id);
|
|
3699
3699
|
if (!at) throw new Error(`There is no clip "${id}"; list_applied_effects or get_video_project lists the clips.`);
|
|
3700
3700
|
return at.clip;
|
|
3701
3701
|
}
|
|
@@ -3708,7 +3708,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3708
3708
|
return this.effectEdit(async () => {
|
|
3709
3709
|
const current = this.clipOrThrow(clip);
|
|
3710
3710
|
const d = await this.describeEffect(effect, "clip");
|
|
3711
|
-
const values =
|
|
3711
|
+
const values = _chunkIGPEBXUDcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
|
|
3712
3712
|
const stack = [..._nullishCoalesce(current.effects, () => ( []))];
|
|
3713
3713
|
const taken = new Set(stack.map((e) => e.id));
|
|
3714
3714
|
let n = 1;
|
|
@@ -3744,7 +3744,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3744
3744
|
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(", ")}.`);
|
|
3745
3745
|
base[k] = d.defaults[k];
|
|
3746
3746
|
}
|
|
3747
|
-
next.values =
|
|
3747
|
+
next.values = _chunkIGPEBXUDcjs.checkVideoEffectValues.call(void 0, d, given, { base, keyframes: true });
|
|
3748
3748
|
}
|
|
3749
3749
|
if (changes.enabled !== void 0) {
|
|
3750
3750
|
if (changes.enabled) delete next.enabled;
|
|
@@ -3762,7 +3762,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3762
3762
|
removeClipEffect(clip, instance) {
|
|
3763
3763
|
const reason = this.readOnlyReason();
|
|
3764
3764
|
if (reason) return this.refused(reason);
|
|
3765
|
-
const at =
|
|
3765
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, this.project, clip);
|
|
3766
3766
|
if (!at) return this.refused(`There is no clip "${clip}".`);
|
|
3767
3767
|
const stack = _nullishCoalesce(at.clip.effects, () => ( []));
|
|
3768
3768
|
const was = stack.find((e) => e.id === instance);
|
|
@@ -3779,7 +3779,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3779
3779
|
return this.effectEdit(async () => {
|
|
3780
3780
|
this.clipOrThrow(clip);
|
|
3781
3781
|
const d = await this.describeEffect(effect, "transition");
|
|
3782
|
-
const values =
|
|
3782
|
+
const values = _chunkIGPEBXUDcjs.checkVideoEffectValues.call(void 0, d, options.values);
|
|
3783
3783
|
const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 1e3));
|
|
3784
3784
|
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 };
|
|
3785
3785
|
});
|
|
@@ -3792,7 +3792,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3792
3792
|
addEffectClip(track, effect, options = {}) {
|
|
3793
3793
|
return this.effectEdit(async () => {
|
|
3794
3794
|
const d = await this.describeEffect(effect, "generator");
|
|
3795
|
-
const values =
|
|
3795
|
+
const values = _chunkIGPEBXUDcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
|
|
3796
3796
|
const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 5e3));
|
|
3797
3797
|
const label = `Add ${d.name}`;
|
|
3798
3798
|
const clipId = _nullishCoalesce(options.id, () => ( ""));
|
|
@@ -3814,42 +3814,42 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
|
|
|
3814
3814
|
if (part === "generator") {
|
|
3815
3815
|
if (current.type !== "effect") throw new Error(`Clip "${clip}" is not an effect clip.`);
|
|
3816
3816
|
const d2 = await this.describeEffect(current.effect);
|
|
3817
|
-
return { edit: { op: "update_clip", clip, set: { values:
|
|
3817
|
+
return { edit: { op: "update_clip", clip, set: { values: _chunkIGPEBXUDcjs.checkVideoEffectValues.call(void 0, d2, values, { base: _nullishCoalesce(current.values, () => ( {})), keyframes: true }) } }, label: `Change ${_nullishCoalesce(current.name, () => ( d2.name))}`, clip };
|
|
3818
3818
|
}
|
|
3819
3819
|
const t = current.transition;
|
|
3820
3820
|
if (_optionalChain([t, 'optionalAccess', _109 => _109.type]) !== "effect" || !t.effect) throw new Error(`Clip "${clip}" has no effect transition.`);
|
|
3821
3821
|
const d = await this.describeEffect(t.effect.effect);
|
|
3822
|
-
const merged =
|
|
3822
|
+
const merged = _chunkIGPEBXUDcjs.checkVideoEffectValues.call(void 0, d, values, { base: _nullishCoalesce(t.effect.values, () => ( {})) });
|
|
3823
3823
|
return { edit: { op: "set_transition", clip, transition: { ...t, effect: { ...t.effect, values: merged } } }, label: `Change transition ${d.name}`, clip };
|
|
3824
3824
|
}, options.merge);
|
|
3825
3825
|
}
|
|
3826
3826
|
/** 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). */
|
|
3827
3827
|
setClipEffectKeyframes(clip, instance, control, keys) {
|
|
3828
|
-
const current = _optionalChain([
|
|
3828
|
+
const current = _optionalChain([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, this.project, clip), 'optionalAccess', _110 => _110.clip]);
|
|
3829
3829
|
const was = _optionalChain([current, 'optionalAccess', _111 => _111.effects, 'optionalAccess', _112 => _112.find, 'call', _113 => _113((e) => e.id === instance)]);
|
|
3830
3830
|
const value = _optionalChain([was, 'optionalAccess', _114 => _114.values, 'optionalAccess', _115 => _115[control]]);
|
|
3831
|
-
const plain = keys === null ?
|
|
3831
|
+
const plain = keys === null ? _chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, value) ? _optionalChain([value, 'access', _116 => _116.keys, 'access', _117 => _117[0], 'optionalAccess', _118 => _118.v]) : value : { keys: [...keys].sort((a, b) => a.t - b.t) };
|
|
3832
3832
|
return this.updateClipEffect(clip, instance, { values: { [control]: _nullishCoalesce(plain, () => ( null)) } });
|
|
3833
3833
|
}
|
|
3834
3834
|
/** What plays at `time` (default: the playhead). */
|
|
3835
3835
|
frame(time = this.player.currentTime) {
|
|
3836
|
-
return
|
|
3836
|
+
return _chunkIGPEBXUDcjs.videoFrameAt.call(void 0, this.project, time);
|
|
3837
3837
|
}
|
|
3838
3838
|
/** The frame at `time` (default: the playhead) as SVG. */
|
|
3839
3839
|
toSvg(time = this.player.currentTime, options = {}) {
|
|
3840
|
-
return
|
|
3840
|
+
return _chunkIGPEBXUDcjs.videoProjectSvg.call(void 0, this.project, time, { lutFor: (src) => this.luts.peek(src), ...options });
|
|
3841
3841
|
}
|
|
3842
3842
|
/** The project as an ffmpeg command. */
|
|
3843
3843
|
toFfmpeg(options = {}) {
|
|
3844
|
-
return
|
|
3844
|
+
return _chunkIGPEBXUDcjs.toVideoFfmpeg.call(void 0, this.project, options);
|
|
3845
3845
|
}
|
|
3846
3846
|
/** The ffmpeg command that measures the mix's loudness (see `toVideoLoudnessMeasure`). */
|
|
3847
3847
|
toLoudnessMeasure(options = {}) {
|
|
3848
|
-
return
|
|
3848
|
+
return _chunkIGPEBXUDcjs.toVideoLoudnessMeasure.call(void 0, this.project, options);
|
|
3849
3849
|
}
|
|
3850
3850
|
/** One track as a CMX 3600 EDL. */
|
|
3851
3851
|
toEdl(options = {}) {
|
|
3852
|
-
return
|
|
3852
|
+
return _chunkIGPEBXUDcjs.toVideoEdl.call(void 0, this.project, options);
|
|
3853
3853
|
}
|
|
3854
3854
|
}, _class7.__initStatic(), _class7);
|
|
3855
3855
|
function checkPreviewScale(scale) {
|
|
@@ -3917,12 +3917,12 @@ function videoRulerTicks(duration, pxPerSecond, fps) {
|
|
|
3917
3917
|
const ticks = [];
|
|
3918
3918
|
for (let t = 0; t <= duration + 1e-6; t += step) {
|
|
3919
3919
|
const isMajor = Math.abs(t / major - Math.round(t / major)) < 1e-9;
|
|
3920
|
-
ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label:
|
|
3920
|
+
ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label: _chunkIGPEBXUDcjs.formatVideoTimecode.call(void 0, t, fps).replace(/^00:/, "") } : {} });
|
|
3921
3921
|
}
|
|
3922
3922
|
return ticks;
|
|
3923
3923
|
}
|
|
3924
3924
|
function videoClipShowsWaveform(clip, asset, mode = "audio") {
|
|
3925
|
-
if (clip.type !== "media" || mode === "none" || !
|
|
3925
|
+
if (clip.type !== "media" || mode === "none" || !_chunkIGPEBXUDcjs.videoAssetHasSound.call(void 0, asset)) return false;
|
|
3926
3926
|
return mode === "all" || asset.kind === "audio";
|
|
3927
3927
|
}
|
|
3928
3928
|
var VIDEO_CLIP_ANIMATION_LABELS = {
|
|
@@ -3983,11 +3983,11 @@ function videoClipLabel(clip, asset, sequence) {
|
|
|
3983
3983
|
if (clip.type === "effect") return `Effect: ${clip.effect}`;
|
|
3984
3984
|
if (clip.type === "adjustment") return `Adjustment${clip.scope === "all" ? " (all tracks)" : clip.scope === "track" ? ` (${clip.targetTrack})` : ""}`;
|
|
3985
3985
|
const base = _nullishCoalesce(_nullishCoalesce(_optionalChain([asset, 'optionalAccess', _121 => _121.name]), () => ( _optionalChain([asset, 'optionalAccess', _122 => _122.src, 'access', _123 => _123.replace, 'call', _124 => _124(/^.*[\\/]/, "")]))), () => ( clip.asset));
|
|
3986
|
-
const speed =
|
|
3986
|
+
const speed = _chunkIGPEBXUDcjs.videoClipSpeed.call(void 0, clip);
|
|
3987
3987
|
return speed !== 1 ? `${base} (${Math.round(speed * 100)}%)` : base;
|
|
3988
3988
|
}
|
|
3989
3989
|
function planVideoClipDrag(project, input) {
|
|
3990
|
-
const at =
|
|
3990
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, input.clip);
|
|
3991
3991
|
if (!at) return null;
|
|
3992
3992
|
const { clip, track } = at;
|
|
3993
3993
|
const snap = _nullishCoalesce(input.snap, () => ( ((t) => t)));
|
|
@@ -4004,17 +4004,17 @@ function planVideoClipDrag(project, input) {
|
|
|
4004
4004
|
}
|
|
4005
4005
|
const minimum = 1e3 / project.fps;
|
|
4006
4006
|
if (input.mode === "trim-start") {
|
|
4007
|
-
const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)),
|
|
4007
|
+
const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)), _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip) - minimum);
|
|
4008
4008
|
const changed2 = Math.abs(to2 - clip.start) > 1e-6;
|
|
4009
|
-
const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration:
|
|
4009
|
+
const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration: _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip) - to2 };
|
|
4010
4010
|
return { ...plan, track: track.id, edit: changed2 ? { op: "trim_clip", clip: clip.id, edge: "start", to: to2, ...input.ripple ? { ripple: true } : {} } : null };
|
|
4011
4011
|
}
|
|
4012
|
-
const to = Math.max(snap(
|
|
4013
|
-
const changed = Math.abs(to -
|
|
4012
|
+
const to = Math.max(snap(_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip) + input.delta), clip.start + minimum);
|
|
4013
|
+
const changed = Math.abs(to - _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip)) > 1e-6;
|
|
4014
4014
|
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 };
|
|
4015
4015
|
}
|
|
4016
4016
|
function videoDropTracks(project, clipId) {
|
|
4017
|
-
const at =
|
|
4017
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, clipId);
|
|
4018
4018
|
if (!at) return [];
|
|
4019
4019
|
return project.tracks.filter((t) => t.kind === at.track.kind && !t.locked).map((t) => t.id);
|
|
4020
4020
|
}
|
|
@@ -4023,7 +4023,7 @@ function videoDragLabel(edit) {
|
|
|
4023
4023
|
return edit.op === "trim_clip" && edit.ripple ? "Ripple trim" : "Trim clip";
|
|
4024
4024
|
}
|
|
4025
4025
|
function videoAssetDropEdit(project, assetId, options = {}) {
|
|
4026
|
-
const asset =
|
|
4026
|
+
const asset = _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, project).get(assetId);
|
|
4027
4027
|
if (!asset) return null;
|
|
4028
4028
|
const kind = asset.kind === "audio" ? "audio" : "video";
|
|
4029
4029
|
const track = _nullishCoalesce(options.track, () => ( _optionalChain([project, 'access', _125 => _125.tracks, 'access', _126 => _126.find, 'call', _127 => _127((t) => t.kind === kind && !t.locked), 'optionalAccess', _128 => _128.id])));
|
|
@@ -4075,25 +4075,25 @@ var KEY_LABELS = {
|
|
|
4075
4075
|
scale: { label: "Scale", step: 0.05 },
|
|
4076
4076
|
rotation: { label: "Rotation", step: 1 }
|
|
4077
4077
|
};
|
|
4078
|
-
var animatableOf = (clip, property) =>
|
|
4078
|
+
var animatableOf = (clip, property) => _chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _129 => _129.transform, 'optionalAccess', _130 => _130[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
|
|
4079
4079
|
var playheadInClip = (clip, time) => Math.round(Math.min(clip.duration, Math.max(0, time - clip.start)));
|
|
4080
4080
|
function videoKeyframeRows(project, clipId, time) {
|
|
4081
|
-
const at =
|
|
4081
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, clipId);
|
|
4082
4082
|
if (!at) return [];
|
|
4083
4083
|
const { clip } = at;
|
|
4084
|
-
const asset = clip.type === "media" ?
|
|
4084
|
+
const asset = clip.type === "media" ? _chunkIGPEBXUDcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
|
|
4085
4085
|
const visual = !(_optionalChain([asset, 'optionalAccess', _131 => _131.kind]) === "audio" || at.track.kind === "audio");
|
|
4086
|
-
const audible = clip.type === "media" &&
|
|
4087
|
-
const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ?
|
|
4086
|
+
const audible = clip.type === "media" && _chunkIGPEBXUDcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
|
|
4087
|
+
const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES : []];
|
|
4088
4088
|
const clipTime = playheadInClip(clip, time);
|
|
4089
4089
|
return properties.map((property) => {
|
|
4090
4090
|
const prop = animatableOf(clip, property);
|
|
4091
|
-
const keys =
|
|
4092
|
-
const limits =
|
|
4091
|
+
const keys = _chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, prop) ? prop.keys : [];
|
|
4092
|
+
const limits = _chunkIGPEBXUDcjs.VIDEO_KEYFRAME_LIMITS[property];
|
|
4093
4093
|
return {
|
|
4094
4094
|
property,
|
|
4095
4095
|
...KEY_LABELS[property],
|
|
4096
|
-
value: Math.round(
|
|
4096
|
+
value: Math.round(_chunkIGPEBXUDcjs.videoValueAt.call(void 0, prop, clipTime, limits.default) * 1e3) / 1e3,
|
|
4097
4097
|
keyed: keys.length > 0,
|
|
4098
4098
|
keys: keys.length,
|
|
4099
4099
|
onKey: keys.some((k) => Math.abs(k.t - clipTime) < 0.5),
|
|
@@ -4104,44 +4104,44 @@ function videoKeyframeRows(project, clipId, time) {
|
|
|
4104
4104
|
});
|
|
4105
4105
|
}
|
|
4106
4106
|
function plainValueEdit(clip, property, value) {
|
|
4107
|
-
if (!
|
|
4107
|
+
if (!_chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property))
|
|
4108
4108
|
return value === void 0 ? { op: "update_clip", clip: clip.id, remove: [property] } : { op: "update_clip", clip: clip.id, set: { [property]: value } };
|
|
4109
4109
|
const transform = { ...clip.transform, [property]: value };
|
|
4110
4110
|
if (value === void 0) delete transform[property];
|
|
4111
4111
|
return Object.keys(transform).length ? { op: "update_clip", clip: clip.id, set: { transform } } : { op: "update_clip", clip: clip.id, remove: ["transform"] };
|
|
4112
4112
|
}
|
|
4113
4113
|
function videoKeyframeValueEdit(project, clipId, property, time, value) {
|
|
4114
|
-
const at =
|
|
4114
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, clipId);
|
|
4115
4115
|
if (!at) return null;
|
|
4116
4116
|
const prop = animatableOf(at.clip, property);
|
|
4117
|
-
if (!
|
|
4117
|
+
if (!_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, prop)) return plainValueEdit(at.clip, property, value);
|
|
4118
4118
|
if (value === void 0) return null;
|
|
4119
|
-
return { op: "set_keyframes", clip: clipId, property, keys:
|
|
4119
|
+
return { op: "set_keyframes", clip: clipId, property, keys: _chunkIGPEBXUDcjs.setVideoKey.call(void 0, prop, { t: playheadInClip(at.clip, time), v: value }, _chunkIGPEBXUDcjs.VIDEO_KEYFRAME_LIMITS[property].default).keys };
|
|
4120
4120
|
}
|
|
4121
4121
|
function videoKeyframeToggleEdit(project, clipId, property, time) {
|
|
4122
|
-
const at =
|
|
4122
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, clipId);
|
|
4123
4123
|
if (!at) return null;
|
|
4124
4124
|
const prop = animatableOf(at.clip, property);
|
|
4125
4125
|
const t = playheadInClip(at.clip, time);
|
|
4126
|
-
const fallback =
|
|
4127
|
-
if (
|
|
4126
|
+
const fallback = _chunkIGPEBXUDcjs.VIDEO_KEYFRAME_LIMITS[property].default;
|
|
4127
|
+
if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, prop)) {
|
|
4128
4128
|
const key = prop.keys.find((k) => Math.abs(k.t - t) < 0.5);
|
|
4129
4129
|
if (key) {
|
|
4130
|
-
const rest =
|
|
4131
|
-
return
|
|
4130
|
+
const rest = _chunkIGPEBXUDcjs.removeVideoKey.call(void 0, prop, key.t);
|
|
4131
|
+
return _chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, rest) ? { op: "set_keyframes", clip: clipId, property, keys: rest.keys } : plainValueEdit(at.clip, property, rest === fallback ? void 0 : rest);
|
|
4132
4132
|
}
|
|
4133
4133
|
}
|
|
4134
|
-
const v =
|
|
4135
|
-
return { op: "set_keyframes", clip: clipId, property, keys:
|
|
4134
|
+
const v = _chunkIGPEBXUDcjs.videoValueAt.call(void 0, prop, t, fallback);
|
|
4135
|
+
return { op: "set_keyframes", clip: clipId, property, keys: _chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, prop) ? _chunkIGPEBXUDcjs.setVideoKey.call(void 0, prop, { t, v }, fallback).keys : [{ t, v }] };
|
|
4136
4136
|
}
|
|
4137
4137
|
function videoLutEdits(project, clips, lut) {
|
|
4138
4138
|
const edits = [];
|
|
4139
4139
|
for (const id of clips) {
|
|
4140
|
-
const at =
|
|
4140
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, id);
|
|
4141
4141
|
if (!at) continue;
|
|
4142
4142
|
const { lut: current, ...rest } = _nullishCoalesce(at.clip.grade, () => ( {}));
|
|
4143
4143
|
if (!lut && !current) continue;
|
|
4144
|
-
const grade =
|
|
4144
|
+
const grade = _chunkIGPEBXUDcjs.normalizeVideoGrade.call(void 0, lut ? { ...rest, lut } : rest);
|
|
4145
4145
|
edits.push(grade ? { op: "update_clip", clip: id, set: { grade } } : { op: "update_clip", clip: id, remove: ["grade"] });
|
|
4146
4146
|
}
|
|
4147
4147
|
return edits;
|
|
@@ -4162,7 +4162,7 @@ function videoAddAdjustmentEdits(project, time, options = {}) {
|
|
|
4162
4162
|
const duration = _nullishCoalesce(options.duration, () => ( 3e3));
|
|
4163
4163
|
const start = Math.max(0, time);
|
|
4164
4164
|
const top = project.tracks[0];
|
|
4165
|
-
const free = top && top.kind === "video" && !top.locked && !top.clips.some((c) => c.start < start + duration &&
|
|
4165
|
+
const free = top && top.kind === "video" && !top.locked && !top.clips.some((c) => c.start < start + duration && _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c) > start);
|
|
4166
4166
|
const edits = [];
|
|
4167
4167
|
let track = _optionalChain([top, 'optionalAccess', _132 => _132.id]);
|
|
4168
4168
|
if (!free) {
|
|
@@ -4181,7 +4181,7 @@ function videoMaskEdit(clip, mask) {
|
|
|
4181
4181
|
function videoSkinProtectionEdits(project, clips, amount) {
|
|
4182
4182
|
const edits = [];
|
|
4183
4183
|
for (const id of clips) {
|
|
4184
|
-
const clip = _optionalChain([
|
|
4184
|
+
const clip = _optionalChain([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, project, id), 'optionalAccess', _133 => _133.clip]);
|
|
4185
4185
|
const lut = _optionalChain([clip, 'optionalAccess', _134 => _134.grade, 'optionalAccess', _135 => _135.lut]);
|
|
4186
4186
|
if (!clip || !lut) continue;
|
|
4187
4187
|
const { preserveSkinTones: _p, ...rest } = lut;
|
|
@@ -4215,7 +4215,7 @@ var RIPPLE = {
|
|
|
4215
4215
|
};
|
|
4216
4216
|
var MODE = {
|
|
4217
4217
|
type: "string",
|
|
4218
|
-
enum: [...
|
|
4218
|
+
enum: [..._chunkIGPEBXUDcjs.VIDEO_PLACEMENT_MODES],
|
|
4219
4219
|
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.'
|
|
4220
4220
|
};
|
|
4221
4221
|
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.` });
|
|
@@ -4232,11 +4232,11 @@ var TRANSFORM = object(
|
|
|
4232
4232
|
);
|
|
4233
4233
|
var TRANSITION = object(
|
|
4234
4234
|
{
|
|
4235
|
-
type: { type: "string", enum:
|
|
4235
|
+
type: { type: "string", enum: _chunkIGPEBXUDcjs.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." },
|
|
4236
4236
|
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." },
|
|
4237
4237
|
color: COLOR("For dip: the colour passed through (default black)"),
|
|
4238
|
-
direction: { type: "string", enum: [...
|
|
4239
|
-
audioCurve: { type: "string", enum: [...
|
|
4238
|
+
direction: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_WIPE_DIRECTIONS], description: "For wipe, push and slide: the way the edge or picture travels (default right, coming in from the left)." },
|
|
4239
|
+
audioCurve: { type: "string", enum: [..._chunkIGPEBXUDcjs.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." }
|
|
4240
4240
|
},
|
|
4241
4241
|
["type", "duration"],
|
|
4242
4242
|
"A transition from the clip that ends where this one starts on the same track."
|
|
@@ -4246,7 +4246,7 @@ var LUT_STRENGTH = { type: "number", minimum: 0, maximum: 1, description: "How m
|
|
|
4246
4246
|
var SKIN = { type: "number", minimum: 0, maximum: 1, description: "How much of the LUT's change to hold back on skin tones, 0 (none, the default) to 1 (skin keeps its colour); 0.5-0.8 keeps faces natural under a heavy look. Applied in the preview and frame renders; ffmpeg's lut3d cannot, so the export notes it." };
|
|
4247
4247
|
var GRADE = object(
|
|
4248
4248
|
{
|
|
4249
|
-
...Object.fromEntries(
|
|
4249
|
+
...Object.fromEntries(_chunkIGPEBXUDcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, { type: "number", minimum: c.min, maximum: c.max, description: c.description }])),
|
|
4250
4250
|
lut: object({ src: LUT_SRC, strength: LUT_STRENGTH, name: { type: "string", minLength: 1, description: "A label for the look." }, preserveSkinTones: SKIN }, ["src"], "A 3D LUT applied after the other settings (set_video_lut checks the file first).")
|
|
4251
4251
|
},
|
|
4252
4252
|
[],
|
|
@@ -4254,7 +4254,7 @@ var GRADE = object(
|
|
|
4254
4254
|
);
|
|
4255
4255
|
var ANIMATION = (when) => object(
|
|
4256
4256
|
{
|
|
4257
|
-
effect: { type: "string", enum: [...
|
|
4257
|
+
effect: { type: "string", enum: [..._chunkIGPEBXUDcjs.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." },
|
|
4258
4258
|
duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default 500)." }
|
|
4259
4259
|
},
|
|
4260
4260
|
["effect"],
|
|
@@ -4264,11 +4264,11 @@ var CLIP_COMMON = {
|
|
|
4264
4264
|
name: { type: "string", description: "A label for the clip." },
|
|
4265
4265
|
opacity: { type: "number", minimum: 0, maximum: 1, description: "Opacity 0\u20131 (default 1). A number replaces any keyframes; set_video_keyframes animates it." },
|
|
4266
4266
|
transform: TRANSFORM,
|
|
4267
|
-
fit: { type: "string", enum: [...
|
|
4267
|
+
fit: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_FITS], description: "How the picture fits the frame before the transform, as CSS object-fit (default contain for media, fill for colours)." },
|
|
4268
4268
|
grade: GRADE,
|
|
4269
4269
|
animateIn: ANIMATION("How the picture enters, from the clip's start (on top of any fade in). Titles usually rise, pop or fade in."),
|
|
4270
4270
|
animateOut: ANIMATION("How the picture leaves, ending at the clip's end."),
|
|
4271
|
-
blend: { type: "string", enum: [...
|
|
4271
|
+
blend: { type: "string", enum: [..._chunkIGPEBXUDcjs.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." },
|
|
4272
4272
|
fadeIn: MS("Fade up from nothing (picture and sound) over this long"),
|
|
4273
4273
|
fadeOut: MS("Fade down to nothing over this long")
|
|
4274
4274
|
};
|
|
@@ -4277,8 +4277,8 @@ var MEDIA_FIELDS = {
|
|
|
4277
4277
|
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." },
|
|
4278
4278
|
volume: { type: "number", minimum: 0, maximum: 4, description: "Gain (1 = unchanged, default 1). A number replaces any keyframes; set_video_keyframes animates it." },
|
|
4279
4279
|
muted: { type: "boolean", description: "Silence this clip (default false)." },
|
|
4280
|
-
fadeInCurve: { type: "string", enum: [...
|
|
4281
|
-
fadeOutCurve: { type: "string", enum: [...
|
|
4280
|
+
fadeInCurve: { type: "string", enum: [..._chunkIGPEBXUDcjs.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)." },
|
|
4281
|
+
fadeOutCurve: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade out (default linear), the same choices as fadeInCurve; exponential sounds natural fading to silence." }
|
|
4282
4282
|
};
|
|
4283
4283
|
var TEXT_FIELDS = {
|
|
4284
4284
|
text: { type: "string", minLength: 1, description: `The title's text ("\\n" breaks lines).` },
|
|
@@ -4327,7 +4327,7 @@ var ASSET_FIELDS = {
|
|
|
4327
4327
|
};
|
|
4328
4328
|
var KEY_PROPERTY = {
|
|
4329
4329
|
type: "string",
|
|
4330
|
-
enum: [...
|
|
4330
|
+
enum: [..._chunkIGPEBXUDcjs.VIDEO_KEYFRAME_PROPERTIES],
|
|
4331
4331
|
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)."
|
|
4332
4332
|
};
|
|
4333
4333
|
var KEYS = {
|
|
@@ -4342,7 +4342,7 @@ var KEYS = {
|
|
|
4342
4342
|
ease: {
|
|
4343
4343
|
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.",
|
|
4344
4344
|
anyOf: [
|
|
4345
|
-
{ type: "string", enum: [...
|
|
4345
|
+
{ type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_EASE_NAMES] },
|
|
4346
4346
|
{ type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }
|
|
4347
4347
|
]
|
|
4348
4348
|
}
|
|
@@ -4371,19 +4371,19 @@ var describeVideoTracks = (tracks) => tracks.map((t, index) => ({
|
|
|
4371
4371
|
...t.locked ? { locked: true } : {},
|
|
4372
4372
|
...t.syncLocked === false ? { syncLocked: false } : {},
|
|
4373
4373
|
...t.volume !== void 0 ? { volume: t.volume } : {},
|
|
4374
|
-
clips:
|
|
4374
|
+
clips: _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, t).map((c) => ({ ...c, end: _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkIGPEBXUDcjs.videoClipSourceRange.call(void 0, c) } : {} }))
|
|
4375
4375
|
}));
|
|
4376
|
-
var videoSequenceUsers = (project, id) =>
|
|
4377
|
-
({ 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:
|
|
4376
|
+
var videoSequenceUsers = (project, id) => _chunkIGPEBXUDcjs.allVideoTracks.call(void 0, project).flatMap(
|
|
4377
|
+
({ 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: _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c), source: _chunkIGPEBXUDcjs.videoClipSourceRange.call(void 0, c) }] : [])
|
|
4378
4378
|
);
|
|
4379
4379
|
function describeVideoSequence(project, sequence, tracks = true) {
|
|
4380
|
-
const cycle =
|
|
4380
|
+
const cycle = _chunkIGPEBXUDcjs.findVideoSequenceCycle.call(void 0, project, sequence.id);
|
|
4381
4381
|
return {
|
|
4382
4382
|
id: sequence.id,
|
|
4383
4383
|
...sequence.name ? { name: sequence.name } : {},
|
|
4384
|
-
duration:
|
|
4384
|
+
duration: _chunkIGPEBXUDcjs.videoSequenceDuration.call(void 0, sequence),
|
|
4385
4385
|
clipCount: sequence.tracks.reduce((n, t) => n + t.clips.length, 0),
|
|
4386
|
-
nests:
|
|
4386
|
+
nests: _chunkIGPEBXUDcjs.videoSequenceChildren.call(void 0, sequence),
|
|
4387
4387
|
usedBy: videoSequenceUsers(project, sequence.id),
|
|
4388
4388
|
...cycle ? { cycle } : {},
|
|
4389
4389
|
...tracks ? { tracks: describeVideoTracks(sequence.tracks) } : { trackCount: sequence.tracks.length }
|
|
@@ -4395,7 +4395,7 @@ function describeVideoProject(project) {
|
|
|
4395
4395
|
width: project.width,
|
|
4396
4396
|
height: project.height,
|
|
4397
4397
|
fps: project.fps,
|
|
4398
|
-
duration:
|
|
4398
|
+
duration: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, project),
|
|
4399
4399
|
...project.background ? { background: project.background } : {},
|
|
4400
4400
|
assets: project.assets.map(videoAssetOut),
|
|
4401
4401
|
tracks: describeVideoTracks(project.tracks),
|
|
@@ -4412,7 +4412,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4412
4412
|
const project = () => controller.getProject();
|
|
4413
4413
|
const outcome = (result, extra = {}) => {
|
|
4414
4414
|
if (!result.ok) throw new Error(result.error);
|
|
4415
|
-
return { ...extra, duration:
|
|
4415
|
+
return { ...extra, duration: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, result.project), issues: issueSummary(result.issues) };
|
|
4416
4416
|
};
|
|
4417
4417
|
const apply = (edits, label, extra) => {
|
|
4418
4418
|
const result = controller.apply(edits, label);
|
|
@@ -4421,7 +4421,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4421
4421
|
const clipOut = (p, id) => {
|
|
4422
4422
|
for (const t of p.tracks) {
|
|
4423
4423
|
const c = t.clips.find((x) => x.id === id);
|
|
4424
|
-
if (c) return { track: t.id, ...c, end:
|
|
4424
|
+
if (c) return { track: t.id, ...c, end: _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkIGPEBXUDcjs.videoClipSourceRange.call(void 0, c) } : {} };
|
|
4425
4425
|
}
|
|
4426
4426
|
return null;
|
|
4427
4427
|
};
|
|
@@ -4433,7 +4433,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4433
4433
|
});
|
|
4434
4434
|
const keysOut = (p, clip, property) => {
|
|
4435
4435
|
const c = clipOut(p, clip);
|
|
4436
|
-
const value =
|
|
4436
|
+
const value = _chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _144 => _144.transform, 'optionalAccess', _145 => _145[property]]) : _optionalChain([c, 'optionalAccess', _146 => _146[property]]);
|
|
4437
4437
|
return typeof value === "object" ? { keys: value.keys } : { keys: [], value: _nullishCoalesce(value, () => ( null)) };
|
|
4438
4438
|
};
|
|
4439
4439
|
const getProject = {
|
|
@@ -4455,8 +4455,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4455
4455
|
inputSchema: object({ time: MS("Time from the start (default: the playhead)") }),
|
|
4456
4456
|
annotations: { title: "What plays at a moment", ...READ },
|
|
4457
4457
|
handler: ({ time }) => {
|
|
4458
|
-
const frame =
|
|
4459
|
-
return { ...frame, timecode:
|
|
4458
|
+
const frame = _chunkIGPEBXUDcjs.videoFrameAt.call(void 0, project(), _nullishCoalesce(time, () => ( controller.getState().time)));
|
|
4459
|
+
return { ...frame, timecode: _chunkIGPEBXUDcjs.formatVideoTimecode.call(void 0, frame.time, project().fps) };
|
|
4460
4460
|
}
|
|
4461
4461
|
};
|
|
4462
4462
|
const listSequences = {
|
|
@@ -4484,7 +4484,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4484
4484
|
annotations: { title: "Find gaps", ...READ },
|
|
4485
4485
|
handler: ({ track }) => {
|
|
4486
4486
|
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(", ")}.`);
|
|
4487
|
-
return { gaps:
|
|
4487
|
+
return { gaps: _chunkIGPEBXUDcjs.findVideoGaps.call(void 0, project(), track) };
|
|
4488
4488
|
}
|
|
4489
4489
|
};
|
|
4490
4490
|
const checkProject = {
|
|
@@ -4514,7 +4514,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4514
4514
|
const lutSrcs = [...new Set(p.tracks.flatMap((t) => t.clips.map((c) => _optionalChain([c, 'access', _147 => _147.grade, 'optionalAccess', _148 => _148.lut, 'optionalAccess', _149 => _149.src])).filter((x) => !!x)))];
|
|
4515
4515
|
const missing = (await Promise.all(lutSrcs.map((src) => controller.luts.load(src).then(() => null, (e) => e.message)))).filter((m) => !!m);
|
|
4516
4516
|
const svgOptions = { lutFor: (src) => controller.luts.peek(src), ...columns ? { columns } : {} };
|
|
4517
|
-
const svg = times ?
|
|
4517
|
+
const svg = times ? _chunkIGPEBXUDcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunkIGPEBXUDcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
|
|
4518
4518
|
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."] : []];
|
|
4519
4519
|
if (format === "png") {
|
|
4520
4520
|
if (!options.rasterize) throw new Error('This host cannot make PNG images; call render_video_frame with format "svg".');
|
|
@@ -4604,7 +4604,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4604
4604
|
if (play === true) controller.play();
|
|
4605
4605
|
if (play === false) controller.pause();
|
|
4606
4606
|
const state = controller.getState();
|
|
4607
|
-
return { time: state.time, timecode:
|
|
4607
|
+
return { time: state.time, timecode: _chunkIGPEBXUDcjs.formatVideoTimecode.call(void 0, state.time, p.fps), playing: state.playing, clips: state.current };
|
|
4608
4608
|
}
|
|
4609
4609
|
};
|
|
4610
4610
|
const setSettings = {
|
|
@@ -4730,7 +4730,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4730
4730
|
inputSchema: object(
|
|
4731
4731
|
{
|
|
4732
4732
|
clip: CLIP_ID,
|
|
4733
|
-
set: object({ ...CLIP_COMMON, ...MEDIA_FIELDS, asset: { ...ASSET_ID, description: "For media: play another asset (same in point)." }, ...TEXT_FIELDS, color: COLOR("Text colour, or a colour clip's fill"), scope: { type: "string", enum: [...
|
|
4733
|
+
set: object({ ...CLIP_COMMON, ...MEDIA_FIELDS, asset: { ...ASSET_ID, description: "For media: play another asset (same in point)." }, ...TEXT_FIELDS, color: COLOR("Text colour, or a colour clip's fill"), scope: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_ADJUSTMENT_SCOPES], description: "For adjustment clips: which pictures it changes, underneath (default), all or track." }, targetTrack: { ...TRACK_ID, description: 'For adjustment clips with scope "track": the track whose pictures it changes.' } }, [], "Fields to replace (only those that fit the clip's type)."),
|
|
4734
4734
|
remove: { type: "array", items: { type: "string", enum: ["name", "opacity", "transform", "fit", "blend", "grade", "animateIn", "animateOut", "fadeIn", "fadeOut", "fadeInCurve", "fadeOutCurve", "in", "speed", "volume", "muted", "fontSize", "fontFamily", "fontWeight", "background", "scope", "targetTrack"] }, description: 'Fields to reset to their defaults (an adjustment clip going from scope "track" to another scope must also remove targetTrack).' }
|
|
4735
4735
|
},
|
|
4736
4736
|
["clip"]
|
|
@@ -4749,7 +4749,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4749
4749
|
const gradeTargets = (ids) => {
|
|
4750
4750
|
const p = project();
|
|
4751
4751
|
for (const id of ids) {
|
|
4752
|
-
const at =
|
|
4752
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, p, id);
|
|
4753
4753
|
if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
|
|
4754
4754
|
const { clip } = at;
|
|
4755
4755
|
if (at.track.kind !== "video" || clip.type === "media" && _optionalChain([p, 'access', _150 => _150.assets, 'access', _151 => _151.find, 'call', _152 => _152((a) => a.id === clip.asset), 'optionalAccess', _153 => _153.kind]) === "audio")
|
|
@@ -4763,7 +4763,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4763
4763
|
inputSchema: object(
|
|
4764
4764
|
{
|
|
4765
4765
|
clips: { type: "array", items: CLIP_ID, minItems: 1, description: "Clips on video tracks to grade." },
|
|
4766
|
-
preset: { type: "string", enum: [...
|
|
4766
|
+
preset: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_GRADE_PRESET_NAMES], description: "The look." },
|
|
4767
4767
|
amount: { type: "number", minimum: 0, maximum: 1, description: "Strength, 0 (none) to 1 (full, the default); 0.5 is a subtler version." }
|
|
4768
4768
|
},
|
|
4769
4769
|
["clips", "preset"]
|
|
@@ -4772,10 +4772,10 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4772
4772
|
handler: ({ clips, preset, amount }) => {
|
|
4773
4773
|
gradeTargets(clips);
|
|
4774
4774
|
const edits = clips.map((clip) => {
|
|
4775
|
-
const grade =
|
|
4775
|
+
const grade = _chunkIGPEBXUDcjs.videoGradeLook.call(void 0, _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
|
|
4776
4776
|
return grade ? { op: "update_clip", clip, set: { grade } } : { op: "update_clip", clip, remove: ["grade"] };
|
|
4777
4777
|
});
|
|
4778
|
-
return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([
|
|
4778
|
+
return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _154 => _154.clip, 'access', _155 => _155.grade]), () => ( null)) })) }));
|
|
4779
4779
|
}
|
|
4780
4780
|
};
|
|
4781
4781
|
const copyGrade = {
|
|
@@ -4786,7 +4786,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4786
4786
|
annotations: { title: "Copy a colour grade", ...WRITE_IDEMPOTENT },
|
|
4787
4787
|
handler: ({ from, to }) => {
|
|
4788
4788
|
gradeTargets([from, ...to]);
|
|
4789
|
-
const grade =
|
|
4789
|
+
const grade = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project(), from).clip.grade;
|
|
4790
4790
|
const edits = to.map((clip) => grade ? { op: "update_clip", clip, set: { grade: { ...grade } } } : { op: "update_clip", clip, remove: ["grade"] });
|
|
4791
4791
|
return apply(edits, "Copy grade", () => ({ grade: _nullishCoalesce(grade, () => ( null)), clips: to }));
|
|
4792
4792
|
}
|
|
@@ -4812,7 +4812,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4812
4812
|
const lut = await controller.luts.load(src);
|
|
4813
4813
|
const label = _nullishCoalesce(name, () => ( lut.title));
|
|
4814
4814
|
const setting = { src, ...strength !== void 0 && strength !== 1 ? { strength } : {}, ...label ? { name: label } : {}, ...preserve_skin_tones ? { preserveSkinTones: preserve_skin_tones } : {} };
|
|
4815
|
-
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([
|
|
4815
|
+
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([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _156 => _156.clip, 'access', _157 => _157.grade]), () => ( null)) })) }));
|
|
4816
4816
|
}
|
|
4817
4817
|
};
|
|
4818
4818
|
const removeLut = {
|
|
@@ -4824,9 +4824,9 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4824
4824
|
handler: ({ clips }) => {
|
|
4825
4825
|
gradeTargets(clips);
|
|
4826
4826
|
const p = project();
|
|
4827
|
-
const withLut = clips.filter((id) => _optionalChain([
|
|
4827
|
+
const withLut = clips.filter((id) => _optionalChain([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, p, id), 'access', _158 => _158.clip, 'access', _159 => _159.grade, 'optionalAccess', _160 => _160.lut]));
|
|
4828
4828
|
if (!withLut.length) throw new Error(`None of ${clips.map((c) => `"${c}"`).join(", ")} has a LUT; get_video_project shows each clip's grade.`);
|
|
4829
|
-
return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([
|
|
4829
|
+
return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _161 => _161.clip, 'access', _162 => _162.grade]), () => ( null)) })) }));
|
|
4830
4830
|
}
|
|
4831
4831
|
};
|
|
4832
4832
|
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." };
|
|
@@ -4935,7 +4935,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
4935
4935
|
approximate: parsed.approximate,
|
|
4936
4936
|
first: list[0],
|
|
4937
4937
|
last: list[list.length - 1],
|
|
4938
|
-
...a.duration !== void 0 && list[list.length - 1].end > a.duration +
|
|
4938
|
+
...a.duration !== void 0 && list[list.length - 1].end > a.duration + _chunkIGPEBXUDcjs.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?` } : {}
|
|
4939
4939
|
}));
|
|
4940
4940
|
}
|
|
4941
4941
|
};
|
|
@@ -5006,22 +5006,22 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5006
5006
|
const bad = ranges.findIndex((r) => !(r.to > r.from));
|
|
5007
5007
|
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".`);
|
|
5008
5008
|
const merged = mergeVideoRanges(ranges);
|
|
5009
|
-
const before =
|
|
5010
|
-
return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before -
|
|
5009
|
+
const before = _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, project());
|
|
5010
|
+
return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before - _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, r.project)), duration: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, r.project) }));
|
|
5011
5011
|
}
|
|
5012
5012
|
};
|
|
5013
5013
|
const rampTarget = (id) => {
|
|
5014
|
-
const at =
|
|
5014
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project(), id);
|
|
5015
5015
|
if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
|
|
5016
5016
|
const { clip } = at;
|
|
5017
5017
|
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.`);
|
|
5018
|
-
if (clip.type !== "media") throw new Error(`Clip "${id}" is a ${
|
|
5018
|
+
if (clip.type !== "media") throw new Error(`Clip "${id}" is a ${_chunkIGPEBXUDcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to change the speed of; use a video or audio clip.`);
|
|
5019
5019
|
if (_optionalChain([project, 'call', _167 => _167(), 'access', _168 => _168.assets, 'access', _169 => _169.find, 'call', _170 => _170((a) => a.id === clip.asset), 'optionalAccess', _171 => _171.kind]) === "image") throw new Error(`Clip "${id}" is a still, so it has no motion to change the speed of.`);
|
|
5020
5020
|
return clip;
|
|
5021
5021
|
};
|
|
5022
5022
|
const rampOut = (r, id) => {
|
|
5023
5023
|
const outcome2 = r.outcomes[r.outcomes.length - 1];
|
|
5024
|
-
return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration:
|
|
5024
|
+
return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, r.project) };
|
|
5025
5025
|
};
|
|
5026
5026
|
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." };
|
|
5027
5027
|
const setSpeedRamp = {
|
|
@@ -5052,8 +5052,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5052
5052
|
),
|
|
5053
5053
|
annotations: { title: "Ramp the speed", ...WRITE_IDEMPOTENT },
|
|
5054
5054
|
handler: ({ clip, segments, ripple }) => {
|
|
5055
|
-
const edit =
|
|
5056
|
-
return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(
|
|
5055
|
+
const edit = _chunkIGPEBXUDcjs.videoSpeedRampEdit.call(void 0, rampTarget(clip), segments, _nullishCoalesce(ripple, () => ( true)));
|
|
5056
|
+
return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(_chunkIGPEBXUDcjs.videoSpeedRampKeys.call(void 0, segments).source) }));
|
|
5057
5057
|
}
|
|
5058
5058
|
};
|
|
5059
5059
|
const addFreeze = {
|
|
@@ -5073,8 +5073,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5073
5073
|
handler: ({ clip, at, duration, ripple }) => {
|
|
5074
5074
|
const c = rampTarget(clip);
|
|
5075
5075
|
const t = at - c.start;
|
|
5076
|
-
if (t < 0 || t > c.duration) throw new Error(`${
|
|
5077
|
-
return apply(
|
|
5076
|
+
if (t < 0 || t > c.duration) throw new Error(`${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, at)} is outside clip "${clip}" (${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, c.start)}\u2013${_chunkIGPEBXUDcjs.formatVideoSeconds.call(void 0, _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c))}); pick a time inside it.`);
|
|
5077
|
+
return apply(_chunkIGPEBXUDcjs.videoFreezeFrameEdit.call(void 0, c, t, duration, _nullishCoalesce(ripple, () => ( true))), "Freeze frame", (r) => rampOut(r, clip));
|
|
5078
5078
|
}
|
|
5079
5079
|
};
|
|
5080
5080
|
const removeRamp = {
|
|
@@ -5247,7 +5247,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5247
5247
|
let from;
|
|
5248
5248
|
let to;
|
|
5249
5249
|
if (args.clip !== void 0) {
|
|
5250
|
-
const found =
|
|
5250
|
+
const found = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, p, args.clip);
|
|
5251
5251
|
if (!found) throw new Error(`There is no clip "${args.clip}"; get_video_project lists the clips.`);
|
|
5252
5252
|
const c = found.clip;
|
|
5253
5253
|
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).`);
|
|
@@ -5257,7 +5257,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5257
5257
|
toSource = (t) => (_nullishCoalesce(c.in, () => ( 0))) + (t - c.start) * speed;
|
|
5258
5258
|
toOut = (s) => c.start + (s - (_nullishCoalesce(c.in, () => ( 0)))) / speed;
|
|
5259
5259
|
from = Math.max(c.start, _nullishCoalesce(args.from, () => ( c.start)));
|
|
5260
|
-
to = Math.min(
|
|
5260
|
+
to = Math.min(_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c), _nullishCoalesce(args.to, () => ( _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c))));
|
|
5261
5261
|
} else {
|
|
5262
5262
|
asset = p.assets.find((a) => a.id === args.asset);
|
|
5263
5263
|
if (!asset) throw new Error(`There is no asset "${args.asset}"; the assets are ${p.assets.map((a) => `"${a.id}"`).join(", ") || "none"}.`);
|
|
@@ -5338,15 +5338,15 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5338
5338
|
annotations: { title: "Measure a frame with scopes", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
5339
5339
|
handler: async ({ time, bins, columns }) => {
|
|
5340
5340
|
const p = project();
|
|
5341
|
-
const end =
|
|
5341
|
+
const end = _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, p);
|
|
5342
5342
|
const t = _nullishCoalesce(time, () => ( controller.getState().time));
|
|
5343
5343
|
if (time !== void 0 && time > end) throw new Error(`Time ${time} ms is past the end of the project (${end} ms).`);
|
|
5344
5344
|
const pixels = await pixelsAt(t);
|
|
5345
|
-
return { time: t, timecode:
|
|
5345
|
+
return { time: t, timecode: _chunkIGPEBXUDcjs.formatVideoTimecode.call(void 0, t, p.fps), width: pixels.width, height: pixels.height, ...summarizeVideoScopes(pixels, { bins, columns }) };
|
|
5346
5346
|
}
|
|
5347
5347
|
};
|
|
5348
5348
|
const MASK_FIELDS = {
|
|
5349
|
-
shape: { type: "string", enum: [...
|
|
5349
|
+
shape: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_MASK_SHAPES], description: "rectangle (with corner_radius), ellipse, linear (a straight split: the side above the line at rotation 0 shows) or polygon (points)." },
|
|
5350
5350
|
x: { type: "number", description: "Centre across the clip's picture, 0 (left edge) to 1 (right edge); default 0.5." },
|
|
5351
5351
|
y: { type: "number", description: "Centre down the clip's picture, 0 (top) to 1 (bottom); default 0.5." },
|
|
5352
5352
|
width: { type: "number", minimum: 0, description: "Width as a fraction of the picture's width (default 0.5). Unused by linear." },
|
|
@@ -5366,10 +5366,10 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5366
5366
|
track: { ...TRACK_ID, description: 'A video track to put it on; tracks below it are "underneath".' },
|
|
5367
5367
|
start: MS("Where it starts on the timeline (default: the end of the track)"),
|
|
5368
5368
|
duration: { type: "number", exclusiveMinimum: 0, description: "How long it lasts, in ms (default 3000)." },
|
|
5369
|
-
scope: { type: "string", enum: [...
|
|
5369
|
+
scope: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_ADJUSTMENT_SCOPES], description: "Which pictures it changes: underneath (default), all or track." },
|
|
5370
5370
|
target_track: { ...TRACK_ID, description: 'For scope "track" (required then): the track whose pictures it changes.' },
|
|
5371
5371
|
grade: GRADE,
|
|
5372
|
-
preset: { type: "string", enum: [...
|
|
5372
|
+
preset: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_GRADE_PRESET_NAMES], description: "A named look to start from (grade settings given override it)." },
|
|
5373
5373
|
amount: { type: "number", minimum: 0, maximum: 1, description: "Strength of the preset, 0\u20131 (default 1)." },
|
|
5374
5374
|
name: { type: "string", minLength: 1, description: 'A label for the clip (e.g. "Night look").' },
|
|
5375
5375
|
id: { type: "string", minLength: 1, description: 'Your own id for the clip (default: a fresh one such as "c7").' },
|
|
@@ -5383,13 +5383,13 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5383
5383
|
if (t && t.kind !== "video") throw new Error(`Track "${track}" is an audio track; adjustment clips change pictures, so put it on a video track.`);
|
|
5384
5384
|
if (scope === "track" && !target_track) throw new Error('Scope "track" needs target_track: the id of the track whose pictures it changes.');
|
|
5385
5385
|
if (target_track !== void 0 && scope !== "track") throw new Error('target_track is only for scope "track"; leave it out or set scope to "track".');
|
|
5386
|
-
const look = { ...preset ?
|
|
5386
|
+
const look = { ...preset ? _chunkIGPEBXUDcjs.videoGradePreset.call(void 0, preset, _nullishCoalesce(amount, () => ( 1))) : {}, ..._nullishCoalesce(grade, () => ( {})) };
|
|
5387
5387
|
const clip = { type: "adjustment", ...id ? { id } : {}, ...name ? { name } : {}, ...start !== void 0 ? { start } : {}, duration: _nullishCoalesce(duration, () => ( 3e3)), ...scope ? { scope } : {}, ...target_track ? { targetTrack: target_track } : {}, ...Object.keys(look).length ? { grade: look } : {} };
|
|
5388
5388
|
return apply({ op: "add_clip", track, clip, mode }, "Add adjustment clip", (r) => ({ clip: clipOut(r.project, r.outcomes[0].clip), ...placed(r.outcomes[0]), ...Object.keys(look).length ? {} : { hint: "It changes nothing yet: give it a grade (update_video_clip), effects (apply_effect) or a mask." } }));
|
|
5389
5389
|
}
|
|
5390
5390
|
};
|
|
5391
5391
|
const maskTarget = (id) => {
|
|
5392
|
-
const at =
|
|
5392
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project(), id);
|
|
5393
5393
|
if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
|
|
5394
5394
|
if (at.track.kind !== "video") throw new Error(`Clip "${id}" is on audio track "${at.track.id}"; masks cut pictures, so pass a clip on a video track.`);
|
|
5395
5395
|
return at;
|
|
@@ -5431,13 +5431,13 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5431
5431
|
gradeTargets(clips);
|
|
5432
5432
|
const edits = [];
|
|
5433
5433
|
for (const id of clips) {
|
|
5434
|
-
const clip =
|
|
5434
|
+
const clip = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, project(), id).clip;
|
|
5435
5435
|
const lut = _optionalChain([clip, 'access', _172 => _172.grade, 'optionalAccess', _173 => _173.lut]);
|
|
5436
5436
|
if (!lut) throw new Error(`Clip "${id}" has no LUT to protect skin from; add one with set_video_lut first.`);
|
|
5437
5437
|
const { preserveSkinTones: _p, ...rest } = lut;
|
|
5438
5438
|
edits.push({ op: "update_clip", clip: id, set: { grade: { ...clip.grade, lut: amount > 0 ? { ...rest, preserveSkinTones: amount } : rest } } });
|
|
5439
5439
|
}
|
|
5440
|
-
return apply(edits, amount > 0 ? "Protect skin tones" : "Stop protecting skin tones", (r) => ({ clips: clips.map((id) => ({ id, lut: _nullishCoalesce(_optionalChain([
|
|
5440
|
+
return apply(edits, amount > 0 ? "Protect skin tones" : "Stop protecting skin tones", (r) => ({ clips: clips.map((id) => ({ id, lut: _nullishCoalesce(_optionalChain([_chunkIGPEBXUDcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _174 => _174.clip, 'access', _175 => _175.grade, 'optionalAccess', _176 => _176.lut]), () => ( null)) })) }));
|
|
5441
5441
|
}
|
|
5442
5442
|
};
|
|
5443
5443
|
const planOut = (plan) => ({
|
|
@@ -5490,7 +5490,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
|
|
|
5490
5490
|
handler: ({ plan }) => {
|
|
5491
5491
|
const r = controller.applyPlan(plan);
|
|
5492
5492
|
if (!r.ok) throw new Error(r.error);
|
|
5493
|
-
return { plan: r.plan.id, title: r.plan.title, stale: r.stale, outcomes: r.outcomes, duration:
|
|
5493
|
+
return { plan: r.plan.id, title: r.plan.title, stale: r.stale, outcomes: r.outcomes, duration: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, r.project), issues: issueSummary(r.issues) };
|
|
5494
5494
|
}
|
|
5495
5495
|
};
|
|
5496
5496
|
const discardPlan = {
|
|
@@ -5544,7 +5544,7 @@ var KEYS2 = {
|
|
|
5544
5544
|
properties: {
|
|
5545
5545
|
t: { type: "number", description: "Clip-relative time in ms (0 = the clip's start)." },
|
|
5546
5546
|
v: { type: "number", description: "The control's value at t, within its range from describe_effect." },
|
|
5547
|
-
ease: { anyOf: [{ type: "string", enum: [...
|
|
5547
|
+
ease: { anyOf: [{ type: "string", enum: [..._chunkIGPEBXUDcjs.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]." }
|
|
5548
5548
|
},
|
|
5549
5549
|
required: ["t", "v"],
|
|
5550
5550
|
additionalProperties: false
|
|
@@ -5558,7 +5558,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
5558
5558
|
return controller.readOnlyReason();
|
|
5559
5559
|
};
|
|
5560
5560
|
const clipOf = (id) => {
|
|
5561
|
-
const at =
|
|
5561
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, controller.getProject(), id);
|
|
5562
5562
|
if (!at) {
|
|
5563
5563
|
const ids = controller.getProject().tracks.flatMap((t) => t.clips.map((c) => c.id));
|
|
5564
5564
|
throw new Error(`There is no clip "${id}"; the clips are ${ids.map((c) => `"${c}"`).join(", ") || "none"} (get_video_project lists them).`);
|
|
@@ -5571,7 +5571,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
5571
5571
|
const effect = _nullishCoalesce(effects.find((e) => e.id === (_nullishCoalesce(instance, () => ( _optionalChain([r, 'access', _179 => _179.effect, 'optionalAccess', _180 => _180.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])));
|
|
5572
5572
|
return { target, effect, effects, ...extra };
|
|
5573
5573
|
};
|
|
5574
|
-
return withVideoPlayback(
|
|
5574
|
+
return withVideoPlayback(_chunk5MQOBTNPcjs.createEffectToolProvider.call(void 0, {
|
|
5575
5575
|
id: _nullishCoalesce(options.id, () => ( "video-effects")),
|
|
5576
5576
|
namespace: options.namespace,
|
|
5577
5577
|
title: "Video effects",
|
|
@@ -5629,7 +5629,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
5629
5629
|
duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default: the effect's own length, else 5000)." },
|
|
5630
5630
|
values: ctx.valuesSchema("Control values over the effect's defaults", true),
|
|
5631
5631
|
name: { type: "string", minLength: 1, description: "A label for the clip (default: the effect's name)." },
|
|
5632
|
-
mode: { type: "string", enum: [...
|
|
5632
|
+
mode: { type: "string", enum: [..._chunkIGPEBXUDcjs.VIDEO_PLACEMENT_MODES], description: "What to do with clips already there: refuse (default), overwrite or insert." }
|
|
5633
5633
|
},
|
|
5634
5634
|
required: ["track", "effect"],
|
|
5635
5635
|
additionalProperties: false
|
|
@@ -5689,7 +5689,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
|
|
|
5689
5689
|
const clip = clipOf(args.clip);
|
|
5690
5690
|
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).`);
|
|
5691
5691
|
const was = _optionalChain([clip, 'access', _181 => _181.values, 'optionalAccess', _182 => _182[args.control]]);
|
|
5692
|
-
const plain = keys === null ?
|
|
5692
|
+
const plain = keys === null ? _chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _183 => _183.keys, 'access', _184 => _184[0], 'optionalAccess', _185 => _185.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
|
|
5693
5693
|
if (plain === void 0) throw new Error(`"${args.control}" has no value to keep; give keys instead.`);
|
|
5694
5694
|
r = await controller.updateEffectValues(args.clip, "generator", { [args.control]: plain });
|
|
5695
5695
|
} else r = await controller.setClipEffectKeyframes(args.clip, args.effect, args.control, keys);
|
|
@@ -5767,7 +5767,7 @@ function createVideoDialogueToolProvider(controller, options = {}) {
|
|
|
5767
5767
|
const r = controller.proposePlan({ title, description: "Cuts fillers, long pauses and stutters found in the transcript, closing up every sync-locked track.", edits: videoRemoveRangesEdits(cuts), ranges: cuts.map((d) => ({ from: d.from, to: d.to, text: d.text, reason: d.kind })), source: "plan_video_dialogue_cleanup" });
|
|
5768
5768
|
if (!r.ok) throw new Error(r.error);
|
|
5769
5769
|
const p = r.plan;
|
|
5770
|
-
return { plan: { id: p.id, title: p.title, summary: p.summary, text: describeVideoEditPlan(p), cuts: cuts.length }, durationNow:
|
|
5770
|
+
return { plan: { id: p.id, title: p.title, summary: p.summary, text: describeVideoEditPlan(p), cuts: cuts.length }, durationNow: _chunkIGPEBXUDcjs.videoProjectDuration.call(void 0, controller.getProject()), hint: `Nothing changed yet. Show the user the plan, then call apply_video_edit_plan with plan "${p.id}" (or discard_video_edit_plan).` };
|
|
5771
5771
|
}
|
|
5772
5772
|
};
|
|
5773
5773
|
return withVideoPlayback(
|
|
@@ -5814,7 +5814,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
5814
5814
|
};
|
|
5815
5815
|
const project = () => controller.getProject();
|
|
5816
5816
|
const soundClip = (p, id) => {
|
|
5817
|
-
const at =
|
|
5817
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, p, id);
|
|
5818
5818
|
if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
|
|
5819
5819
|
const c = at.clip;
|
|
5820
5820
|
if (c.type !== "media") throw new Error(`Clip "${id}" is a ${c.type} clip and has no sound of its own; pass a video or audio clip.`);
|
|
@@ -5830,8 +5830,8 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
5830
5830
|
const { clip, asset: asset2 } = soundClip(p, args.clip);
|
|
5831
5831
|
const speed = _nullishCoalesce(clip.speed, () => ( 1));
|
|
5832
5832
|
const from2 = Math.max(clip.start, _nullishCoalesce(args.from, () => ( clip.start)));
|
|
5833
|
-
const to2 = Math.min(
|
|
5834
|
-
if (!(to2 > from2)) throw new Error(`The stretch is empty (${from2}\u2013${to2} ms); "from" and "to" must be inside the clip (${clip.start}\u2013${
|
|
5833
|
+
const to2 = Math.min(_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip), _nullishCoalesce(args.to, () => ( _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip))));
|
|
5834
|
+
if (!(to2 > from2)) throw new Error(`The stretch is empty (${from2}\u2013${to2} ms); "from" and "to" must be inside the clip (${clip.start}\u2013${_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, clip)} ms) with "to" after "from".`);
|
|
5835
5835
|
return { asset: asset2, from: (_nullishCoalesce(clip.in, () => ( 0))) + (from2 - clip.start) * speed, to: (_nullishCoalesce(clip.in, () => ( 0))) + (to2 - clip.start) * speed, out: (s) => clip.start + (s - (_nullishCoalesce(clip.in, () => ( 0)))) / speed };
|
|
5836
5836
|
}
|
|
5837
5837
|
const asset = p.assets.find((a) => a.id === args.asset);
|
|
@@ -5873,7 +5873,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
5873
5873
|
handler: async ({ clips, target, ceiling, replace }) => {
|
|
5874
5874
|
const p = project();
|
|
5875
5875
|
const targets = clips.map((id) => soundClip(p, id));
|
|
5876
|
-
for (const t of targets) if (
|
|
5876
|
+
for (const t of targets) if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, t.clip.volume) && !replace) throw new Error(`Clip "${t.clip.id}" has volume keyframes, which a constant gain would replace; pass replace: true, or remove them first.`);
|
|
5877
5877
|
const results = [];
|
|
5878
5878
|
const edits = [];
|
|
5879
5879
|
for (const { clip, asset } of targets) {
|
|
@@ -5918,7 +5918,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
5918
5918
|
handler: async (args) => {
|
|
5919
5919
|
const p = project();
|
|
5920
5920
|
const music = args.music.map((id) => soundClip(p, id));
|
|
5921
|
-
for (const m of music) if (
|
|
5921
|
+
for (const m of music) if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, m.clip.volume) && !args.replace) throw new Error(`Music clip "${m.clip.id}" already has volume keyframes; pass replace: true to replace them, or remove them first.`);
|
|
5922
5922
|
const transcriptTrack = videoTranscriptTrack(p, args.dialogue_track);
|
|
5923
5923
|
const mode = _nullishCoalesce(args.speech, () => ( (transcriptTrack && videoTimelineTranscript(p, { track: transcriptTrack }).length ? "transcript" : "audio")));
|
|
5924
5924
|
let ranges = [];
|
|
@@ -5931,7 +5931,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
5931
5931
|
const track = p.tracks.find((t) => t.id === args.dialogue_track);
|
|
5932
5932
|
if (!track) throw new Error(`There is no track "${args.dialogue_track}".`);
|
|
5933
5933
|
const musicIds = new Set(music.map((m) => m.clip.id));
|
|
5934
|
-
for (const c of
|
|
5934
|
+
for (const c of _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, track)) {
|
|
5935
5935
|
if (c.type !== "media" || musicIds.has(c.id)) continue;
|
|
5936
5936
|
const asset = p.assets.find((a) => a.id === c.asset);
|
|
5937
5937
|
if (!asset || asset.kind === "image" || asset.hasAudio === false) continue;
|
|
@@ -5942,10 +5942,10 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
5942
5942
|
let at = c.start;
|
|
5943
5943
|
for (const s of silences) {
|
|
5944
5944
|
const a = c.start + (s.start - src0) / speed;
|
|
5945
|
-
if (a - at >
|
|
5945
|
+
if (a - at > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) ranges.push({ from: at, to: a });
|
|
5946
5946
|
at = c.start + (s.end - src0) / speed;
|
|
5947
5947
|
}
|
|
5948
|
-
if (
|
|
5948
|
+
if (_chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c) - at > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) ranges.push({ from: at, to: _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, c) });
|
|
5949
5949
|
}
|
|
5950
5950
|
if (!ranges.length) throw new Error(`Track "${args.dialogue_track}" has no sound above -40 dBFS, so there is no speech to duck under.`);
|
|
5951
5951
|
}
|
|
@@ -6008,7 +6008,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
6008
6008
|
if (!beats.length) throw new Error(`No beats were found in "${args.music}"; try a lower sensitivity, or pass beats.`);
|
|
6009
6009
|
} else beats = [...args.beats].sort((a, b) => a - b);
|
|
6010
6010
|
const tolerance = _nullishCoalesce(args.tolerance, () => ( 150));
|
|
6011
|
-
const clips =
|
|
6011
|
+
const clips = _chunkIGPEBXUDcjs.sortedVideoClips.call(void 0, track);
|
|
6012
6012
|
const edits = [];
|
|
6013
6013
|
const ranges = [];
|
|
6014
6014
|
const skipped = [];
|
|
@@ -6016,8 +6016,8 @@ function createVideoMusicToolProvider(controller, options = {}) {
|
|
|
6016
6016
|
for (let i = 0; i + 1 < clips.length; i++) {
|
|
6017
6017
|
const left = clips[i];
|
|
6018
6018
|
const right = clips[i + 1];
|
|
6019
|
-
const cut =
|
|
6020
|
-
if (Math.abs(right.start - cut) >
|
|
6019
|
+
const cut = _chunkIGPEBXUDcjs.videoClipEnd.call(void 0, left);
|
|
6020
|
+
if (Math.abs(right.start - cut) > _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON) continue;
|
|
6021
6021
|
const beat = nearestVideoBeat(beats, cut, tolerance);
|
|
6022
6022
|
if (beat === null) {
|
|
6023
6023
|
skipped.push({ cut: round4(cut), reason: `no beat within ${tolerance} ms` });
|
|
@@ -6092,7 +6092,7 @@ function videoClipEffectDocument(clip, instance, providerId) {
|
|
|
6092
6092
|
const values = {};
|
|
6093
6093
|
const tracks = {};
|
|
6094
6094
|
for (const [control, v] of Object.entries(_nullishCoalesce(effect.values, () => ( {})))) {
|
|
6095
|
-
if (
|
|
6095
|
+
if (_chunkIGPEBXUDcjs.isVideoKeyframes.call(void 0, v)) {
|
|
6096
6096
|
values[control] = v.keys[0].v;
|
|
6097
6097
|
tracks[control] = v.keys.map((k) => ({ time: k.t, value: k.v, ...k.ease && k.ease !== "linear" ? { easing: videoEaseToAnimationEasing(k.ease) } : {} }));
|
|
6098
6098
|
} else values[control] = v;
|
|
@@ -6133,10 +6133,10 @@ function videoEffectValuesFromDocument(doc) {
|
|
|
6133
6133
|
async function openVideoClipEffectAuthoring(controller, clip, instance, options = {}) {
|
|
6134
6134
|
const provider = controller.effectsProvider;
|
|
6135
6135
|
if (!provider) throw new Error("No effects provider is registered, so the effect cannot be opened for authoring; register one with setEffectsProvider.");
|
|
6136
|
-
const at =
|
|
6136
|
+
const at = _chunkIGPEBXUDcjs.findVideoClip.call(void 0, controller.getProject(), clip);
|
|
6137
6137
|
if (!at) throw new Error(`There is no clip "${clip}".`);
|
|
6138
6138
|
const doc = videoClipEffectDocument(at.clip, instance, provider.id);
|
|
6139
|
-
const session = await
|
|
6139
|
+
const session = await _chunkK5GXW5TRcjs.createEffectAuthoringSession.call(void 0, { document: doc }, { ...options, provider });
|
|
6140
6140
|
return {
|
|
6141
6141
|
clip,
|
|
6142
6142
|
instance,
|
|
@@ -6477,4 +6477,4 @@ function createVideoEditorDocument(controller) {
|
|
|
6477
6477
|
|
|
6478
6478
|
|
|
6479
6479
|
|
|
6480
|
-
exports.TranscriptVideoController = TranscriptVideoController; exports.VIDEO_ADJUSTMENT_SCOPES = _chunkC6CMQXMIcjs.VIDEO_ADJUSTMENT_SCOPES; exports.VIDEO_ADJUSTMENT_SCOPE_LABELS = VIDEO_ADJUSTMENT_SCOPE_LABELS; exports.VIDEO_BLEND_MODES = _chunkC6CMQXMIcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkC6CMQXMIcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkC6CMQXMIcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkC6CMQXMIcjs.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_DISFLUENCY_KINDS = VIDEO_DISFLUENCY_KINDS; exports.VIDEO_EASE_NAMES = _chunkC6CMQXMIcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkC6CMQXMIcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkC6CMQXMIcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkC6CMQXMIcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkC6CMQXMIcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkC6CMQXMIcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkC6CMQXMIcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkC6CMQXMIcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkC6CMQXMIcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LOUDNESS_HOP = VIDEO_LOUDNESS_HOP; exports.VIDEO_LUT_MAX_SIZE = _chunkC6CMQXMIcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_MASK_DEFAULTS = _chunkC6CMQXMIcjs.VIDEO_MASK_DEFAULTS; exports.VIDEO_MASK_SHAPES = _chunkC6CMQXMIcjs.VIDEO_MASK_SHAPES; exports.VIDEO_MASK_SHAPE_LABELS = VIDEO_MASK_SHAPE_LABELS; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkC6CMQXMIcjs.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 = _chunkC6CMQXMIcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkC6CMQXMIcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkC6CMQXMIcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkC6CMQXMIcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkC6CMQXMIcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkC6CMQXMIcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkC6CMQXMIcjs.allVideoClipIds; exports.allVideoTracks = _chunkC6CMQXMIcjs.allVideoTracks; exports.animationEasingToVideoEase = animationEasingToVideoEase; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkC6CMQXMIcjs.applyVideoGrade; exports.applyVideoLut = _chunkC6CMQXMIcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkC6CMQXMIcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkC6CMQXMIcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkC6CMQXMIcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkC6CMQXMIcjs.checkVideoTimeRemap; exports.createVideoDialogueToolProvider = createVideoDialogueToolProvider; exports.createVideoEditorDocument = createVideoEditorDocument; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoMusicToolProvider = createVideoMusicToolProvider; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoEditPlan = describeVideoEditPlan; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.detectVideoDisfluencies = detectVideoDisfluencies; exports.diffVideoProjects = diffVideoProjects; exports.drawVideoFrame = _chunkC6CMQXMIcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkC6CMQXMIcjs.ffmpegFilterValue; exports.findVideoAudioBeats = findVideoAudioBeats; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkC6CMQXMIcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkC6CMQXMIcjs.findVideoGaps; exports.findVideoRepetitions = findVideoRepetitions; exports.findVideoSequenceClip = _chunkC6CMQXMIcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkC6CMQXMIcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkC6CMQXMIcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkC6CMQXMIcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkC6CMQXMIcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkC6CMQXMIcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkC6CMQXMIcjs.isVideoKeyframes; exports.measureVideoLoudness = measureVideoLoudness; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkC6CMQXMIcjs.mixEffectPixels; exports.nearestVideoBeat = nearestVideoBeat; exports.nextFreeVideoSlot = _chunkC6CMQXMIcjs.nextFreeVideoSlot; exports.normalizeVideoClipMask = _chunkC6CMQXMIcjs.normalizeVideoClipMask; exports.normalizeVideoGrade = _chunkC6CMQXMIcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkC6CMQXMIcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.openVideoClipEffectAuthoring = openVideoClipEffectAuthoring; exports.overEffectPixels = _chunkC6CMQXMIcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoClipMask = parseVideoClipMask; exports.parseVideoCubeLut = _chunkC6CMQXMIcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkC6CMQXMIcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRef = parseVideoTimeRef; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkC6CMQXMIcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoEdits = planVideoEdits; exports.planVideoPrefetch = planVideoPrefetch; exports.planVideoToolPlayback = planVideoToolPlayback; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkC6CMQXMIcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkC6CMQXMIcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkC6CMQXMIcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkC6CMQXMIcjs.setVideoKey; exports.snapToVideoFrame = _chunkC6CMQXMIcjs.snapToVideoFrame; exports.snapVideoTime = _chunkC6CMQXMIcjs.snapVideoTime; exports.sortVideoKeys = _chunkC6CMQXMIcjs.sortVideoKeys; exports.sortedVideoClips = _chunkC6CMQXMIcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkC6CMQXMIcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkC6CMQXMIcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkC6CMQXMIcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkC6CMQXMIcjs.toVideoLoudnessMeasure; exports.videoAddAdjustmentEdits = videoAddAdjustmentEdits; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkC6CMQXMIcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkC6CMQXMIcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioLoudness = videoAudioLoudness; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoAuthorableEffects = videoAuthorableEffects; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkC6CMQXMIcjs.videoClipAfter; exports.videoClipAnimated = _chunkC6CMQXMIcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkC6CMQXMIcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkC6CMQXMIcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkC6CMQXMIcjs.videoClipBefore; exports.videoClipEffectDocument = videoClipEffectDocument; exports.videoClipEffectUses = _chunkC6CMQXMIcjs.videoClipEffectUses; exports.videoClipEnd = _chunkC6CMQXMIcjs.videoClipEnd; exports.videoClipHandles = _chunkC6CMQXMIcjs.videoClipHandles; exports.videoClipHeading = videoClipHeading; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkC6CMQXMIcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkC6CMQXMIcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkC6CMQXMIcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkC6CMQXMIcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkC6CMQXMIcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkC6CMQXMIcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipTypeLabel = _chunkC6CMQXMIcjs.videoClipTypeLabel; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkC6CMQXMIcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkC6CMQXMIcjs.videoContactSheetSvg; exports.videoCutsWithMargin = videoCutsWithMargin; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoDuckingKeys = videoDuckingKeys; exports.videoEaseBezier = _chunkC6CMQXMIcjs.videoEaseBezier; exports.videoEaseProgress = _chunkC6CMQXMIcjs.videoEaseProgress; exports.videoEaseToAnimationEasing = videoEaseToAnimationEasing; exports.videoEffectFrameTime = _chunkC6CMQXMIcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkC6CMQXMIcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkC6CMQXMIcjs.videoEffectValuesAt; exports.videoEffectValuesFromDocument = videoEffectValuesFromDocument; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkC6CMQXMIcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkC6CMQXMIcjs.videoFfmpegUnsupportedEffects; exports.videoFfmpegUnsupportedFeatures = _chunkC6CMQXMIcjs.videoFfmpegUnsupportedFeatures; exports.videoFrameAt = _chunkC6CMQXMIcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkC6CMQXMIcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkC6CMQXMIcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkC6CMQXMIcjs.videoFrameToSvg; exports.videoFrames = _chunkC6CMQXMIcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkC6CMQXMIcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkC6CMQXMIcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkC6CMQXMIcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkC6CMQXMIcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkC6CMQXMIcjs.videoGradeLook; exports.videoGradePreset = _chunkC6CMQXMIcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkC6CMQXMIcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkC6CMQXMIcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkC6CMQXMIcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkC6CMQXMIcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkC6CMQXMIcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkC6CMQXMIcjs.videoHourFrames; exports.videoIrisRadius = _chunkC6CMQXMIcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkC6CMQXMIcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkC6CMQXMIcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkC6CMQXMIcjs.videoKeysOf; exports.videoLayerMask = _chunkC6CMQXMIcjs.videoLayerMask; exports.videoLayersUseEffects = _chunkC6CMQXMIcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkC6CMQXMIcjs.videoLayersWithoutTransitionEffects; exports.videoLoudnessEnergy = videoLoudnessEnergy; exports.videoLoudnessGain = videoLoudnessGain; exports.videoLoudnessOf = videoLoudnessOf; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkC6CMQXMIcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkC6CMQXMIcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkC6CMQXMIcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkC6CMQXMIcjs.videoLutToCube; exports.videoMaskContains = _chunkC6CMQXMIcjs.videoMaskContains; exports.videoMaskEdit = videoMaskEdit; exports.videoMaskPolygon = _chunkC6CMQXMIcjs.videoMaskPolygon; exports.videoMaskSvgPath = _chunkC6CMQXMIcjs.videoMaskSvgPath; exports.videoOverlap = _chunkC6CMQXMIcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkC6CMQXMIcjs.videoProjectDuration; exports.videoProjectEffects = _chunkC6CMQXMIcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkC6CMQXMIcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkC6CMQXMIcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkC6CMQXMIcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkC6CMQXMIcjs.videoSequenceMap; exports.videoShellQuote = _chunkC6CMQXMIcjs.videoShellQuote; exports.videoSkinProtectionEdits = videoSkinProtectionEdits; exports.videoSkinToneWeight = _chunkC6CMQXMIcjs.videoSkinToneWeight; exports.videoSlowMotionRamp = _chunkC6CMQXMIcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkC6CMQXMIcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeechRanges = videoSpeechRanges; exports.videoSpeedRampEdit = _chunkC6CMQXMIcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkC6CMQXMIcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkC6CMQXMIcjs.videoTextStyle; exports.videoTimeRef = videoTimeRef; exports.videoTimeRemapBreakpoints = _chunkC6CMQXMIcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkC6CMQXMIcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkC6CMQXMIcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkC6CMQXMIcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkC6CMQXMIcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkC6CMQXMIcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkC6CMQXMIcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkC6CMQXMIcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkC6CMQXMIcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkC6CMQXMIcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange; exports.withVideoPlayback = withVideoPlayback;
|
|
6480
|
+
exports.TranscriptVideoController = TranscriptVideoController; exports.VIDEO_ADJUSTMENT_SCOPES = _chunkIGPEBXUDcjs.VIDEO_ADJUSTMENT_SCOPES; exports.VIDEO_ADJUSTMENT_SCOPE_LABELS = VIDEO_ADJUSTMENT_SCOPE_LABELS; exports.VIDEO_BLEND_MODES = _chunkIGPEBXUDcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkIGPEBXUDcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkIGPEBXUDcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkIGPEBXUDcjs.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_DISFLUENCY_KINDS = VIDEO_DISFLUENCY_KINDS; exports.VIDEO_EASE_NAMES = _chunkIGPEBXUDcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkIGPEBXUDcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkIGPEBXUDcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkIGPEBXUDcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkIGPEBXUDcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkIGPEBXUDcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkIGPEBXUDcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkIGPEBXUDcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkIGPEBXUDcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LOUDNESS_HOP = VIDEO_LOUDNESS_HOP; exports.VIDEO_LUT_MAX_SIZE = _chunkIGPEBXUDcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_MASK_DEFAULTS = _chunkIGPEBXUDcjs.VIDEO_MASK_DEFAULTS; exports.VIDEO_MASK_SHAPES = _chunkIGPEBXUDcjs.VIDEO_MASK_SHAPES; exports.VIDEO_MASK_SHAPE_LABELS = VIDEO_MASK_SHAPE_LABELS; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkIGPEBXUDcjs.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 = _chunkIGPEBXUDcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkIGPEBXUDcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkIGPEBXUDcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkIGPEBXUDcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkIGPEBXUDcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkIGPEBXUDcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkIGPEBXUDcjs.allVideoClipIds; exports.allVideoTracks = _chunkIGPEBXUDcjs.allVideoTracks; exports.animationEasingToVideoEase = animationEasingToVideoEase; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkIGPEBXUDcjs.applyVideoGrade; exports.applyVideoLut = _chunkIGPEBXUDcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkIGPEBXUDcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkIGPEBXUDcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkIGPEBXUDcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkIGPEBXUDcjs.checkVideoTimeRemap; exports.createVideoDialogueToolProvider = createVideoDialogueToolProvider; exports.createVideoEditorDocument = createVideoEditorDocument; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoMusicToolProvider = createVideoMusicToolProvider; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoEditPlan = describeVideoEditPlan; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.detectVideoDisfluencies = detectVideoDisfluencies; exports.diffVideoProjects = diffVideoProjects; exports.drawVideoFrame = _chunkIGPEBXUDcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkIGPEBXUDcjs.ffmpegFilterValue; exports.findVideoAudioBeats = findVideoAudioBeats; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkIGPEBXUDcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkIGPEBXUDcjs.findVideoGaps; exports.findVideoRepetitions = findVideoRepetitions; exports.findVideoSequenceClip = _chunkIGPEBXUDcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkIGPEBXUDcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkIGPEBXUDcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkIGPEBXUDcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkIGPEBXUDcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkIGPEBXUDcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkIGPEBXUDcjs.isVideoKeyframes; exports.measureVideoLoudness = measureVideoLoudness; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkIGPEBXUDcjs.mixEffectPixels; exports.nearestVideoBeat = nearestVideoBeat; exports.nextFreeVideoSlot = _chunkIGPEBXUDcjs.nextFreeVideoSlot; exports.normalizeVideoClipMask = _chunkIGPEBXUDcjs.normalizeVideoClipMask; exports.normalizeVideoGrade = _chunkIGPEBXUDcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkIGPEBXUDcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.openVideoClipEffectAuthoring = openVideoClipEffectAuthoring; exports.overEffectPixels = _chunkIGPEBXUDcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoClipMask = parseVideoClipMask; exports.parseVideoCubeLut = _chunkIGPEBXUDcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkIGPEBXUDcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRef = parseVideoTimeRef; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkIGPEBXUDcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoEdits = planVideoEdits; exports.planVideoPrefetch = planVideoPrefetch; exports.planVideoToolPlayback = planVideoToolPlayback; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkIGPEBXUDcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkIGPEBXUDcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkIGPEBXUDcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkIGPEBXUDcjs.setVideoKey; exports.snapToVideoFrame = _chunkIGPEBXUDcjs.snapToVideoFrame; exports.snapVideoTime = _chunkIGPEBXUDcjs.snapVideoTime; exports.sortVideoKeys = _chunkIGPEBXUDcjs.sortVideoKeys; exports.sortedVideoClips = _chunkIGPEBXUDcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkIGPEBXUDcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkIGPEBXUDcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkIGPEBXUDcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkIGPEBXUDcjs.toVideoLoudnessMeasure; exports.videoAddAdjustmentEdits = videoAddAdjustmentEdits; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkIGPEBXUDcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkIGPEBXUDcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioLoudness = videoAudioLoudness; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoAuthorableEffects = videoAuthorableEffects; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkIGPEBXUDcjs.videoClipAfter; exports.videoClipAnimated = _chunkIGPEBXUDcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkIGPEBXUDcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkIGPEBXUDcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkIGPEBXUDcjs.videoClipBefore; exports.videoClipEffectDocument = videoClipEffectDocument; exports.videoClipEffectUses = _chunkIGPEBXUDcjs.videoClipEffectUses; exports.videoClipEnd = _chunkIGPEBXUDcjs.videoClipEnd; exports.videoClipHandles = _chunkIGPEBXUDcjs.videoClipHandles; exports.videoClipHeading = videoClipHeading; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkIGPEBXUDcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkIGPEBXUDcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkIGPEBXUDcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkIGPEBXUDcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkIGPEBXUDcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkIGPEBXUDcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipTypeLabel = _chunkIGPEBXUDcjs.videoClipTypeLabel; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkIGPEBXUDcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkIGPEBXUDcjs.videoContactSheetSvg; exports.videoCutsWithMargin = videoCutsWithMargin; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoDuckingKeys = videoDuckingKeys; exports.videoEaseBezier = _chunkIGPEBXUDcjs.videoEaseBezier; exports.videoEaseProgress = _chunkIGPEBXUDcjs.videoEaseProgress; exports.videoEaseToAnimationEasing = videoEaseToAnimationEasing; exports.videoEffectFrameTime = _chunkIGPEBXUDcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkIGPEBXUDcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkIGPEBXUDcjs.videoEffectValuesAt; exports.videoEffectValuesFromDocument = videoEffectValuesFromDocument; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkIGPEBXUDcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkIGPEBXUDcjs.videoFfmpegUnsupportedEffects; exports.videoFfmpegUnsupportedFeatures = _chunkIGPEBXUDcjs.videoFfmpegUnsupportedFeatures; exports.videoFrameAt = _chunkIGPEBXUDcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkIGPEBXUDcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkIGPEBXUDcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkIGPEBXUDcjs.videoFrameToSvg; exports.videoFrames = _chunkIGPEBXUDcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkIGPEBXUDcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkIGPEBXUDcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkIGPEBXUDcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkIGPEBXUDcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkIGPEBXUDcjs.videoGradeLook; exports.videoGradePreset = _chunkIGPEBXUDcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkIGPEBXUDcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkIGPEBXUDcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkIGPEBXUDcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkIGPEBXUDcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkIGPEBXUDcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkIGPEBXUDcjs.videoHourFrames; exports.videoIrisRadius = _chunkIGPEBXUDcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkIGPEBXUDcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkIGPEBXUDcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkIGPEBXUDcjs.videoKeysOf; exports.videoLayerMask = _chunkIGPEBXUDcjs.videoLayerMask; exports.videoLayersUseEffects = _chunkIGPEBXUDcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkIGPEBXUDcjs.videoLayersWithoutTransitionEffects; exports.videoLoudnessEnergy = videoLoudnessEnergy; exports.videoLoudnessGain = videoLoudnessGain; exports.videoLoudnessOf = videoLoudnessOf; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkIGPEBXUDcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkIGPEBXUDcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkIGPEBXUDcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkIGPEBXUDcjs.videoLutToCube; exports.videoMaskContains = _chunkIGPEBXUDcjs.videoMaskContains; exports.videoMaskEdit = videoMaskEdit; exports.videoMaskPolygon = _chunkIGPEBXUDcjs.videoMaskPolygon; exports.videoMaskSvgPath = _chunkIGPEBXUDcjs.videoMaskSvgPath; exports.videoOverlap = _chunkIGPEBXUDcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkIGPEBXUDcjs.videoProjectDuration; exports.videoProjectEffects = _chunkIGPEBXUDcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkIGPEBXUDcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkIGPEBXUDcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkIGPEBXUDcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkIGPEBXUDcjs.videoSequenceMap; exports.videoShellQuote = _chunkIGPEBXUDcjs.videoShellQuote; exports.videoSkinProtectionEdits = videoSkinProtectionEdits; exports.videoSkinToneWeight = _chunkIGPEBXUDcjs.videoSkinToneWeight; exports.videoSlowMotionRamp = _chunkIGPEBXUDcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkIGPEBXUDcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeechRanges = videoSpeechRanges; exports.videoSpeedRampEdit = _chunkIGPEBXUDcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkIGPEBXUDcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkIGPEBXUDcjs.videoTextStyle; exports.videoTimeRef = videoTimeRef; exports.videoTimeRemapBreakpoints = _chunkIGPEBXUDcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkIGPEBXUDcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkIGPEBXUDcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkIGPEBXUDcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkIGPEBXUDcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkIGPEBXUDcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkIGPEBXUDcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkIGPEBXUDcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkIGPEBXUDcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkIGPEBXUDcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange; exports.withVideoPlayback = withVideoPlayback;
|