import * as THREE from 'three'; import {Script} from '../core/Script'; /** * Enum for video stream states. */ export enum StreamState { IDLE = 'idle', INITIALIZING = 'initializing', STREAMING = 'streaming', ERROR = 'error', NO_DEVICES_FOUND = 'no_devices_found', } export type VideoStreamDetails = { force?: boolean; error?: Error; }; export interface VideoStreamEventMap extends THREE.Object3DEventMap { statechange: {state: StreamState; details?: T}; } type VideoStreamGetSnapshotImageDataOptionsBase = { /** The target width, defaults to the video width. */ width?: number; /** The target height, defaults to the video height. */ height?: number; }; export type VideoStreamGetSnapshotImageDataOptions = VideoStreamGetSnapshotImageDataOptionsBase & { outputFormat: 'imageData'; }; export type VideoStreamGetSnapshotBase64Options = VideoStreamGetSnapshotImageDataOptionsBase & { outputFormat: 'base64'; mimeType?: string; quality?: number; }; export type VideoStreamGetSnapshotBlobOptions = VideoStreamGetSnapshotImageDataOptionsBase & { outputFormat: 'blob'; mimeType?: string; quality?: number; }; export type VideoStreamGetSnapshotTextureOptions = VideoStreamGetSnapshotImageDataOptionsBase & { outputFormat?: 'texture'; }; export type VideoStreamGetSnapshotOptions = | VideoStreamGetSnapshotImageDataOptions | VideoStreamGetSnapshotBase64Options | VideoStreamGetSnapshotTextureOptions | VideoStreamGetSnapshotBlobOptions; export type VideoStreamOptions = { /** Hint for performance optimization for frequent captures. */ willCaptureFrequently?: boolean; }; function blobToBase64(blob: Blob): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result as string); reader.readAsDataURL(blob); reader.onerror = () => reject(reader.error); }); } /** * The base class for handling video streams (from camera or file), managing * the underlying