/** * WebGPURenderer — VideoFrame → WebGPU canvas renderer. * * Mirrors the public surface of CanvasRenderer so the two are * interchangeable behind . * * Scope (initial cut): * - Full presentation queue + A/V-sync presentation loop (parity) * - Fit modes (contain/cover/fill/zoom/control) + smoothed scale * - Letterbox color, rotation (CSS-driven, same as canvas path) * - DOM subtitle overlay — plain text only (karaoke/image cues fall * back to plain text). Full karaoke + image-cue rendering lives in * CanvasRenderer; they can be ported when needed. * - HDR: relies on browser native via canvas color space when * available; no shader-based PQ tone mapping yet. * * Async note: WebGPU device acquisition is async. configure() kicks * off init; until the device is ready, drawFrame() no-ops and frames * fall through the queue. The presentation loop still runs so * subtitles update. */ import type { SubtitleCue } from "../types"; export declare class WebGPURenderer { private canvas; private device; private context; private pipeline; private sampler; private uniformBuffer; private bindGroupLayout; private canvasFormat; private deviceReady; private deviceFailed; private width; private height; private colorSpace; private hasNativeHDRSupport; private frameQueue; private static readonly MAX_FRAME_QUEUE; private hdrEnabled; private isHDRSource; private lastPrimaries?; private lastTransfer?; private rafId; private isPlaying; private getAudioTime; private _isAudioHealthy; private presentationStartTime; private presentationStartPts; private lastPresentedPts; private syncedToAudio; private lastKnownAudioTime; private playbackRate; private justSeeked; private framesPresented; private currentTime; private videoFrameRate; private rotation; private metadataRotation; private manualRotation; private containerWidth; private containerHeight; private fitMode; private letterboxColor; private letterboxTarget; private currentScaleX; private currentScaleY; private lastTargetScaleX; private lastTargetScaleY; private fitAnimRafId; private activeSubtitleCue; private subtitleCues; private subtitleOverlay; private subtitleControlsPadding; private subtitleDelay; private _lastRenderedSubtitleKey; private lastRenderedFrame; constructor(canvas: HTMLCanvasElement | OffscreenCanvas, subtitleOverlay?: HTMLElement); private initWebGPU; configure(width: number, height: number, colorPrimaries?: string, colorTransfer?: string, frameRate?: number, rotation?: number, isHDR?: boolean, _pixelFormat?: string): void; private detectColorSpace; setHDREnabled(enabled: boolean): void; isHDRSupported(): boolean; resize(width: number, height: number, fromRotate?: boolean): void; setLetterboxColor(r: number, g: number, b: number): void; setFitMode(mode: "contain" | "cover" | "fill" | "zoom" | "control"): void; private startFitAnimation; setAudioTimeProvider(getAudioTime: (() => number) | null, isAudioHealthy?: (() => boolean) | null): void; queueFrame(frame: VideoFrame): void; render(frame: VideoFrame): void; startPresentationLoop(): void; stopPresentationLoop(): void; private presentationLoop; private getCurrentPlaybackTime; private selectFrameForPresentation; private drawFrame; setSubtitleOverlay(overlay: HTMLElement | null): void; setSubtitleFormat(format: "vtt" | "srt" | "ass" | "ssa" | "ttml" | "pgs" | "dvd" | "dvb" | string | null): void; rotate90(): number; getRotation(): number; setManualRotation(deg: number): void; setSubtitleControlsPadding(padding: number): void; setSubtitleCues(cues: SubtitleCue[]): void; setSubtitleDelay(seconds: number): void; getSubtitleDelay(): number; getAllCues(): { start: number; end: number; text: string; }[]; clearSubtitles(): void; private updateActiveSubtitle; private renderSubtitles; private renderImageCue; setPlaybackRate(rate: number): void; getCurrentTime(): number; hasQueuedFrames(): boolean; getQueueSize(): number; getStats(): { framesPresented: number; frameQueueSize: number; colorSpace: string; resolution: string; syncedToAudio: boolean; }; dropStaleFrames(targetTimeSec: number, toleranceSec?: number): number; clearQueue(): void; renderBitmap(_bitmap: ImageBitmap): void; clear(): void; fillBlack(): void; getCanvas(): HTMLCanvasElement | OffscreenCanvas; destroy(): void; } //# sourceMappingURL=WebGPURenderer.d.ts.map