@pixerate/editor 0.86.0 → 0.87.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/video-editor/index.cjs +505 -48
- package/dist/video-editor/index.cjs.map +1 -1
- package/dist/video-editor/index.d.cts +243 -1
- package/dist/video-editor/index.d.ts +243 -1
- package/dist/video-editor/index.js +463 -6
- package/dist/video-editor/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/pixerate-video-editor/SKILL.md +12 -0
|
@@ -1038,6 +1038,223 @@ declare function videoGradeSvgDefs(grade: VideoGrade | undefined): {
|
|
|
1038
1038
|
/** A grade as ffmpeg filters on RGB, in order: `lutrgb` for exposure and contrast, `colorchannelmixer` for the rest. */
|
|
1039
1039
|
declare function videoGradeFfmpegFilters(grade: VideoGrade | undefined): string[];
|
|
1040
1040
|
|
|
1041
|
+
/**
|
|
1042
|
+
* Colour scopes: a histogram, a luma waveform and a vectorscope, worked out from a frame's pixels,
|
|
1043
|
+
* plus exposure and clipping figures. Pure functions on RGBA pixels as `ImageData` holds them, so
|
|
1044
|
+
* the same numbers come from a preview canvas, a decoded export frame or a test.
|
|
1045
|
+
*
|
|
1046
|
+
* Luma and chroma use the Rec. 709 weights on the gamma-encoded values (Y′, Cb, Cr), as broadcast
|
|
1047
|
+
* scopes do: luma 0 is black and 1 white; Cb and Cr run from −0.5 to 0.5.
|
|
1048
|
+
*/
|
|
1049
|
+
/** RGBA pixels, 4 values (0–255) a pixel, rows top to bottom: an `ImageData` fits. */
|
|
1050
|
+
interface VideoPixels {
|
|
1051
|
+
width: number;
|
|
1052
|
+
height: number;
|
|
1053
|
+
data: ArrayLike<number>;
|
|
1054
|
+
}
|
|
1055
|
+
type VideoScopeKind = 'histogram' | 'waveform' | 'vectorscope';
|
|
1056
|
+
declare const VIDEO_SCOPE_KINDS: readonly ["histogram", "waveform", "vectorscope"];
|
|
1057
|
+
/** Rec. 709 luma of gamma-encoded RGB (each 0–1). */
|
|
1058
|
+
declare const videoLuma: (r: number, g: number, b: number) => number;
|
|
1059
|
+
/** Rec. 709 chroma (Cb, Cr), each −0.5 to 0.5, of gamma-encoded RGB (each 0–1). */
|
|
1060
|
+
declare function videoChroma(r: number, g: number, b: number): [number, number];
|
|
1061
|
+
interface VideoScopeOptions {
|
|
1062
|
+
/**
|
|
1063
|
+
* Read at most about this many pixels, evenly spaced (default 262 144, a 512 × 512 picture), so
|
|
1064
|
+
* a large frame costs no more than a small one. Counts are of the pixels read.
|
|
1065
|
+
*/
|
|
1066
|
+
maxPixels?: number;
|
|
1067
|
+
}
|
|
1068
|
+
/** How many pixels fall in each of `bins` equal steps of red, green, blue and luma (bin 0 is darkest). */
|
|
1069
|
+
interface VideoHistogram {
|
|
1070
|
+
bins: number;
|
|
1071
|
+
r: number[];
|
|
1072
|
+
g: number[];
|
|
1073
|
+
b: number[];
|
|
1074
|
+
luma: number[];
|
|
1075
|
+
/** Pixels counted. */
|
|
1076
|
+
total: number;
|
|
1077
|
+
}
|
|
1078
|
+
declare function videoHistogram(pixels: VideoPixels, options?: VideoScopeOptions & {
|
|
1079
|
+
bins?: number;
|
|
1080
|
+
}): VideoHistogram;
|
|
1081
|
+
/**
|
|
1082
|
+
* A luma waveform: the picture split into `columns` vertical strips, left to right, each counting
|
|
1083
|
+
* its pixels at each of `levels` luma steps. `data[column * levels + level]`; level 0 is black.
|
|
1084
|
+
*/
|
|
1085
|
+
interface VideoWaveform {
|
|
1086
|
+
columns: number;
|
|
1087
|
+
levels: number;
|
|
1088
|
+
data: Uint32Array;
|
|
1089
|
+
/** The largest count, for scaling a drawing. */
|
|
1090
|
+
peak: number;
|
|
1091
|
+
}
|
|
1092
|
+
declare function videoLumaWaveform(pixels: VideoPixels, options?: VideoScopeOptions & {
|
|
1093
|
+
columns?: number;
|
|
1094
|
+
levels?: number;
|
|
1095
|
+
}): VideoWaveform;
|
|
1096
|
+
/**
|
|
1097
|
+
* A vectorscope: pixels counted on a `size` × `size` grid by chroma, Cb across (left −0.5, right
|
|
1098
|
+
* +0.5) and Cr up (top +0.5). The centre is grey; the further out, the more saturated; the angle
|
|
1099
|
+
* is the hue. `data[row * size + column]`.
|
|
1100
|
+
*/
|
|
1101
|
+
interface VideoVectorscope {
|
|
1102
|
+
size: number;
|
|
1103
|
+
data: Uint32Array;
|
|
1104
|
+
peak: number;
|
|
1105
|
+
}
|
|
1106
|
+
/** Where chroma (Cb, Cr) falls on a vectorscope of `size` pixels, as `[column, row]`. */
|
|
1107
|
+
declare const videoVectorscopePoint: (cb: number, cr: number, size: number) => [number, number];
|
|
1108
|
+
declare function videoVectorscope(pixels: VideoPixels, options?: VideoScopeOptions & {
|
|
1109
|
+
size?: number;
|
|
1110
|
+
}): VideoVectorscope;
|
|
1111
|
+
/** Exposure and colour figures for a frame (see `videoExposureStats`). Luma and levels run 0–1. */
|
|
1112
|
+
interface VideoExposureStats {
|
|
1113
|
+
/** Pixels read. */
|
|
1114
|
+
pixels: number;
|
|
1115
|
+
luma: {
|
|
1116
|
+
mean: number;
|
|
1117
|
+
median: number;
|
|
1118
|
+
min: number;
|
|
1119
|
+
max: number;
|
|
1120
|
+
p1: number;
|
|
1121
|
+
p99: number;
|
|
1122
|
+
};
|
|
1123
|
+
/** Share (0–1) of pixels crushed to black (luma at or below `shadowLevel`) or blown to white (at or above `highlightLevel`). */
|
|
1124
|
+
clipped: {
|
|
1125
|
+
shadows: number;
|
|
1126
|
+
highlights: number;
|
|
1127
|
+
r: number;
|
|
1128
|
+
g: number;
|
|
1129
|
+
b: number;
|
|
1130
|
+
};
|
|
1131
|
+
/** Mean and highest chroma, 0 (grey) to 1 (a full primary). */
|
|
1132
|
+
saturation: {
|
|
1133
|
+
mean: number;
|
|
1134
|
+
max: number;
|
|
1135
|
+
};
|
|
1136
|
+
/** The mean colour as `#rrggbb`: far from grey means a colour cast. */
|
|
1137
|
+
average: string;
|
|
1138
|
+
}
|
|
1139
|
+
interface VideoExposureOptions extends VideoScopeOptions {
|
|
1140
|
+
/** Luma (0–1) at or below which a pixel counts as crushed (default 0.02). */
|
|
1141
|
+
shadowLevel?: number;
|
|
1142
|
+
/** Luma or channel (0–1) at or above which a pixel counts as blown (default 0.98). */
|
|
1143
|
+
highlightLevel?: number;
|
|
1144
|
+
}
|
|
1145
|
+
declare function videoExposureStats(pixels: VideoPixels, options?: VideoExposureOptions): VideoExposureStats;
|
|
1146
|
+
/** What a scope reading says in words: exposure, clipping and colour cast worth fixing. */
|
|
1147
|
+
declare function videoExposureNotes(stats: VideoExposureStats): string[];
|
|
1148
|
+
/** A compact reading of a frame for agents: exposure figures, notes, and coarse histogram, waveform and vectorscope summaries. */
|
|
1149
|
+
interface VideoScopeSummary {
|
|
1150
|
+
stats: VideoExposureStats;
|
|
1151
|
+
notes: string[];
|
|
1152
|
+
/** Share of pixels (0–1) in each of `bins` equal luma and channel steps, darkest first. */
|
|
1153
|
+
histogram: {
|
|
1154
|
+
bins: number;
|
|
1155
|
+
luma: number[];
|
|
1156
|
+
r: number[];
|
|
1157
|
+
g: number[];
|
|
1158
|
+
b: number[];
|
|
1159
|
+
};
|
|
1160
|
+
/** The picture in vertical strips, left to right: each strip's luma spread (0–1). */
|
|
1161
|
+
waveform: {
|
|
1162
|
+
start: number;
|
|
1163
|
+
end: number;
|
|
1164
|
+
min: number;
|
|
1165
|
+
median: number;
|
|
1166
|
+
max: number;
|
|
1167
|
+
}[];
|
|
1168
|
+
/** The chroma of the most saturated tenth of the picture: its main hue (degrees on the vectorscope, red ≈ 103°) and strength (0–1). */
|
|
1169
|
+
vectorscope: {
|
|
1170
|
+
hue: number | null;
|
|
1171
|
+
strength: number;
|
|
1172
|
+
spread: number;
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
/** Vectorscope angle (degrees, anticlockwise from +Cb) of chroma. */
|
|
1176
|
+
declare const videoVectorscopeAngle: (cb: number, cr: number) => number;
|
|
1177
|
+
declare function summarizeVideoScopes(pixels: VideoPixels, options?: VideoExposureOptions & {
|
|
1178
|
+
bins?: number;
|
|
1179
|
+
columns?: number;
|
|
1180
|
+
}): VideoScopeSummary;
|
|
1181
|
+
/** Where the six 75% colour-bar targets sit on a vectorscope: name, Cb and Cr. */
|
|
1182
|
+
declare const VIDEO_VECTORSCOPE_TARGETS: readonly {
|
|
1183
|
+
name: string;
|
|
1184
|
+
rgb: [number, number, number];
|
|
1185
|
+
cb: number;
|
|
1186
|
+
cr: number;
|
|
1187
|
+
}[];
|
|
1188
|
+
/** RGBA pixels of a drawn scope, ready for `new ImageData(data, width, height)`. */
|
|
1189
|
+
interface VideoScopeImage {
|
|
1190
|
+
width: number;
|
|
1191
|
+
height: number;
|
|
1192
|
+
data: Uint8ClampedArray<ArrayBuffer>;
|
|
1193
|
+
}
|
|
1194
|
+
/** A histogram drawn `width` × `height`: red, green and blue added together, with luma as a white outline. */
|
|
1195
|
+
declare function videoHistogramImage(h: VideoHistogram, width?: number, height?: number): VideoScopeImage;
|
|
1196
|
+
/** A luma waveform drawn `width` × `height`: white at the top, black at the bottom, lines at each quarter. */
|
|
1197
|
+
declare function videoWaveformImage(w: VideoWaveform, width?: number, height?: number): VideoScopeImage;
|
|
1198
|
+
/** A vectorscope drawn `size` × `size`, with its outer circle, the skin-tone line and the colour-bar targets. */
|
|
1199
|
+
declare function videoVectorscopeImage(v: VideoVectorscope, size?: number): VideoScopeImage;
|
|
1200
|
+
/** One scope of a frame drawn `width` × `height` (a vectorscope is square: the smaller side). */
|
|
1201
|
+
declare function videoScopeImage(kind: VideoScopeKind, pixels: VideoPixels, width?: number, height?: number, options?: VideoScopeOptions): VideoScopeImage;
|
|
1202
|
+
/** A frame the preview drew: when, whether every picture in it had loaded, and its pixels. */
|
|
1203
|
+
interface VideoPreviewSnapshot {
|
|
1204
|
+
time: number;
|
|
1205
|
+
/** False while a picture is still loading or seeking (the frame shows a placeholder or a stale picture). */
|
|
1206
|
+
complete: boolean;
|
|
1207
|
+
pixels: VideoPixels;
|
|
1208
|
+
}
|
|
1209
|
+
/**
|
|
1210
|
+
* Where a preview's pixels can be read, for scopes and agents: a `VideoPreviewEngine` attaches its
|
|
1211
|
+
* canvas and says each time it draws. `VideoEditorController.previewPixels` is one, so a preview,
|
|
1212
|
+
* a scopes panel and the agent tools of one editor find each other without wiring.
|
|
1213
|
+
*/
|
|
1214
|
+
declare class VideoPreviewPixels {
|
|
1215
|
+
private reader;
|
|
1216
|
+
private drawnAt;
|
|
1217
|
+
private readonly listeners;
|
|
1218
|
+
/** Gives the canvas to read (the latest preview wins). Returns a function that takes it away again. */
|
|
1219
|
+
attach(reader: () => VideoPreviewSnapshot | null): () => void;
|
|
1220
|
+
/** Whether a preview is attached. */
|
|
1221
|
+
get attached(): boolean;
|
|
1222
|
+
/** The preview drew the frame at `time`; `complete` is false while a picture was missing or stale. */
|
|
1223
|
+
drawn(time: number, complete: boolean): void;
|
|
1224
|
+
/** The last frame drawn, with its pixels; `null` without a preview. Throws when the canvas cannot be read. */
|
|
1225
|
+
read(): VideoPreviewSnapshot | null;
|
|
1226
|
+
/** Called after each frame the preview draws. */
|
|
1227
|
+
subscribe(listener: () => void): () => void;
|
|
1228
|
+
/**
|
|
1229
|
+
* The frame at `time` once it is complete: now, if the last frame drawn was it, else the next
|
|
1230
|
+
* complete drawing of it. Fails after `timeout` ms (default 5000).
|
|
1231
|
+
*/
|
|
1232
|
+
next(time: number, timeout?: number): Promise<VideoPreviewSnapshot>;
|
|
1233
|
+
private emit;
|
|
1234
|
+
}
|
|
1235
|
+
/** What a scopes panel shows for the preview's latest frame (see `readVideoScopesPanel`). */
|
|
1236
|
+
type VideoScopesPanelReading = {
|
|
1237
|
+
ok: true;
|
|
1238
|
+
time: number;
|
|
1239
|
+
complete: boolean;
|
|
1240
|
+
images: Partial<Record<VideoScopeKind, VideoScopeImage>>;
|
|
1241
|
+
stats: VideoExposureStats;
|
|
1242
|
+
notes: string[];
|
|
1243
|
+
} | {
|
|
1244
|
+
ok: false;
|
|
1245
|
+
message: string;
|
|
1246
|
+
};
|
|
1247
|
+
/**
|
|
1248
|
+
* The preview's latest frame as a scopes panel draws it: an image per scope `kinds`, each
|
|
1249
|
+
* `width` × `height` (vectorscopes square), and the exposure figures. Reads at most `maxPixels`
|
|
1250
|
+
* (default 65 536) so it keeps up with playback. Says why when there is nothing to show.
|
|
1251
|
+
*/
|
|
1252
|
+
declare function readVideoScopesPanel(feed: VideoPreviewPixels, kinds?: readonly VideoScopeKind[], options?: {
|
|
1253
|
+
width?: number;
|
|
1254
|
+
height?: number;
|
|
1255
|
+
maxPixels?: number;
|
|
1256
|
+
}): VideoScopesPanelReading;
|
|
1257
|
+
|
|
1041
1258
|
/** Default length of an entrance or exit animation (ms). */
|
|
1042
1259
|
declare const VIDEO_CLIP_ANIMATION_DURATION = 500;
|
|
1043
1260
|
declare const PROPS: readonly ["opacity", "x", "y", "scale"];
|
|
@@ -1354,6 +1571,8 @@ interface VideoPreviewSource {
|
|
|
1354
1571
|
playing: boolean;
|
|
1355
1572
|
};
|
|
1356
1573
|
subscribe(listener: () => void): () => void;
|
|
1574
|
+
/** Where to publish the drawn pixels (a controller has one), for scopes and agents. */
|
|
1575
|
+
previewPixels?: VideoPreviewPixels;
|
|
1357
1576
|
}
|
|
1358
1577
|
/** The parts of a media element the preview drives (so tests can pass fakes). */
|
|
1359
1578
|
interface VideoPreviewMedia {
|
|
@@ -1363,6 +1582,8 @@ interface VideoPreviewMedia {
|
|
|
1363
1582
|
volume: number;
|
|
1364
1583
|
muted: boolean;
|
|
1365
1584
|
paused: boolean;
|
|
1585
|
+
/** True while a seek is under way (the element still shows the old frame). */
|
|
1586
|
+
seeking?: boolean;
|
|
1366
1587
|
readyState: number;
|
|
1367
1588
|
preload: string;
|
|
1368
1589
|
play(): Promise<void> | void;
|
|
@@ -1394,6 +1615,11 @@ interface VideoPreviewOptions {
|
|
|
1394
1615
|
* it. Default: a hidden `<svg>` added to `document.body`. `null` leaves white balance out.
|
|
1395
1616
|
*/
|
|
1396
1617
|
defineSvgFilter?: ((id: string, markup: string) => void) | null;
|
|
1618
|
+
/**
|
|
1619
|
+
* Where to publish the canvas's pixels after each frame, for scopes and the `get_video_scopes`
|
|
1620
|
+
* tool (default: the source's `previewPixels`). `null` publishes nothing.
|
|
1621
|
+
*/
|
|
1622
|
+
pixels?: VideoPreviewPixels | null;
|
|
1397
1623
|
}
|
|
1398
1624
|
/**
|
|
1399
1625
|
* Plays a project in the browser: keeps one `<video>` or `<audio>` element per playing clip in step
|
|
@@ -1413,12 +1639,18 @@ declare class VideoPreviewEngine {
|
|
|
1413
1639
|
private destroyed;
|
|
1414
1640
|
private filterHost;
|
|
1415
1641
|
private readonly filters;
|
|
1642
|
+
private readonly detachPixels;
|
|
1643
|
+
private readonly pixelsTarget;
|
|
1644
|
+
private drawn;
|
|
1645
|
+
private complete;
|
|
1416
1646
|
constructor(source: VideoPreviewSource, canvas: {
|
|
1417
1647
|
width: number;
|
|
1418
1648
|
height: number;
|
|
1419
1649
|
clientWidth?: number;
|
|
1420
1650
|
getContext?: (id: '2d') => unknown;
|
|
1421
1651
|
}, options?: VideoPreviewOptions);
|
|
1652
|
+
/** The canvas's pixels and the frame they show, or `null` when its context cannot be read. */
|
|
1653
|
+
readPixels(): VideoPreviewSnapshot | null;
|
|
1422
1654
|
private createMedia;
|
|
1423
1655
|
private image;
|
|
1424
1656
|
private entry;
|
|
@@ -1487,6 +1719,8 @@ declare class VideoEditorController {
|
|
|
1487
1719
|
readonly player: AnimationPlayer;
|
|
1488
1720
|
/** Sound levels per asset, loaded on demand for waveforms and agents. */
|
|
1489
1721
|
readonly audioPeaks: VideoAudioPeaksCache;
|
|
1722
|
+
/** The pixels the preview last drew, for scopes and `get_video_scopes` (a `VideoPreviewEngine` fills it). */
|
|
1723
|
+
readonly previewPixels: VideoPreviewPixels;
|
|
1490
1724
|
private project;
|
|
1491
1725
|
private issues;
|
|
1492
1726
|
private selection;
|
|
@@ -1587,6 +1821,14 @@ interface VideoEditorToolProviderOptions {
|
|
|
1587
1821
|
data: string;
|
|
1588
1822
|
mimeType: string;
|
|
1589
1823
|
};
|
|
1824
|
+
/**
|
|
1825
|
+
* The rendered pixels of the frame at `time` (ms), for `get_video_scopes` (e.g. a frame decoded
|
|
1826
|
+
* by ffmpeg on a server). Default: what the editor's `<VideoPreview>` draws, through
|
|
1827
|
+
* `controller.previewPixels`, seeking it there and back when `time` is not the playhead.
|
|
1828
|
+
*/
|
|
1829
|
+
framePixels?: (time: number) => VideoPixels | null | Promise<VideoPixels | null>;
|
|
1830
|
+
/** How long `get_video_scopes` waits for the preview to finish drawing a frame (ms, default 5000). */
|
|
1831
|
+
framePixelsTimeout?: number;
|
|
1590
1832
|
}
|
|
1591
1833
|
/** A project as agents see it: settings, assets, and each track's clips in order with their times. */
|
|
1592
1834
|
declare function describeVideoProject(project: VideoProject): {
|
|
@@ -1841,4 +2083,4 @@ declare function videoKeyframeValueEdit(project: VideoProject, clipId: string, p
|
|
|
1841
2083
|
*/
|
|
1842
2084
|
declare function videoKeyframeToggleEdit(project: VideoProject, clipId: string, property: VideoKeyframeProperty, time: number): VideoEdit | null;
|
|
1843
2085
|
|
|
1844
|
-
export { type CreateVideoProjectOptions, type NewVideoClip, VIDEO_BLEND_MODES, VIDEO_BLEND_MODE_LABELS, VIDEO_CLIP_ANIMATION_DURATION, VIDEO_CLIP_ANIMATION_EFFECTS, VIDEO_CLIP_ANIMATION_LABELS, VIDEO_CLIP_TYPES, VIDEO_DEFAULT_FILLERS, VIDEO_DEFAULT_STILL_DURATION, VIDEO_DEFAULT_TITLE_DURATION, VIDEO_EASE_NAMES, VIDEO_EDIT_OPS, VIDEO_FADE_CURVES, VIDEO_FADE_CURVE_LABELS, VIDEO_FITS, VIDEO_GRADE_CONTROLS, VIDEO_GRADE_PRESETS, VIDEO_GRADE_PRESET_NAMES, VIDEO_ISSUE_CODES, VIDEO_KEYFRAME_LIMITS, VIDEO_KEYFRAME_PROPERTIES, VIDEO_PEAK_BLOCK, VIDEO_PLACEMENT_MODES, VIDEO_TIME_EPSILON, VIDEO_TRANSFORM_PROPERTIES, VIDEO_TRANSITION_LABELS, VIDEO_TRANSITION_TYPES, VIDEO_WIPE_DIRECTIONS, type VideoAnimatable, type VideoAsset, type VideoAssetKind, type VideoAudioLevel, type VideoAudioPeaks, VideoAudioPeaksCache, type VideoAudioPeaksLoader, type VideoAudioSource, type VideoBlendMode, type VideoCanvasContext, type VideoClip, type VideoClipAnimation, type VideoClipAnimationEffect, type VideoClipDragInput, type VideoClipDragMode, type VideoClipDragPlan, type VideoClipLocation, type VideoClipType, type VideoColorClip, type VideoEase, type VideoEdit, type VideoEditOp, type VideoEditOutcome, type VideoEditResult, VideoEditorController, type VideoEditorOptions, type VideoEditorState, type VideoEditorToolProviderOptions, type VideoEdlOptions, type VideoFadeCurve, type VideoFfmpegExport, type VideoFfmpegOptions, type VideoFit, type VideoFrame, type VideoGap, type VideoGrade, type VideoGradeControl, type VideoGradePreset, type VideoGradeStep, type VideoIssue, type VideoIssueCode, type VideoIssueSeverity, type VideoKey, type VideoKeyframeProperty, type VideoKeyframeRow, type VideoKeyframes, type VideoLayer, type VideoLoudnessMeasurement, type VideoLoudnessTarget, type VideoMarker, type VideoMediaClip, type VideoMediaProbe, type VideoPauseOptions, type VideoPlacementMode, VideoPreviewEngine, type VideoPreviewImage, type VideoPreviewMedia, type VideoPreviewOptions, type VideoPreviewSource, type VideoProject, type VideoRect, type VideoRulerTick, type VideoSilenceOptions, type VideoSnapOptions, type VideoSpeedSegment, type VideoSvgOptions, type VideoTextClip, type VideoTimelineWord, type VideoTrack, type VideoTrackKind, type VideoTranscriptRange, type VideoTranscriptWord, type VideoTransform, type VideoTransition, type VideoTransitionType, type VideoWaveformMode, type VideoWipeDirection, allVideoClipIds, applyVideoEdits, applyVideoGrade, buildVideoAudioPeaks, checkVideoProject, checkVideoTimeRemap, createVideoEditorToolProvider, createVideoProject, decodeVideoAudioPeaks, describeVideoProject, drawVideoFrame, ffmpegFilterValue, findVideoAudioSilences, findVideoClip, findVideoFillers, findVideoGaps, findVideoTranscriptPauses, findVideoTranscriptText, formatVideoSeconds, formatVideoTimecode, formatVideoTimecodeFrames, isVideoDropFrameRate, isVideoKeyframes, mergeVideoRanges, nextFreeVideoSlot, normalizeVideoGrade, normalizeVideoWord, parseVideoAnimatable, parseVideoAsset, parseVideoClip, parseVideoClipAnimation, parseVideoGrade, parseVideoKeyframes, parseVideoLoudnessMeasurement, parseVideoMarker, parseVideoProject, parseVideoTimeRemap, parseVideoTrack, parseVideoTranscript, parseVideoTranscriptWords, parseVideoTransform, parseVideoTransition, placeVideoRect, planVideoClipDrag, probeVideoMedia, removeVideoKey, retimeVideoAnimatable, setVideoKey, snapToVideoFrame, snapVideoTime, sortVideoKeys, sortedVideoClips, splitVideoAnimatable, toVideoEdl, toVideoFfmpeg, toVideoLoudnessMeasure, videoAssetDropEdit, videoAssetHasSound, videoAssetKindOf, videoAssetMap, videoAudioLevels, videoAudioPeakRange, videoAudioPeakSpans, videoAudioPeaksDuration, videoClipAfter, videoClipAnimated, videoClipAnimationProperties, videoClipAnimationSpans, videoClipBefore, videoClipEnd, videoClipHandles, videoClipKeyframes, videoClipLabel, videoClipOverhang, videoClipShowsWaveform, videoClipSoundGain, videoClipSourceRange, videoClipSourceTime, videoClipSpeed, videoClipSpeedAt, videoClipTint, videoClipWaveform, videoClipWaveformPath, videoClipsAt, videoContactSheetSvg, videoDragLabel, videoDropTracks, videoEaseBezier, videoEaseProgress, videoFadeCurveGain, videoFrameAt, videoFrameDuration, videoFrameToSvg, videoFrames, videoFreezeFrameEdit, videoGradeCssFilter, videoGradeFfmpegFilters, videoGradeGainsFilterId, videoGradePreset, videoGradeStepMatrix, videoGradeStepSvgValues, videoGradeSteps, videoGradeSvgDefs, videoGradeSvgFilter, videoHourFrames, videoIrisRadius, videoIssueKey, videoKeyframeBreakpoints, videoKeyframeFfmpegExpr, videoKeyframeRows, videoKeyframeToggleEdit, videoKeyframeValueEdit, videoKeysOf, videoOverlap, videoPeakDb, videoProjectDuration, videoProjectSvg, videoRemoveRangesEdits, videoRulerTicks, videoSlowMotionRamp, videoSnapPoints, videoSpeedRampEdit, videoSpeedRampKeys, videoTextStyle, videoTimeRemapBreakpoints, videoTimeRemapSpan, videoTimecodeFrames, videoTimelineTranscript, videoTitleFrame, videoTrackSyncLocked, videoTranscriptEdit, videoTranscriptTrack, videoTransformAt, videoTransitionAudioCurve, videoTransitionEase, videoTransitionHasDirection, videoValueAt, videoWaveformPath, videoWipeRect, videoWordAt, videoWordsRange };
|
|
2086
|
+
export { type CreateVideoProjectOptions, type NewVideoClip, VIDEO_BLEND_MODES, VIDEO_BLEND_MODE_LABELS, VIDEO_CLIP_ANIMATION_DURATION, VIDEO_CLIP_ANIMATION_EFFECTS, VIDEO_CLIP_ANIMATION_LABELS, VIDEO_CLIP_TYPES, VIDEO_DEFAULT_FILLERS, VIDEO_DEFAULT_STILL_DURATION, VIDEO_DEFAULT_TITLE_DURATION, VIDEO_EASE_NAMES, VIDEO_EDIT_OPS, VIDEO_FADE_CURVES, VIDEO_FADE_CURVE_LABELS, VIDEO_FITS, VIDEO_GRADE_CONTROLS, VIDEO_GRADE_PRESETS, VIDEO_GRADE_PRESET_NAMES, VIDEO_ISSUE_CODES, VIDEO_KEYFRAME_LIMITS, VIDEO_KEYFRAME_PROPERTIES, VIDEO_PEAK_BLOCK, VIDEO_PLACEMENT_MODES, VIDEO_SCOPE_KINDS, VIDEO_TIME_EPSILON, VIDEO_TRANSFORM_PROPERTIES, VIDEO_TRANSITION_LABELS, VIDEO_TRANSITION_TYPES, VIDEO_VECTORSCOPE_TARGETS, VIDEO_WIPE_DIRECTIONS, type VideoAnimatable, type VideoAsset, type VideoAssetKind, type VideoAudioLevel, type VideoAudioPeaks, VideoAudioPeaksCache, type VideoAudioPeaksLoader, type VideoAudioSource, type VideoBlendMode, type VideoCanvasContext, type VideoClip, type VideoClipAnimation, type VideoClipAnimationEffect, type VideoClipDragInput, type VideoClipDragMode, type VideoClipDragPlan, type VideoClipLocation, type VideoClipType, type VideoColorClip, type VideoEase, type VideoEdit, type VideoEditOp, type VideoEditOutcome, type VideoEditResult, VideoEditorController, type VideoEditorOptions, type VideoEditorState, type VideoEditorToolProviderOptions, type VideoEdlOptions, type VideoExposureOptions, type VideoExposureStats, type VideoFadeCurve, type VideoFfmpegExport, type VideoFfmpegOptions, type VideoFit, type VideoFrame, type VideoGap, type VideoGrade, type VideoGradeControl, type VideoGradePreset, type VideoGradeStep, type VideoHistogram, type VideoIssue, type VideoIssueCode, type VideoIssueSeverity, type VideoKey, type VideoKeyframeProperty, type VideoKeyframeRow, type VideoKeyframes, type VideoLayer, type VideoLoudnessMeasurement, type VideoLoudnessTarget, type VideoMarker, type VideoMediaClip, type VideoMediaProbe, type VideoPauseOptions, type VideoPixels, type VideoPlacementMode, VideoPreviewEngine, type VideoPreviewImage, type VideoPreviewMedia, type VideoPreviewOptions, VideoPreviewPixels, type VideoPreviewSnapshot, type VideoPreviewSource, type VideoProject, type VideoRect, type VideoRulerTick, type VideoScopeImage, type VideoScopeKind, type VideoScopeOptions, type VideoScopeSummary, type VideoScopesPanelReading, type VideoSilenceOptions, type VideoSnapOptions, type VideoSpeedSegment, type VideoSvgOptions, type VideoTextClip, type VideoTimelineWord, type VideoTrack, type VideoTrackKind, type VideoTranscriptRange, type VideoTranscriptWord, type VideoTransform, type VideoTransition, type VideoTransitionType, type VideoVectorscope, type VideoWaveform, type VideoWaveformMode, type VideoWipeDirection, allVideoClipIds, applyVideoEdits, applyVideoGrade, buildVideoAudioPeaks, checkVideoProject, checkVideoTimeRemap, createVideoEditorToolProvider, createVideoProject, decodeVideoAudioPeaks, describeVideoProject, drawVideoFrame, ffmpegFilterValue, findVideoAudioSilences, findVideoClip, findVideoFillers, findVideoGaps, findVideoTranscriptPauses, findVideoTranscriptText, formatVideoSeconds, formatVideoTimecode, formatVideoTimecodeFrames, isVideoDropFrameRate, isVideoKeyframes, mergeVideoRanges, nextFreeVideoSlot, normalizeVideoGrade, normalizeVideoWord, parseVideoAnimatable, parseVideoAsset, parseVideoClip, parseVideoClipAnimation, parseVideoGrade, parseVideoKeyframes, parseVideoLoudnessMeasurement, parseVideoMarker, parseVideoProject, parseVideoTimeRemap, parseVideoTrack, parseVideoTranscript, parseVideoTranscriptWords, parseVideoTransform, parseVideoTransition, placeVideoRect, planVideoClipDrag, probeVideoMedia, readVideoScopesPanel, removeVideoKey, retimeVideoAnimatable, setVideoKey, snapToVideoFrame, snapVideoTime, sortVideoKeys, sortedVideoClips, splitVideoAnimatable, summarizeVideoScopes, toVideoEdl, toVideoFfmpeg, toVideoLoudnessMeasure, videoAssetDropEdit, videoAssetHasSound, videoAssetKindOf, videoAssetMap, videoAudioLevels, videoAudioPeakRange, videoAudioPeakSpans, videoAudioPeaksDuration, videoChroma, videoClipAfter, videoClipAnimated, videoClipAnimationProperties, videoClipAnimationSpans, videoClipBefore, videoClipEnd, videoClipHandles, videoClipKeyframes, videoClipLabel, videoClipOverhang, videoClipShowsWaveform, videoClipSoundGain, videoClipSourceRange, videoClipSourceTime, videoClipSpeed, videoClipSpeedAt, videoClipTint, videoClipWaveform, videoClipWaveformPath, videoClipsAt, videoContactSheetSvg, videoDragLabel, videoDropTracks, videoEaseBezier, videoEaseProgress, videoExposureNotes, videoExposureStats, videoFadeCurveGain, videoFrameAt, videoFrameDuration, videoFrameToSvg, videoFrames, videoFreezeFrameEdit, videoGradeCssFilter, videoGradeFfmpegFilters, videoGradeGainsFilterId, videoGradePreset, videoGradeStepMatrix, videoGradeStepSvgValues, videoGradeSteps, videoGradeSvgDefs, videoGradeSvgFilter, videoHistogram, videoHistogramImage, videoHourFrames, videoIrisRadius, videoIssueKey, videoKeyframeBreakpoints, videoKeyframeFfmpegExpr, videoKeyframeRows, videoKeyframeToggleEdit, videoKeyframeValueEdit, videoKeysOf, videoLuma, videoLumaWaveform, videoOverlap, videoPeakDb, videoProjectDuration, videoProjectSvg, videoRemoveRangesEdits, videoRulerTicks, videoScopeImage, videoSlowMotionRamp, videoSnapPoints, videoSpeedRampEdit, videoSpeedRampKeys, videoTextStyle, videoTimeRemapBreakpoints, videoTimeRemapSpan, videoTimecodeFrames, videoTimelineTranscript, videoTitleFrame, videoTrackSyncLocked, videoTranscriptEdit, videoTranscriptTrack, videoTransformAt, videoTransitionAudioCurve, videoTransitionEase, videoTransitionHasDirection, videoValueAt, videoVectorscope, videoVectorscopeAngle, videoVectorscopeImage, videoVectorscopePoint, videoWaveformImage, videoWaveformPath, videoWipeRect, videoWordAt, videoWordsRange };
|
|
@@ -1038,6 +1038,223 @@ declare function videoGradeSvgDefs(grade: VideoGrade | undefined): {
|
|
|
1038
1038
|
/** A grade as ffmpeg filters on RGB, in order: `lutrgb` for exposure and contrast, `colorchannelmixer` for the rest. */
|
|
1039
1039
|
declare function videoGradeFfmpegFilters(grade: VideoGrade | undefined): string[];
|
|
1040
1040
|
|
|
1041
|
+
/**
|
|
1042
|
+
* Colour scopes: a histogram, a luma waveform and a vectorscope, worked out from a frame's pixels,
|
|
1043
|
+
* plus exposure and clipping figures. Pure functions on RGBA pixels as `ImageData` holds them, so
|
|
1044
|
+
* the same numbers come from a preview canvas, a decoded export frame or a test.
|
|
1045
|
+
*
|
|
1046
|
+
* Luma and chroma use the Rec. 709 weights on the gamma-encoded values (Y′, Cb, Cr), as broadcast
|
|
1047
|
+
* scopes do: luma 0 is black and 1 white; Cb and Cr run from −0.5 to 0.5.
|
|
1048
|
+
*/
|
|
1049
|
+
/** RGBA pixels, 4 values (0–255) a pixel, rows top to bottom: an `ImageData` fits. */
|
|
1050
|
+
interface VideoPixels {
|
|
1051
|
+
width: number;
|
|
1052
|
+
height: number;
|
|
1053
|
+
data: ArrayLike<number>;
|
|
1054
|
+
}
|
|
1055
|
+
type VideoScopeKind = 'histogram' | 'waveform' | 'vectorscope';
|
|
1056
|
+
declare const VIDEO_SCOPE_KINDS: readonly ["histogram", "waveform", "vectorscope"];
|
|
1057
|
+
/** Rec. 709 luma of gamma-encoded RGB (each 0–1). */
|
|
1058
|
+
declare const videoLuma: (r: number, g: number, b: number) => number;
|
|
1059
|
+
/** Rec. 709 chroma (Cb, Cr), each −0.5 to 0.5, of gamma-encoded RGB (each 0–1). */
|
|
1060
|
+
declare function videoChroma(r: number, g: number, b: number): [number, number];
|
|
1061
|
+
interface VideoScopeOptions {
|
|
1062
|
+
/**
|
|
1063
|
+
* Read at most about this many pixels, evenly spaced (default 262 144, a 512 × 512 picture), so
|
|
1064
|
+
* a large frame costs no more than a small one. Counts are of the pixels read.
|
|
1065
|
+
*/
|
|
1066
|
+
maxPixels?: number;
|
|
1067
|
+
}
|
|
1068
|
+
/** How many pixels fall in each of `bins` equal steps of red, green, blue and luma (bin 0 is darkest). */
|
|
1069
|
+
interface VideoHistogram {
|
|
1070
|
+
bins: number;
|
|
1071
|
+
r: number[];
|
|
1072
|
+
g: number[];
|
|
1073
|
+
b: number[];
|
|
1074
|
+
luma: number[];
|
|
1075
|
+
/** Pixels counted. */
|
|
1076
|
+
total: number;
|
|
1077
|
+
}
|
|
1078
|
+
declare function videoHistogram(pixels: VideoPixels, options?: VideoScopeOptions & {
|
|
1079
|
+
bins?: number;
|
|
1080
|
+
}): VideoHistogram;
|
|
1081
|
+
/**
|
|
1082
|
+
* A luma waveform: the picture split into `columns` vertical strips, left to right, each counting
|
|
1083
|
+
* its pixels at each of `levels` luma steps. `data[column * levels + level]`; level 0 is black.
|
|
1084
|
+
*/
|
|
1085
|
+
interface VideoWaveform {
|
|
1086
|
+
columns: number;
|
|
1087
|
+
levels: number;
|
|
1088
|
+
data: Uint32Array;
|
|
1089
|
+
/** The largest count, for scaling a drawing. */
|
|
1090
|
+
peak: number;
|
|
1091
|
+
}
|
|
1092
|
+
declare function videoLumaWaveform(pixels: VideoPixels, options?: VideoScopeOptions & {
|
|
1093
|
+
columns?: number;
|
|
1094
|
+
levels?: number;
|
|
1095
|
+
}): VideoWaveform;
|
|
1096
|
+
/**
|
|
1097
|
+
* A vectorscope: pixels counted on a `size` × `size` grid by chroma, Cb across (left −0.5, right
|
|
1098
|
+
* +0.5) and Cr up (top +0.5). The centre is grey; the further out, the more saturated; the angle
|
|
1099
|
+
* is the hue. `data[row * size + column]`.
|
|
1100
|
+
*/
|
|
1101
|
+
interface VideoVectorscope {
|
|
1102
|
+
size: number;
|
|
1103
|
+
data: Uint32Array;
|
|
1104
|
+
peak: number;
|
|
1105
|
+
}
|
|
1106
|
+
/** Where chroma (Cb, Cr) falls on a vectorscope of `size` pixels, as `[column, row]`. */
|
|
1107
|
+
declare const videoVectorscopePoint: (cb: number, cr: number, size: number) => [number, number];
|
|
1108
|
+
declare function videoVectorscope(pixels: VideoPixels, options?: VideoScopeOptions & {
|
|
1109
|
+
size?: number;
|
|
1110
|
+
}): VideoVectorscope;
|
|
1111
|
+
/** Exposure and colour figures for a frame (see `videoExposureStats`). Luma and levels run 0–1. */
|
|
1112
|
+
interface VideoExposureStats {
|
|
1113
|
+
/** Pixels read. */
|
|
1114
|
+
pixels: number;
|
|
1115
|
+
luma: {
|
|
1116
|
+
mean: number;
|
|
1117
|
+
median: number;
|
|
1118
|
+
min: number;
|
|
1119
|
+
max: number;
|
|
1120
|
+
p1: number;
|
|
1121
|
+
p99: number;
|
|
1122
|
+
};
|
|
1123
|
+
/** Share (0–1) of pixels crushed to black (luma at or below `shadowLevel`) or blown to white (at or above `highlightLevel`). */
|
|
1124
|
+
clipped: {
|
|
1125
|
+
shadows: number;
|
|
1126
|
+
highlights: number;
|
|
1127
|
+
r: number;
|
|
1128
|
+
g: number;
|
|
1129
|
+
b: number;
|
|
1130
|
+
};
|
|
1131
|
+
/** Mean and highest chroma, 0 (grey) to 1 (a full primary). */
|
|
1132
|
+
saturation: {
|
|
1133
|
+
mean: number;
|
|
1134
|
+
max: number;
|
|
1135
|
+
};
|
|
1136
|
+
/** The mean colour as `#rrggbb`: far from grey means a colour cast. */
|
|
1137
|
+
average: string;
|
|
1138
|
+
}
|
|
1139
|
+
interface VideoExposureOptions extends VideoScopeOptions {
|
|
1140
|
+
/** Luma (0–1) at or below which a pixel counts as crushed (default 0.02). */
|
|
1141
|
+
shadowLevel?: number;
|
|
1142
|
+
/** Luma or channel (0–1) at or above which a pixel counts as blown (default 0.98). */
|
|
1143
|
+
highlightLevel?: number;
|
|
1144
|
+
}
|
|
1145
|
+
declare function videoExposureStats(pixels: VideoPixels, options?: VideoExposureOptions): VideoExposureStats;
|
|
1146
|
+
/** What a scope reading says in words: exposure, clipping and colour cast worth fixing. */
|
|
1147
|
+
declare function videoExposureNotes(stats: VideoExposureStats): string[];
|
|
1148
|
+
/** A compact reading of a frame for agents: exposure figures, notes, and coarse histogram, waveform and vectorscope summaries. */
|
|
1149
|
+
interface VideoScopeSummary {
|
|
1150
|
+
stats: VideoExposureStats;
|
|
1151
|
+
notes: string[];
|
|
1152
|
+
/** Share of pixels (0–1) in each of `bins` equal luma and channel steps, darkest first. */
|
|
1153
|
+
histogram: {
|
|
1154
|
+
bins: number;
|
|
1155
|
+
luma: number[];
|
|
1156
|
+
r: number[];
|
|
1157
|
+
g: number[];
|
|
1158
|
+
b: number[];
|
|
1159
|
+
};
|
|
1160
|
+
/** The picture in vertical strips, left to right: each strip's luma spread (0–1). */
|
|
1161
|
+
waveform: {
|
|
1162
|
+
start: number;
|
|
1163
|
+
end: number;
|
|
1164
|
+
min: number;
|
|
1165
|
+
median: number;
|
|
1166
|
+
max: number;
|
|
1167
|
+
}[];
|
|
1168
|
+
/** The chroma of the most saturated tenth of the picture: its main hue (degrees on the vectorscope, red ≈ 103°) and strength (0–1). */
|
|
1169
|
+
vectorscope: {
|
|
1170
|
+
hue: number | null;
|
|
1171
|
+
strength: number;
|
|
1172
|
+
spread: number;
|
|
1173
|
+
};
|
|
1174
|
+
}
|
|
1175
|
+
/** Vectorscope angle (degrees, anticlockwise from +Cb) of chroma. */
|
|
1176
|
+
declare const videoVectorscopeAngle: (cb: number, cr: number) => number;
|
|
1177
|
+
declare function summarizeVideoScopes(pixels: VideoPixels, options?: VideoExposureOptions & {
|
|
1178
|
+
bins?: number;
|
|
1179
|
+
columns?: number;
|
|
1180
|
+
}): VideoScopeSummary;
|
|
1181
|
+
/** Where the six 75% colour-bar targets sit on a vectorscope: name, Cb and Cr. */
|
|
1182
|
+
declare const VIDEO_VECTORSCOPE_TARGETS: readonly {
|
|
1183
|
+
name: string;
|
|
1184
|
+
rgb: [number, number, number];
|
|
1185
|
+
cb: number;
|
|
1186
|
+
cr: number;
|
|
1187
|
+
}[];
|
|
1188
|
+
/** RGBA pixels of a drawn scope, ready for `new ImageData(data, width, height)`. */
|
|
1189
|
+
interface VideoScopeImage {
|
|
1190
|
+
width: number;
|
|
1191
|
+
height: number;
|
|
1192
|
+
data: Uint8ClampedArray<ArrayBuffer>;
|
|
1193
|
+
}
|
|
1194
|
+
/** A histogram drawn `width` × `height`: red, green and blue added together, with luma as a white outline. */
|
|
1195
|
+
declare function videoHistogramImage(h: VideoHistogram, width?: number, height?: number): VideoScopeImage;
|
|
1196
|
+
/** A luma waveform drawn `width` × `height`: white at the top, black at the bottom, lines at each quarter. */
|
|
1197
|
+
declare function videoWaveformImage(w: VideoWaveform, width?: number, height?: number): VideoScopeImage;
|
|
1198
|
+
/** A vectorscope drawn `size` × `size`, with its outer circle, the skin-tone line and the colour-bar targets. */
|
|
1199
|
+
declare function videoVectorscopeImage(v: VideoVectorscope, size?: number): VideoScopeImage;
|
|
1200
|
+
/** One scope of a frame drawn `width` × `height` (a vectorscope is square: the smaller side). */
|
|
1201
|
+
declare function videoScopeImage(kind: VideoScopeKind, pixels: VideoPixels, width?: number, height?: number, options?: VideoScopeOptions): VideoScopeImage;
|
|
1202
|
+
/** A frame the preview drew: when, whether every picture in it had loaded, and its pixels. */
|
|
1203
|
+
interface VideoPreviewSnapshot {
|
|
1204
|
+
time: number;
|
|
1205
|
+
/** False while a picture is still loading or seeking (the frame shows a placeholder or a stale picture). */
|
|
1206
|
+
complete: boolean;
|
|
1207
|
+
pixels: VideoPixels;
|
|
1208
|
+
}
|
|
1209
|
+
/**
|
|
1210
|
+
* Where a preview's pixels can be read, for scopes and agents: a `VideoPreviewEngine` attaches its
|
|
1211
|
+
* canvas and says each time it draws. `VideoEditorController.previewPixels` is one, so a preview,
|
|
1212
|
+
* a scopes panel and the agent tools of one editor find each other without wiring.
|
|
1213
|
+
*/
|
|
1214
|
+
declare class VideoPreviewPixels {
|
|
1215
|
+
private reader;
|
|
1216
|
+
private drawnAt;
|
|
1217
|
+
private readonly listeners;
|
|
1218
|
+
/** Gives the canvas to read (the latest preview wins). Returns a function that takes it away again. */
|
|
1219
|
+
attach(reader: () => VideoPreviewSnapshot | null): () => void;
|
|
1220
|
+
/** Whether a preview is attached. */
|
|
1221
|
+
get attached(): boolean;
|
|
1222
|
+
/** The preview drew the frame at `time`; `complete` is false while a picture was missing or stale. */
|
|
1223
|
+
drawn(time: number, complete: boolean): void;
|
|
1224
|
+
/** The last frame drawn, with its pixels; `null` without a preview. Throws when the canvas cannot be read. */
|
|
1225
|
+
read(): VideoPreviewSnapshot | null;
|
|
1226
|
+
/** Called after each frame the preview draws. */
|
|
1227
|
+
subscribe(listener: () => void): () => void;
|
|
1228
|
+
/**
|
|
1229
|
+
* The frame at `time` once it is complete: now, if the last frame drawn was it, else the next
|
|
1230
|
+
* complete drawing of it. Fails after `timeout` ms (default 5000).
|
|
1231
|
+
*/
|
|
1232
|
+
next(time: number, timeout?: number): Promise<VideoPreviewSnapshot>;
|
|
1233
|
+
private emit;
|
|
1234
|
+
}
|
|
1235
|
+
/** What a scopes panel shows for the preview's latest frame (see `readVideoScopesPanel`). */
|
|
1236
|
+
type VideoScopesPanelReading = {
|
|
1237
|
+
ok: true;
|
|
1238
|
+
time: number;
|
|
1239
|
+
complete: boolean;
|
|
1240
|
+
images: Partial<Record<VideoScopeKind, VideoScopeImage>>;
|
|
1241
|
+
stats: VideoExposureStats;
|
|
1242
|
+
notes: string[];
|
|
1243
|
+
} | {
|
|
1244
|
+
ok: false;
|
|
1245
|
+
message: string;
|
|
1246
|
+
};
|
|
1247
|
+
/**
|
|
1248
|
+
* The preview's latest frame as a scopes panel draws it: an image per scope `kinds`, each
|
|
1249
|
+
* `width` × `height` (vectorscopes square), and the exposure figures. Reads at most `maxPixels`
|
|
1250
|
+
* (default 65 536) so it keeps up with playback. Says why when there is nothing to show.
|
|
1251
|
+
*/
|
|
1252
|
+
declare function readVideoScopesPanel(feed: VideoPreviewPixels, kinds?: readonly VideoScopeKind[], options?: {
|
|
1253
|
+
width?: number;
|
|
1254
|
+
height?: number;
|
|
1255
|
+
maxPixels?: number;
|
|
1256
|
+
}): VideoScopesPanelReading;
|
|
1257
|
+
|
|
1041
1258
|
/** Default length of an entrance or exit animation (ms). */
|
|
1042
1259
|
declare const VIDEO_CLIP_ANIMATION_DURATION = 500;
|
|
1043
1260
|
declare const PROPS: readonly ["opacity", "x", "y", "scale"];
|
|
@@ -1354,6 +1571,8 @@ interface VideoPreviewSource {
|
|
|
1354
1571
|
playing: boolean;
|
|
1355
1572
|
};
|
|
1356
1573
|
subscribe(listener: () => void): () => void;
|
|
1574
|
+
/** Where to publish the drawn pixels (a controller has one), for scopes and agents. */
|
|
1575
|
+
previewPixels?: VideoPreviewPixels;
|
|
1357
1576
|
}
|
|
1358
1577
|
/** The parts of a media element the preview drives (so tests can pass fakes). */
|
|
1359
1578
|
interface VideoPreviewMedia {
|
|
@@ -1363,6 +1582,8 @@ interface VideoPreviewMedia {
|
|
|
1363
1582
|
volume: number;
|
|
1364
1583
|
muted: boolean;
|
|
1365
1584
|
paused: boolean;
|
|
1585
|
+
/** True while a seek is under way (the element still shows the old frame). */
|
|
1586
|
+
seeking?: boolean;
|
|
1366
1587
|
readyState: number;
|
|
1367
1588
|
preload: string;
|
|
1368
1589
|
play(): Promise<void> | void;
|
|
@@ -1394,6 +1615,11 @@ interface VideoPreviewOptions {
|
|
|
1394
1615
|
* it. Default: a hidden `<svg>` added to `document.body`. `null` leaves white balance out.
|
|
1395
1616
|
*/
|
|
1396
1617
|
defineSvgFilter?: ((id: string, markup: string) => void) | null;
|
|
1618
|
+
/**
|
|
1619
|
+
* Where to publish the canvas's pixels after each frame, for scopes and the `get_video_scopes`
|
|
1620
|
+
* tool (default: the source's `previewPixels`). `null` publishes nothing.
|
|
1621
|
+
*/
|
|
1622
|
+
pixels?: VideoPreviewPixels | null;
|
|
1397
1623
|
}
|
|
1398
1624
|
/**
|
|
1399
1625
|
* Plays a project in the browser: keeps one `<video>` or `<audio>` element per playing clip in step
|
|
@@ -1413,12 +1639,18 @@ declare class VideoPreviewEngine {
|
|
|
1413
1639
|
private destroyed;
|
|
1414
1640
|
private filterHost;
|
|
1415
1641
|
private readonly filters;
|
|
1642
|
+
private readonly detachPixels;
|
|
1643
|
+
private readonly pixelsTarget;
|
|
1644
|
+
private drawn;
|
|
1645
|
+
private complete;
|
|
1416
1646
|
constructor(source: VideoPreviewSource, canvas: {
|
|
1417
1647
|
width: number;
|
|
1418
1648
|
height: number;
|
|
1419
1649
|
clientWidth?: number;
|
|
1420
1650
|
getContext?: (id: '2d') => unknown;
|
|
1421
1651
|
}, options?: VideoPreviewOptions);
|
|
1652
|
+
/** The canvas's pixels and the frame they show, or `null` when its context cannot be read. */
|
|
1653
|
+
readPixels(): VideoPreviewSnapshot | null;
|
|
1422
1654
|
private createMedia;
|
|
1423
1655
|
private image;
|
|
1424
1656
|
private entry;
|
|
@@ -1487,6 +1719,8 @@ declare class VideoEditorController {
|
|
|
1487
1719
|
readonly player: AnimationPlayer;
|
|
1488
1720
|
/** Sound levels per asset, loaded on demand for waveforms and agents. */
|
|
1489
1721
|
readonly audioPeaks: VideoAudioPeaksCache;
|
|
1722
|
+
/** The pixels the preview last drew, for scopes and `get_video_scopes` (a `VideoPreviewEngine` fills it). */
|
|
1723
|
+
readonly previewPixels: VideoPreviewPixels;
|
|
1490
1724
|
private project;
|
|
1491
1725
|
private issues;
|
|
1492
1726
|
private selection;
|
|
@@ -1587,6 +1821,14 @@ interface VideoEditorToolProviderOptions {
|
|
|
1587
1821
|
data: string;
|
|
1588
1822
|
mimeType: string;
|
|
1589
1823
|
};
|
|
1824
|
+
/**
|
|
1825
|
+
* The rendered pixels of the frame at `time` (ms), for `get_video_scopes` (e.g. a frame decoded
|
|
1826
|
+
* by ffmpeg on a server). Default: what the editor's `<VideoPreview>` draws, through
|
|
1827
|
+
* `controller.previewPixels`, seeking it there and back when `time` is not the playhead.
|
|
1828
|
+
*/
|
|
1829
|
+
framePixels?: (time: number) => VideoPixels | null | Promise<VideoPixels | null>;
|
|
1830
|
+
/** How long `get_video_scopes` waits for the preview to finish drawing a frame (ms, default 5000). */
|
|
1831
|
+
framePixelsTimeout?: number;
|
|
1590
1832
|
}
|
|
1591
1833
|
/** A project as agents see it: settings, assets, and each track's clips in order with their times. */
|
|
1592
1834
|
declare function describeVideoProject(project: VideoProject): {
|
|
@@ -1841,4 +2083,4 @@ declare function videoKeyframeValueEdit(project: VideoProject, clipId: string, p
|
|
|
1841
2083
|
*/
|
|
1842
2084
|
declare function videoKeyframeToggleEdit(project: VideoProject, clipId: string, property: VideoKeyframeProperty, time: number): VideoEdit | null;
|
|
1843
2085
|
|
|
1844
|
-
export { type CreateVideoProjectOptions, type NewVideoClip, VIDEO_BLEND_MODES, VIDEO_BLEND_MODE_LABELS, VIDEO_CLIP_ANIMATION_DURATION, VIDEO_CLIP_ANIMATION_EFFECTS, VIDEO_CLIP_ANIMATION_LABELS, VIDEO_CLIP_TYPES, VIDEO_DEFAULT_FILLERS, VIDEO_DEFAULT_STILL_DURATION, VIDEO_DEFAULT_TITLE_DURATION, VIDEO_EASE_NAMES, VIDEO_EDIT_OPS, VIDEO_FADE_CURVES, VIDEO_FADE_CURVE_LABELS, VIDEO_FITS, VIDEO_GRADE_CONTROLS, VIDEO_GRADE_PRESETS, VIDEO_GRADE_PRESET_NAMES, VIDEO_ISSUE_CODES, VIDEO_KEYFRAME_LIMITS, VIDEO_KEYFRAME_PROPERTIES, VIDEO_PEAK_BLOCK, VIDEO_PLACEMENT_MODES, VIDEO_TIME_EPSILON, VIDEO_TRANSFORM_PROPERTIES, VIDEO_TRANSITION_LABELS, VIDEO_TRANSITION_TYPES, VIDEO_WIPE_DIRECTIONS, type VideoAnimatable, type VideoAsset, type VideoAssetKind, type VideoAudioLevel, type VideoAudioPeaks, VideoAudioPeaksCache, type VideoAudioPeaksLoader, type VideoAudioSource, type VideoBlendMode, type VideoCanvasContext, type VideoClip, type VideoClipAnimation, type VideoClipAnimationEffect, type VideoClipDragInput, type VideoClipDragMode, type VideoClipDragPlan, type VideoClipLocation, type VideoClipType, type VideoColorClip, type VideoEase, type VideoEdit, type VideoEditOp, type VideoEditOutcome, type VideoEditResult, VideoEditorController, type VideoEditorOptions, type VideoEditorState, type VideoEditorToolProviderOptions, type VideoEdlOptions, type VideoFadeCurve, type VideoFfmpegExport, type VideoFfmpegOptions, type VideoFit, type VideoFrame, type VideoGap, type VideoGrade, type VideoGradeControl, type VideoGradePreset, type VideoGradeStep, type VideoIssue, type VideoIssueCode, type VideoIssueSeverity, type VideoKey, type VideoKeyframeProperty, type VideoKeyframeRow, type VideoKeyframes, type VideoLayer, type VideoLoudnessMeasurement, type VideoLoudnessTarget, type VideoMarker, type VideoMediaClip, type VideoMediaProbe, type VideoPauseOptions, type VideoPlacementMode, VideoPreviewEngine, type VideoPreviewImage, type VideoPreviewMedia, type VideoPreviewOptions, type VideoPreviewSource, type VideoProject, type VideoRect, type VideoRulerTick, type VideoSilenceOptions, type VideoSnapOptions, type VideoSpeedSegment, type VideoSvgOptions, type VideoTextClip, type VideoTimelineWord, type VideoTrack, type VideoTrackKind, type VideoTranscriptRange, type VideoTranscriptWord, type VideoTransform, type VideoTransition, type VideoTransitionType, type VideoWaveformMode, type VideoWipeDirection, allVideoClipIds, applyVideoEdits, applyVideoGrade, buildVideoAudioPeaks, checkVideoProject, checkVideoTimeRemap, createVideoEditorToolProvider, createVideoProject, decodeVideoAudioPeaks, describeVideoProject, drawVideoFrame, ffmpegFilterValue, findVideoAudioSilences, findVideoClip, findVideoFillers, findVideoGaps, findVideoTranscriptPauses, findVideoTranscriptText, formatVideoSeconds, formatVideoTimecode, formatVideoTimecodeFrames, isVideoDropFrameRate, isVideoKeyframes, mergeVideoRanges, nextFreeVideoSlot, normalizeVideoGrade, normalizeVideoWord, parseVideoAnimatable, parseVideoAsset, parseVideoClip, parseVideoClipAnimation, parseVideoGrade, parseVideoKeyframes, parseVideoLoudnessMeasurement, parseVideoMarker, parseVideoProject, parseVideoTimeRemap, parseVideoTrack, parseVideoTranscript, parseVideoTranscriptWords, parseVideoTransform, parseVideoTransition, placeVideoRect, planVideoClipDrag, probeVideoMedia, removeVideoKey, retimeVideoAnimatable, setVideoKey, snapToVideoFrame, snapVideoTime, sortVideoKeys, sortedVideoClips, splitVideoAnimatable, toVideoEdl, toVideoFfmpeg, toVideoLoudnessMeasure, videoAssetDropEdit, videoAssetHasSound, videoAssetKindOf, videoAssetMap, videoAudioLevels, videoAudioPeakRange, videoAudioPeakSpans, videoAudioPeaksDuration, videoClipAfter, videoClipAnimated, videoClipAnimationProperties, videoClipAnimationSpans, videoClipBefore, videoClipEnd, videoClipHandles, videoClipKeyframes, videoClipLabel, videoClipOverhang, videoClipShowsWaveform, videoClipSoundGain, videoClipSourceRange, videoClipSourceTime, videoClipSpeed, videoClipSpeedAt, videoClipTint, videoClipWaveform, videoClipWaveformPath, videoClipsAt, videoContactSheetSvg, videoDragLabel, videoDropTracks, videoEaseBezier, videoEaseProgress, videoFadeCurveGain, videoFrameAt, videoFrameDuration, videoFrameToSvg, videoFrames, videoFreezeFrameEdit, videoGradeCssFilter, videoGradeFfmpegFilters, videoGradeGainsFilterId, videoGradePreset, videoGradeStepMatrix, videoGradeStepSvgValues, videoGradeSteps, videoGradeSvgDefs, videoGradeSvgFilter, videoHourFrames, videoIrisRadius, videoIssueKey, videoKeyframeBreakpoints, videoKeyframeFfmpegExpr, videoKeyframeRows, videoKeyframeToggleEdit, videoKeyframeValueEdit, videoKeysOf, videoOverlap, videoPeakDb, videoProjectDuration, videoProjectSvg, videoRemoveRangesEdits, videoRulerTicks, videoSlowMotionRamp, videoSnapPoints, videoSpeedRampEdit, videoSpeedRampKeys, videoTextStyle, videoTimeRemapBreakpoints, videoTimeRemapSpan, videoTimecodeFrames, videoTimelineTranscript, videoTitleFrame, videoTrackSyncLocked, videoTranscriptEdit, videoTranscriptTrack, videoTransformAt, videoTransitionAudioCurve, videoTransitionEase, videoTransitionHasDirection, videoValueAt, videoWaveformPath, videoWipeRect, videoWordAt, videoWordsRange };
|
|
2086
|
+
export { type CreateVideoProjectOptions, type NewVideoClip, VIDEO_BLEND_MODES, VIDEO_BLEND_MODE_LABELS, VIDEO_CLIP_ANIMATION_DURATION, VIDEO_CLIP_ANIMATION_EFFECTS, VIDEO_CLIP_ANIMATION_LABELS, VIDEO_CLIP_TYPES, VIDEO_DEFAULT_FILLERS, VIDEO_DEFAULT_STILL_DURATION, VIDEO_DEFAULT_TITLE_DURATION, VIDEO_EASE_NAMES, VIDEO_EDIT_OPS, VIDEO_FADE_CURVES, VIDEO_FADE_CURVE_LABELS, VIDEO_FITS, VIDEO_GRADE_CONTROLS, VIDEO_GRADE_PRESETS, VIDEO_GRADE_PRESET_NAMES, VIDEO_ISSUE_CODES, VIDEO_KEYFRAME_LIMITS, VIDEO_KEYFRAME_PROPERTIES, VIDEO_PEAK_BLOCK, VIDEO_PLACEMENT_MODES, VIDEO_SCOPE_KINDS, VIDEO_TIME_EPSILON, VIDEO_TRANSFORM_PROPERTIES, VIDEO_TRANSITION_LABELS, VIDEO_TRANSITION_TYPES, VIDEO_VECTORSCOPE_TARGETS, VIDEO_WIPE_DIRECTIONS, type VideoAnimatable, type VideoAsset, type VideoAssetKind, type VideoAudioLevel, type VideoAudioPeaks, VideoAudioPeaksCache, type VideoAudioPeaksLoader, type VideoAudioSource, type VideoBlendMode, type VideoCanvasContext, type VideoClip, type VideoClipAnimation, type VideoClipAnimationEffect, type VideoClipDragInput, type VideoClipDragMode, type VideoClipDragPlan, type VideoClipLocation, type VideoClipType, type VideoColorClip, type VideoEase, type VideoEdit, type VideoEditOp, type VideoEditOutcome, type VideoEditResult, VideoEditorController, type VideoEditorOptions, type VideoEditorState, type VideoEditorToolProviderOptions, type VideoEdlOptions, type VideoExposureOptions, type VideoExposureStats, type VideoFadeCurve, type VideoFfmpegExport, type VideoFfmpegOptions, type VideoFit, type VideoFrame, type VideoGap, type VideoGrade, type VideoGradeControl, type VideoGradePreset, type VideoGradeStep, type VideoHistogram, type VideoIssue, type VideoIssueCode, type VideoIssueSeverity, type VideoKey, type VideoKeyframeProperty, type VideoKeyframeRow, type VideoKeyframes, type VideoLayer, type VideoLoudnessMeasurement, type VideoLoudnessTarget, type VideoMarker, type VideoMediaClip, type VideoMediaProbe, type VideoPauseOptions, type VideoPixels, type VideoPlacementMode, VideoPreviewEngine, type VideoPreviewImage, type VideoPreviewMedia, type VideoPreviewOptions, VideoPreviewPixels, type VideoPreviewSnapshot, type VideoPreviewSource, type VideoProject, type VideoRect, type VideoRulerTick, type VideoScopeImage, type VideoScopeKind, type VideoScopeOptions, type VideoScopeSummary, type VideoScopesPanelReading, type VideoSilenceOptions, type VideoSnapOptions, type VideoSpeedSegment, type VideoSvgOptions, type VideoTextClip, type VideoTimelineWord, type VideoTrack, type VideoTrackKind, type VideoTranscriptRange, type VideoTranscriptWord, type VideoTransform, type VideoTransition, type VideoTransitionType, type VideoVectorscope, type VideoWaveform, type VideoWaveformMode, type VideoWipeDirection, allVideoClipIds, applyVideoEdits, applyVideoGrade, buildVideoAudioPeaks, checkVideoProject, checkVideoTimeRemap, createVideoEditorToolProvider, createVideoProject, decodeVideoAudioPeaks, describeVideoProject, drawVideoFrame, ffmpegFilterValue, findVideoAudioSilences, findVideoClip, findVideoFillers, findVideoGaps, findVideoTranscriptPauses, findVideoTranscriptText, formatVideoSeconds, formatVideoTimecode, formatVideoTimecodeFrames, isVideoDropFrameRate, isVideoKeyframes, mergeVideoRanges, nextFreeVideoSlot, normalizeVideoGrade, normalizeVideoWord, parseVideoAnimatable, parseVideoAsset, parseVideoClip, parseVideoClipAnimation, parseVideoGrade, parseVideoKeyframes, parseVideoLoudnessMeasurement, parseVideoMarker, parseVideoProject, parseVideoTimeRemap, parseVideoTrack, parseVideoTranscript, parseVideoTranscriptWords, parseVideoTransform, parseVideoTransition, placeVideoRect, planVideoClipDrag, probeVideoMedia, readVideoScopesPanel, removeVideoKey, retimeVideoAnimatable, setVideoKey, snapToVideoFrame, snapVideoTime, sortVideoKeys, sortedVideoClips, splitVideoAnimatable, summarizeVideoScopes, toVideoEdl, toVideoFfmpeg, toVideoLoudnessMeasure, videoAssetDropEdit, videoAssetHasSound, videoAssetKindOf, videoAssetMap, videoAudioLevels, videoAudioPeakRange, videoAudioPeakSpans, videoAudioPeaksDuration, videoChroma, videoClipAfter, videoClipAnimated, videoClipAnimationProperties, videoClipAnimationSpans, videoClipBefore, videoClipEnd, videoClipHandles, videoClipKeyframes, videoClipLabel, videoClipOverhang, videoClipShowsWaveform, videoClipSoundGain, videoClipSourceRange, videoClipSourceTime, videoClipSpeed, videoClipSpeedAt, videoClipTint, videoClipWaveform, videoClipWaveformPath, videoClipsAt, videoContactSheetSvg, videoDragLabel, videoDropTracks, videoEaseBezier, videoEaseProgress, videoExposureNotes, videoExposureStats, videoFadeCurveGain, videoFrameAt, videoFrameDuration, videoFrameToSvg, videoFrames, videoFreezeFrameEdit, videoGradeCssFilter, videoGradeFfmpegFilters, videoGradeGainsFilterId, videoGradePreset, videoGradeStepMatrix, videoGradeStepSvgValues, videoGradeSteps, videoGradeSvgDefs, videoGradeSvgFilter, videoHistogram, videoHistogramImage, videoHourFrames, videoIrisRadius, videoIssueKey, videoKeyframeBreakpoints, videoKeyframeFfmpegExpr, videoKeyframeRows, videoKeyframeToggleEdit, videoKeyframeValueEdit, videoKeysOf, videoLuma, videoLumaWaveform, videoOverlap, videoPeakDb, videoProjectDuration, videoProjectSvg, videoRemoveRangesEdits, videoRulerTicks, videoScopeImage, videoSlowMotionRamp, videoSnapPoints, videoSpeedRampEdit, videoSpeedRampKeys, videoTextStyle, videoTimeRemapBreakpoints, videoTimeRemapSpan, videoTimecodeFrames, videoTimelineTranscript, videoTitleFrame, videoTrackSyncLocked, videoTranscriptEdit, videoTranscriptTrack, videoTransformAt, videoTransitionAudioCurve, videoTransitionEase, videoTransitionHasDirection, videoValueAt, videoVectorscope, videoVectorscopeAngle, videoVectorscopeImage, videoVectorscopePoint, videoWaveformImage, videoWaveformPath, videoWipeRect, videoWordAt, videoWordsRange };
|