import type { Keyframe } from "./composition.js";
/**
 * Defensive runtime guard. D4 — speed values are clamped to [0.1, 4.0].
 * Non-finite inputs (NaN, +/-Infinity) collapse to the static fallback 1.0
 * so a malformed comp.yaml from an older build can't break the renderer.
 */
export declare function clampSpeed(v: number): number;
/**
 * Per-frame playback rate for a VideoClip. Reads the "speed" keyframes (if
 * any) via interpolateProperty and falls back to 1.0 (D3). Output is clamped
 * to [SPEED_MIN, SPEED_MAX] (D4). Pure — no Remotion hooks; the renderer
 * passes `useCurrentFrame()` and `useVideoConfig().fps` as args.
 */
export declare function computeVideoSpeedForFrame(clip: {
    keyframes?: readonly Keyframe[];
}, localFrame: number, fps: number): number;
/**
 * Returns the agreed-upon speed value if every speed keyframe on the clip
 * has the same value (within KEYFRAME_TIME_EPSILON), otherwise null. Null
 * also means "no speed keyframes" — the caller treats null as "static 1.0".
 *
 * Used by the export pipeline (D6) to decide between fast-path ffmpeg
 * setpts and the deferred variable-speed path.
 */
export declare function isStaticSpeed(clip: {
    keyframes?: readonly Keyframe[];
}): number | null;
/**
 * Timeline width (in seconds) of a clip, accounting for speed ramps (D7).
 *
 * Convention (D9): keyframe `time` values are clip-local *timeline* seconds.
 * For static speed=k, width = (out - in) / k. For variable speed, we sample
 * the speed curve at 0.01s steps along timeline-time, accumulating consumed
 * source-time; the timeline-time at which we have consumed (out - in)
 * seconds of source IS the effective clip duration.
 *
 * Speed > 1 SHRINKS timeline duration; speed < 1 EXPANDS it (D9).
 */
export declare function effectiveClipDuration(clip: {
    in: number;
    out: number;
    keyframes?: readonly Keyframe[];
}): number;
//# sourceMappingURL=speed-ramp.d.ts.map