UNPKG

remotion

Version:

Make videos programmatically

855 lines (838 loc) • 26.3 kB
// src/interpolate.ts function interpolateFunction(input, inputRange, outputRange, options) { const { extrapolateLeft, extrapolateRight, easing } = options; let result = input; const [inputMin, inputMax] = inputRange; const [outputMin, outputMax] = outputRange; if (result < inputMin) { if (extrapolateLeft === "identity") { return result; } if (extrapolateLeft === "clamp") { result = inputMin; } else if (extrapolateLeft === "wrap") { const range = inputMax - inputMin; result = ((result - inputMin) % range + range) % range + inputMin; } else if (extrapolateLeft === "extend") {} } if (result > inputMax) { if (extrapolateRight === "identity") { return result; } if (extrapolateRight === "clamp") { result = inputMax; } else if (extrapolateRight === "wrap") { const range = inputMax - inputMin; result = ((result - inputMin) % range + range) % range + inputMin; } else if (extrapolateRight === "extend") {} } if (outputMin === outputMax) { return outputMin; } result = (result - inputMin) / (inputMax - inputMin); result = easing(result); result = result * (outputMax - outputMin) + outputMin; return result; } function findRange(input, inputRange) { let i; for (i = 1;i < inputRange.length - 1; ++i) { if (inputRange[i] >= input) { break; } } return i - 1; } function checkValidInputRange(arr) { for (let i = 1;i < arr.length; ++i) { if (!(arr[i] > arr[i - 1])) { throw new Error(`inputRange must be strictly monotonically increasing but got [${arr.join(",")}]`); } } } function checkInfiniteRange(name, arr) { if (arr.length < 2) { throw new Error(name + " must have at least 2 elements"); } for (const element of arr) { if (typeof element !== "number") { throw new Error(`${name} must contain only numbers`); } if (!Number.isFinite(element)) { throw new Error(`${name} must contain only finite numbers, but got [${arr.join(",")}]`); } } } function interpolate(input, inputRange, outputRange, options) { if (typeof input === "undefined") { throw new Error("input can not be undefined"); } if (typeof inputRange === "undefined") { throw new Error("inputRange can not be undefined"); } if (typeof outputRange === "undefined") { throw new Error("outputRange can not be undefined"); } if (inputRange.length !== outputRange.length) { throw new Error("inputRange (" + inputRange.length + ") and outputRange (" + outputRange.length + ") must have the same length"); } checkInfiniteRange("inputRange", inputRange); checkInfiniteRange("outputRange", outputRange); checkValidInputRange(inputRange); const easing = options?.easing ?? ((num) => num); let extrapolateLeft = "extend"; if (options?.extrapolateLeft !== undefined) { extrapolateLeft = options.extrapolateLeft; } let extrapolateRight = "extend"; if (options?.extrapolateRight !== undefined) { extrapolateRight = options.extrapolateRight; } if (typeof input !== "number") { throw new TypeError("Cannot interpolate an input which is not a number"); } const range = findRange(input, inputRange); return interpolateFunction(input, [inputRange[range], inputRange[range + 1]], [outputRange[range], outputRange[range + 1]], { easing, extrapolateLeft, extrapolateRight }); } // src/random.ts function mulberry32(a) { let t = a + 1831565813; t = Math.imul(t ^ t >>> 15, t | 1); t ^= t + Math.imul(t ^ t >>> 7, t | 61); return ((t ^ t >>> 14) >>> 0) / 4294967296; } function hashCode(str) { let i = 0; let chr = 0; let hash = 0; for (i = 0;i < str.length; i++) { chr = str.charCodeAt(i); hash = (hash << 5) - hash + chr; hash |= 0; } return hash; } var random = (seed, dummy) => { if (dummy !== undefined) { throw new TypeError("random() takes only one argument"); } if (seed === null) { return Math.random(); } if (typeof seed === "string") { return mulberry32(hashCode(seed)); } if (typeof seed === "number") { return mulberry32(seed * 10000000000); } throw new Error("random() argument must be a number or a string"); }; // src/truthy.ts function truthy(value) { return Boolean(value); } // src/delay-render.ts if (typeof window !== "undefined") { window.remotion_renderReady = false; if (!window.remotion_delayRenderTimeouts) { window.remotion_delayRenderTimeouts = {}; } window.remotion_delayRenderHandles = []; } var DELAY_RENDER_CALLSTACK_TOKEN = "The delayRender was called:"; var DELAY_RENDER_RETRIES_LEFT = "Retries left: "; var DELAY_RENDER_RETRY_TOKEN = "- Rendering the frame will be retried."; var DELAY_RENDER_CLEAR_TOKEN = "handle was cleared after"; // src/input-props-serialization.ts var DATE_TOKEN = "remotion-date:"; var FILE_TOKEN = "remotion-file:"; var serializeJSONWithSpecialTypes = ({ data, indent, staticBase }) => { let customDateUsed = false; let customFileUsed = false; let mapUsed = false; let setUsed = false; try { const serializedString = JSON.stringify(data, function(key, value) { const item = this[key]; if (item instanceof Date) { customDateUsed = true; return `${DATE_TOKEN}${item.toISOString()}`; } if (item instanceof Map) { mapUsed = true; return value; } if (item instanceof Set) { setUsed = true; return value; } if (typeof item === "string" && staticBase !== null && item.startsWith(staticBase)) { customFileUsed = true; return `${FILE_TOKEN}${item.replace(staticBase + "/", "")}`; } return value; }, indent); return { serializedString, customDateUsed, customFileUsed, mapUsed, setUsed }; } catch (err) { throw new Error("Could not serialize the passed input props to JSON: " + err.message); } }; var deserializeJSONWithSpecialTypes = (data) => { return JSON.parse(data, (_, value) => { if (typeof value === "string" && value.startsWith(DATE_TOKEN)) { return new Date(value.replace(DATE_TOKEN, "")); } if (typeof value === "string" && value.startsWith(FILE_TOKEN)) { return `${window.remotion_staticBase}/${value.replace(FILE_TOKEN, "")}`; } return value; }); }; // src/interpolate-colors.ts var NUMBER = "[-+]?\\d*\\.?\\d+"; var PERCENTAGE = NUMBER + "%"; function call(...args) { return "\\(\\s*(" + args.join(")\\s*,\\s*(") + ")\\s*\\)"; } var MODERN_VALUE = "(?:none|[-+]?\\d*\\.?\\d+(?:%|deg|rad|grad|turn)?)"; function modernColorCall(name) { return new RegExp(name + "\\(\\s*(" + MODERN_VALUE + ")\\s+(" + MODERN_VALUE + ")\\s+(" + MODERN_VALUE + ")(?:\\s*\\/\\s*(" + MODERN_VALUE + "))?\\s*\\)"); } function getMatchers() { const cachedMatchers = { rgb: undefined, rgba: undefined, hsl: undefined, hsla: undefined, hex3: undefined, hex4: undefined, hex5: undefined, hex6: undefined, hex8: undefined, oklch: undefined, oklab: undefined, lab: undefined, lch: undefined, hwb: undefined }; if (cachedMatchers.rgb === undefined) { cachedMatchers.rgb = new RegExp("rgb" + call(NUMBER, NUMBER, NUMBER)); cachedMatchers.rgba = new RegExp("rgba" + call(NUMBER, NUMBER, NUMBER, NUMBER)); cachedMatchers.hsl = new RegExp("hsl" + call(NUMBER, PERCENTAGE, PERCENTAGE)); cachedMatchers.hsla = new RegExp("hsla" + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER)); cachedMatchers.hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/; cachedMatchers.hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/; cachedMatchers.hex6 = /^#([0-9a-fA-F]{6})$/; cachedMatchers.hex8 = /^#([0-9a-fA-F]{8})$/; cachedMatchers.oklch = modernColorCall("oklch"); cachedMatchers.oklab = modernColorCall("oklab"); cachedMatchers.lab = modernColorCall("lab"); cachedMatchers.lch = modernColorCall("lch"); cachedMatchers.hwb = modernColorCall("hwb"); } return cachedMatchers; } function hue2rgb(p, q, t) { if (t < 0) { t += 1; } if (t > 1) { t -= 1; } if (t < 1 / 6) { return p + (q - p) * 6 * t; } if (t < 1 / 2) { return q; } if (t < 2 / 3) { return p + (q - p) * (2 / 3 - t) * 6; } return p; } function hslToRgb(h, s, l) { const q = l < 0.5 ? l * (1 + s) : l + s - l * s; const p = 2 * l - q; const r = hue2rgb(p, q, h + 1 / 3); const g = hue2rgb(p, q, h); const b = hue2rgb(p, q, h - 1 / 3); return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8; } function parse255(str) { const int = Number.parseInt(str, 10); if (int < 0) { return 0; } if (int > 255) { return 255; } return int; } function parse360(str) { const int = Number.parseFloat(str); return (int % 360 + 360) % 360 / 360; } function parse1(str) { const num = Number.parseFloat(str); if (num < 0) { return 0; } if (num > 1) { return 255; } return Math.round(num * 255); } function parsePercentage(str) { const int = Number.parseFloat(str); if (int < 0) { return 0; } if (int > 100) { return 1; } return int / 100; } function parseModernComponent(str, percentScale) { if (str === "none") return 0; if (str.endsWith("%")) { return Number.parseFloat(str) / 100 * percentScale; } return Number.parseFloat(str); } function parseHueAngle(str) { if (str === "none") return 0; if (str.endsWith("rad")) { return Number.parseFloat(str) * 180 / Math.PI; } if (str.endsWith("grad")) return Number.parseFloat(str) * 0.9; if (str.endsWith("turn")) return Number.parseFloat(str) * 360; return Number.parseFloat(str); } function parseModernAlpha(str) { if (str === undefined || str === "none") return 1; if (str.endsWith("%")) { return Math.max(0, Math.min(1, Number.parseFloat(str) / 100)); } return Math.max(0, Math.min(1, Number.parseFloat(str))); } function linearToSrgb(c) { if (c <= 0.0031308) return 12.92 * c; return 1.055 * c ** (1 / 2.4) - 0.055; } function clamp01(v) { return Math.max(0, Math.min(1, v)); } function rgbFloatToInt(r, g, b, alpha) { const ri = Math.round(clamp01(r) * 255); const gi = Math.round(clamp01(g) * 255); const bi = Math.round(clamp01(b) * 255); const ai = Math.round(clamp01(alpha) * 255); return (ri << 24 | gi << 16 | bi << 8 | ai) >>> 0; } function oklabToSrgb(L, a, b) { const l_ = L + 0.3963377774 * a + 0.2158037573 * b; const m_ = L - 0.1055613458 * a - 0.0638541728 * b; const s_ = L - 0.0894841775 * a - 1.291485548 * b; const l = l_ * l_ * l_; const m = m_ * m_ * m_; const s = s_ * s_ * s_; const rLin = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s; const gLin = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s; const bLin = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s; return [linearToSrgb(rLin), linearToSrgb(gLin), linearToSrgb(bLin)]; } function labToSrgb(L, a, b) { const epsilon = 216 / 24389; const kappa = 24389 / 27; const Xn = 0.95047; const Yn = 1; const Zn = 1.08883; const fy = (L + 16) / 116; const fx = a / 500 + fy; const fz = fy - b / 200; const fx3 = fx * fx * fx; const fz3 = fz * fz * fz; const xr = fx3 > epsilon ? fx3 : (116 * fx - 16) / kappa; const yr = L > kappa * epsilon ? ((L + 16) / 116) ** 3 : L / kappa; const zr = fz3 > epsilon ? fz3 : (116 * fz - 16) / kappa; const X = xr * Xn; const Y = yr * Yn; const Z = zr * Zn; const rLin = 3.2404542 * X - 1.5371385 * Y - 0.4985314 * Z; const gLin = -0.969266 * X + 1.8760108 * Y + 0.041556 * Z; const bLin = 0.0556434 * X - 0.2040259 * Y + 1.0572252 * Z; return [linearToSrgb(rLin), linearToSrgb(gLin), linearToSrgb(bLin)]; } function hwbToSrgb(h, w, bk) { if (w + bk >= 1) { const gray = w / (w + bk); return [gray, gray, gray]; } const q = 1; const p = 0; const r = hue2rgb(p, q, h + 1 / 3); const g = hue2rgb(p, q, h); const bl = hue2rgb(p, q, h - 1 / 3); const factor = 1 - w - bk; return [r * factor + w, g * factor + w, bl * factor + w]; } var colorNames = { transparent: 0, aliceblue: 4042850303, antiquewhite: 4209760255, aqua: 16777215, aquamarine: 2147472639, azure: 4043309055, beige: 4126530815, bisque: 4293182719, black: 255, blanchedalmond: 4293643775, blue: 65535, blueviolet: 2318131967, brown: 2771004159, burlywood: 3736635391, burntsienna: 3934150143, cadetblue: 1604231423, chartreuse: 2147418367, chocolate: 3530104575, coral: 4286533887, cornflowerblue: 1687547391, cornsilk: 4294499583, crimson: 3692313855, cyan: 16777215, darkblue: 35839, darkcyan: 9145343, darkgoldenrod: 3095792639, darkgray: 2846468607, darkgreen: 6553855, darkgrey: 2846468607, darkkhaki: 3182914559, darkmagenta: 2332068863, darkolivegreen: 1433087999, darkorange: 4287365375, darkorchid: 2570243327, darkred: 2332033279, darksalmon: 3918953215, darkseagreen: 2411499519, darkslateblue: 1211993087, darkslategray: 793726975, darkslategrey: 793726975, darkturquoise: 13554175, darkviolet: 2483082239, deeppink: 4279538687, deepskyblue: 12582911, dimgray: 1768516095, dimgrey: 1768516095, dodgerblue: 512819199, firebrick: 2988581631, floralwhite: 4294635775, forestgreen: 579543807, fuchsia: 4278255615, gainsboro: 3705462015, ghostwhite: 4177068031, gold: 4292280575, goldenrod: 3668254975, gray: 2155905279, green: 8388863, greenyellow: 2919182335, grey: 2155905279, honeydew: 4043305215, hotpink: 4285117695, indianred: 3445382399, indigo: 1258324735, ivory: 4294963455, khaki: 4041641215, lavender: 3873897215, lavenderblush: 4293981695, lawngreen: 2096890111, lemonchiffon: 4294626815, lightblue: 2916673279, lightcoral: 4034953471, lightcyan: 3774873599, lightgoldenrodyellow: 4210742015, lightgray: 3553874943, lightgreen: 2431553791, lightgrey: 3553874943, lightpink: 4290167295, lightsalmon: 4288707327, lightseagreen: 548580095, lightskyblue: 2278488831, lightslategray: 2005441023, lightslategrey: 2005441023, lightsteelblue: 2965692159, lightyellow: 4294959359, lime: 16711935, limegreen: 852308735, linen: 4210091775, magenta: 4278255615, maroon: 2147483903, mediumaquamarine: 1724754687, mediumblue: 52735, mediumorchid: 3126187007, mediumpurple: 2473647103, mediumseagreen: 1018393087, mediumslateblue: 2070474495, mediumspringgreen: 16423679, mediumturquoise: 1221709055, mediumvioletred: 3340076543, midnightblue: 421097727, mintcream: 4127193855, mistyrose: 4293190143, moccasin: 4293178879, navajowhite: 4292783615, navy: 33023, oldlace: 4260751103, olive: 2155872511, olivedrab: 1804477439, orange: 4289003775, orangered: 4282712319, orchid: 3664828159, palegoldenrod: 4008225535, palegreen: 2566625535, paleturquoise: 2951671551, palevioletred: 3681588223, papayawhip: 4293907967, peachpuff: 4292524543, peru: 3448061951, pink: 4290825215, plum: 3718307327, powderblue: 2967529215, purple: 2147516671, rebeccapurple: 1714657791, red: 4278190335, rosybrown: 3163525119, royalblue: 1097458175, saddlebrown: 2336560127, salmon: 4202722047, sandybrown: 4104413439, seagreen: 780883967, seashell: 4294307583, sienna: 2689740287, silver: 3233857791, skyblue: 2278484991, slateblue: 1784335871, slategray: 1887473919, slategrey: 1887473919, snow: 4294638335, springgreen: 16744447, steelblue: 1182971135, tan: 3535047935, teal: 8421631, thistle: 3636451583, tomato: 4284696575, turquoise: 1088475391, violet: 4001558271, wheat: 4125012991, white: 4294967295, whitesmoke: 4126537215, yellow: 4294902015, yellowgreen: 2597139199 }; function normalizeColor(color) { const matchers = getMatchers(); let match; if (matchers.hex6) { if (match = matchers.hex6.exec(color)) { return Number.parseInt(match[1] + "ff", 16) >>> 0; } } if (colorNames[color] !== undefined) { return colorNames[color]; } if (matchers.rgb) { if (match = matchers.rgb.exec(color)) { return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | 255) >>> 0; } } if (matchers.rgba) { if (match = matchers.rgba.exec(color)) { return (parse255(match[1]) << 24 | parse255(match[2]) << 16 | parse255(match[3]) << 8 | parse1(match[4])) >>> 0; } } if (matchers.hex3) { if (match = matchers.hex3.exec(color)) { return Number.parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + "ff", 16) >>> 0; } } if (matchers.hex8) { if (match = matchers.hex8.exec(color)) { return Number.parseInt(match[1], 16) >>> 0; } } if (matchers.hex4) { if (match = matchers.hex4.exec(color)) { return Number.parseInt(match[1] + match[1] + match[2] + match[2] + match[3] + match[3] + match[4] + match[4], 16) >>> 0; } } if (matchers.hsl) { if (match = matchers.hsl.exec(color)) { return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | 255) >>> 0; } } if (matchers.hsla) { if (match = matchers.hsla.exec(color)) { return (hslToRgb(parse360(match[1]), parsePercentage(match[2]), parsePercentage(match[3])) | parse1(match[4])) >>> 0; } } if (matchers.oklch) { if (match = matchers.oklch.exec(color)) { const L = parseModernComponent(match[1], 1); const C = parseModernComponent(match[2], 0.4); const H = parseHueAngle(match[3]); const alpha = parseModernAlpha(match[4]); const hRad = H * Math.PI / 180; const [r, g, b] = oklabToSrgb(L, C * Math.cos(hRad), C * Math.sin(hRad)); return rgbFloatToInt(r, g, b, alpha); } } if (matchers.oklab) { if (match = matchers.oklab.exec(color)) { const L = parseModernComponent(match[1], 1); const a = parseModernComponent(match[2], 0.4); const b = parseModernComponent(match[3], 0.4); const alpha = parseModernAlpha(match[4]); const [r, g, bl] = oklabToSrgb(L, a, b); return rgbFloatToInt(r, g, bl, alpha); } } if (matchers.lab) { if (match = matchers.lab.exec(color)) { const L = parseModernComponent(match[1], 100); const a = parseModernComponent(match[2], 125); const b = parseModernComponent(match[3], 125); const alpha = parseModernAlpha(match[4]); const [r, g, bl] = labToSrgb(L, a, b); return rgbFloatToInt(r, g, bl, alpha); } } if (matchers.lch) { if (match = matchers.lch.exec(color)) { const L = parseModernComponent(match[1], 100); const C = parseModernComponent(match[2], 150); const H = parseHueAngle(match[3]); const alpha = parseModernAlpha(match[4]); const hRad = H * Math.PI / 180; const [r, g, bl] = labToSrgb(L, C * Math.cos(hRad), C * Math.sin(hRad)); return rgbFloatToInt(r, g, bl, alpha); } } if (matchers.hwb) { if (match = matchers.hwb.exec(color)) { const H = parseHueAngle(match[1]); const W = parseModernComponent(match[2], 1); const B = parseModernComponent(match[3], 1); const alpha = parseModernAlpha(match[4]); const [r, g, bl] = hwbToSrgb(H / 360, W, B); return rgbFloatToInt(r, g, bl, alpha); } } throw new Error(`invalid color string ${color} provided`); } function processColor(color) { const normalizedColor = normalizeColor(color); return (normalizedColor << 24 | normalizedColor >>> 8) >>> 0; } // src/prores-profile.ts var proResProfileOptions = [ "4444-xq", "4444", "hq", "standard", "light", "proxy" ]; // src/v5-flag.ts var ENABLE_V5_BREAKING_CHANGES = false; // src/validate-frame.ts var validateFrame = ({ allowFloats, durationInFrames, frame }) => { if (typeof frame === "undefined") { throw new TypeError(`Argument missing for parameter "frame"`); } if (typeof frame !== "number") { throw new TypeError(`Argument passed for "frame" is not a number: ${frame}`); } if (!Number.isFinite(frame)) { throw new RangeError(`Frame ${frame} is not finite`); } if (frame % 1 !== 0 && !allowFloats) { throw new RangeError(`Argument for frame must be an integer, but got ${frame}`); } if (frame < 0 && frame < -durationInFrames) { throw new RangeError(`Cannot use frame ${frame}: Duration of composition is ${durationInFrames}, therefore the lowest frame that can be rendered is ${-durationInFrames}`); } if (frame > durationInFrames - 1) { throw new RangeError(`Cannot use frame ${frame}: Duration of composition is ${durationInFrames}, therefore the highest frame that can be rendered is ${durationInFrames - 1}`); } }; // src/codec.ts var validCodecs = [ "h264", "h265", "vp8", "vp9", "av1", "mp3", "aac", "wav", "prores", "h264-mkv", "h264-ts", "gif" ]; // src/validation/validate-default-codec.ts function validateCodec(defaultCodec, location, name) { if (typeof defaultCodec === "undefined") { return; } if (typeof defaultCodec !== "string") { throw new TypeError(`The "${name}" prop ${location} must be a string, but you passed a value of type ${typeof defaultCodec}.`); } if (!validCodecs.includes(defaultCodec)) { throw new Error(`The "${name}" prop ${location} must be one of ${validCodecs.join(", ")}, but you passed ${defaultCodec}.`); } } // src/validation/validate-default-props.ts var validateDefaultAndInputProps = (defaultProps, name, compositionId) => { if (!defaultProps) { return; } if (typeof defaultProps !== "object") { throw new Error(`"${name}" must be an object, but you passed a value of type ${typeof defaultProps}`); } if (Array.isArray(defaultProps)) { throw new Error(`"${name}" must be an object, an array was passed ${compositionId ? `for composition "${compositionId}"` : ""}`); } }; // src/validation/validate-dimensions.ts function validateDimension(amount, nameOfProp, location) { if (typeof amount !== "number") { throw new Error(`The "${nameOfProp}" prop ${location} must be a number, but you passed a value of type ${typeof amount}`); } if (isNaN(amount)) { throw new TypeError(`The "${nameOfProp}" prop ${location} must not be NaN, but is NaN.`); } if (!Number.isFinite(amount)) { throw new TypeError(`The "${nameOfProp}" prop ${location} must be finite, but is ${amount}.`); } if (amount % 1 !== 0) { throw new TypeError(`The "${nameOfProp}" prop ${location} must be an integer, but is ${amount}.`); } if (amount <= 0) { throw new TypeError(`The "${nameOfProp}" prop ${location} must be positive, but got ${amount}.`); } } // src/validation/validate-duration-in-frames.ts function validateDurationInFrames(durationInFrames, options) { const { allowFloats, component } = options; if (typeof durationInFrames === "undefined") { throw new Error(`The "durationInFrames" prop ${component} is missing.`); } if (typeof durationInFrames !== "number") { throw new Error(`The "durationInFrames" prop ${component} must be a number, but you passed a value of type ${typeof durationInFrames}`); } if (durationInFrames <= 0) { throw new TypeError(`The "durationInFrames" prop ${component} must be positive, but got ${durationInFrames}.`); } if (!allowFloats && durationInFrames % 1 !== 0) { throw new TypeError(`The "durationInFrames" prop ${component} must be an integer, but got ${durationInFrames}.`); } if (!Number.isFinite(durationInFrames)) { throw new TypeError(`The "durationInFrames" prop ${component} must be finite, but got ${durationInFrames}.`); } } // src/validation/validate-fps.ts function validateFps(fps, location, isGif) { if (typeof fps !== "number") { throw new Error(`"fps" must be a number, but you passed a value of type ${typeof fps} ${location}`); } if (!Number.isFinite(fps)) { throw new Error(`"fps" must be a finite, but you passed ${fps} ${location}`); } if (isNaN(fps)) { throw new Error(`"fps" must not be NaN, but got ${fps} ${location}`); } if (fps <= 0) { throw new TypeError(`"fps" must be positive, but got ${fps} ${location}`); } if (isGif && fps > 50) { throw new TypeError(`The FPS for a GIF cannot be higher than 50. Use the --every-nth-frame option to lower the FPS: https://remotion.dev/docs/render-as-gif`); } } // src/video/get-current-time.ts var getExpectedMediaFrameUncorrected = ({ frame, playbackRate, startFrom }) => { return interpolate(frame, [-1, startFrom, startFrom + 1], [-1, startFrom, startFrom + playbackRate]); }; // src/absolute-src.ts var getAbsoluteSrc = (relativeSrc) => { if (typeof window === "undefined") { return relativeSrc; } if (relativeSrc.startsWith("http://") || relativeSrc.startsWith("https://") || relativeSrc.startsWith("file://") || relativeSrc.startsWith("blob:") || relativeSrc.startsWith("data:")) { return relativeSrc; } return new URL(relativeSrc, window.origin).href; }; // src/video/offthread-video-source.ts var getOffthreadVideoSource = ({ src, transparent, currentTime, toneMapped }) => { return `http://localhost:${window.remotion_proxyPort}/proxy?src=${encodeURIComponent(getAbsoluteSrc(src))}&time=${encodeURIComponent(Math.max(0, currentTime))}&transparent=${String(transparent)}&toneMapped=${String(toneMapped)}`; }; // src/no-react.ts var NoReactInternals = { processColor, truthy, validateFps, validateDimension, validateDurationInFrames, validateDefaultAndInputProps, validateFrame, serializeJSONWithSpecialTypes, bundleName: "bundle.js", bundleMapName: "bundle.js.map", deserializeJSONWithSpecialTypes, DELAY_RENDER_CALLSTACK_TOKEN, DELAY_RENDER_RETRY_TOKEN, DELAY_RENDER_CLEAR_TOKEN, DELAY_RENDER_ATTEMPT_TOKEN: DELAY_RENDER_RETRIES_LEFT, getOffthreadVideoSource, getExpectedMediaFrameUncorrected, ENABLE_V5_BREAKING_CHANGES, MIN_NODE_VERSION: ENABLE_V5_BREAKING_CHANGES ? 18 : 16, MIN_BUN_VERSION: ENABLE_V5_BREAKING_CHANGES ? "1.1.3" : "1.0.3", colorNames, DATE_TOKEN, FILE_TOKEN, validateCodec, proResProfileOptions }; export { random, interpolate, NoReactInternals };