@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.
@@ -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 };