/** * AVRenderer -- deterministic offline A/V renderer. * * Steps through audio samples and visual frames in lockstep. * Each video frame knows its exact audio position. No wall-clock * dependency -- fully deterministic. * * @module */ import type { CompositeState } from './compositor.js'; import type { Compositor } from './compositor.js'; import { AVBridge } from './av-bridge.js'; import type { Millis } from './brands.js'; interface AVRenderConfig { readonly sampleRate: number; readonly fps: number; readonly durationMs: Millis; } interface AVFrameOutput { readonly frame: number; readonly timestamp: number; readonly sample: number; readonly sampleCount: number; readonly state: CompositeState; } interface AVRendererShape { readonly config: AVRenderConfig; readonly bridge: AVBridge.Shape; readonly totalFrames: number; frames(options?: { onAudioFrame?: (sample: number, sampleCount: number) => void; onVideoFrame?: (frame: number, timestamp: number, state: CompositeState) => void; }): AsyncGenerator; } declare function _make(config: AVRenderConfig, compositor: Compositor.Shape, existingBridge?: AVBridge.Shape): AVRendererShape; /** * AVRenderer — deterministic offline audio+video renderer. * * Steps an {@link AVBridge} in lockstep with a {@link Compositor} so every * video frame carries the exact sample offset it corresponds to. Pure clock * math — no wall-clock input, reproducible across runs. */ export declare const AVRenderer: { /** Create a renderer bound to a compositor, optionally reusing an existing {@link AVBridge}. */ make: typeof _make; }; export declare namespace AVRenderer { /** Structural shape of a renderer instance returned by {@link AVRenderer.make}. */ type Shape = AVRendererShape; /** Configuration accepted by {@link AVRenderer.make}. */ type Config = AVRenderConfig; /** Per-frame output yielded by the async iterator. */ type FrameOutput = AVFrameOutput; } export {}; //# sourceMappingURL=av-renderer.d.ts.map